Ligações de teclas específicas a um buffer

13

É possível definir ligações de teclas específicas para o buffer?

Eu tenho o seguinte em um dos meus arquivos organizacionais:

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

Mas essa ligação persiste também para outros arquivos de modo organizacional. Se eu abrir um arquivo com um modo principal diferente, a ligação de teclas padrão será ativada.

Parece que local-set-keyestá definindo ligações específicas para o modo principal e não específicas para o buffer.

Como posso ter ligações que são ativadas apenas em um buffer específico?

Kaushal Modi
fonte
2
Oh, uau, você está certo: "A ligação está no mapa local do buffer atual, que na maioria dos casos é compartilhado com todos os outros buffers no mesmo modo principal". Eu nunca soube disso.
shosti
Agora que penso nisso, local-unset-keyviciado em org-mode-hookpode funcionar se for executado antes da Local Variables:seção.
Kaushal Modi
Ou você poderia fazer um modo menor com um mapa de teclado semi escassa e alterná-la usandoLocal Variables:
Vamsi
@Vamsi Thanks! Esta é uma solução elegante! Eu atualizei sua solução.
Kaushal Modi

Respostas:

17

Para finalizar, aqui está uma resposta que se expande em meu comentário. Defino um modo secundário com a combinação de teclas necessária e alterno-o no buffer necessário usando variáveis ​​locais do arquivo.

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

Você pode alterná-lo nos arquivos necessários, definindo a seção de variáveis ​​locais no final do arquivo da seguinte maneira. Você também pode alterar ou adicionar a combinação de teclas aqui. Você ainda precisará definir diferentes modos secundários para cada buffer que mapeia a mesma sequência de teclas para diferentes comandos.

 # 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
fonte
@kaushalmodi: convém converter suas edições em uma resposta separada, pois é mais completa. Além disso, você não seria capaz de mapear a mesma sequência de teclas para duas funções diferentes simultaneamente, a menos que você use um nome específico de buffer.
Vamsi
Eu recebo este erro: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapquando tento executar isso(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
Eu também recebo o mesmo erro. qualquer ideia?
Zeltak
Chamada @incandescentman (make-keymap) com a :keymappalavra - chave, verifique nullprogram.com/blog/2013/02/06
nichijou
5

Aqui está uma maneira genérica de definir ligações de teclas específicas do buffer.

  • Crie um modo secundário temporário (salve o snippet abaixo nele temp-mode.ele requireno seu init.el.
  • Ative esse temp-modemodo secundário e defina o mapa de teclas desse modo secundário apenas no (s) buffer (es) necessário (s).

Coloque o Local Variablestrecho abaixo no buffer onde deseja a ligação de chave personalizada. Abaixo estão exemplos de org-modearquivos.

No buffer ONE

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

Se algum outro buffer redefinir a mesma combinação de teclas usando,

No buffer DOIS

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

então a nova ligação se tornará eficaz em fazer M-x revert-buffer.

Isto é o que eu faria se precisas alternar entre esses dois buffers com muita frequência e se precisar usar a F10ligação em ambos:

  • Trabalhe no buffer UM C-x C-s(salvar) e mude para o buffer DOIS
  • revert-buffer(atualizar ligações), trabalhe no buffer DOIS C-x C-se alterne para o buffer UM
  • revert-buffer(atualizar ligações), trabalhe no buffer UM C-x C-se mude para o buffer DOIS

Mas prefiro vincular os diferentes comandos específicos do buffer a diferentes chaves.


Modo secundário temporário

;; 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
fonte