Como navegar na pesquisa reversa do bash?

40

O Bash oferece a funcionalidade de reverter a pesquisa via Ctrl+ R. Em seguida, pode-se digitar uma parte de um comando para mostrar uma entrada apropriada do histórico.

Suponha que esta é minha história:

vim foo1
vim foo2 # I want to go here
vim foo3 # this is where I land, how to go back?

Eu procuro por foo. Pressionar Ctrl+ Rnovamente mostra a próxima entrada de pesquisa apropriada. Muitas vezes acontece comigo que sou rápido demais e navego além do resultado pretendido e vim foo3é mostrado e agora quero voltar para vim foo2.

Portanto, minha pergunta é: como navego na pesquisa reversa?

k0pernikus
fonte
Qual terminal você usa? Por exemplo. gnome-terminal, konsole, assim por diante ...
varesa
11
Bem, eu não estou muito familiarizado com ele ... A chave deve ser ctrl + S, mas alguns terminais parecem comer a chave, antes que ele atinja o inverso-search
varesa
Ctrl + shift + R - pesquisa para a frente enquanto ctrl + R
devansvd
Relacionados: stackoverflow.com/questions/791765/...
k0pernikus

Respostas:

36

Você pode acessar isso através da forward-search-historyfunção à qual está vinculado por padrão ctrl+s. Infelizmente, ctrl+sé usado para sinalizar xoffpor padrão, o que significa que você não pode usá-lo para alterar a direção da pesquisa. Existem duas soluções para solucionar o problema, uma desativando o envio da xoff/xonsinalização e a outra alterando a tecla de atalho paraforward-search-history

Desativar xon / xoff

Execute stty -ixonno seu terminal ou adicione-o ao seu ~/.bashrc. Isso permite que você use ctrl+spara usar a forward-search-historyfunção de histórico.

Para obter mais informações sobre o fluxo de controle, consulte Como descongelar depois de pressionar acidentalmente Ctrl-S em um terminal? e algumas das respostas

Alterar a combinação de teclas

Se você não quiser alterar o comportamento padrão, ctrl+spode alterar a combinação de teclas forward-search-historycom bind. Como a maioria das chaves já está definida no bash, talvez você precise ser criativo:

bind "\C-t":forward-search-history

Isso será vinculado ctrl+tao histórico de pesquisa direta, mas lembre-se de que, por padrão, ctrl+té executadotranspose-chars

Ulrich Dangel
fonte
Eu tentei a sua primeira solução stty -ixonno zshe ele funciona muito bem. No entanto, existem efeitos colaterais possivelmente indesejados na desativação da xoff/xonsinalização?
estudante de
@student Não é mais possível ctrl+spausar a saída do terminal. Se você nunca usou antes isso não é problema
Ulrich Dangel
11
Pelo que vale, fui com a segunda solução. Coisas boas ! Eu nunca soube que você poderia congelar o console pressionando C-s.. muito útil ao usar a cauda nos logs do servidor. Arrumado ! (Eu gostaria de ter uma outra upvote :))
Ashutosh Jindal
Não consegui obter a opção 2 para trabalhar no OSX. Eu tive que fazer isso:bind '"\C-t": history-search-forward'
stiemannkj1 26/03
0

Como alternativa à pesquisa reversa básica e à pesquisa direta fornecida pelo seu bash, convém procurar:

fzf , um "localizador nebuloso de linha de comando" auto-descrito.

Ele pode substituir a pesquisa reversa padrão do seu bash (e outros terminais).

Seus benefícios são que:

  • imprime uma lista de seus comandos do histórico
    • alterna a ordem cronológica ou de relevância pressionando Ctrl + R novamente
  • pode ser navegado através das teclas de seta (ou Ctrl + J / Ctrl + K)
  • permite procurar várias agulhas

Meu fluxo de trabalho agora se baseia completamente no fzf na pesquisa reversa básica em máquinas sobre as quais tenho controle.

k0pernikus
fonte