zsh - 'cd ../../../' のときに親ディレクトリ名をプレビューする

zsh - 'cd ../../../' のときに親ディレクトリ名をプレビューする

今すぐリターンキーを押した場合に、zsh で親ディレクトリのプレビューを表示する方法を誰か知っていますか?

たとえば、ディレクトリ ツリーの非常に深いところにいるときに、入力を開始すると....( に展開されます../../..)、ディレクトリ ツリーを 3 回上までジャンプして最終的に到達する最上位のフォルダー名をプレビューしたいとします。

答え1

の展開はオンザフライで行われるため、 には特別なキーバインディングがあると....思います。私も、 に触発されて、 ../../...Jérémie Roquet の zsh ユーザー メーリング リストへの投稿リスト。この関数を拡張して、magic-dotパスを表示するために呼び出され、ミニバッファつまり、コマンドラインの下:

user@linux:~/foo> ls ../../
[ /home/ ]

私のコードにはいくつか欠点があります:

  1. 最適化されておらず、読みにくいです(perl出力を生成するためにも使用されます)
  2. シンボリックリンクが関係してくると失敗する
  3. ミニバッファはクリアされないので、コマンドの実行後も表示される可能性があります。

(ポイント 1 と 3 は修正できるはずですが、今は修正できなかったことをお詫びします。)

しかし、ほとんどの場合、私にとっては非常にうまく機能するので、自分の実験の出発点として、最小限の(実際にはそうでもない?)動作例を共有したいと思います。

PS1="$PS1o"

terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]

function zle-statusline() {
  PS1="%{${terminfo_down_sc}$1$terminfo[rc]%}$PS1o"
  zle reset-prompt
}
# taken from http://stackoverflow.com/questions/3622943/zsh-vi-mode-status-line
zle -N zle-statusline

function magic-dot() {
if [[ $LBUFFER = *. && $LBUFFER != *{*. && ${${${(z)${:-DUMMY $LBUFFER}}[-1]}[1]} != '/' ]]; then
  LBUFFER+=./
  zle-statusline "[ $(print "$(builtin pwd -P)"/${${(z)${:-DUMMY $LBUFFER}}[-1]} \
                           | perl -pe 's/\n//; $i=0; while($_=~/\.\./ && !($_=~/^\/\./)) { $i++; if($i>100) {print "INFTY!"; exit;} s/\/[^\/]+\/\.\.// }') ]"
elif [[ $LBUFFER = *../ && ${${${(z)${:-DUMMY $LBUFFER}}[-1]}[1]} != '/' ]]; then
  LBUFFER+=../
  zle-statusline "[ $(print "$(builtin pwd -P)"/${${(z)${:-DUMMY $LBUFFER}}[-1]} \
                           | perl -pe 's/\n//; $i=0; while($_=~/\.\./ && !($_=~/^\/\./)) { $i++; if($i>100) {print "INFTY!"; exit;} s/\/[^\/]+\/\.\.// }') ]"
else
  zle self-insert
fi
}
zle -N magic-dot
bindkey "." magic-dot

precmd () { PS1="$PS1o" }

答え2

おそらく、 を実行しls ../../..てから を実行できますcd ../../..; ls。これを行うことは可能ですが、zsh のドキュメントにどのような他のテクニックが記載されているかはよくわかりません。

関連情報