Ни один из других ответов не удовлетворил мои потребности. Так что это может помочь другим людям. Я хотел, чтобы Tab
перешел на начало строки, если я нахожусь в нормальном режиме Зла (в основном: это означает везде в Emacs), но вместо этого я хотел, чтобы он переключался между состояниями элемента org, если я Я нахожусь в документе в режиме организации.
Одним из вариантов было возиться с отдельными привязками и постоянной привязкой привязки всякий раз, когда я переключал буферы (потому что зло допускает только одну привязку на ключ в своем нормальном состоянии).
Но более эффективным вариантом было заставить Tab
запускать мой собственный код, который запускает требуемую функцию в зависимости от того, какой основной режим использует текущий буфер. Поэтому, если я нахожусь в буфере org, этот код запускается org-cycle
, а в противном случае он запускается evil-first-non-blank
(переход к первому непробельному символу в строке).
Технику, которую я здесь использовал, можно также использовать, вызывая вашу пользовательскую функцию через global-set-key
, для людей, которые используют обычные не злые Emacs.
Для тех, кто не знает Emacs lisp, первая строка после оператора «if» - это true-action, а строка после этого - false-action. Поэтому, если major-mode
равно org-mode
, мы запускаем org-cycle
, в противном случае мы запускаем evil-first-non-blank
во всех других режимах:
(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)