Установить пользовательскую привязку клавиш для определенного режима Emacs - PullRequest
51 голосов
/ 31 марта 2011

Несмотря на то, что я знаю, как установить глобальную привязку ключей в 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?

Ответы [ 4 ]

47 голосов
/ 01 апреля 2011

Чтобы связать клавишу в режиме, вам нужно дождаться загрузки режима, прежде чем определять клавишу. Можно потребовать режим или использовать eval-after-load

   (eval-after-load 'latex 
                    '(define-key LaTeX-mode-map [(tab)] 'outline-cycle))

Не забывайте, что либо ' - eval-after-load не является макросом, поэтому он нуждается в них.

41 голосов
/ 09 января 2013

Я использую следующее:

(add-hook 'LaTeX-mode-hook
          (lambda () (local-set-key (kbd "C-0") #'run-latexmk)))

для определения привязки только для режима LaTeX.

5 голосов
/ 31 марта 2011

Вам необходимо определить карту клавиш для этого режима (например, LaTeX-mode-map) и использовать функцию define-key.Например, наряду с активацией outline-minor-mode в режиме LaTeX, у меня есть:

  (define-key LaTeX-mode-map [(tab)] 'outline-cycle))

В этом случае основной режим (LaTeX) содержит привязку клавиш, но также есть outline-minor-mode-map.

3 голосов
/ 10 декабря 2016

Ни один из других ответов не удовлетворил мои потребности. Так что это может помочь другим людям. Я хотел, чтобы 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)
...