arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
191 lines (116 loc) • 11.2 kB
Markdown
**Readline** - это библиотека, созданная [GNU Project](/index.php/GNU_Project "GNU Project"), используемая [Bash](/index.php/Bash_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Bash (Русский)") и другими программами с интерфейсом CLI для того, чтобы взаимодействовать с командной строкой. Перед прочтением этой статьи пожалуйста ознакомьтесь с домашней [страницей](http://www.gnu.org/s/readline/) проекта, т.к. здесь размещена только общая информация.
## Contents
* [1 Редактирование в командной строке](#.D0.A0.D0.B5.D0.B4.D0.B0.D0.BA.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D0.B2_.D0.BA.D0.BE.D0.BC.D0.B0.D0.BD.D0.B4.D0.BD.D0.BE.D0.B9_.D1.81.D1.82.D1.80.D0.BE.D0.BA.D0.B5)
* [2 История команд](#.D0.98.D1.81.D1.82.D0.BE.D1.80.D0.B8.D1.8F_.D0.BA.D0.BE.D0.BC.D0.B0.D0.BD.D0.B4)
* [2.1 Поиск по истории](#.D0.9F.D0.BE.D0.B8.D1.81.D0.BA_.D0.BF.D0.BE_.D0.B8.D1.81.D1.82.D0.BE.D1.80.D0.B8.D0.B8)
* [2.1.1 Избежание повторов](#.D0.98.D0.B7.D0.B1.D0.B5.D0.B6.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BF.D0.BE.D0.B2.D1.82.D0.BE.D1.80.D0.BE.D0.B2)
* [2.1.2 Удаление пробелов в начале строки](#.D0.A3.D0.B4.D0.B0.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D0.B1.D0.B5.D0.BB.D0.BE.D0.B2_.D0.B2_.D0.BD.D0.B0.D1.87.D0.B0.D0.BB.D0.B5_.D1.81.D1.82.D1.80.D0.BE.D0.BA.D0.B8)
* [3 Макросы](#.D0.9C.D0.B0.D0.BA.D1.80.D0.BE.D1.81.D1.8B)
* [4 Советы и хитрости](#.D0.A1.D0.BE.D0.B2.D0.B5.D1.82.D1.8B_.D0.B8_.D1.85.D0.B8.D1.82.D1.80.D0.BE.D1.81.D1.82.D0.B8)
* [4.1 Отключение ^C](#.D0.9E.D1.82.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.5EC)
## Редактирование в командной строке
По умолчанию Readline использует стиль сокращений Emacs для взаимодействия с командной строкой. Однако стиль редактирования vi также поддерживается. Так или иначе, библиотека предлагает огромный набор клавиатурных сокращений для редактирования вводимых данных [без использования клавиш управления курсором.](/index.php/Keyboard_without_cursor_keys "Keyboard without cursor keys")
Если вы являетесь пользователем [vi](/index.php/Vim_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Vim (Русский)") или [vim](/index.php/Vim_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Vim (Русский)"), возможно, вы захотите добавить следующую строку в `~/.inputrc` для включения сочетаний клавиш в стиле vi:
```
set editing-mode vi
```
Другой способ включить vi-сочетания клавиш - дописать следующую строку в `~/.bashrc`:
```
set -o vi
```
Полезная информация по каждому стилю сокращений: [vi](http://www.catonmat.net/download/bash-vi-editing-mode-cheat-sheet.pdf)-стиль; [emacs](http://www.catonmat.net/download/readline-emacs-editing-mode-cheat-sheet.pdf)-стиль.
## История команд
Обычно при нажатии кнопки "стрелка вверх", в приглашение командной строки подставляется последняя введенная команда вне зависимости от того, что набрал пользователь в момент нажатия. Однако, некоторые пользователи предпочитают, чтобы нажатие кнопки "стрелка вверх" вызывало список только тех команд, которые подходят к тому, что они набрали в момент нажатия.
Например, если пользователь вводил следующие команды:
* `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` (из [этого поста](https://bbs.archlinux.org/viewtopic.php?pid=428760#p428760)):
```
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`, если вы хотите избежать странных вещей вроде [этой](https://bbs.archlinux.org/viewtopic.php?id=112537):
```
$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](https://www.archlinux.org/packages/?name=readline) терминал выводит на экран `^C` после нажатия `Ctrl+C`. Если вы хотите отключить это, просто добавьте следующую строку в `~/.inputrc`:
```
set echo-control-characters off
```