我主要在gvim和许多终端中工作。最初,我更喜欢在单个vim实例中打开所有文件。为此,我使用别名从当前“ vim服务器”中的终端打开文件。
alias rv="gvim --remote-silent"
但是在单个vim实例中打开多个项目的许多文件会影响我的工作效率,因此我将别名升级为函数。
# main function
rv() {
local args options server
options=$(getopt -o hils:t: -l "help,info,list,set:,target:" -- "$@")
if [[ $? -ne 0 ]]; then
echo "Failed to parse options."
return 1
fi
# a little magic, necessary when using getopt
eval set -- "$options"
# go through the options with a case and use shift to analyze one option at a time.
while true; do
case "$1" in
-h|--help)
echo "Usage: $0 [-hil] [--help] [--info] [--list]";
echo " $0 {-s | --set} <name> [<file1 file2...>]";
echo " $0 {-t | --target} <name>] <file1 file2...>";
return 0;;
-i|--info)
gvim_show_info;
return 0;;
-l|--list)
gvim_list_servers;
return 0;;
-s|--set)
gvim_set_server_name ${2:u};
shift 2;;
-t|--target)
server="$2";
shift 2;;
--)
shift;
break;;
esac
done
if [[ "$#" -eq 0 ]]; then
# if no files specified...
if [[ -n "$server" ]]; then
# throw error if --target option was specified.
echo "Error! --target requires one or more filenames."
return 1;
fi
else
# if files were specified...
if [[ -n "$server" ]]; then
# if --target was specified
gvim_run_remote $server "$@"
else
gvim_run_remote $(gvim_get_default_server) "$@"
fi
fi
return 0;
}
现在,此新功能rv
有其自己的选择。我可以用它来:
- 列出可用的vim服务器(-l --list)
- 设置当前shell的默认vim服务器(-s --set)
- 显示默认的vim服务器(-i --info)
- 在特定的vim服务器中打开文件(-t --target)
- 在默认的vim服务器中打开文件:
rv files...
但是,由于我使用的是函数rv
而不是别名,因此我失去了以前喜欢的zsh补全功能。我已经阅读了有关创建完成函数的信息,_rv
该函数将显示rv
的选项,但是我想将我的完成选项与现有的vim完成选项结合起来。我知道可能会有一些冲突与rv
的-s
和vim
的-s
,但我想我能处理的优雅与--
分离。
TLDR;那么,如何创建一个完成脚本,结合了_arguments
这两个选项_rv
和_vim
?我宁愿重用_vim
,而不是将其参数列表复制粘贴到中_rv
。
这是我的_rv
。 更新2014/6/10 16:10
#compdef rv
_rv() {
typeset -A opt_args
local alternatives
alternatives=(
'args:rv options:_rv_options'
'files:file:_vim_files'
)
_alternative $alternatives && return 0
return 1
}
_rv_options() {
local arguments
arguments=(
'(-i -l -s -t --info --list --set --target)'{-h,--help}'[Print usage info.]'
'(-h -l -s -t --help --list --set --target)'{-i,--info}'[Print default vim server. As stored in $GVIM_SERVER.]'
'(-i -h -s -t --info --help --set --target)'{-l,--list}'[Print list of existing vim servers.]'
'(-i -h -l -t --info --help --list --target)'{-s,--set}'[Set default vim server for the current shell.]:vim servers:_rv_vim_servers'
'(-i -h -l -s --info --help --list --set)'{-t,--target}'[Open files in a particular vim server.]:vim servers:_rv_vim_servers'
)
_arguments -s -C $arguments && return 0
return 1
}
_rv_vim_servers() {
local -a servers
servers=( ${(f)"$(_call_program servers vim --serverlist 2>/dev/null)"} )
_wanted servers expl server compadd -M 'm:{a-z}={A-Z}' -a servers && return
}
# invoke the completion command during autoload
_rv "$@"
当前行为
当前_rv
完成将是可用的,但不是理想的。
- 输入时
rv <TAB>
,看不到vim选项。仅显示rv选项和文件路径。_vim
正在为我完成文件路径,对此敬上! - 输入时
rv -s <TAB>
,我会看到vim服务器列表,但还会显示文件路径。此时命令中不允许使用文件,该文件也不应出现在自动完成中。
预期行为
- 键入时
rv <TAB>
,我希望看到:1)rv选项,2)vim选项,3)文件路径列表 - 键入时
rv -s <TAB>
,我希望看到:1)vim服务器名称(由提供)_rv_vim_servers
。 - 当我键入时
rv /valid/file/path/<TAB>
,我希望只会看到文件路径列表。由于_vim
已经具有此功能,因此我希望依靠它。
1
这个unix.stackexchange.com/questions/128199/…可能有用。
—
clobrano
compdef
有一个-n
选项说它“防止覆盖已经为命令或上下文定义的任何补全”。那么,您尝试过compdef _vim rv
跟在后面compdev -n _rv rv
吗?
28个投票都没有答案...这是一个关于zsh的问题...我将尝试为您调用@StéphaneChazelas^^(我尝试不滥用此功能,但这很有趣。请Stephane,告诉我是否应该执行此操作...,我将删除它,不再执行此操作)...如果这里有人知道答案,应该是他
—
Olivier Dulac
@OlivierDulac我认为只有在该主题中已发布的情况下,您才会收到通知。(允许使用重复的名称,所以这很有意义。)尽管您可能在聊天中找到他。
—
Sparhawk
是否可以获取原始
—
拉斐尔·阿伦斯
_vim
文件,但在此之前_arguments
用自定义本地函数覆盖该函数?这样,您将从中获取论据_vim
。也许使用单独的zsh进程。