zsh有一个特性(auto_cd),只需输入目录名称即可自动进入该目录(cd)。我很好奇是否有一种方法可以配置zsh以执行类似的操作,如果我只输入文件名,它会自动用vim打开这些文件?
我能想到三种可能性。第一种是后缀别名,可以自动翻译。
% *.ps
到
% screen -d -m okular *.ps
在你做完之后
alias -s ps='screen -d -m okular'
但是你需要为每个文件后缀定义这个别名。它也在大多数扩展之前处理,所以如果
% *.p?
匹配与*.ps
相同的文件,它不会打开任何文件。
第二个是command_not_found
处理程序:
function command_not_found_handler()
{
emulate -L zsh
for file in $@ ; do test -e $file && xdg-open $file:A ; done
}
但这仅适用于不包含正斜杠的内容,对于绝对路径或相对路径无效。
第三种方法是通过覆盖accept-line小部件来进行的hack:
function xdg-open()
{
emulate -L zsh
for arg in $@ ; do
command xdg-open $arg
endfor
}
function _-accept-line()
{
emulate -L zsh
FILE="${(z)BUFFER[1]}"
whence $FILE &>/dev/null || BUFFER="xdg-open $BUFFER"
zle .accept-line
}
zle -N accept-line _-accept-line
whence '*.ps'
会返回别名的值),我曾经以为它会禁用后缀别名,但它却禁用了“autocd”功能。我可以避免这个问题(在 whence
测试之后加上 || test -d $FILE
),但是谁知道还有多少其他的问题也被破坏了呢。如果你对第一和第二种解决方案都满意的话,最好使用它们。我猜你可以使用 "fasd_cd",它有一个别名 v,使用 viminfo 文件来识别你至少打开过一次的文件。在我的环境中,它非常好用。
Fast cd 还有其他很棒的功能!不要忘记在 vim 中设置这个别名,以便打开最后编辑的文件:
alias lvim="vim -c \"normal '0\""
man zshbuiltins
,查找^\s*alias
(假设MANPAGER
是默认的less
),第二段。关于它的工作原理没有太多信息,但是指出在进行globbing之前会被扩展。 - ZyX