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?


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)

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)

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)))))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.