ZSH auto_vim(如auto_cd)

ZSH auto_vim(如auto_cd),zsh,zshrc,Zsh,Zshrc,zsh有一个功能(auto_cd),只要键入目录名,就会自动转到(cd)该目录。我很好奇是否有一种方法可以将zsh配置为对文件名执行类似的操作,如果我只键入一个文件名,就可以使用vim自动打开文件?我可以想到三种可能性。首先是后缀别名,它可以自动转换 % *.ps 到 等你做完了 alias -s ps='screen -d -m okular' 。但您需要为每个文件后缀定义此别名。它也是在大多数扩展之前处理的,因此如果 % *.p? 匹配与*.ps相同的文件。它不会打开任何内容 第二个是

zsh有一个功能(auto_cd),只要键入目录名,就会自动转到(cd)该目录。我很好奇是否有一种方法可以将zsh配置为对文件名执行类似的操作,如果我只键入一个文件名,就可以使用vim自动打开文件?

我可以想到三种可能性。首先是后缀别名,它可以自动转换

% *.ps

等你做完了

alias -s ps='screen -d -m okular'
。但您需要为每个文件后缀定义此别名。它也是在大多数扩展之前处理的,因此如果

% *.p?
匹配与
*.ps
相同的文件。它不会打开任何内容

第二个是未找到的命令处理程序:

function command_not_found_handler()
{
    emulate -L zsh
    for file in $@ ; do test -e $file && xdg-open $file:A ; done
}
。但这不适用于绝对或相对路径,只适用于不包含正斜杠的路径

第三个是一个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。我可以避免这种情况(只是
|test-d$FILE
从何处开始测试之后),但谁知道还有多少其他东西也被破坏了。如果您对第一个和第二个解决方案没有意见,最好使用它们。

我想您可以使用“”来识别您至少打开过一次的文件,它有一个别名v。在我的环境中,它就像一种魅力

Fast cd还有其他你会喜欢的令人惊奇的东西! 不要忘记在vim上设置此别名以打开上次编辑的文件:

alias lvim="vim -c \"normal '0\""

谢谢,我选择了alias-s解决方案,因为只有一小部分扩展我会使用它。只是好奇,你能解释一下这是怎么工作的吗?我以前从未使用过-s标志,而且似乎找不到任何相关文档。@seagullJS
man zshbuiltins
,搜索
^\s*别名
/^\s*别名
假设
MANPAGER
默认值较小),第二段。关于它是如何工作的,并没有太多的信息,但有人说它在进行全球化之前恰好被扩展了。
alias lvim="vim -c \"normal '0\""