¿Es posible utilizar diferentes comportamientos de selección de menú zsh para diferentes comandos?

13

Estoy usando el menu selectcomportamiento en zsh, que invoca un menú debajo del cursor donde puede ver las diversas posibilidades. La opción .zshrc que configuré para esto es

zstyle ':completion:*' menu select=2

De forma predeterminada, presionar Returnpara seleccionar una posibilidad en este menú solo completa la palabra; en realidad, no envía el comando. Por ejemplo, podría obtener un menú como este

~ % cd de<TAB>
completing directory:
[Desktop/]  Development/

Presionando Returnaquí resultará en

~ % cd Desktop/

Luego tengo que presionar Returnuna segunda vez para enviar el comando.

Puedo modificar este comportamiento para que presionar Returnambos seleccione la finalización y envíe el comando haciendo esto

bindkey -M menuselect '^M' .accept-line

Sin embargo, hay un problema con esto: a veces necesito completar un archivo o directorio sin enviar el comando. Por ejemplo, es posible que deba hacerlo ln -s Desktop Desktop2: con este bindkeycomportamiento, intentar completar el Escritorio resultará en ln -s Desktop/ser enviado como el comando, y obviamente no quiero eso.

Soy consciente de que solo presionar la barra espaciadora me permitirá seguir con el comando, pero ahora es un hábito.
Dado esto, ¿hay alguna manera de hacerlo de modo que solo algunos comandos le permitan presionar Returnuna vez (como cd), pero todos los demás comandos requieren presionarlo dos veces?

vacas
fuente
Si el .zshrcarchivo no le permite hacerlo, entonces la respuesta simplemente será no, a menos que ajuste el código fuente usted mismo para admitir el comportamiento basado en comandos. Pero entonces todavía tienes que definir para qué comandos hacer esto, lo que por sí solo es mucho más tedioso que presionar una tecla adicional ...
Tamara Wijsman

Respuestas:

3

Si realmente necesita esto, en teoría podría establecer una función que verifique el comando que está ejecutando y complete o envíe la línea.

Pruebe algo como esto (no probado):

commands=(ls cd)
# define widget function
function check-command {
    zle beginning-of-line
    zle forward-word
    RBUFFER=" $RBUFFER"
    if [[ ${commands[(r)$LBUFFER]} == $LBUFFER ]] ; then ; zle accept-line ; else; zle     end-of-line ; fi
}

# create widget from function
zle -N check-command

# bind widget
bindkey -M menuselect '^M' check-command

Fuente: ¿ usando un comando personalizado del antiguo .inputrc en zsh?

balcánico
fuente
0

Técnicamente no es posible en la forma en que está preguntando. No sé si hay otra salida

Aexyn
fuente