GNU Readline
Материал из Xgu.ru
GNU Readline — библиотека, предназначенная для решения задачи ввода и редактирования текстовой строки, например командной строки. Самая популярная программа, использующая readline — командный интерпретатор bash; но вообще программ, которые прибегают к использованию readline для ввода текста, намного больше (другие же можно оснастить воозможностями readline при помощью специальных обёрток, об этом ниже).
[править] Комбинации клавиш
GNU Readline поддерживает два режима редактирования:
- Emacs-режим;
- Vi-режим;
управляющие последовательности в которых, похожи на управляющие последовательности текстовых редакторов Emacs и Vi соответственно. Основным режимом является режим Emacs (настолько, что не все даже знают о существовании режима vi).
Управляющие последовательности для режима Emacs:
- Ctrl+a - переход к началу строки
- Ctrl+e - переход к концу строки
- Ctrl+b - аналог стрелки влево
- Ctrl+f - аналог стрелки вправо
- Ctrl+c - сброс команды
- Ctrl+d - аналог Delete. Если строка пустая - выход из shell (если не установлено set -o ignoreeof)
- Ctrl+g - выход из режима дополнения
- Ctrl+h - аналог BackSpace
- Ctrl+i - аналог Tab
- Ctrl+w - удалить от курсора до начала слова
- Ctrl+k - удалить всё до конца строки
- Ctrl+u - удалить всё до начала строки
- Ctrl+y - вставить из текст из буфера kill-ring (то, что было удалено ранее)
- Ctrl+l - Очистить экран (набранная строка и даже позиция курсора остаётся)
- Ctrl+r - поиск по истории набранных команд
- Ctrl+t - поменять местами текущий символ с предыдущим
- Ctrl+v - преобразует следующую клавишу в её символьное отображение (Enter - ^M, Esc - ^[ и т.д.)
- Ctrl+x дважды - скачок между началом строки и текущей позицией курсора.
- Ctrl+z - притормозить/остановить выполнение команды в фон
- Ctrl+_ - отмена последнего изменения
Эти комбинации клавиш можно использовать везде,
где используется readline,
но чаще всего их применяют в командном интерпретаторе bash.
[править] readline-обёртки
Даже если программа не поддерживает readline (и вообще работает со стандартными потоками ввода и вывода), можно добавить в неё функционал readline, если запускать её через специальную обёртку.
- cle (программы, работающие напрямую с терминалом работают, не работают в cle; нет возможности загружать свои варианты автопродолжения по tab);
- rlfe (программы, работающие напрямую с терминалом работают, не работают в cle; нет возможности загружать свои варианты автопродолжения по tab; ввод подсвечивается);
- rlwrap (наиболее мощный wrapper; умеет загружать свои варианты автопродолжения).
Например, мы обращаемся на 25 порт SMTP-сервера с помощью программы netcat и хотим использовать мощные возможности readline при работе с ним.
%$ nc mxs.mail.ru 25 220 Mail.Ru ESMTP HELO zlo 250 mx24.mail.ru ready to serve ^[[A^[[B
Обратите внимание на последнюю строку. Мы не можем использовать стрелки для прокручивания истории нашего ввода.
Теперь, мы пробуем использовать readline-wrapper:
%$ rlwrap nc mxs.mail.ru 25 HELO zlo
Даже нажатие стрелки вверх сразу же приводит к тому, что вспоминается ввод
HELO zlo
Дальше можно продолжать использовать стрелки, можно обратный поиск в истории и даже автоматическое продолжение. По завершении команды история её ввода сохраняется в ~/.команда_history. Например, для данного случая история будет сохранена в ~/.nc_history (так работает rlwrap).
Пример кода Си, использующего readline:
#include <stdio.h> #include <stdlib.h> #include <readline/readline.h> #include <readline/history.h> int main() { printf( "%s\n", readline( "test> " ) ); return 0; }
[править] Дополнительная информация
- Фокусы с автодополнением в bash (рус.) — и ещё немного об автодополнении в bash