Вопрос или проблема
Предположим, у меня есть следующие имена файлов:
$ ls -1
file-index-00012.txt
file-index-00345.txt
question.txt
Я начинаю вводить, где “|” обозначает курсор:
$ cat fil|
Если я нажимаю tab один раз, Bash частично завершает имена файлов:
$ cat file-index-00|
Если я нажимаю tab дважды, он показывает кандидатов на завершение:
$ cat file-index-00
file-index-00012.txt file-index-00345.txt
$ cat file-index-00|
Проблема заключается в том, что мне нужно проверить, сколько цифр было частично завершено, прежде чем вводить оставшиеся. Например, первый раз, когда я получаю “file-index-01000.txt” в этом каталоге, мне нужно ввести дополнительную цифру:
$ cat file-index-0
file-index-00012.txt file-index-00345.txt file-index-01000.txt
$ cat file-index-0|
Возможно ли сделать так, чтобы Bash завершал на начале слова (разделённого дефисом, подчеркиванием или пробелом), как в этом примере:
$ cat file-index-
file-index-00012.txt file-index-00345.txt
$ cat file-index-|
Ответ или решение
Да, в Bash возможно настроить автодополнение, чтобы оно останавливало комплет на границах слов, разделенных дефисами, подчеркиваниями или пробелами. Стандартное поведение автодополнения в Bash — это дополнение до максимально возможной неопределенной части, что не всегда удобно при обилии однотипных файлов, как в вашем случае.
Для реализации подобного функционала в Bash, можно прибегнуть к настройке комплита с использованием встроенных вызовов и скриптов. Основная идея заключается в том, чтобы изменить поведение надстройки через bash-скрипты и специальные параметры. В вашем случае потребуется настроить readline до границ "слов", определяемых вами как разделенные дефисами.
Настройка автодополнения по словам в Bash
-
Настройка IFS:
Internal Field Separator (IFS) используется в Bash для определения границ "слов". По умолчанию это пробелы и табуляции, но вы можете установить его на дефис и любую другую символику:IFS='-'
Но следует учесть, что установка IFS таким способом может повлиять и на другие области использования терминала. Это требует дополнительного учета.
-
Использование расширенных сценариев комплита:
Bash имеет возможность проводить автодополнение через специальную команду
complete
. Вы можете написать свой shell-скрипт, который будет использовать эту команду:_custom_complete() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" opts=$(ls -1 | tr '\n' ' ') COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 } complete -F _custom_complete cat
Здесь функция
_custom_complete
будет генерировать список возможных автодополнений на основании разделения на-
. -
Использование сторонних инструментов:
Вполне возможно, что сторонние утилиты или оболочки могут предлагать более гибкие и простые в настройке решения для полной кастомизации автодополнения (например,
zsh
может предложить более расширенные возможности).
Заключение
Расширение функциональности Bash для достижения нужных вам целей возможно, но потребует некоторых вмешательств в стандартное поведение оболочки. Примечательно, что лучше всего использовать тестовую среду для подобных экспериментов, чтобы избежать внесения нежелательных изменений в основную рабочую среду. Эти изменения обеспечат снижение число ошибок при автодополнении и могут сделать ваш рабочий процесс более эффективным.