Powiązania klawiszy specyficzne dla bufora

14

Czy można ustawić przypisania klawiszy specyficzne dla bufora?

Mam jeden z moich plików org:

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

Ale to wiązanie trwa również dla innych plików w trybie organizacji. Jeśli otworzę plik z innym głównym trybem, uruchomi się moje domyślne powiązanie klawiszy.

Wygląda na local-set-keyto, że ustawienie powiązań jest specyficzne dla trybu głównego, a nie specyficzne dla bufora.

Jak mogę mieć powiązania, które aktywują się tylko w określonym buforze?

Kaushal Modi
źródło
2
O rany, masz rację: „Wiązanie przechodzi na mapę lokalną bieżącego bufora, która w większości przypadków jest współdzielona ze wszystkimi innymi buforami w tym samym trybie głównym”. Nie zdawałem sobie z tego sprawy.
shosti
Teraz, gdy o tym myślę, local-unset-keyuzależniony od org-mode-hookmoże działać, jeśli zostanie wykonany przed Local Variables:sekcją.
Kaushal Modi
Lub możesz zrobić tryb mniejszy z częściowo rzadką mapą klawiszy i przełączać ją za pomocąLocal Variables:
Vamsi
@Vamsi Thanks! To eleganckie rozwiązanie! Zaktualizowałem twoje rozwiązanie.
Kaushal Modi

Odpowiedzi:

17

Na zakończenie, oto odpowiedź, która poszerza mój komentarz. Definiuję tryb podrzędny z wymaganym klawiszem i przełączam go w wymaganym buforze za pomocą lokalnych zmiennych pliku.

  (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)

Możesz przełączać go w niezbędnych plikach, ustawiając sekcję zmiennych lokalnych na końcu pliku w następujący sposób. Możesz także zmienić lub dodać skrót klawiszowy tutaj. Nadal będziesz musiał zdefiniować różne pomniejsze tryby dla każdego bufora, który odwzorowuje tę samą sekwencję klawiszy na różne polecenia.

 # 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
źródło
@kaushalmodi: Możesz podzielić swoje edycje na osobną odpowiedź, ponieważ jest ona bardziej kompletna. Ponadto nie można zmapować tej samej sekwencji klawiszy na dwie różne funkcje jednocześnie, chyba że zostanie użyta nazwa specyficzna dla bufora.
Vamsi
Dostaję ten błąd: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapkiedy próbuję to uruchomić(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)
żarzący się
Otrzymuję również ten sam błąd. dowolny pomysł?
zeltak
@incandescentman call (make-keymap) ze :keymapsłowem kluczowym, sprawdź nullprogram.com/blog/2013/02/06
nichijou 30.12.2018
5

Oto ogólny sposób ustawiania powiązań klawiszy specyficznych dla bufora.

  • Utwórz tymczasowy tryb podrzędny (zapisz poniższy fragment temp-mode.eli requirena swoim koncie init.el.
  • Włącz ten temp-modetryb pomocniczy i zdefiniuj mapę klawiszy trybu pomocniczego tylko w potrzebnych buforach.

Umieść poniższy Local Variablesfragment kodu w buforze, w którym chcesz powiązać klucz niestandardowy. Poniżej znajdują się przykłady org-modeplików.

W buforze JEDEN

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

Jeśli jakiś inny bufor przedefiniuje to samo powiązanie klawiszy za pomocą,

W buforze DWA

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

wtedy nowe wiązanie stanie się skuteczne M-x revert-buffer.

Tak zrobię, jeśli będę musiał bardzo często przełączać się między tymi dwoma buforami i jeśli będę musiał użyć F10powiązania w obu:

  • Pracuj w buforze JEDEN, C-x C-s(zapisz) i przełącz na bufor DWA
  • revert-buffer(odśwież powiązania), pracuj w buforze DWA C-x C-si przełącz na bufor JEDEN
  • revert-buffer(odśwież powiązania), pracuj w buforze JEDEN C-x C-si przełącz na bufor DWA

Wolałbym jednak powiązać różne polecenia specyficzne dla bufora z różnymi kluczami.


Tymczasowy tryb pomocniczy

;; 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)
Kaushal Modi
źródło