Finalización de zsh: obtener nombres de archivo de un directorio específico

10

OK, un poco de historia: uso una Mac y hago todo lo posible en la CLI.

En particular, con frecuencia introduzco una memoria USB cpo mvun archivo, y luego deseo expulsarla (desmontarla y desconectarla) de inmediato. Esto generalmente se puede lograr con un puñado de teclas, a excepción de desmontarlo, lo que requiere (en 10.7) ir a un espacio de escritorio vacío (generalmente a dos espacios de distancia al menos), seleccionar el disco y presionar "comando-e". Francamente, este procedimiento desmontado es, en varios órdenes de magnitud, la parte más tediosa y tediosa del proceso.

Sería mucho más natural y eficiente simplemente poder escribir, por ejemplo:

ej<tab> J<tab>

Digamos que mi memoria USB se monta en / Volumes / Jefferson. Lo que esperaría obtener de mis 6 pulsaciones de teclas es lo siguiente:

eject /Volumes/Jefferson

Esto debería ejecutar el comando:

diskutil unmount /Volumes/Jefferson

Entonces, escribí una pequeña y bonita función:

eject() {
    diskutil unmount /Volumes/$1
}

Y una función de finalización para acompañarlo:

compdef '_files -g "/Volumes/*"' eject  

Sin embargo, hay un problema con esto. La _filesfunción genera rutas completas. Ahora, podría cambiar la línea en mi función de "expulsión" diskutil unmount $1y las cosas funcionarían, pero no tengo la capacidad de escribir la primera letra del nombre del punto de montaje, ya que la ruta comienza con / Volumes /. Por ejemplo, si escribo J<tab, obtendré autocompletado para los archivos en el PWD. Tendría que escribir /Volumes/J<tab>para obtener la finalización deseada.

Entonces, ¿hay una función de finalización que tome nombres de archivos de una ubicación específica predefinida, en lugar de generar rutas completas?

Realmente me gustaría reducir esto a 6 pulsaciones de teclas.

Marshall Eubanks
fuente

Respuestas:

12
_files -W /Volumes

Ver la documentación de _path_files.

Gilles 'SO- deja de ser malvado'
fuente
¡Perfecto! Sabía que tenía que ser incorporado. ¡Muchas gracias!
Marshall Eubanks
Entonces, ¿cómo hago para que cargue automáticamente esta función de finalización? Intenté poner la compdeflínea en el archivo _ejectubicado en mi fpath. Lo probé con y sin una línea de carga automática. Miré varias guías sobre funciones de finalización y nadie cubrió cómo hacer un ejemplo realmente simple como este, y nada de lo que probé en función de ninguno de sus ejemplos funcionó.
Marshall Eubanks
@marshaul Debe tener #compdef ejectcomo primera línea del archivo, luego el código real. Consulte debajo de los archivos con carga automática en el manual. Si no agregó la línea al principio, es posible que deba eliminar el caché ~/.zcompdumpy reiniciar zsh.
Gilles 'SO- deja de ser malvado'
AH! Eliminar ~/.zcompdumphizo el truco. ¡Gracias de nuevo!
Marshall Eubanks