zsh--当'cd ../../../'时预览父目录名称

zsh--当'cd ../../../'时预览父目录名称

有人知道如何让 zsh 显示我现在按下回车键时我所在父目录的预览吗?

例如,如果我在目录树的深处,并且我开始输入....(扩展为../../..),我希望预览我在目录树中向上跳转三次后最终到达的最高文件夹名称。

答案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 文档中还有哪些其他技术。

相关内容