ZSH: histórico de pesquisa nas teclas para cima e para baixo?

22

Atualmente, tenho o seguinte no meu .zshrc:

bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

No entanto, isso parece corresponder apenas ao conteúdo da minha entrada atual antes que um caractere de espaço ocorra. Por exemplo, sudo ls /corresponderá a todas as linhas da minha história que começam com sudo, enquanto eu gostaria que correspondesse apenas às linhas que correspondem a toda a minha entrada. (ou seja sudo ls /etc, corresponderia, mas não sudo cat /var/log/messages)

O que preciso mudar para obter o comportamento desejado?

Aqui está todo o meu .zshrc, caso seja relevante: https://gist.github.com/919566

rps
fonte

Respostas:

9

Este é o comportamento documentado :

down-line-or-search
Mova para baixo uma linha no buffer ou, se já estiver na linha inferior, procure no histórico uma linha que comece com a primeira palavra no buffer.

Não parece haver um widget existente que faça exatamente o que você deseja, então você terá que fazer o seu próprio. Veja como definir um widget que se comporta como up-line-or-search, mas usando o início da linha (até o cursor) em vez da primeira palavra como string de pesquisa. Não é realmente testado, especialmente não na entrada de várias linhas.

up-line-or-search-prefix () {
  local CURSOR_before_search=$CURSOR
  zle up-line-or-search "$LBUFFER"
  CURSOR=$CURSOR_before_search
}
zle -N up-line-or-search-prefix

Uma abordagem alternativa é usar history-beginning-search-backward, mas apenas a chame se o cursor estiver na primeira linha. Não testado.

up-line-or-history-beginning-search () {
  if [[ -n $PREBUFFER ]]; then
    zle up-line-or-history
  else
    zle history-beginning-search-backward
  fi
}
zle -N up-line-or-history-beginning-search
Gilles 'SO- parar de ser mau'
fonte
Obrigado, Gilles, sua primeira solução funciona muito bem, mas há um problema e espero que você possa me ajudar a resolvê-lo. Quando eu chamo prefixo up-line-or-search em uma entrada vazia, ele me fornece o último comando de execução - o comportamento desejado. No entanto, quando executo o prefixo up-line-or-search novamente, ele faz um up-line-or-search no primeiro caractere da minha entrada. É possível alterar de alguma forma as coisas para que pressionar a seta para cima com uma entrada vazia percorra meu histórico?
rps
@rps Ah, entendi, estava pegando a primeira palavra porque o argumento estava faltando (em vez de estar vazio como deveria). Use minha versão editada.
Gilles 'SO- stop be evil' '
33

O zsh fornece essa funcionalidade usando

history-beginning-search-backward
history-beginning-search-forward

Ex.

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

Encontre o código exato da tecla
ctrl+vKEY

Ex.
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
etc.

mudrii
fonte
1
Uma alternativa para códigos-chave que podem funcionar em diferentes terminais pode ser encontrada em zprezto [ 1 ]. <kbd> Acima </kbd> é $terminfo[kcuu1], <kbd> Abaixo </kbd> é $terminfo[kcud1].
22615 Justin C #
8

Este post de 2013 recomenda algumas combinações de teclas que correspondem a todas as palavras antes do cursor.

# Cycle through history based on characters already typed on the line
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "$key[Up]" up-line-or-beginning-search
bindkey "$key[Down]" down-line-or-beginning-search

(Em uma versão anterior desta resposta, eu usei $terminfocomo recomendado em um dos comentários na postagem do blog. Alguns valores terminfo estão listados aqui .)

joeytwiddle
fonte
1
O zsh também fornece esses alias mais amigáveis ​​(pelo menos no pacote ubuntu) /etc/zsh/zshrc, como $key[Up].
zzxyz
Se estiver usando, $terminfovocê precisará alterar os modos do terminal. Veja aqui .
Tom Hale
Eu editei a resposta para usar em $key[]vez de $terminfo[]. Espero que isso funcione bem para os leitores!
joeytwiddle
1

Veja também o projeto zsh-history-substring-search .

Ele oferece o que você está procurando e pode até ser usado como um plugin oh-my-zsh.

Matthieu Napoli
fonte