Основні прив'язки, характерні для буфера


14

Чи можна встановити ключові прив’язки, характерні для буфера?

У одному з моїх файлів org є таке:

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

Але ця прив'язка зберігається і для інших файлів у режимі org. Якщо я відкрию файл у іншому головному режимі, то починається прив'язка мого ключа за замовчуванням.

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

Як я можу мати прив'язки, які активуються лише в певному буфері?


2
О, вау, ви маєте рацію: "Прив'язка входить у локальну карту поточного буфера, яка в більшості випадків ділиться з усіма іншими буферами в тому ж основному режимі." Я ніколи цього не знав.
shosti

Тепер, коли я замислююся над цим, 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:

@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)
incandescentman

Я також отримую ту ж помилку. будь-яка ідея?
zeltak

@incandescentman call (make-keymap) з :keymapключовим словом, перевірити nullprogram.com/blog/2013/02/06
nichijou

5

Ось загальний спосіб встановлення специфічних для буфера прив’язок ключів.

  • Створіть тимчасовий другорядний режим (збережіть фрагмент нижче temp-mode.elта requireйого у своєму init.el.
  • Увімкніть цей temp-modeмінорний режим та визначте мапу клавіш мінорного режиму лише у потрібних буферах.

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

У буфері ONE

# 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(оновіть прив’язки), працюйте в буфері ДВОЕ C-x C-sі перейдіть на буфер ОДНО
  • revert-buffer(оновіть прив’язки), працюйте в буфері ONE C-x C-sі перейдіть на буфер ДВОЙ

Але я б швидше прив’язував різні команди, характерні для буфера, до різних клавіш.


Тимчасовий другорядний режим

;; 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.