Como executar a pesquisa de histórico no modo Vi no bash

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

  • É <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.
  • @ D.BenKnoble Sim, é, mas acho que <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.

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.

  1. http://vimcasts.org/episodes/neovim-terminal/
  2. https://neovim.io/doc/user/nvim_terminal_emulator.html
  3. https://github.com/vim/vim/blob/master/runtime/doc/terminal.txt

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *