zsh - 當「cd ../../../」時預覽父目錄名稱

zsh - 當「cd ../../../」時預覽父目錄名稱

任何人都知道有一種方法可以讓 zsh 向我顯示如果我現在按回車鍵的話我將位於的父目錄的預覽嗎?

例如,如果我在目錄樹的深處,並且我開始輸入....(它擴展為../../..),我想預覽最高的資料夾名稱,我最終會在目錄樹上進行這三個跳躍。

答案1

....我想to的擴充../../..是即時發生的,所以你有一個特殊的鍵綁定.。我也是,靈感來自 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 文件中還有哪些其他技術。

相關內容