Como vincular um comando com um prefixo Cu a uma chave diferente?

7

C-c C-x C-vchama a org-toggle-inline-imagesfunção. Com a tecla prefix, ele passa alguns argumentos para essa função (não sei qual).

Como posso mapear a função com argumentos para o F12botão para que faça o mesmo que C-u C-c C-x C-v?

Kossak
fonte

Respostas:

11

C-ué o argumento do prefixo universal. É frequentemente usado para comandos que possuem apenas dois estados (com e sem argumento), embora também possa ser interpretado como um prefixo numérico (4).

Nesse caso, observando o código-fonte, org-toggle-inline-imagesvejo que ele apenas verifica se o argumento está definido para que o valor específico que você passa não importe.

Você pode definir uma função que chama (org-toggle-inline-images t). Para fazer isso com uma lambda:

(define-key org-mode-map  (kbd "<f12>")
    (lambda () (interactive) (org-toggle-inline-images t)))

Isso liga F12 no modo organizacional, deixando a ligação global no lugar para outros modos.

Para mais informações sobre as combinações de teclas, é uma boa leitura: Dominando as associações de teclas no Emacs . E é claro que existem muitos detalhes no manual Emacs Lisp .

glucas
fonte
3

A resposta em geral é olhar para o código que define o comando. Em particular (mas não necessariamente apenas) as interactiveespecificações.

O que você procura é o que a função faz com um prefixo arg. E então você define um comando que faz a mesma coisa.

Normalmente, o prefixo arg é usado para definir algum valor que é passado no código para outra função. Você só precisa chamar essa outra função, passando o argumento que seria fornecido pelo prefixo arg no comando original. IOW, você normalmente pode usar o mesmo código, apenas passando um valor no lugar do valor que seria determinado a partir do prefixo arg.

Desenhou
fonte
3
Você também pode emular um C-uprefixo com este: (let ((current-prefix-arg '(4))) (call-interactively #'whatever-command)). Isso pode ser útil se você não conseguir descobrir o que o comando que está chamando está fazendo com seu argumento.
glucas
@ glucas: Isso é apropriado apenas se o prefixo específico arg usado não for relevante para o comando fornecido, ou se o comportamento que você deseja do comando for simples C-u. Não é apropriado se o comando tiver um comportamento diferente, dependendo de se plain C-ué usado ou não (por exemplo, distinção de C--ou C-3ou C-u C-uapenas C-u. Meu conselho é sempre verificar como o comando realmente trata um prefixo arg.
Drew
Verdade, bom ponto. Fornecendo apenas uma opção para o caso específico de "chame isso como se eu tivesse pressionado Cu primeiro".
glucas
@ glucas: Além do mais, no caso em que você cita, você normalmente (mas nem sempre) pode ficar sem o uso interativo e apenas passar '(4)para o comando (sem se preocupar call-interactively). (Mas isso não vai funcionar, por exemplo, se o comando não tem um parâmetro que corresponde ao prefixo arg, mas em vez disso testa current-prefix-argno corpo de comando.)
de Drew
@ glucas: Sim, foi bom que você mencionou.
Tirou