Eu quero encontrar a alternativa para ctrl + R para pesquisar o histórico no bash. Posso habilitar o modo vi no bash, mas não consigo fazer uma pesquisa. Quando eu faço /search
ou ?search
nada acontece. Há algo mais que devo pressionar? Tentei pressionar Enter e isso aconteceu:
$ set -o vi $ ls|grep f $ /gr -bash: /gr: No such file or directory $
Comentários
Resposta
Certamente há um estilo Vim pesquisando em bash / readline. Na verdade, sua linha de comando é essencialmente uma versão reduzida do editor Vim com um número significativo de comandos do modo Normal disponíveis para você. Mais sobre isso em um segundo, mas primeiro Pesquise. A informação principal de que você precisa é que, ao olhar para aquele cursor piscando na linha de comando, você está no equivalente ao modo de inserção do Vim. Então, como vamos para o modo normal? Pressionando Esc , é claro.
A partir daí, pressione / , insira um termo de pesquisa e pressione Enter . Agora você pode usar n e N para mover para frente e para trás pelos resultados. (Você estará efetivamente pesquisando para trás por padrão com n
… pesquisando para frente desde o início não forneceria nenhum resultado, já que não há histórico no futuro!) Para executar o resultado atual como um comando, pressione Enter novamente.
Não se esqueça de que você ” No entanto, você está no modo Normal, portanto, se você não encontrar o que está procurando e quiser voltar a inserir texto no modo Inserir, faça o que costuma fazer no Vim. Bater em i , por exemplo, vai resolver. Ou você pode usar o comando do Vim C
que removerá qualquer texto após o cursor e entrará no modo Inserir, o que é útil. (Você pode preceder com 0
se moveu o cursor além da primeira coluna.) Ou use A
, a
, R
, s
, s
, I
, Ctrl-C
… você entendeu.
Além dos vários comandos que entram no modo Inserir, você pode navegar com b
, B
, e
, E
, w
, W
, 0
, $
, etc. Yank / delete / put também estão lá, e você pode usá-los neles em ação + comandos de navegação como yB
, c2e
, d$
, etc. 1 Finalmente, u
ndo também funciona! Vá em frente e experimente outras coisas você mesmo.
Ah, e se você ficar um pouco perdido ou, como acontece comigo de vez em quando, alguma coisa desagradável com quebra de linha embaralhar seu c / l, você pode deixar de fingir e clicar em v
. Isso puxa o conteúdo da linha de comando para uma instância real do Vim para que você possa editar com um Editor de texto totalmente armado e operacional . Uma vez feito isso, :wq
para enviar o que você tem ao shell para execução.
1 Infelizmente, o operador + comandos de movimento (caw
, dis
, yap
, etc.) não são suportados. Mas o comentário de @EdNeville “abaixo tem um link para algumas configurações de readline que aparentemente adicionará cada comando op-motion existe, assim como uma série de outros. Você pode realmente aprimorar sua experiência Vim baseada em linha de comando adicionando-os ao seu arquivo .inputrc.
Informações adicionais : você não está restrito a usar apenas o que set -o vi
ou set -o emacs
oferece. Você pode usar qualquer um dos comandos readline disponíveis. Acredito que Ctrl-R
deva estar disponível mesmo no modo Vim, mas se não, você pode tentar colocando isso em seu ~/.inputrc
…
set editing-mode vi "\C-r": reverse-search-history "\C-s": forward-search-history
Melhor ainda, você pode adicionar alguns comandos não disponíveis como
"\C-o": operate-and-get-next
Com isso, depois de selecionar um comando do histórico (por exemplovia pesquisa do Vim) pressione Ctrl-O
em vez de Enter
e o Bash executará o comando e inserirá o próximo comando do histórico, pronto para ser executado.
Consulte a seção Nomes de comandos de linha de leitura na página de manual do Bash para obter a lista completa.
(Você também pode configurá-los na linha de comando com bind
comando, mas já estou indo muito longe aqui.)
Comentários
- Bom. Um momento de aprendizado.
- @niklas, esta é sua resposta
- @glennjackman Eu uso bastante essa funcionalidade. Muito útil para mim.
- @NiklasRosencrantz Sim, entendi. Nós tente escrever respostas que sejam geralmente úteis, em vez de focadas apenas no questionador, então adicionei informações extras sobre como misturar comandos de modos diferentes.
- Você também pode adicionar coisas como
ciw
se você modificar .inputrc: usenix.org.uk/content/bash.html#input
Resposta
O que @ B-Layer mencionou funciona muito bem no bash e similarmente no zsh.
Uma vez que você já está usando o VIM , e se você estiver usando neovim
ou vim8
, você também pode tentar :terminal
, que irá abrir o terminal padrão em vim
.
Depois, você pode usar o comando vim para navegar pela saída do terminal, bem como navegar pelo histórico dos comandos do terminal.
Ref.
<C-r>
realmente não está funcionando para você no modo vi para readline? Funciona bem para mim com a versão mais recente do bash.<C-r>
é o modo emacs e quero aprender modo vi.<C-r>
é apenas uma pesquisa recursiva; não tenho certeza se tem algo a ver com emacs vs vi, especialmente porque pode ser uma extensão específica do bash (minha memória está confusa nesse detalhe). Não estou desencorajando você de usar/
, apenas que cada um tem seus (diferentes) usos.