Associazioni chiave specifiche di un buffer


13

È possibile impostare combinazioni di tasti specifiche per il buffer?

Ho uno dei seguenti in uno dei miei file dell'organizzazione:

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

Ma questo legame persiste anche per altri file in modalità org. Se apro un file con una diversa modalità principale, viene attivata la mia associazione di tasti predefinita.

Sembra che local-set-keystia impostando associazioni specifiche per la modalità principale non specifiche per il buffer.

Come posso avere associazioni che si attivano solo in un determinato buffer?


2
Oh wow, hai ragione: "L'associazione va nella mappa locale del buffer corrente, che nella maggior parte dei casi è condivisa con tutti gli altri buffer nella stessa modalità principale." Non l'ho mai saputo.
shosti,

Ora che ci penso, local-unset-keycollegato con org-mode-hookpotrebbe funzionare se questo viene eseguito prima della Local Variables:sezione.
Kaushal Modi,

Oppure potresti creare una modalità secondaria con una Local Variables:
keymap

@Vamsi Grazie! Questa è una soluzione elegante! Ho aggiornato la tua soluzione.
Kaushal Modi,

Risposte:


17

Per la chiusura, ecco una risposta che si espande sul mio commento. Definisco una modalità minore con il keybinding richiesto e lo abilito nel buffer richiesto usando le variabili locali del file.

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

Puoi attivarlo nei file necessari impostando la sezione delle variabili locali alla fine del file come segue. Puoi anche modificare o aggiungere il keybinding qui. Sarà comunque necessario definire diverse modalità secondarie per ciascun buffer che associ la stessa sequenza di tasti a comandi diversi.

 # 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: potresti voler modificare le tue modifiche in una risposta separata poiché è più completa. Inoltre, non saresti in grado di mappare la stessa sequenza di tasti a due diverse funzioni contemporaneamente a meno che tu non usi un nome specifico del buffer.
Vamsi,

Ottengo questo errore: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapquando provo a eseguire questo(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

Ottengo anche lo stesso errore. qualche idea?
zeltak,

@incandescentman call (make-keymap) con la :keymapparola chiave, controlla nullprogram.com/blog/2013/02/06
nichijou il

5

Ecco un modo generico per impostare associazioni di tasti specifici del buffer.

  • Crea una modalità secondaria temporanea (salva lo snippet di seguito temp-mode.ele requireinseriscilo nel tuo init.el.
  • Abilitare quella temp-modemodalità minore e definire la mappa chiave di quella modalità secondaria solo nei buffer necessari.

Inserisci lo Local Variablessnippet di seguito nel buffer nel punto in cui desideri associare la chiave personalizzata. Di seguito sono riportati esempi di org-modefile.

Nel buffer ONE

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

Se qualche altro buffer ridefinisce lo stesso key binding usando,

Nel buffer DUE

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

quindi il nuovo legame diventa efficace nel fare M-x revert-buffer.

Questo è ciò che farei se avessi bisogno di passare molto frequentemente tra questi due buffer e se dovessi usare l' F10associazione in entrambi:

  • Lavora nel buffer ONE, C-x C-s(salva) e passa al buffer DUE
  • revert-buffer(aggiorna i binding), lavora nel buffer DUE C-x C-se passa al buffer ONE
  • revert-buffer(aggiorna i binding), lavora nel buffer ONE C-x C-se passa al buffer TWO

Preferirei piuttosto associare i diversi comandi specifici del buffer a chiavi diverse.


Modalità secondaria temporanea

;; 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.