Я работаю с большим количеством файлов, которые я храню в каталоге. Каждый раз, когда я захожу в этот каталог и случайно нажимаю Tabдважды, отображение файлов, соответствующих шаблону, занимает слишком много времени (может быть более минуты), и меня это раздражает.
Например, моя структура каталогов:
my-project/
├── docs/
├── data/ <---- contains around 200k files.
└── analyser/
Так как я все еще люблю завершение, есть ли возможность отключить эту функцию только в data/
каталоге? Например, установить тайм-аут на 5 секунд или скрипт, который автоматически отключает завершение, когда находится в определенном каталоге?
bash
autocomplete
neizod
источник
источник
Ответы:
Это не идеально, но с другой стороны, завершение bash довольно сложно ...
Самый простой способ для каждой команды, он немного более гибкий, чем
FIGNORE
вы можете сделать:Это инструктирует автозаполнение, что завершение для
vi
файлов, и удаляет шаблоны, соответствующие-X
фильтру. Недостатком является то, что шаблон не нормализован, поэтому../data
и варианты не будут совпадать.Следующая лучшая вещь может быть пользовательской
PROMPT_COMMAND
функцией:Это отключает завершение (полностью), когда вы находитесь в каталоге, но отключает его для каждого пути, а не только для файлов в этом каталоге.
В более общем случае было бы полезно выборочно отключить это для определенных путей, но я считаю, что единственный способ - использовать функцию завершения по умолчанию (bash-4.1 и более поздние версии
complete -D
) и много возиться.Это должно работать для вас, но может иметь непредвиденные побочные эффекты (то есть изменения в ожидаемом завершении в некоторых случаях):
Это работает для завершения
vi
, другие команды могут быть добавлены по мере необходимости. Это должно остановить завершение для файлов в названных каталогах независимо от пути или рабочего каталога.Я считаю, что общий подход
complete -D
заключается в динамическом добавлении функций завершения для каждой команды, когда она встречается. Можно также добавитьcomplete -E
(завершение имени команды, когда входной буфер пуст).Обновление Вот гибридная версия решения
PROMPT_COMMAND
и функции завершения, немного легче понять и взломать, я думаю:Эта функция подсказки устанавливает
nocomplete
переменную при вводе одного из настроенных каталогов. Измененное поведение завершения включается только тогда, когда эта переменная непустая, и только когда вы пытаетесь завершить из пустой строки, что позволяет завершить частичные имена (удалите-z "$cur"
условие, чтобы предотвратить полное завершение). Закомментируйте двеprintf
строки для тихой работы.Другие варианты включают
.noautocomplete
файл флага для каждого каталога, который вы можетеtouch
в каталоге по мере необходимости; и угадывание размера каталога с использованием GNUstat
. Вы можете использовать любой или все эти три варианта.(
stat
Метод является лишь предположением , размер каталога, о котором сообщается, увеличивается с его содержимым, это «верхний предел», который обычно не уменьшается при удалении файлов без какого-либо административного вмешательства. Это дешевле, чем определение реального содержимого потенциально большого размера каталог. Точное поведение и приращение в расчете на файл зависят от базовой файловой системы. Я считаю это надежным показателем, по крайней мере, в системах linux ext2 / 3/4.)bash добавляет дополнительный пробел, даже когда возвращается пустое завершение (это происходит только при завершении в конце строки). Вы можете добавить
-o nospace
вcomplete
команду, чтобы предотвратить это.Остается один недостаток: если вы вернете курсор к началу токена и нажмете на вкладку, то по умолчанию будет снова выполнено завершение. Считайте, что это особенность ;-)
(Или вы можете возиться с этим,
${COMP_LINE:$COMP_POINT-1:1}
если вам нравится чрезмерное проектирование, но я обнаружил, что сам bash не может установить переменные завершения надежно, когда вы выполняете резервное копирование и пытаетесь выполнить завершение в середине команды.)источник
Если
data
каталог содержит файлы с определенным суффиксом, например.out
, вы можете установитьbash
переменнуюFIGNORE
в".out"
и они будут игнорироваться. Хотя можно также использовать имена каталогов, это не помогает для текущих имен рабочих каталогов.Пример:
Создайте тысячи тестовых файлов размером 100 КБ на физическом хосте с жесткими дисками raid 1:
Установите
bash
переменную:$ FIGNORE=".json"
Создайте тестовый файл:
$ touch test.out
Тест на 5000 файлов:
Никакой задержки между ви и синглом
tab
неtest.out
появляется.Тест на 50000 файлов:
Одиночная вкладка создает долю секунды до
test.out
появления.Тест на 200 000 файлов:
Задержка в 1 секунду между ви и синглом
tab
доtest.out
появления.Ссылки:
Выдержка из человека Баш
источник
$ vi <tab><tab>
, это все равно занимает много времени. : \.json
файлы 100k , и один текстовый файл с именемfoo.txt
. включаюFIGNORE='.json'
, набираю$ vi <tab>
и все равно нужно подождать полминуты, чтобы она меня завершила$ vi foo.txt
. --- реальный сценарий, который я не собираюсь редактировать или смешивать типы файлов внутри этого каталога, но если я включуFIGNORE
и (случайно) нажму вкладку, моя клавиатура будет долго зависать без намека на что-то подобноеDisplay all 188275 possibilities? (y or n)
, что говорит мне что я могу вернуть свою клавиатуру.Угадай, это то, что ты хочешь (позаимствовал код у @ mr.spuratic)
Обратите внимание, что это не мешает вам нажимать клавишу TAB, используя полный путь (например,
vim /directory/contains/lots/files<tab><tab>
источник
pushd
/popd
. Поскольку для этого используется только обычный массив, а не ассоциативный массив, он будет работать и в bash 3.x.