Привязки клавиш, характерные для буфера

13

Можно ли установить привязки клавиш, специфичные для буфера?

В одном из моих файлов org есть следующее:

# Local Variables:
# eval: (local-set-key (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
# End:

Но эта привязка сохраняется и для других файлов режима org. Если я открываю файл с другим основным режимом, то начинает действовать моя привязка ключа по умолчанию.

Похоже, local-set-keyустанавливает привязки, специфичные для основного режима, а не для буфера.

Как я могу иметь привязки, которые активируются только в определенном буфере?

Каушал Моди
источник
2
Ух ты, ты прав: «Привязка идет в локальной карте текущего буфера, которая в большинстве случаев используется совместно со всеми другими буферами в том же основном режиме». Я никогда не знал этого.
Шости
Теперь, когда я думаю об этом, « local-unset-keyзацепка» org-mode-hookможет сработать, если она будет выполнена до того, как будет создан Local Variables:раздел.
Каушал Моди
Или вы можете сделать второстепенный режим с полуна разреженной раскладкой клавиш и переключать его, используяLocal Variables:
Vamsi
@Vamsi Спасибо! Это элегантное решение! Я обновил ваше решение.
Каушал Моди

Ответы:

17

Для завершения, вот ответ, который расширяет мой комментарий. Я определяю второстепенный режим с необходимой привязкой клавиш и переключаю его в нужный буфер, используя локальные переменные файла.

  (define-minor-mode my-org-buffer-local-mode
    "Minor mode to simulate buffer local keybindings."
    :init-value nil)
  (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)

Вы можете включить его в необходимые файлы, установив раздел локальных переменных в конце файла следующим образом. Вы также можете изменить или добавить связывание клавиш здесь. Вам все равно нужно будет определить разные второстепенные режимы для каждого буфера, который отображает одну и ту же последовательность клавиш на разные команды.

 # Local Variables:
 # my-org-buffer-local-mode: t
 # eval:(define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-other-custom-defun-specific-to-this-buffer)
 # End:
Vamsi
источник
@kaushalmodi: Вы можете выделить свои правки в отдельный ответ, так как он более полный. Кроме того, вы не сможете сопоставить одну и ту же последовательность клавиш двум разным функциям одновременно, если вы не используете специфичное для буфера имя.
Вамси
Я получаю эту ошибку: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapкогда я пытаюсь запустить это(define-minor-mode my-org-buffer-local-mode "Minor mode to simulate buffer local keybindings." :init-value nil) (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
Лампа накаливания
Я также получаю ту же ошибку. любая идея?
Zeltak
Вызов @incandescentman (make-keymap) с :keymapключевым словом, проверьте nullprogram.com/blog/2013/02/06
nichijou
5

Вот общий способ установки привязок клавиш для конкретного буфера.

  • Создайте временный второстепенный режим (сохраните приведенный ниже фрагмент temp-mode.elи добавьте requireего в свой init.el.
  • Включите этот temp-modeвторостепенный режим и определите раскладку этого второстепенного режима только в нужном вам буфере.

Поместите приведенный ниже Local Variablesфрагмент в буфер, где вы хотите, чтобы пользовательская привязка ключа. Ниже приведены примеры org-modeфайлов.

В буфере ОДИН

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-ONE)
# End:

Если какой-то другой буфер переопределяет ту же привязку ключа, используя

В буфере ДВА

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-TWO)
# End:

тогда новая привязка вступает в силу M-x revert-buffer.

Это то, что я сделал бы, если бы мне нужно было очень часто переключаться между этими двумя буферами и использовать F10привязку в обоих:

  • Работа в буфере ОДИН, C-x C-s(сохранить) и переключиться в буфер ДВА
  • revert-buffer(обновить привязки), работать в буфере TWO C-x C-sи переключиться в буфер ONE
  • revert-buffer(обновить привязки), работать в буфере ONE C-x C-sи переключиться в буфер TWO

Но я бы предпочел привязать разные специфичные для буфера команды к разным клавишам.


Временный второстепенный режим

;; temp-mode.el
;; Temporary minor mode
;; Main use is to enable it only in specific buffers to achieve the goal of
;; buffer-specific keymaps

(defvar temp-mode-map (make-sparse-keymap)
  "Keymap while temp-mode is active.")

;;;###autoload
(define-minor-mode temp-mode
  "A temporary minor mode to be activated only specific to a buffer."
  nil
  :lighter " Temp"
  temp-mode-map)

(provide 'temp-mode)
Каушал Моди
источник