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

22

Atualmente, tenho o seguinte em meu .zshrc:

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

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

O que eu preciso mudar para obter o comportamento desejado?

Aqui está o meu inteiro .zshrc, caso seja relevante: link

    
por rps 05.07.2011 / 17:11

4 respostas

8

Este é o comportamento documentado :

down-line-or-search
Move down a line in the buffer, or if already at the bottom line, search forward in the history for a line beginning with the first word in the buffer.

Não parece haver um widget existente que faça exatamente o que você quer, 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. Realmente não foi testado, especialmente em entradas 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 chamá-lo 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
    
por 05.07.2011 / 20:13
28

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-chave exato por ctrl + v CHAVE

Ex.
ctrl + v UP
ctrl + v ABAIXO
ctrl + v PageUp
ctrl + v PageDown
etc.

    
por 12.11.2013 / 08:48
4

Esta postagem de blog de 2013 recomenda algumas associações de teclas que corresponde 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 "$terminfo[kcuu1]" up-line-or-beginning-search
bindkey "$terminfo[kcud1]" down-line-or-beginning-search

Eu usei $terminfo como recomendado em um dos comentários, então isso deve configurar o chaves corretamente, independentemente do seu terminal e ambiente.

    
por 24.05.2016 / 14:49
1

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

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

    
por 29.07.2013 / 09:59