Readline (Русский)
Readline - это библиотека, созданная GNU Project, используемая Bash и другими программами с интерфейсом CLI для того, чтобы взаимодействовать с командной строкой. Перед прочтением этой статьи пожалуйста ознакомьтесь с домашней страницей проекта, т.к. здесь размещена только общая информация.
Contents
Установка
Пакет readline, скорее всего, уже установлен как зависимость Bash
Редактирование в командной строке
По умолчанию Readline использует стиль сокращений Emacs для взаимодействия с командной строкой. Однако стиль редактирования vi также поддерживается. Для включения сочетаний клавиш в стиле vi:
~/.inputrc
set editing-mode vi
Чтобы включить такой режим только для Bash:
~/.bashrc
set -o vi
Индикатор режима при вводе
Имеется два режима редактирования vi - командый и вставочный. Вы можете включить отображение текущего режима:
~/.inputrc
set show-mode-in-prompt on
Команда выше отображает строчку в вводе (по умолчанию (cmd)/(ins)). Ее можно отредактировать посредством переменных vi-ins-mode-string и vi-cmd-mode-string.
Различные формы курсора для каждого из режимов
Вы можете установить различную форму курсора для каждого мода, используя "\1 .. \2" escapes:
~/.inputrc
set vi-ins-mode-string \1\e[6 q\2 set vi-cmd-mode-string \1\e[2 q\2
This will set a block shaped cursor when in command mode and a pipe cursor when in insert mode.
The Virtual Console uses different escape codes, so you should check first which term is being used:
~/.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
See software cursor for VGA for further details.
История команд
Обычно при нажатии кнопки "стрелка вверх", в приглашение командной строки подставляется последняя введенная команда вне зависимости от того, что набрал пользователь в момент нажатия. Однако, некоторые пользователи предпочитают, чтобы нажатие кнопки "стрелка вверх" вызывало список только тех команд, которые подходят к тому, что они набрали в момент нажатия.
Например, если пользователь вводил следующие команды:
ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfigwhomountman 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 # these are for vi-command mode "\e[A": history-search-backward "\e[B": history-search-forward set keymap vi-insert # these are for vi-insert mode "\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/XOF). Для активации forward-search-history/деактивации контроля потока выполните:
$ stty -ixon
либо переназначьте комбинацию клавиш в inputrc, например, на Alt+S, которая ничем не занята по умолчанию:
"\es":forward-search-history
Поиск по истории
Избежание повторов
Если вы несколько раз повторяете ввод одной и той же команды, она запишется в историю ввода несколько раз. Чтобы избежать этого, добавьте в ~/.bashrc:
export HISTCONTROL=ignoredups
Удаление пробелов в начале строки
Чтобы отключить запись в историю команд строк, начинающихся с пробелов, добавьте в ~/.bashrc:
export HISTCONTROL=ignorespace
Если ~/.bashrc уже содержит
export HISTCONTROL=ignoredups
замените строку на:
export HISTCONTROL=ignoreboth
Макросы
В Readline также реализована поддержка назначения клавиш на клавиатурные макросы. Вот простой пример, запустите эту команду в Bash:
bind '"\ew":"\C-e # macro"'
Или добавьте ее часть в inputrc:
"\ew":"\C-e # macro"
Теперь наберите команду и нажмите Alt+W. Readline отреагирует на это, как если бы была нажата комбинация Ctrl+E (end-of-line, конец строки).
Используйте любые сочетания клавиш с макросами Readline для автоматизации часто используемых задач. Например, такой макрос при нажатии Ctrl+Alt+L добавляет к строке " | less" и запускает команду (Ctrl+M is equivalent to Enter):
"\e\C-l":"\C-e | less\C-m"
Следующий макрос добавляет в начало команды "yes | " при нажатии Ctrl+Alt+Y для того, чтобы согласиться на любой вопрос "yes/no", задаваемый командой:
"\e\C-y":"\C-ayes | \C-m"
Этот пример разрывает строку на su -c '', если была нажата комбинация Alt+S:
"\es":"\C-a su -c '\C-e'\C-m"
Следующий пример добавляет в начало команды sudo при нажатии Alt+S. Она безопаснее, т.к. не передает нажатие клавиши {{ic|Enter}.
"\es":"\C-asudo \C-e"
В последнем примере показано, как быстро отправить команду на выполнение в бэкграунд используя сочетание Ctrl+Alt+B и игнорируя весь ее вывод:
"\e\C-b":"\C-e > /dev/null 2>&1 &\C-m"
Советы и хитрости
Отключение ^C
После обновления readline терминал выводит на экран ^C после нажатия Ctrl+C. Если вы хотите отключить это, просто добавьте следующую строку в ~/.inputrc:
set echo-control-characters off