Readline (Русский) - ArchWiki

Jump to content

# Readline (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Readline. Дата последней синхронизации: 11 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Readline — библиотека GNU Project, которую Bash и другие программы с CLI-интерфейсом используют для взаимодействия с командной строкой. Подробнее см. readline(3).

## Установка

Вероятнее всего, пакет readline уже установлен как зависимость Bash.

## Режим редактирования

По умолчанию Readline использует для взаимодействия с командной строкой комбинации клавиш в стиле Emacs. Чтобы выбрать стиль vi, добавьте следующую строку в файл `~/.inputrc`:

    ~/.inputrc

    set editing-mode vi

Если вы хотите задать этот режим только для Bash, отредактируйте `~/.bashrc`:

    ~/.bashrc

    set -o vi

### Индикатор режима в приглашении

Редактирование в стиле vi имеет два режима: командный и вставки. Настроить отображение индикатора режима можно следующей опцией:

    ~/.inputrc

    set show-mode-in-prompt on

Теперь в вашем приглашении будет отображаться строка-индикатор (по умолчанию — `(cmd)`/`(ins)`), которую можно модифицировать переменными `vi-ins-mode-string` и `vi-cmd-mode-string`.

### Разные формы курсора для режимов

Форма курсора выбирается с помощью escape-последовательностей "\1 .. \2":

    ~/.inputrc

    set vi-ins-mode-string \1\e[6 q\2
    set vi-cmd-mode-string \1\e[2 q\2

Здесь для командного режима выбран курсор-блок, а для режима вставки — вертикальная линия. Чтобы это работало, необходимо включить индикатор режима редактирования (см. #Индикатор режима в приглашении).

В виртуальной консоли используются другие коды управляющих последовательностей, так что сначала необходимо проверить, какой терминал используется:

    ~/.inputrc

    $if term=linux
    	set vi-ins-mode-string \1\e[?0c\2
    	set vi-cmd-mode-string \1\e[?8c\2
    $else
    	set vi-ins-mode-string \1\e[6 q\2
    	set vi-cmd-mode-string \1\e[2 q\2
    $endif

Подробнее см. документацию о программном курсоре для VGA.

## Быстрое перемещение по словам

Xterm поддерживает перемещение по словам клавишами `Ctrl+Left` и `Ctrl+Right` по умолчанию. Чтобы настроить этот эффект в других эмуляторах, выберите подходящие коды терминала и присвойте их переменным `backward-word` и `forward-word` в файле `~/.inputrc`.

Например, для urxvt:

    ~/.inputrc

    "\e[1;5D": backward-word
    "\e[1;5C": forward-word

## История команд

Обычно нажатие клавиши "стрелка вверх" выводит последнюю команду вне зависимости от того, что было (частично) введено на данный момент. Более практично будет искать только те прошлые команды, которые совпадают с текущим вводом.

Например, пользователь вводил следующие команды:

- `ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig`
- `who`
- `mount`
- `man mount`

Если в этой ситуации набрать `ls` и нажать стрелку, текущий ввод будет заменён на `man mount`, последнюю выполненную команду. Если поиск по истории включён, то показываться будут только прошлые команды, начинающиеся с `ls` (текущий ввод), в данном случае — `ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig`.

Включить режим поиска по истории можно следующими строками в `/etc/inputrc` или `~/.inputrc`:

    "\e[A": history-search-backward
    "\e[B": history-search-forward

Если вы используете режим vi, то добавьте следующие строки в `~/.inputrc` (из этого сообщения):

    set editing-mode vi
    $if mode=vi
    set keymap vi-command
    # для командного режима vi
    "\e[A": history-search-backward
    "\e[B": history-search-forward
    j: history-search-forward
    k: history-search-backward
    set keymap vi-insert
    # для режима вставки vi
    "\e[A": history-search-backward
    "\e[B": history-search-forward
    $endif

Если вы настраивали файл `~/.inputrc`, то рекомендуется добавить в него ещё одну строку, чтобы избежать странных вещей вроде этой:

    $include /etc/inputrc

В качестве альтернативы можно использовать инкрементный поиск по комбинации `Ctrl+R`. В этом случае поиск будет вестись не по последним командам, а по похожим. Повторное нажатие `Ctrl+R` при работе в этом режиме отобразит предыдущую строку в буфере, совпадающую с текущей строкой поиска, а `Ctrl+G` отменит поиск и восстановит текущий ввод. Так, чтобы поиск шёл среди ранее выполненных команд `mount`, нажмите `Ctrl+R`, введите 'mount' и продолжайте нажимать `Ctrl+R`, пока не дойдёте до нужной команды.

Обратный (вперёд) эквивалент этого режима называется forward-search-history и привязан к комбинации `Ctrl+S`. Правда, в большинстве терминалов комбинация `Ctrl+S` переопределена на приостановку выполнения програмы до нажатия `Ctrl+Q` (т.н. управление выполнением XON/XOFF). Для активации forward-search-history либо отключите управление потоком выполнения:

    $ stty -ixon

либо назначьте в `inputrc` другую комбинацию. Например, можно использовать `Alt+S`:

    "\es": forward-search-history

## Быстрое завершение

При автодополнении (tab completion) одиночное нажатие клавиши tab пытается дополнить команду. Если частичное дополнение невозможно, двукратное нажатие покажет все возможные завершения.

Можно изменить двойное нажатие на одиночное:

    ~/.inputrc

    set show-all-if-unmodified on

Либо же можно настроить, чтобы такое одиночное нажатие выполняло оба действия: дополнение слова и показ всех возможных завершений, если полное дополнение невозможно:

    ~/.inputrc

    set show-all-if-ambiguous on

## Цветное завершение

Включить цветное отображение имён файлов можно опцией `colored-stats`. При желании можно настроить подсветку одинакового префикса в списке возможных завершений опцией `colored-completion-prefix`. Например:

    ~/.inputrc

    # Цвет файла в зависимости от типа
    # Может вызвать мерцание текста в некоторых терминалах (например, xterm)
    set colored-stats On
    # Добавление символа для обозначения типа
    set visible-stats On
    # Пометить каталоги-ссылки
    set mark-symlinked-directories On
    # Цветовое выделение общего префикса
    set colored-completion-prefix On
    # Цветовое выделение общего префикса и завершение с помощью меню
    set menu-complete-display-prefix On

## Макросы

Readline позволяет привязывать клавиатурные макросы на клавиши. Например, выполните эту команду в Bash:

    bind '"\ew": "\C-e # macro"'

или добавьте строку внутри одиночных кавычек в inputrc:

    "\ew": "\C-e # macro"

Теперь введите любую строку и нажмите `Alt`+`W`. Readline будет действовать как при нажатии `Ctrl+E` (end-of-line) с добавлением в конце строки "`# macro`".

Макросы позволяют автоматизировать часто используемые идиомы. Например, добавление "| less" к строке и "нажатие" `Ctrl+M` (эквивалент `Enter`) по комбинации `Ctrl+Alt+L`:

    "\e\C-l": "\C-e | less\C-m"

Добавление префикса 'yes |' по нажатию `Ctrl+Alt+Y`, в результате чего программа получит утвердительный ответ на любой вопрос "да/нет":

    "\e\C-y": "\C-ayes | \C-m"

Добавление префикса `su -c ''` по нажатию `Alt+S`:

    "\es": "\C-a su -c '\C-e'\C-m"

Добавление префикса `sudo` по нажатию `Alt+S`. Несколько безопаснее, чем предыдущий пример, потому что не происходит нажатия `Enter`:

    "\es": "\C-asudo \C-e"

Наконец, быстрый перевод программы в фоновый режим выполнения с удалением всего вывода по комбинации `Ctrl+Alt+B`.

    "\e\C-b": "\C-e > /dev/null 2>&1 &\C-m"

## Отключение отображения клавиши control

Readline выдаёт в терминал строку `^C` при нажатия `Ctrl+C`. Чтобы это отключить, просто добавьте следующие строки в `~/.inputrc`:

    set echo-control-characters off

## Смотрите также

- Редактирование в режиме vi
- Редактирование в режиме emacs

Categories:

- Command-line (Русский)
- GNU (Русский)