None of the other answers satisfied my needs. So this may help other people. I wanted Tab
to jump to the beginning of the line if I'm in Evil's normal mode (basically this means everywhere in Emacs), but I instead wanted it to cycle between org item states if I am in an org-mode document.
One option was to mess around with separate bindings and constant binding-rebinding whenever I switched buffers (because evil allows only one binding per key in its normal state).
But a more efficient option was to make Tab
run my own code which runs the required function based on which major mode the current buffer uses. So if I am in a org buffer, this code runs org-cycle
, and otherwise it runs evil-first-non-blank
(go to the first non-whitespace character on the line).
The technique I used here can also be used by calling your custom function via global-set-key
instead, for people who use regular non-evil Emacs.
For those who don't know Emacs lisp, the first line after the "if" statement is the true-action, and the line after that is the false-action. So if major-mode
equals org-mode
, we run org-cycle
, otherwise we run evil-first-non-blank
in all other modes:
(defun my/tab-jump-or-org-cycle ()
"jumps to beginning of line in all modes except org mode, where it cycles"
(interactive)
(if (equal major-mode 'org-mode)
(org-cycle)
(evil-first-non-blank))
)
(define-key evil-normal-state-map (kbd "<tab>") 'my/tab-jump-or-org-cycle)
Symbol's value as variable is void: LaTeX-mode-map
all the time. Hmmm... – Jalousie