ZSH的auto_vim(类似于auto_cd)

3

zsh有一个特性(auto_cd),只需输入目录名称即可自动进入该目录(cd)。我很好奇是否有一种方法可以配置zsh以执行类似的操作,如果我只输入文件名,它会自动用vim打开这些文件?

2个回答

3

我能想到三种可能性。第一种是后缀别名,可以自动翻译。

% *.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),但是谁知道还有多少其他的问题也被破坏了呢。如果你对第一和第二种解决方案都满意的话,最好使用它们。

谢谢,我选择了- s解决方案,因为我只会在其中使用一小部分扩展名。只是好奇,您能解释一下这是如何工作的吗? 我以前从未使用过-s标志,并且似乎找不到任何文档来说明它。 - seagullJS
1
@seagullJS,搜索man zshbuiltins,查找^\s*alias(假设MANPAGER是默认的less),第二段。关于它的工作原理没有太多信息,但是指出在进行globbing之前会被扩展。 - ZyX

0

我猜你可以使用 "fasd_cd",它有一个别名 v,使用 viminfo 文件来识别你至少打开过一次的文件。在我的环境中,它非常好用。

Fast cd 还有其他很棒的功能!不要忘记在 vim 中设置这个别名,以便打开最后编辑的文件:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接