Las finalizaciones de la pestaña Zsh no funcionan como se desea para rutas parciales

17

Quiero finalización difusa entre mayúsculas y minúsculas para archivos y directorios en zsh. Después de leer el manual durante unas horas, esto es lo que se me ocurrió:

zstyle ':completion:*:*:*:*:globbed-files' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'
zstyle ':completion:*:*:*:*:local-directories' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'
zstyle ':completion:*:*:*:*:directories' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'

Además, quiero presionar TABuna vez para mostrar las posibles finalizaciones, solo modificando lo que he escrito si hay exactamente una finalización. Luego, presionar TABuna segunda vez debería ponerme en el modo "finalización del menú". Basado en los manuales, se me ocurrió esto:

zstyle ':completion:*' menu select

Ahora todo funciona como debería, excepto en una circunstancia. Tengo dos carpetas Desktopy .rstudio-desktopen mi directorio personal. Como tengo setopt globdots, espero escribir lo siguiente:

$ cd ~/dktop<TAB>

dejar mi comando como se ingresó, y mostrar como candidatos de finalización Desktopy .rstudio-desktop. En cambio, se elimina dktop , dejándome con lo siguiente:

$ cd ~/

He examinado todos los manuales, guías, preguntas de Stack Exchange relevantes y varias otras fuentes relevantes. Pero haga lo que haga, no puedo hacer que esto funcione.

Curiosamente, sin embargo, si estoy en el directorio de inicio y escribo lo siguiente, entonces todo funciona como se esperaba:

$ cd dktop<TAB>

Es decir, solo es un problema con segmentos de rutas no líderes (y puede ver C-x hque esto corresponde a la directoriesetiqueta en lugar de a la local-directoriesetiqueta que se está utilizando).

Para una fácil reproducibilidad, aquí hay una ~/.zshrcque reproducirá la situación y el comportamiento descritos anteriormente (probado en una nueva máquina virtual El Capitan con zshHomebrew).

Radon Rosborough
fuente
No se puede reproducir zsh 5.3.1en Arch Linux. cd ~/dktop<tab>rendimientos cd ~/Desktop.
PythonNut
@PythonNut Con zsh 5.3.1en OS X el problema se reproduce. Es interesante que haya una diferencia entre los sistemas operativos.
Radon Rosborough
1
@PythonNut En realidad, apuesto a que esto se debe a que Linux distingue entre mayúsculas y minúsculas y macOS no distingue entre mayúsculas y minúsculas.
Radon Rosborough
Como un recordatorio amigable, no todos los Mac / macOS distinguen entre mayúsculas y minúsculas, depende de si su disco tiene formato de mayúsculas o minúsculas o no.
konqui

Respuestas:

1

Una posible solución es hacer:

bindkey "^I" expand-word

Esto hará que la pestaña se expanda ~/a la ruta absoluta.

Estreñido Ninja
fuente
Tal vez me estoy perdiendo algo, pero no veo cómo esto se relaciona de alguna manera con las finalizaciones de pestañas difusas o con la resolución del problema descrito anteriormente. Si hago lo que sugieres, presionar TAB me dará cd /Users/raxod502/dktop, y la finalización se desactivará.
Radon Rosborough
@RadonRosborough La esperanza era que al expandirse ~/a su camino absoluto, la finalización difusa comenzaría a funcionar. Parecía uno de esos casos donde el problema es que lo evalúa una vez, pero en realidad lo necesitas para evaluar dos veces para que funcione, por lo que tener la ruta absoluta en lugar de eso ~/significaría que volvería a necesitar solo una evaluación. Pero mierda, lo siento, olvidé que Bindkey reemplaza los enlaces antiguos, y no puedo encontrar nada que diga si es posible vincular dos funciones a una tecla. Sin mi bindkey, ¿su finalización funciona según lo previsto cuando se le dan rutas absolutas?
Estreñido
No. No importa si la ruta de entrada es ~/dktopo /Users/raxod502/dktop; el resultado es el mismo, es decir, que dktopse elimina cuando presiono TAB.
Radon Rosborough