ZSH: historia wyszukiwania na klawiszach góra i dół?

22

Obecnie w moim pliku .zshrc mam następujące elementy:

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

Wydaje się to jednak pasować do zawartości mojego bieżącego wejścia, zanim pojawi się znak spacji. Na przykład sudo ls /dopasuje każdy wiersz w mojej historii, który zaczyna się od sudo, podczas gdy chciałbym, aby dopasowywał tylko wiersze, które pasują do całego mojego wejścia. (tzn. sudo ls /etcpasuje, ale nie pasuje sudo cat /var/log/messages)

Co muszę zmienić, aby uzyskać pożądane zachowanie?

Oto mój cały plik .zshrc, jeśli jest to istotne: https://gist.github.com/919566

rps
źródło

Odpowiedzi:

9

To jest udokumentowane zachowanie :

down-line-or-search
Przejdź w dół linii w buforze lub, jeśli już znajduje się w dolnej linii, wyszukaj w historii linię rozpoczynającą się od pierwszego słowa w buforze.

Wydaje się, że nie ma istniejącego widżetu, który robi dokładnie to, co chcesz, więc musisz stworzyć własny. Oto jak zdefiniować widget, który zachowuje się tak up-line-or-search, ale używając początku wiersza (do kursora) zamiast pierwszego słowa jako ciągu wyszukiwania. Niezbyt przetestowane, szczególnie nie na wejściu wieloliniowym.

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

Można zastosować alternatywne podejście history-beginning-search-backward, ale wywołuj je tylko wtedy, gdy kursor znajduje się w pierwszym wierszu. Niesprawdzone

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- przestań być zły”
źródło
Dzięki, Gilles, twoje pierwsze rozwiązanie działa całkiem dobrze, ale jest jeden problem i mam nadzieję, że możesz mi pomóc go rozwiązać. Kiedy wywołuję prefiks up-line-lub-search na pustym wejściu, daje mi polecenie ostatniego uruchomienia - pożądane zachowanie. Jednak gdy ponownie uruchomię prefiks up-line-lub-search, wykonuje on wyszukiwanie w górę pierwszego wiersza moich danych wejściowych. Czy można jakoś coś zmienić, aby naciśnięcie strzałki w górę z pustym wejściem przewijało moją historię?
rps
@rps Ach, gotcha, zbierał pierwsze słowo, ponieważ brakowało argumentu (zamiast być pustym tak, jak powinno). Użyj mojej edytowanej wersji.
Gilles „SO- przestań być zły”
33

zsh zapewnia tę funkcjonalność za pomocą

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

Dawny.

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

Znajdź dokładny kod klucza przez
ctrl+vKEY

Dawny.
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
itd.

mudrii
źródło
1
Alternatywę dla kodów klawiszy, które mogą działać na różnych terminalach, można znaleźć w zprezto [ 1 ]. <kbd> W górę </kbd> to $terminfo[kcuu1], <kbd> W dół </kbd> to $terminfo[kcud1].
Justin C
8

Ten post na blogu z 2013 roku zaleca kilka skrótów klawiszowych pasujących do wszystkich słów przed kursorem.

# 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

(We wcześniejszej wersji tej odpowiedzi użyłem $terminfozgodnie z zaleceniami w jednym z komentarzy na blogu. Niektóre wartości terminfo są wymienione tutaj ).

joeytwiddle
źródło
1
zsh udostępnia także te bardziej przyjazne aliasy (przynajmniej w pakiecie ubuntu) /etc/zsh/zshrc, takie jak $key[Up].
zzxyz
Jeśli używasz $terminfo, musisz zmienić tryby terminalu. Zobacz tutaj .
Tom Hale,
Zredagowałem odpowiedź do użycia $key[]zamiast $terminfo[]. Mam nadzieję, że to działa dobrze dla czytelników!
joeytwiddle
1

Zobacz także projekt zsh-history-substring-search .

Oferuje to, czego szukasz, i może być nawet używany jako wtyczka oh-my-zsh.

Matthieu Napoli
źródło