Estoy trabajando con una gran cantidad de archivos, que guardo en un directorio. Cada vez que entro en ese directorio y presiono accidentalmente Tabdos veces, toma demasiado tiempo (puede ser más de un minuto) mostrar archivos que coinciden con el patrón, y estoy bastante molesto con este comportamiento.
Por ejemplo, mi estructura de directorio es:
my-project/
├── docs/
├── data/        <---- contains around 200k files.
└── analyser/
Como todavía me encanta completar, ¿hay alguna forma de deshabilitar esta función solo en el data/directorio? ¿Como establecer un tiempo de espera de 5 segundos o un script que apaga automáticamente la finalización cuando está dentro de un directorio específico?
                    
                        bash
                                autocomplete
                                
                    
                    
                        neizod
fuente
                
                fuente

Respuestas:
Esto no es perfecto, pero una vez más la finalización de bash es bastante difícil ...
La forma más simple es por orden, es un poco más flexible que
FIGNORE, puedes hacer:Esto le indica al autocompletado que la finalización de
vies para archivos y para eliminar patrones que coincidan con el-Xfiltro. La desventaja es que el patrón no está normalizado, así que../datavariaciones no coincidirán.La siguiente mejor opción podría ser una
PROMPT_COMMANDfunción personalizada :Esto desactiva la finalización (completamente) cuando está en el directorio, pero lo desactiva para cada ruta, no solo para los archivos en ese directorio.
Sería más útil en general deshabilitar selectivamente esto para rutas definidas, pero creo que la única forma es usar una función de finalización predeterminada (bash-4.1 y posterior con
complete -D) y un montón de problemas.Esto debería funcionar para usted, pero puede tener efectos secundarios no deseados (es decir, cambios en la finalización esperada en algunos casos):
Esto funciona para completar
vi, se pueden agregar otros comandos según sea necesario. Debe detener la finalización de los archivos en los directorios nombrados, independientemente de la ruta o el directorio de trabajo.Creo que el enfoque general con
complete -Des agregar dinámicamente funciones de finalización para cada comando a medida que se encuentra. También podría ser necesario agregarcomplete -E(completar el nombre del comando cuando el búfer de entrada está vacío).Actualización Aquí hay una versión híbrida de las
PROMPT_COMMANDsoluciones de función de finalización, creo que es un poco más fácil de entender y piratear:Esta función de solicitud establece la
nocompletevariable cuando ingresa uno de los directorios configurados. El comportamiento de finalización modificado solo se activa cuando esa variable no está en blanco y solo cuando intenta completar desde una cadena vacía, lo que permite completar nombres parciales (elimine la-z "$cur"condición para evitar que se complete por completo). Comenta los dosprintflíneas para una operación silenciosa.Otras opciones incluyen un
.noautocompletearchivo de marca por directorio que puedetouchen un directorio según sea necesario; y adivinar el tamaño del directorio usando GNUstat. Puede usar cualquiera o todas esas tres opciones.(El
statmétodo es solo una suposición , el tamaño del directorio reportado crece con su contenido, es una "marca de límite" que generalmente no se reducirá cuando los archivos se eliminen sin alguna intervención administrativa. Es más barato que determinar el contenido real de un archivo potencialmente grande directorio. El comportamiento preciso y el incremento por archivo dependen del sistema de archivos subyacente. Me parece un indicador confiable en los sistemas Linux ext2 / 3/4 al menos).bash agrega un espacio adicional incluso cuando se devuelve una finalización vacía (esto solo ocurre cuando se completa al final de una línea). Puede agregar
-o nospacealcompletecomando para evitar esto.Un inconveniente restante es que si retrocede el cursor al comienzo de un token y presiona la pestaña, la finalización predeterminada se activará nuevamente. Considéralo una característica ;-)
(O podría perder el tiempo
${COMP_LINE:$COMP_POINT-1:1}si le gusta la ingeniería excesiva, pero creo que bash en sí mismo no puede establecer las variables de finalización de manera confiable cuando realiza una copia de seguridad e intenta completarla en medio de un comando).fuente
Si el
datadirectorio contiene archivos con un sufijo específico, por ejemplo.out, entonces se puede establecer subashvariable deFIGNOREa".out"y éstos serán ignoradas. Aunque también es posible usar nombres de directorio, esto no ayuda en los nombres de directorio de trabajo actuales.Ejemplo:
Cree miles de archivos de prueba de 100 KB en el host físico con discos duros RAID 1:
Establecer la
bashvariable:$ FIGNORE=".json"Crea el archivo de prueba:
$ touch test.outPrueba en 5,000 archivos:
No aparece ningún retraso entre vi y single
tabantestest.out.Prueba a 50,000 archivos:
Una sola pestaña crea una fracción de segundo retraso antes de que
test.outaparezca.Prueba a 200,000 archivos:
Retardo de 1 segundo entre la VI y sola
tabantes detest.outque aparezca.Referencias
Sobresalir de man bash
fuente
$ vi <tab><tab>, toma mucho tiempo de todos modos. : \.jsonarchivos y un solo archivo de texto llamadofoo.txt. enciendoFIGNORE='.json', escribo$ vi <tab>y todavía necesito esperar medio minuto para que me complete$ vi foo.txt. --- escenario real que no voy a editar, o mezclar tipos de archivos dentro de ese directorio, pero si enciendoFIGNOREy (accidentalmente) presiono la tecla, mi teclado se congelará por un largo tiempo sin una pista de algo comoDisplay all 188275 possibilities? (y or n), lo que me dice que puedo recuperar mi teclado.Supongo que esto es lo que quieres (tomé prestado un código de @ mr.spuratic)
Tenga en cuenta que esto no le impide presionar TAB con la ruta completa (p. Ej.
vim /directory/contains/lots/files<tab><tab>fuente
pushd/popd. Como esto solo usa una matriz regular, no una matriz asociativa, también funcionará en bash 3.x.