Возможно ли автодополнение по целому слову в Bash?

Вопрос или проблема

Предположим, у меня есть следующие имена файлов:

$ 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

  1. Настройка IFS:
    Internal Field Separator (IFS) используется в Bash для определения границ "слов". По умолчанию это пробелы и табуляции, но вы можете установить его на дефис и любую другую символику:

    IFS='-'

    Но следует учесть, что установка IFS таким способом может повлиять и на другие области использования терминала. Это требует дополнительного учета.

  2. Использование расширенных сценариев комплита:

    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 будет генерировать список возможных автодополнений на основании разделения на -.

  3. Использование сторонних инструментов:

    Вполне возможно, что сторонние утилиты или оболочки могут предлагать более гибкие и простые в настройке решения для полной кастомизации автодополнения (например, zsh может предложить более расширенные возможности).

Заключение

Расширение функциональности Bash для достижения нужных вам целей возможно, но потребует некоторых вмешательств в стандартное поведение оболочки. Примечательно, что лучше всего использовать тестовую среду для подобных экспериментов, чтобы избежать внесения нежелательных изменений в основную рабочую среду. Эти изменения обеспечат снижение число ошибок при автодополнении и могут сделать ваш рабочий процесс более эффективным.

Оцените материал
Добавить комментарий

Капча загружается...