O Visual Studio tem esse recurso interessante, onde você pode colocar um ponto em algo, pressionar C-f3
e ele encontrará a próxima instância da coisa sob o ponto e ela se lembrará. Você pode pressionar f3
para encontrar a próxima instância e S-f3
procurar a mesma coisa, mas para trás.
Eu posso fazer a mesma coisa no Emacs usando algum elisp que escrevi. (É volumoso e tenho certeza ruim, então vou omitir).
O que eu gostaria de fazer é ativar a funcionalidade semelhante para, digamos, f2
, f3
, f4
, e f5
. Assim, pressionar pressionando C-f2
procura a coisa sob o ponto, salvando-a em uma variável / matriz / símbolo de associação em algum lugar; pressionar C-f3
uma coisa diferente faz com que o emacs salve a segunda coisa a ser salva em uma variável distinta, para que eu possa pesquisar pela primeira coisa pressionando f2
no futuro, e eu posso procurar pela segunda coisa pressionando f3
no futuro.
Eu adoraria criar uma única função para o Control-X, outra apenas para o X simples e uma terceira para o Shift-X, mas não tenho certeza de como abordar isso.
É melhor que a função solicite o pressionamento de tecla atual (a la this-single-command-keys
) ou encontre uma maneira de passar um parâmetro para a função interativa ( sem avisar o usuário, pois ele já pressionou uma tecla)?
Como se passa informações adicionais para uma função interativa?
fonte
C-u
; ou, solicitando que o usuário insira uma seleção no minibuffer ou peça ao usuário para escolher uma chave específica; por exemplo, pressione 1 para foo, pressione 2 para bar, pressione 3 para baz. [Cerca de 90% de toda a pergunta é interessante , mas não relevante para a última pergunta / resposta (na minha opinião). A segunda à última pergunta busca uma opinião .]Respostas:
Você pode vincular um comando a várias seqüências de teclas e acessar a sequência de teclas de chamada no comando com
this-command-keys
. Isso é demonstrado com o seguinte código. Há o mesmo comandomy-command
é indiretamente ligado às sequências de teclasF9
,C-c a
, eC-c b
. Desse modo, "indiretamente" significa que existe um invólucro finomy-command-wrapper
. Esse wrapper é usado como comando interativo e é mantido muito simples. Ele não deve ser instrumentadoedebug-defun
porque o valor de retorno dathis-command-keys
sessão de depuração não faz sentido.O código de exemplo demonstra como você pode manter históricos separados para as sequências de teclas de chamada separadas.
Se você chamar as seqüências de teclas na primeira vez, ou com o prefixo arg ou com o modificador shift, poderá alterar o valor do argumento,
my-command
caso contrário, o último valor do argumento do histórico será usado.fonte
Vejamos isso logicamente: você deseja ter comandos quase idênticos vinculados a
C-f2
eC-f3
. A única diferença entre esses comandos é se eles armazenam a coisa em questão naf2
memória ou naf3
memória. Então você precisa construir comandos diferentes ou precisa de um único comando cujo comportamento depende de qual chave está vinculada.Você pode vincular uma chave a um comando que é construído no momento em que você cria a ligação. O argumento de comando para
define-key
e amigos não precisa ser um nome de comando na forma de um símbolo, pode ser uma expressão lambda.Isso funciona, mas não é muito bom. Por exemplo, comandos de ajuda e históricos de comandos não mostram um nome de comando.
Você pode colocar a maior parte do código em uma função e definir funções pequenas do invólucro. Para evitar repetir muito código, faça com que uma função ou macro gere as funções do wrapper.
Como alternativa, você pode definir um único comando para cada funcionalidade (primeira pesquisa, repetir para frente, repetir para trás). Isso é um pouco menos flexível (por exemplo, você não pode refazer o comando `pesquisar-coisa-no-ponto-f2 para H-sse for necessário), mas muito menos detalhado.
Um comando pode encontrar qual chave o chamou. A maneira mais fácil para você é usar a variável
last-command-event
.Não acho que sua interface proposta seja uma adição particularmente útil ao Emacs. A pesquisa básica básica do Emacs tem maneiras fáceis de pesquisar a coisa no momento e repetir pesquisas anteriores.
C-s
para iniciar uma pesquisa interativa .C-w
pela palavra,C-e
pelo restante da linha,C-y
pelo último texto copiado etc.C-s
novamente.M-p
eM-n
.fonte
Dirigindo seu caso de uso original em vez da pergunta de programação Elisp, o pacote
highlight-symbol
faz o que você deseja. Sou um usuário feliz há muitos anos.http://nschum.de/src/emacs/highlight-symbol/
Na descrição do pacote:
fonte