Установите индивидуальный привязку клавиш для конкретного режима Emacs
Хотя я знаю, как установить глобальную привязку ключей в Emacs, мне трудно даже Google вывести код для локального (привязанного к второстепенному) привязки ключей. Например, у меня есть этот код в моем .emacs
:
;; PDFLaTeX from AucTeX
(global-set-key (kbd "C-c M-p")
(lambda ()
(interactive)
(shell-command (concat "pdflatex " buffer-file-name))))
Я не хочу устанавливать его глобально. Существует ли такая функция, как local-set-key
?
Ответы
Ответ 1
Чтобы связать ключ в режиме, вам нужно дождаться загрузки режима перед определением ключа. Можно потребовать режим или использовать eval-after-load
(eval-after-load 'latex
'(define-key LaTeX-mode-map [(tab)] 'outline-cycle)))
Не забывайте, что '
- eval-after-load
не является макросом, поэтому он нуждается в них.
Ответ 2
Я использую следующее:
(add-hook 'LaTeX-mode-hook
(lambda () (local-set-key (kbd "C-0") #'run-latexmk)))
иметь привязку, определенную только для режима LaTeX.
Ответ 3
Вам нужно идентифицировать карту ключа для этого режима (например, LaTeX-mode-map
) и использовать функцию define-key
. В качестве примера, наряду с активизацией outline-minor-mode
в режиме LaTeX, у меня есть:
(define-key LaTeX-mode-map [(tab)] 'outline-cycle))
В этом случае основной режим (LaTeX) содержит привязку клавиш, но есть также outline-minor-mode-map
.
Ответ 4
Ни один из ответов не удовлетворил мои потребности. Так что это может помочь другим людям. Я хотел, чтобы Tab
прыгнул в начало строки, если я в нормальном режиме Зла (в основном: это означает всюду в Emacs), но вместо этого я хотел, чтобы он переключался между состояниями org item, если я в org-mode документ.
Один из вариантов состоял в том, чтобы объединиться с отдельными привязками и постоянным привязкой привязки, когда я переключал буферы (потому что зло допускает только одно связывание на ключ в его нормальном состоянии).
Но более эффективным вариантом было сделать Tab
запуск моего собственного кода, который запускает требуемую функцию на основе основного режима, который использует текущий буфер. Поэтому, если я в буфере org, этот код работает org-cycle
, и в противном случае он запускает evil-first-non-blank
(перейдите к первому небезватому символу в строке).
Используемая здесь техника также может быть использована путем вызова вашей пользовательской функции через global-set-key
вместо этого для людей, которые используют регулярные не-злые Emacs.
Для тех, кто не знает Emacs lisp, первая строка после оператора "if" является истинным действием, а строка после этого является ложным действием. Поэтому, если 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)