Existe um (repeat-last-command) no Emacs?

143

Freqüentemente, eu procurei em documentos e documentos procurando algo como o seguinte para desistir de voltar à tarefa em questão:

(repetir o último comando)

execute o último comando C ou M que acabei de executar (para recuperar a tecla fn)

ou às vezes os relacionados:

(descrever a última função)

que tecla foi digitada por engano, cujo efeito gostaria de adicionar à minha lista de truques. A chave de descrição está próxima, mas requer saber o que eu digitei.

Estou simplesmente pedindo demais ao meu fiel companheiro?

ack
fonte
1
Cx z (repeat)e Cx Mz (repeat-complex-command). Veja também (repeat-matching-complex-command).
Hatshepsut #

Respostas:

62

com relação a ' descrição da última função ':

Há uma variável last-commanddefinida como um símbolo representativo da última coisa que você fez. Portanto, esse trecho elisp (describe-function last-command)deve trazer a documentação para o que aconteceu imediatamente.

Então você poderia fazer um trabalho trivial describe-last-functioncomo esse

(defun describe-last-function() 
  (interactive) 
  (describe-function last-command))

Coloque esse elisp em .emacsou equivalente, e você terá uma função de descrição da última Mx .

Se você digitou algumas teclas ou fez algo que modificou o último comando desde a coisa em que está interessado, a command-historyfunção pode ser interessante. Você pode obter isso pelo histórico de comandos do Mx

cms
fonte
168

A funcionalidade de repetição é fornecida pelo repeat.elpacote Emacs Lisp, incluído nas distribuições padrão do Emacs. Da repeat.eldocumentação:

Este pacote define um comando que repete o comando anterior, seja o que for, incluindo seus argumentos, sejam eles quais forem. Este comando está conectado à chave Cx z. Para repetir o comando anterior uma vez, digite Cx z. Para repetir uma segunda vez imediatamente depois, digite apenas z. Digitando z repetidamente, você pode repetir o comando repetidamente.

Para ver informações adicionais sobre o comando repeat, digite C-h F repeat RETno Emacs.

Emerick Rogul
fonte
160

Repita o último comando

C-xz

Depois de pressioná-lo, basta pressionar apenas z depois e ele será repetido (sem ter que pressionar C-xnovamente).

Johannes Schaub - litb
fonte
Exatamente o que eu esperava que fizesse.
Vasantha Ganesh K
81

Sim, existe um comando de repetição . É chamado repeat:

  • Você pode repetir comandos com C-x ze pressionar zpara continuar repetindo.

Um pouco chocante que ninguém mencionou repeat-complex-command, disponível na ligação de teclas C-x ESC ESC.

ashawley
fonte
2
semelhante ao Mx Mp, exceto que o comando repeat-complex-repeat repete argumentos anteriores.
Yoo
5
Também em C-x M-:(mnemônico: like, M-:mas com a expressão elisp já preenchida para você).
phils
6
Sim, chocante mesmo . A resposta aceita não é a melhor resposta aqui, IMO (mas o OP parece achar que corresponde melhor à sua pergunta). Para mim, essa resposta está mais próxima do que a pergunta escrita pediu (repita o último comando). E as possibilidades oferecidas por repeat.el(que subsumem C-x z z z...) são as segundas mais próximas. Na segunda pergunta feita, sobre quais teclas foram pressionadas por último, a melhor resposta é C-h l( view-lossage). Há pouco uso, IMHO, de um describe-last-commandcomando.
Drew
Você também pode usar C-x M-:como parte de uma macro do teclado, o que pode ser útil. As repeat-complex-commandligações padrão são um pouco complicadas para digitar repetidamente.
remcycles
24

Além disso, M-x view-lossagemostra as últimas centenas de teclas digitadas (?) Que você digitou. Então, você poderá ver onde está o comando. É o que eu usei até agora descobrir sobre o M-x command-historyque acho que vou usar C-h wagora.

quodlibetor
fonte
18

Não tenho muita certeza, mas talvez você esteja procurando por este?

O comando C-xz( repeat) fornece outra maneira de repetir um comando do Emacs várias vezes. Este comando repete o comando anterior do Emacs, seja o que for. Repetir um comando usa os mesmos argumentos que foram usados ​​anteriormente; ele não lê novos argumentos a cada vez.

Emacs Manual, 8.11 Repetindo um comando

eco
fonte
2
e, como observado por Johannes Schaub, prensas subsequentes zpor conta própria continuarão a repetição.
phils
9

Pode ser que isso ajude também ... Do emacs Help, literalmente:

C-x M-ESC runs the command repeat-complex-command
  which is an interactive compiled Lisp function in `simple.el'.
It is bound to <again>, <redo>, C-x M-:, C-x M-ESC.
(repeat-complex-command ARG)

Edit and re-evaluate last complex command, or ARGth from last.
A complex command is one which used the minibuffer.
The command is placed in the minibuffer as a Lisp form for editing.
The result is executed, repeating the command as changed.
If the command has been changed or is not the most recent previous command
it is added to the front of the command history.
You can use the minibuffer history commands M-n and M-p
to get different commands to edit and resubmit.
Murali VP
fonte
4

Pessoalmente, achei a idéia de Sebastian útil. Aqui está uma versão de trabalho

(global-set-key "\C-r" #'(lambda () (interactive)
                                 (eval (car command-history))))
sabof
fonte
2
Considerando que isearche isearch-backwardsão importantes comandos de navegação, e que este último está vinculado a <kbd> Cr </kbd> por padrão, provavelmente seria possível encontrar uma ligação melhor para o comando repeat. Em um Mac, sugiro Command (super) -Y, pois alguns aplicativos já têm a convenção de usá-lo como o oposto de 'desfazer'.
Brighid McDonnell
0

Isso é antigo, mas o Google aparece primeiro quando eu estava tentando recuperar o último comando digitado no prompt do Emacs. Nenhuma dessas respostas funcionou para mim, então eu decidi colocar meus dois centavos para aqueles que pudessem tropeçar mais tarde como eu. Estou usando o Portacle, mas achei o que estava procurando aqui, então espero que seja genérico o suficiente para trabalhar com configurações diferentes. Enfim, o que funcionou para mim é usar C-↑e C-↓percorrer a história. Usando M-pe M-nfuncionando também, mas prefiro usar as setas, pois uso o Bash um pouco.

Doug F
fonte