任何人都知道有一種方法可以讓 zsh 向我顯示如果我現在按回車鍵的話我將位於的父目錄的預覽嗎?
例如,如果我在目錄樹的深處,並且我開始輸入....
(它擴展為../../..
),我想預覽最高的資料夾名稱,我最終會在目錄樹上進行這三個跳躍。
答案1
....
我想to的擴充../../..
是即時發生的,所以你有一個特殊的鍵綁定.
。我也是,靈感來自
Jérémie Roquet 關於 zsh 用戶郵件的帖子列表。我擴展了這個函數,呼叫它magic-dot
來顯示路徑,後面會提到迷你緩衝區,即在命令列下方:
user@linux:~/foo> ls ../../
[ /home/ ]
我的程式碼有一些缺點:
- 它沒有經過優化,而且讀起來非常難看(它甚至用於
perl
生成輸出) - 當符號連結發揮作用時它會失敗
- 迷你緩衝區未清除,因此在執行命令後可能仍然可見
(第 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 文件中還有哪些其他技術。