Como executo uma pesquisa de histórico reverso no modo vi do ZSH?

47

Eu uso vimbasicamente todas as minhas necessidades de edição, então decidi tentar novamente o modo vi para o meu shell (atualmente ZSH w / oh-my-zsh no OS X), mas me pego tentando (e falhando) usá-lo Ctrl-Rconstantemente. Qual é a ligação de chave equivalente? E para referência futura, como eu mesmo descobriria isso? Tenho certeza que eu poderia usar bind -Pno bash.

Hank Gay
fonte
2
De acordo com o 'man zshzle', a pesquisa incremental de histórico para trás não é vinculada nos modos Vi (vicmd, viins) por padrão.
paul

Respostas:

56

Você pode executar bindkeysem argumentos para obter uma lista de ligações existentes, por exemplo:

# Enter vi mode
chopper:~> bindkey -v

# Search for history key bindings
chopper:~> bindkey | fgrep history
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[[A" up-line-or-history
"^[[B" down-line-or-history

No modo emacs, a ligação que você deseja é history-incremental-search-backward, mas não está vinculada por padrão no modo vi. Para vincular Ctrl-R, você pode executar este comando ou adicioná-lo ao seu ~/.zshrc:

bindkey "^R" history-incremental-search-backward

A página de zshzlemanual ( man zshzle) tem mais informações sobre os modos de editor de linha, bindkey e emacs / vi do zsh.

mrb
fonte
3
Obrigado, particularmente por zshzle. Isso é bastante informativo e útil.
Hank Gay
Eu te amo. A sério. Após a atualização para o OSX El Capitan, a pesquisa reversa desapareceu e eu perdi mais do que tudo no meu fluxo de trabalho diário.
Christian
24

Essa é uma pergunta antiga, mas a única resposta (e aceita) basicamente explica como transplantar o "emacs-like" history-incremental-search-backwardpara o modo vi. Embora isso seja perfeitamente factível e possa ser a solução certa para você, é um pouco estranho que ninguém tenha mencionado a "maneira vi" de pesquisar na história.

O modo vi no zsh suporta o histórico de pesquisa usando as teclas vi / vim padrão: /e ?, ambas disponíveis no modo de comando. (Pressione <Esc>para alternar do modo de inserção para o modo de comando, assim como no vi ou vim.)

O sentido deles é invertido: porém, como você normalmente deseja pesquisar o histórico do seu shell ao contrário, /faz uma pesquisa reversa, enquanto ?faz uma pesquisa direta.

Depois que o primeiro hit é exibido, você pode (como no vi / vim) usar npara continuar encontrando mais hits na mesma direção ou Npara reverter a direção da pesquisa.

As ligações de teclas padrão relevantes no vicmdmapa de teclas são:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search
wjv
fonte
2
Também é bom usar "^P" history-beginning-search-backwarde "^N" history-beginning-search-forwardpara o preenchimento automático do tipo vim (você começa a digitar e depois pressiona ctrl+pou ctrl+n).
Cprn 31/10/16
Para mim, ?traz à tona bck-i-search, que é exatamente o que eu estava procurando. Obrigado.
precisa
@wjv a vantagem do histórico-incremental-pesquisa-para trás é que ele suporta padrões glob. O padrão /ou `? ' doesnt: coderwall.com/p/-jvcag/zsh-reverse-history-search-with-regex
alpha_989
@ alpha_989 A postagem do blog que você mencionou está incorreta. Pode ser que o autor tenha alguma “estrutura” zsh instalada que sobrecarregue a ^Rcombinação de teclas. O único caractere "semelhante à regex" suportado por ambos history-search-backwarde history-incremental-search-backwardé ^ancorar a sequência de pesquisa no início da linha. O poder real history-incremental-search-backwardé que ele faz uma pesquisa incremental, como o próprio nome sugere. Eu posso imaginar que alguém pode querer vinculá-lo no vicmdmapa de chaves por esse motivo.
Wjv 17/04
@ wjv, você está certo .. Eu deveria ter escrito history-incremental-pattern-search-backward, não history-incremental-search-backward. history-incremental-pattern-search-backwardstalvez um widget .. mas acho que ele vem instalado por padrão no zsh. Ele suporta globpadrões regexque você não apontou corretamente: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators . Há de fato um erro no post ..
alpha_989