ZSH:上下キーの検索履歴?


22

現在、.zshrcには次のものがあります。

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

ただし、これはスペース文字が発生する前の現在の入力の内容と一致しているようです。たとえば、sudo ls /で始まる履歴内のすべての行に一致しますがsudo、入力全体に一致する行のみに一致するようにします。(つまりsudo ls /etc一致しますが、一致しませんsudo cat /var/log/messages

目的の動作を得るには、何を変更する必要がありますか?

関連する場合の私の.zshrc全体を以下に示します。https ://gist.github.com/919566

回答:


9

これは文書化された動作です:

down-line-or-search
バッファ内の行を下に移動します。すでに最下行にある場合は、バッファ内の最初の単語で始まる行を履歴内で前方に検索します。

あなたが望むものを正確に実行する既存のウィジェットはないようですので、あなたはあなた自身のものを作らなければなりません。のように動作するウィジェットを定義する方法を次に示しますが、up-line-or-search検索文字列として最初の単語ではなく、行の先頭(カーソルまで)を使用します。特に複数行の入力ではなく、実際にはテストされていません。

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

別の方法はを使用するhistory-beginning-search-backwardことですが、カーソルが最初の行にある場合にのみ呼び出します。未テスト。

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

おかげで、最初の解決策は非常にうまく機能しますが、1つの問題があり、解決に役立つことを願っています。空の入力でup-line-or-search-prefixを呼び出すと、最後の実行コマンド(目的の動作)が得られます。ただし、up-line-or-search-prefixを再度実行すると、入力の最初の文字に対してup-line-or-searchが実行されます。空の入力で上矢印を押すと履歴がスクロールするように、何らかの形で変更することは可能ですか?
rps

@rpsあ、ああ、最初の単語を拾っていたのは、引数がなかったからです(本来あるべき空の代わりに)。編集したバージョンを使用します。
ジル 'SO-悪であるのをやめる'

33

zshは、以下を使用してこの機能を提供します

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

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


ctrl+で正確なキーコードを見つけるvKEY


ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
など


1
異なる端末間で機能するキーコードの代替は、zprezto [ 1 ]にあります。<kbd> Up </ kbd>は$terminfo[kcuu1]、<kbd> Down </ kbd>は$terminfo[kcud1]です。
ジャスティンC

8

2013年のこのブログ投稿では、カーソルの前のすべての単語に一致するキーバインドをいくつかお勧めしています。

# 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

(この回答の以前のバージョンで$terminfoは、ブログ投稿のコメントの1つで推奨されていたように使用していました。いくつかのterminfo値はここにリストされています。)


1
また、zshは、これらの親しみやすいエイリアス(少なくともubuntuパッケージ内)を/etc/zsh/zshrc、などで提供し$key[Up]ます。
zzxyz

使用$terminfoする場合は、ターミナルモードを変更する必要があります。こちらをご覧ください
トム・ヘイル

$key[]代わりに使用する回答を編集しました$terminfo[]。これが読者にとってうまくいくことを願っています!
joeytwiddle

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.