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
vi
es para archivos y para eliminar patrones que coincidan con el-X
filtro. La desventaja es que el patrón no está normalizado, así que../data
variaciones no coincidirán.La siguiente mejor opción podría ser una
PROMPT_COMMAND
funció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 -D
es 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_COMMAND
soluciones 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
nocomplete
variable 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 dosprintf
líneas para una operación silenciosa.Otras opciones incluyen un
.noautocomplete
archivo de marca por directorio que puedetouch
en un directorio según sea necesario; y adivinar el tamaño del directorio usando GNUstat
. Puede usar cualquiera o todas esas tres opciones.(El
stat
mé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 nospace
alcomplete
comando 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
data
directorio contiene archivos con un sufijo específico, por ejemplo.out
, entonces se puede establecer subash
variable deFIGNORE
a".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
bash
variable:$ FIGNORE=".json"
Crea el archivo de prueba:
$ touch test.out
Prueba en 5,000 archivos:
No aparece ningún retraso entre vi y single
tab
antestest.out
.Prueba a 50,000 archivos:
Una sola pestaña crea una fracción de segundo retraso antes de que
test.out
aparezca.Prueba a 200,000 archivos:
Retardo de 1 segundo entre la VI y sola
tab
antes detest.out
que aparezca.Referencias
Sobresalir de man bash
fuente
$ vi <tab><tab>
, toma mucho tiempo de todos modos. : \.json
archivos 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 enciendoFIGNORE
y (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.