Como recuperar um comando anterior (sem execução) para alterá-lo?

14

Não me lembro do truque em que eu poderia obter o último comando sem executá-lo:

digamos que eu queira poder acessar o comando! 1255 ao pressionar a tecla de seta para cima e modificar o comando. Então, qual é o truque para chamar o comando, fazer com que ele seja mostrado na linha de comando, mas não executado e depois acessível através da tecla de seta para cima?

Eu tentei colocar um eco, mas depois eu tenho um eco antes do comando, não me lembro de como fazê-lo corretamente.

Arturas M
fonte
4
se eu entendi seu pedido corretamente, talvez apenas tente um sufixo de ": p" como em "! 1255: p" #
Theophrastus
@ Theophrastus sim, exatamente, eu tinha esquecido isso: parte p e não conseguia obter as palavras corretas no google para encontrá-lo ... Obrigado pessoal.
Arturas M

Respostas:

21
!1255:p

Vai fazer isso

!O recall de histórico
1255é o número da linha
:pimpresso, mas não é executado

Em seguida, você pode usar a seta para cima para recuperar o comando anterior (não executado) e alterá-lo conforme necessário.

Costumo combinar isso com hg("History Grep") - meu apelido favorito.

$ alias hg  # Maybe use hgr instead if you are a Mercurial CLI user.
alias hg='history | tail -200 | grep -i'

Ele procura texto em uma linha de histórico recente, independentemente do caso e é usado desta maneira:

Quando eu quero procurar por comandos vi recentes para editar um determinado arquivo e depois quero reutilizar um deles para editar o mesmo arquivo, mas com uma extensão de arquivo diferente.

$ hg variables
 6153  vi Variables/user-extensions.js 
 6176  vi Variables/user-extensions.js 
 6178  vi Variables/user-extensions.js 
 6190  vi Variables/user-extensions.js 
 6230  hg variables
$ # Notice the difference in case with V and v is ignored
$ !6190:p
vi Variables/user-extensions.js 
$ ["up-arrow"]
$ vi Variables/user-extensions.[now change .js to .html]

Também defino hga("History Grep All") para pesquisar em toda a minha história:

$ alias hga
alias hga='history | grep -i'

mas não o uso muito porque meu histórico é (intencionalmente) muito grande e recebo muita saída que mais tarde afeta a rolagem de volta pelas páginas do meu terminal.

Michael Durrant
fonte
2
Observe que hgtambém é a CLI do Mercurial .
usandfriends
1
Boa nota. Adicionado para responder.
quer
12

Pressionar Ctrl+ R(que é a ligação das teclas de pesquisa incremental reversa do emacs como @gnp apontada nos comentários) no terminal permite pesquisar no histórico por um comando específico. O comando será mostrado e pode ser editado antes da execução. Você verá algo assim:

insira a descrição da imagem aqui

Fonte

Hamza Abbad
fonte
1
Obrigado! Não é realmente a resposta direta à minha pergunta, mas eu não sabia disso e acho realmente útil. Muito obrigado!
Arturas M
1
Também digno de nota, Ctrl + R é a pesquisa incremental reversa do emacs. Muitas combinações de teclas do emacs funcionam em várias ferramentas GNU: Ctrl + A, Ctrl + E, Ctrl + K, Ctrl + Y e outras.
GnP # 16/15
@gnp Obrigado pela informação, eu não sabia disso.
Hamza Abbad
Levei muito tempo para me acostumar com ctrl-r depois de aprender duas coisas importantes. 1. ignore a saída enquanto digita. 2. Tenha certeza que você sabe o suficiente para escrever o suficiente exclusivamente para o comando que você quer
Michael Durrant
7

o fccomando faz o que você quer

fc -l <number> listará o histórico de comandos em torno desse número

fc <number>abrirá a entrada da linha de comando vim(ou qualquer que seja o seu editor padrão, suponho), para que você possa editá-la e, depois, :wqela estará disponível com a seta para cima.

Molho
fonte
7

No bash Ctl+alt+e, a expansão do shell é digitada !1255e, em seguida, pressionada essa combinação substitui a linha atual pelo conteúdo da entrada do histórico 1255

Adônis
fonte
não fez isso por mim no Ubuntu
Michael Durrant
@ MichaelDurrant, eu apenas tentei no 14.04 (kubuntu) e funciona para mim. Está documentado em man bashcomo shell-expand-line. Talvez haja um atalho definido para o gnome-terminal.
9788 adonis
@ adonis Eu nunca conheci esse, muito obrigado, de fato, faz o que eu estava solicitando também. E, de fato, posso encontrar mais usos dessa função. Impressionante! Obrigado!
Artur M
4

Você deseja usar o comando fc enquanto especifica a lista em vez de executar (-l)

fc -ln -1
Miau
fonte