¿Cómo puedo modificar el sistema de finalización de zsh para completar archivos "falsos" en algunas circunstancias?
Más precisamente, el sistema de archivos AVFS expone los archivos como directorios al crear un "directorio falso" al lado de cada archivo. Por defecto, replica toda la jerarquía de directorios bajo su punto de montaje ~/.avfs
. Además, debajo de ~/.avfs
, para cada archivo de archivado, como /tmp/foo.zip
, además del archivo de archivado ~/.avfs/tmp/foo.zip
, hay un directorio llamado ~/.avfs/tmp/foo.zip#
que expone el contenido del archivo. Sin embargo, este directorio adicional no aparece en la lista de ~/.avfs/tmp
: solo existe cuando se solicita explícitamente. (Esto es similar a cómo funcionan algunos montadores automáticos).
mountavfs
cd ~/.avfs/tmp/foo.zip\#
Cuando escribo un comando como el anterior, foo.zip#
no aparece como una finalización en ~/.avfs/tmp/
, ya que no existe ese directorio. ¿Cómo puedo decirle a zsh que siempre que haya un archivo cuya ruta completa $arc
coincida con ~/.avfs/**/*.(tgz|zip)
¹, debería pretender que hay un directorio llamado ${arc}#
?
(Tenga en cuenta que quiero que la finalización funcione con cada llamada _files
o _dirs
, no solo para el cd
comando. Preferiría no tener que duplicar el código de la _files
función, si es posible).
¹ y todo el resto de las extensiones
fuente
/path/to/foo
son visibles como~/.avfs/path/to/foo
.avfs
. Si presentara la#
entrada de directorio predeterminada para cualquier archivo que coincida con las cadenas que admite, o incluso probó mágicamente los archivos en un directorio para lo que necesitaba tener una#
entrada, entonces la finalización simplemente funcionaría. Supongo que habría un éxito en el rendimiento de algo como,find
ya que ahora rastrearía a través de archivos comprimidos.Respuestas:
Una respuesta falsa parece insuficiente para esta pregunta falsa; El soporte incorporado de zsh para directorios de montaje automático opera en directorios (
fake-files dir:names
), y no en patrones de archivo en ellos. Esto es útil para agregar archivos llamados específicos a un directorio, que puede adaptarseautomount
osshfs
o NetApp.snapshot
tipo configuraciones donde el directorio-a-ser-montar es un nombre estático conocido,ALAS
.zshall(1)
dice que los "nombres" son cadenas, y los experimentos indican meta-caracteres (por ejemplo,#
o\#
o'*(e:"echo hi":)'
) "no hacer el trabajo" de varias maneras, por lo que no hay manera que conozco para echar un pegote sobre la parte de los nombres de lafake-files
declaración. (ProfundizarSrc/Zle/computil.c
podría revelar exactamente cuáles pueden ser los nombres, pero eso sería más trabajo). (Además, el uso de globos recursivos en la posición del directorio para nombrar los archivos de almacenamiento no voló, pero nuevamente tomará C zambullirse para ver cuántofake-files
permite te saldrás con la tuya)Con
compdef
, uno puede enumerar las.avfs
terminaciones de directorio:Excepto que esto falla, ya que solo mostrará los
#
archivos cuando no importa y, por lo tanto, no se puede completar en ellos. (Hay usos productivos para este formulario, aunque no para este caso).Usar
zstyle
te acerca, con lo siguiente.zshrc
:Sin embargo, solo puede completarse hasta el
\#/
bit (en un debian squeeze virt con una configuración avfs predeterminada), pero no en el sistema de archivos virtual para un archivo, por lo que será necesario un trabajo adicional para completar la pestaña en los archivos. Estoy adivinando a través de_call_program ... ls
o algo por el estilo para completar en el momento\#
, a menos que haya una forma más elegante dezsh
creer que los directorios que no existen sí lo hacen.¡Malas noticias! La finalización no llega
_path_files
a los directorios falsos; Sospecho que esto está relacionado con zsh globbing. Tanto zsh 4.something on como zsh 5.0.8 presentan el problema. Por lo tanto, sospecho que una solución completa requeriría parches_path_files
o escribir algo diferente que de lo contrario se completa en estos directorios falsos. Se puede generar una traza de depuración completada escribiendols /root/.avfs/root/sometar.gz\#/
y luego al final de esa escrituracontrol-x
y luego?
, suponiendobindkey -e
y que_complete_debug
está vinculado a dicho combo de teclas, si alguien quiere profundizar en por qué esto está fallando.fuente
En zsh puede usar
compctl -K
para registrar su propia función en las opciones de finalización de generación. Por ejemplo:Entonces necesitas definir tu propia función:
Obviamente, lo anterior necesita algo más de trabajo, pero es algo para comenzar.
Se puede registrar una función de finalización personalizada similar (pero diferente) para bash.
Aquí hay un ejemplo con implementaciones para bash y zsh . (Ofrece la finalización de las opciones de la línea de comandos al extraer las opciones de la página del comando man.)
Y aquí hay algunas conjeturas rápidas sobre cosas que podrían funcionar dentro de su función de finalización:
O tal vez esto:
¡Buena suerte!
fuente
compctl
, es decir, quiero cambiar lo que_files
hace. Tu respuesta no es útil en absoluto.