ZSH: 履歴検索のメニュー選択自動補完

ZSH: 履歴検索のメニュー選択自動補完

ZSH には、ディレクトリの選択、kill (kill[tab][tab]) によるプロセスの選択など、強力なメニュー選択の自動補完機能があります。矢印を使用して選択肢間を移動できます。

履歴検索 (CTRL+R) のメニュー ポップアップも表示できますか? メニューで、現在の CTRL+R 検索バーの一致をナビゲートできるような方法は?

答え1

これはあなたが求めていることとは程遠いことは承知していますが、根本的な問題を解決するかもしれません。

履歴を検索すると、結果が満載のページを表示するシェル履歴拡張機能があります。また、現在のディレクトリ、git リポジトリ、終了ステータス、およびホストに基づいて、関連する結果を最初に表示します。

プロジェクトはここからインストールできます:https://github.com/curusarn/resh
CTRL+ を使用して起動しますR(逆検索を置き換えます)。
検索アプリケーションの外観は次のようになります。

検索アプリケーションのスクリーンショット

免責事項:私はこのプロジェクトの作者であり、これは恥知らずな自己宣伝です

答え2

zsh-navigation-toolsは、次のような機能があります。 oh-my-zsh を使用する場合は、zsh-navigation-toolsを追加するだけplugins=(...).zshrc、Ctrl + R で、上/下および検索/フィルタリング付きのスクロール履歴が表示されます。 oh-my-zsh がなくても使用できますが、セットアップに手間がかかりそうです。

答え3

  1. 私の知る限りでは、ありません。

  2. 多分あなたが試したいのはpredict-on、あなたが尋ねていることに関連したことを実行する です:

    autoload -U predict-on
    zle -N predict-on
    zle -N predict-off
    bindkey '^X1' predict-on
    bindkey '^X2' predict-off
    

答え4

それは可能です。原則として、_kill履歴イベントでも機能するように完了を変更しました。

次に例を示します。エントリを選択した後、[ENTER] キーを 1 回押してイベント番号を受け入れ (コマンド ラインには fe と表示されますhc 780)、もう一度 [ENTER] キーを押してコマンドを実行します。(実行前にコマンド ラインを変更する場合は、fcの代わりにを使用します)。hc

$ hc Makefile[TAB]
history event
 1906  9.3.2013 18:10  vi Makefile
 1867  9.3.2013 17:26  less Makefile
  780  3.2.2013 17:54  cat Makefile                
  776  3.2.2013 17:51  cat ../Makefile     

これを使用するには、追加されたファイルを のディレクトリに配置し$fpath、 に次の行を追加します~/.zshrc

zstyle ':completion:*:historyevent' command 'fc -dE -lr 1'
zstyle ':completion:*:historyevent' sort no

最後に、新しいzshセッションを開始します。

注意してください。これは手っ取り早い解決策ですが、しばらくの間はうまく機能していました。


_歴史イベント

#autoload

local out histevent list expl match desc listargs all nm ret=1

_tags historyevent || return 1

all=(-U)
match="*[[:blank:]]*[[/[:blank:]]$PREFIX*$SUFFIX*"
nm="$compstate[nmatches]"

out=( "${(@f)$(_call_program historyevent fc -l 2>/dev/null)}" )
desc="$out[1]"
out=( "${(@M)out[2,-1]:#${~match}}" )

histevent=( "${(@)${(@M)out##[^0-9]#[0-9]#}##*[[:blank:]]}" )

if zstyle -T ":completion:${curcontext}:historyevent" verbose; then
  list=( "${(@Mr:COLUMNS-1:)out}" )
  desc=(-ld list)
else
  desc=()
fi

_wanted processes expl 'history event' \
    compadd "$@" "$desc[@]" "$all[@]" -a - histevent && ret=0

if [[ -n "$all" ]]; then
  zstyle -s ":completion:${curcontext}:historyevent" insert-ids out || out=menu

  case "$out" in
  menu)   compstate[insert]=menu ;;
  single) [[ $compstate[nmatches] -ne nm+1 ]] && compstate[insert]= ;;
  *)      [[ ${#:-$PREFIX$SUFFIX} -gt ${#compstate[unambiguous]} ]] &&
              compstate[insert]=menu ;;
  esac
fi

return ret

_fc

#compdef fc

local curcontext="$curcontext" line state ret=1

_arguments -C \
   '-e[editor command]' \
   '-l[list last history events]' \
   '-n[suppress numbers]' \
   '-r[reverse order]' \
   '*:history event:->historyevent' && ret=0

if [[ -n "$state" ]]; then
  _alternative \
    'historyevent:: _historyevent' && ret=0
fi

return ret

関連情報