是的,可以将目录折叠为首字母路径,并在按下 [Tab] 键时让 Z Shell 展开该路径。我只需使用 compinstall(与 Zsh 一起安装的 zsh 实用程序脚本)生成以下代码。要注意扩展路径元素的重要部分位于第六个 zstyle
命令附近的末尾括号中的字符,用于将完成点与包括 /
的字符分隔开来,这当然是目录分隔符。有了这个,您建议的唯一路径将完全填满,只需按一次 [Tab] 就像每个路径名称唯一字母的结尾处有 *
一样。
# The following lines were added by compinstall
zstyle ':completion:*' add-space true
zstyle ':completion:*' completer _list _expand _complete _ignored _match _correct _approximate _prefix
zstyle ':completion:*' completions 1
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]} r:|[._-]=* r:|=*' 'm:{[:lower:]}={[:upper:]} m:{[:lower:][:upper:]}={[:upper:][:lower:]} r:|[._-]=* r:|=*' 'r:|[._-/]=* r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' match-original both
zstyle :compinstall filename '/home/micah/.zsh/.zshrc'
autoload -Uz compinit
compinit
# End of lines added by compinstall
关于首先创建独特路径并将其插入提示符,这可以通过一个zsh脚本或函数来实现,因此对于自动补全程序或行编辑器也应该是可能的。但如果只是针对提示符,您需要向`$precmd_functions`数组添加一个函数,以修改或添加到`PS1`变量。这个特殊的数组是一个函数名称列表,在每个提示符之前运行。
function precmd_unique_pwd {
local pwd_string="$(upwd)"
PS1="%B%n@%m $pwd_string => %b"
}
precmd_functions+=( precmd_unique_pwd )
获取当前 PWD 的缩写形式,我认为这个函数很清晰易懂,尽管不一定针对低资源使用进行了优化。
#!/bin/zsh
function upwd {
emulate -LR zsh -o nullglob
local dir Path
local -a newpwd tmp stack
local -i length=1 Flag=0
newpwd=( ${(s./.)PWD} )
foreach dir ( $newpwd )
(( length=0, Flag=0 ))
repeat $#dir
do
(( length += 1 ))
tmp=( ${(j.*/.)~stack}/$dir[1,$length]*(/) )
if
(( $#tmp == 1 ))
then
Path=$Path/$dir[1,$length]
stack+=( /$dir )
(( Flag=1 ))
break
fi
done
if
(( Flag ))
then
continue
else
Path=$Path/$dir
fi
end
print -- $Path
}
upwd
请注意,由于Zsh特性中的
(/)
,它会查找具有目录名称的唯一路径。在最后一个目录(当前目录)上,这意味着如果有与同名加扩展名的文件,则可能会匹配其他内容。