Eu trabalho principalmente em gvim e muitos terminais. Originalmente, preferi abrir todos os meus arquivos em uma única instância de vim. Para esse fim eu usei um alias para abrir arquivos dos meus terminais no atual 'servidor vim'.
alias rv="gvim --remote-silent"
Mas ter muitos arquivos de vários projetos abertos em uma única instância vim afeta minha produtividade, por isso estou atualizando meu alias para uma função.
# 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;
}
Agora, este novo rv
tem suas próprias opções. Eu posso usá-lo para:
- listar os servidores vim disponíveis (-l --list)
- define o servidor vim padrão para o shell atual (-s --set)
- mostre o servidor vim padrão (-i --info)
- arquivos abertos em um servidor vim específico (-t --target)
- arquivos abertos no servidor vim padrão:
rv files...
No entanto, como estou usando uma função para rv
em vez de um alias, perco a conclusão zsh da qual gostei anteriormente. Eu li sobre a criação de uma função de conclusão, _rv
, que mostrará as opções de rv
, mas eu quero combinar minhas opções de conclusão com as opções existentes de conclusão do vim. Eu sei que pode haver alguns conflitos com rv
' -s
e vim
' -s
, mas acho que posso lidar com isso elegantemente com o separador --
.
TLDR; Então, como criar um script de conclusão que combine as opções _arguments
para _rv
e _vim
? Eu prefiro reutilizar _vim
, se possível, em vez de copiar e colar sua lista de argumentos em _rv
.
Aqui está o meu _rv
. Atualizado em 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 "$@"
Comportamento atual
Atualmente, o _rv
completion will é utilizável, mas não ideal.
- Quando digito
rv <TAB>
, não vejo as opções do vim. Somente as opções rv e os caminhos de arquivo são exibidos. _vim
está completando caminhos de arquivos para mim, então apresse isso!
- Quando digito
rv -s <TAB>
, vejo a lista de servidores vim, mas também os caminhos de arquivo são exibidos. Um arquivo não é permitido neste momento no comando e não deve aparecer no preenchimento automático.
Comportamento esperado
- Quando digito
rv <TAB>
, espero ver: 1) opções de rv, 2) opções de vim, 3) lista de caminhos de arquivos
- Quando digito
rv -s <TAB>
, espero ver: 1) nomes de servidores vim (conforme fornecido por _rv_vim_servers
.
- Quando digito
rv /valid/file/path/<TAB>
, espero ver apenas uma lista de caminhos de arquivos. Como o _vim
já tem esse recurso, eu preferiria confiar nele.