Подтвердить что ты не робот

Установите индивидуальный привязку клавиш для конкретного режима 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?

4b9b3361

Ответ 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)