Trabajo principalmente en gvim y en muchas terminales. Originalmente, prefería abrir todos mis archivos en una sola instancia de vim. Con ese fin, utilicé un alias para abrir archivos desde mis terminales en el 'servidor vim' actual.
alias rv="gvim --remote-silent"
Pero tener muchos archivos de múltiples proyectos abiertos en una sola instancia de vim afecta mi productividad, por lo que estoy actualizando mi alias a una función.
# 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;
}
Ahora este nuevo rv
tiene sus propias opciones. Puedo usarlo para:
- enumerar los servidores vim disponibles (-l --list)
- establece el servidor vim predeterminado para el shell actual (-s --set)
- muestra el servidor vim predeterminado (-i --info)
- abrir archivos en un servidor vim específico (-t --target)
- abrir archivos en el servidor vim predeterminado:
rv files...
Sin embargo, como estoy usando una función para en rv
lugar de un alias, pierdo la finalización de zsh que disfruté anteriormente. He leído sobre la creación de una función de finalización _rv
que mostrará rv
las opciones, pero quiero combinar mis opciones de finalización con las opciones de finalización de vim existentes. Sé que puede haber algunos conflictos con rv
's -s
y vim
' s -s
, pero calculo que puedo manejar eso forma elegante con el --
separador.
TLDR; Entonces, ¿cómo creo un script de finalización que combine las _arguments
opciones para ambos _rv
y _vim
? Prefiero reutilizar _vim
si es posible en lugar de copiar y pegar su lista de argumentos _rv
.
Aquí está mi _rv
. Actualizado 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 "$@"
Comportamiento actual
Actualmente la _rv
terminación de la voluntad es utilizable, pero no ideal.
- Cuando escribo
rv <TAB>
, no veo las opciones de vim. Solo se muestran las opciones de rv y las rutas de archivos._vim
está completando rutas de archivos para mí, ¡así que hurra! - Cuando escribo
rv -s <TAB>
, veo la lista de servidores vim, pero también se muestran las rutas de los archivos. Un archivo no está permitido en este punto en el comando, y no debe aparecer en el autocompletado.
Comportamiento esperado
- Cuando escribo
rv <TAB>
, espero ver: 1) opciones de rv, 2) opciones de vim, 3) lista de rutas de archivo - Cuando escribo
rv -s <TAB>
, espero ver: 1) los nombres de servidor de vim (según lo dispuesto por_rv_vim_servers
. - Cuando escribo
rv /valid/file/path/<TAB>
, espero ver solo una lista de rutas de archivo. Como_vim
ya tiene esta capacidad, preferiría confiar en ella.
compdef
tiene una -n
opción que dice "evita que se sobrescriban las finalizaciones ya definidas para el comando o contexto". Entonces, ¿lo has intentado compdef _vim rv
seguido compdev -n _rv rv
?
_vim
archivo original , pero antes de hacerlo sobrescribir la _arguments
función con una función local personalizada? Al hacerlo, obtendría los argumentos de _vim
. Tal vez con un proceso zsh separado.