Завершение команд в терминале: переключение между предложениями

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

У меня это было на настройках Ubuntu, и с тех пор как я перешел на Fedora, я хочу это настроить, но забыл как… Идея проста:

Я не хочу, чтобы терминал показывал мне подсказки, когда я нажимаю tab дважды, вместо этого я хочу, чтобы он перебирал все возможные подсказки с каждым нажатием tab… это можно сделать и в Vim.

Итак, когда я наберу gedit a и нажму tab, он покажет мне все файлы с первой буквой a.

На самом деле это функция readline, называемая menu-complete. Вы можете привязать её к tab (заменив стандартный complete), добавив bind TAB:menu-complete в ваш ~/.bashrc или добавив TAB:menu-complete в ваш ~/.inputrc (без ключевого слова bind).

Также вы можете найти полезными bind -p (показать текущие привязки, обратите внимание, что tab отображается как "\C-i") и bind -l (перечислить все функции, которые можно привязать), а также раздел редактирования командной строки в руководстве по bash и документацию readline.

Вы можете переключаться между меню автозаполнения в Bash, а также можете показывать меню элементов. В отличие от Zsh, текущий элемент меню не будет выделен.

Добавьте в ~/.inputrc:

set show-all-if-ambiguous on
set show-all-if-unmodified on
set menu-complete-display-prefix on
"\t": menu-complete
"\e[Z": menu-complete-backward

Документация из man bash:

Переменные Readline
    menu-complete-display-prefix (Выкл.)
           Если установлено в Вкл., меню автозаполнения отображает общий
           префикс списка возможных завершений (который может быть пустым)
           перед переключением по списку.
    show-all-if-ambiguous (Выкл.)
           Это изменяет стандартное поведение функций автозаполнения.
           Если установлено в Вкл., слова, у которых есть более одного
           возможного завершения, приводят к немедленному перечислению
           совпадений вместо сигнала.
    show-all-if-unmodified (Выкл.)
           Это изменяет стандартное поведение функций автозаполнения
           похожим образом на show-all-if-ambiguous. Если установлено в
           Вкл., слова, у которых есть более одного возможного
           завершения без каких-либо возможных частичных завершений
           (возможные завершения не имеют общего префикса), приводят
           к немедленному перечислению совпадений вместо сигнала.

Завершение
    menu-complete
          Похоже на complete, но заменяет слово, которое нужно
          завершить, на одно совпадение из списка возможных
          завершений. Повторное выполнение menu-complete перебирает
          список возможных завершений, вставляя каждое совпадение
          по очереди. В конце списка завершений раздается сигнал
          (в зависимости от настройки bell-style) и восстанавливается
          исходный текст. Аргумент n перемещает на n позиций вперёд
          в списке совпадений; отрицательный аргумент может использоваться
          для перемещения назад по списку. Эта команда предназначена
          для привязки к TAB, но по умолчанию она не привязана.
    menu-complete-backward
          Идентично menu-complete, но перемещается назад по списку
          возможных завершений, как если бы menu-complete был дан
          с отрицательным аргументом. Эта команда по умолчанию
          не привязана.

Альтернативное решение через новую оболочку:

Я бы порекомендовал изменить окружение терминала с bash на fish, которое по умолчанию имеет автозаполнение вместе с подсветкой синтаксиса и несколькими другими функциями.

введите описание изображения здесь

Ответ или решение

Для настройки автозавершения с циклом по предложениям в терминале Fedora вам нужно внести изменения в файл конфигурации вашего интерпретатора команд. Рассмотрим, как сделать это для bash.

Настройка оболочки Bash

  1. Измените файл ~/.inputrc:
    Откройте файл конфигурацииreadline в вашем домашнем каталоге:

    nano ~/.inputrc

    Добавьте в него следующие строки:

    set show-all-if-ambiguous on
    set show-all-if-unmodified on
    set menu-complete-display-prefix on
    "\t": menu-complete
    "\e[Z": menu-complete-backward
    • set show-all-if-ambiguous on: позволяет сразу выводить все варианты, если введенный текст не уникален.
    • set show-all-if-unmodified on: аналогично, выводит варианты при отсутствии частичного совпадения.
    • set menu-complete-display-prefix on: показывает общий префикс для всех вариантов.
    • "\t": menu-complete: связывает клавишу Tab с функцией menu-complete, которая позволяет циклически перебирать предложения.
    • "\e[Z": menu-complete-backward: позволяет переключаться по предложениям в обратном порядке.
  2. Примените изменения:
    После редактирования файла ~/.inputrc, чтобы изменения вступили в силу, перезапустите терминал или выполните:

    bind -f ~/.inputrc
  3. Проверьте настройки:
    Для проверки текущих привязок клавиш используйте команды:

    bind -p

    Эта команда покажет текущие привязки клавиш, среди которых вы должны увидеть вашу настройку для "\t".

Альтернативный вариант: использование Fish Shell

Если вы ищете более современное и удобное решение, рассмотрите возможность использования оболочки fish. Она предоставляет автозавершение по умолчанию и другие функции, такие как подсветка синтаксиса.

  1. Установите Fish:

    sudo dnf install fish
  2. Сделайте Fish своей оболочкой по умолчанию:

    Выполните следующую команду:

    chsh -s /usr/bin/fish
  3. Перезапустите терминал:
    После перезагрузки терминала вы будете использовать Fish, которое автоматически предлагает завершение команд по мере ввода.

Заключение

Теперь ваш терминал настроен так, чтобы при нажатии клавиши Tab переключаться между вариантами автозавершения. Если вы предпочтете более интуитивно понятный интерфейс, использование Fish может быть отличным решением.

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

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