Qual é a melhor maneira de detectar pressionamentos de tecla (por exemplo, através de um gancho) que não editam o buffer? Quero dizer coisas como setas para apontar movimento, chamadas para beginning-of-buffer
etc.
A razão para isso é que estou trabalhando em algumas ycmd
ligações para o emacs e gostaria de poder detectar (pelo menos heuristicamente) quando o usuário parou de editar e está se movendo pelo buffer. É um bom momento para enviar o conteúdo do buffer para análise. O cliente vim faz isso quando o usuário sai do modo de inserção e estou tentando emular esse comportamento.
key-bindings
Abingham
fonte
fonte
self-insert-command
a cancelar e reagendar um cronômetro em vez de usar um cronômetro inativo. Dessa forma, mesmo que o usuário faça algo, o cronômetro não será redefinido, a menos que "algo" seja inserção de texto.after-change-functions
é um mecanismo geral para reagir a alterações de texto.post-command-hook
. Isso será acionado em tudo, portanto, você pode precisar filtrar o que o acionou antes de executar qualquer ação que desejar.buffer-chars-modified-tick
função pode ser útil.Respostas:
Adicione os seguintes ganchos:
pre-command-hook
, defina alguma variável sentinela comot
- isso indica que o comando não foi alterado.after-change-functions
, defina esse valor sentinela comonil
. (É um gancho, apenas não soa como um; obrigado a @phils por apontar isso.)post-command-hook
, verifique este valor sentinela e execute sua função.Isso pode ou não funcionar, dependendo da ordem de execução. Caso contrário, informe-me nos comentários abaixo.
Quando sair do trabalho, vou postar um exemplo.
fonte
post-self-insert-hook
(essa parte da resposta parece estar confundindo esse assunto com aconselhamentoself-insert-command
). De qualquer forma, acho que você geralmente prefeririaafter-change-functions
porque realmente faz o que deseja (como a inserção automática não é o único tipo de pressionamento de tecla que modifica o buffer).Apenas um pensamento -
Isso realmente não deve ser sobre "pressionamentos de teclas", mas sobre comandos - não importa como eles sejam executados, não ? Se bem entendi, você está realmente procurando uma maneira de saber se um determinado comando que é chamado modifica o buffer.
Nesse caso, talvez faça algo assim:
Coloque uma função em
pre-command-hook
que (1) registre o valor atual de(buffer-modified-p)
e (2) useset-modified-p
para tornar o buffer não modificado.Coloque uma função em
post-command-hook
que (1) verifica se o comando modificou o buffer (comparando o valor registrado com o novo valor atual de(buffer-modified-p)
) e, em seguida, age de acordo; e (2) se o novo valor énil
redefinido para o valor anterior à alteração usandoset-modified-p
.Tipo de mão pesada (verifica cada comando que é chamado), mas pode valer a pena tentar.
Se a parte " age de acordo " é apenas uma opção não operacional para todos os comandos de modificação de buffer e se também é uma operação não operacional para muitos comandos que não modificam (por exemplo, porque você fez isso apenas em um comando não modificado anterior), pelo menos você não fará a ação " agir adequadamente " mais do que o necessário. Mas a parte de verificação por si só pode ser cara / exagerada (desacelera demais as coisas) - tente ver.
fonte