como adicionar uma chave de prefixo a todas as combinações de teclas de um modo específico?

7

Estou usando um modo, mas não estou acostumado a suas combinações de teclas: algumas delas conflitam com as globais do emacs. Então, eu quero adicionar um prefixo de ligação a todas as suas associações de teclas existentes.

por exemplo, se my-mode definir ligação de tecla M-]para my-mode-shot , estou procurando algumas maneiras da seguinte maneira:

(define-prefix-for-mode 'my-mode (kbd "C-c m"))

então a ligação das teclas para o meu modo-tiro agora é C-c m M-].

como adicionar um prefixo de ligação a todas as associações disponíveis de um modo específico?

象 嘉 道
fonte
11
Pode depender do tipo de modo. Você pode dar detalhes?
Stefan
@ Stefan Estou procurando uma solução geral, não um modo específico.
12166
Uma solução que funcione de maneira confiável para todos os modos é provavelmente impossível. Você provavelmente pode criar uma solução, usando o código que forneci, que funcionará para os principais modos, embora.
Stefan

Respostas:

4

Uma maneira de mover as teclas de atalho do -mode poderia ser com algo como

(let ((origmap <foo>-mode-map)
      (newmap (make-sparse-keymap)))
  (define-key newmap <prefix> origmap)
  (setq <foo>-mode-map newmap))  

Mas esse código falhará se for executado antes da execução do modo foo. E não terá efeito se for executado após o modo ser inserido. Então você provavelmente terá que fazê-lo dentro do modo `(with-eval-after-load '...).

Além disso, se for um modo menor, o código acima também não terá efeito, porque você também precisa fazer algo como (dentro do acima let):

(setcdr (assq '<foo>-mode minor-mode-map-alist) newmap)
Stefan
fonte
2
  1. Defina uma chave de prefixo para o mapa de teclas do modo.
  2. Defina as outras teclas que o incomodam nesse mapa de teclas.

Suponha que o modo de foo-modechave liga-se C-x oa foo-it, e você não faz assim.

(define-key foo-mode-map (kbd "C-x o") nil)

E suponha que você queira foo-mode-mapna chave de prefixo <f9>:

(define-prefix-command 'foo-mode-map)
(define-key global-map (kbd "<f9>") 'foo-mode-map)
Desenhou
fonte
Isso também fará com que foo-itnão fique disponível via <f9> C-x o, o que pode ser autodestrutivo se o objetivo for afastar as combinações de teclas e permanecer acessível através da tecla de prefixo.
Nispio
1

Você pode modificar o mapa de teclas do modo diretamente para mover todas as ligações sob o prefixo escolhido:

(setcdr my-mode-map
  `(keymap (?\C-c keymap (?m keymap . ,(cdr my-mode-map)))))
Gilles 'SO- parar de ser mau'
fonte