GNU readline — свободная библиотека для интерфейса командной строки и обработки строк. Создана и поддерживается в рамках проекта GNU. Библиотека распространяется на условиях GNU General Public License. Последние версии библиотеки позволяют работать с многобайтовыми кодировками (Unicode).

Например, при вводе строки с использованием readline нажатие C-b () передвигает курсор на одну позицию назад, тогда как передвигает курсор на одну позицию вперёд; нажатие позволяет произвести поиск команд среди ранее введённых; использование этих клавиш пришло из одной из старейших и популярнейших программ проекта GNU — текстового редактора Emacs (описаны назначенные по умолчанию клавиши, но это назначение можно изменить, сделав его подобным применяемому в редакторе vi). Кроме того, readline поддерживает буфер обмена и дополнение имени команды по первым символам при нажатии клавиши . Readline является кросс-платформеной библиотекой, а значит, позволяет многим программам сохранить одинаковое поведение при вводе строки пользователем даже при переходе на другую платформу.

Конфигурация и примеры После установки readline полезно будет настроить под себя возможности редактирования в командной строке. Для этого нужно отредактировать один из конфигурационных файлов: /etc/inputrc — глобальный файл конфигурации для всех пользователей; ~/.inputrc — файл конфигурации для отдельных пользователей, хранимый в их домашнем каталоге; Не следует забывать — readline является библиотекой, а не самостоятельной утилитой, и поэтому те программы, которые используют readline могут иметь собственные файлы конфигурации, в которых определяется поведение библиотеки для решения специальных задач.

Формат файла конфигурации Комментарии — начинаются с символа # Назначения значений переменным конфигурации — пример: set meta-flag on Управляющие директивы — примеры: $if mode=emacs Назначения функций или макросов клавиатурным сочетаниям () —

Клавиатурные сочетания Команда bind.

Интересные примеры макросов В файлах конфигурации помимо простого переназначения функций редактирования новым «клавиатурным сочетаниям» можно создать достаточно нетривиальные макросы для выполнения специальных задач. Вот несколько примеров: "\e[A~":"\C-aman " — При нажатии в начало строки добавляется "man " "\ee":"\C-a/etc/init.d/ restart\e[5D\C-b" — При нажатии (или последовательном ) в начало командной строки вводится текст /etc/init.d/ restart, после чего курсор сдвигается на одно слово и символ назад. "\ew":"ping -c 3 -w 5 -R rbc.ru\e[5D\e[5D" — При нажатии , выводит ping -c 3 -w 5 -R rbc.ru и переводит курсор к rbc.ru.

Нетривиальные примеры Помимо ввода текста и выполнения функций редактирования, клавишам можно назначить немедленное выполнение программ или сценариев. Причём можно использовать возвращаемый в ходе выполнения программ текст для вставки его в редактируемую строку. Например, можно запрограммировать readline, чтобы при вводе определённой команды в качестве её аргументов можно было интерактивно подставлять с помощью функции не только имена файлов/каталогов, но и определённые параметры, специфичные именно для этой команды. Для настройки автодополнения используют команду complete.

Пример кода Следующий код написан на C :

#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <readline/readline.h> #include <readline/history.h>

int main() { char* input, shell_prompt;

for(;;)

// getting the current user's path snprintf(shell_prompt, sizeof(shell_prompt), "%s:%s $ ", getenv("USER"), getcwd(NULL, 1024)); // inputing... input = readline(shell_prompt); // eof if (!input) break; // path autocompletion when tabulation hit rl_bind_key('\t', rl_complete); // adding the previous input into history add_history(input);

/* do stuff */

// Т. к. вызов readline() выделяет память, но не освобождает (а возвращает), то эту память нужно вернуть (освободить). free(input);

Примечания

Ссылки Домашняя страница библиотека The Tecla — аналог readline, распространяется на условиях MIT-подобной лицензии библиотека libedit — аналог readline, распространяется на условиях лицензии BSD Bash Programmable-Completion GNU global: bash usage

Readline Категория:Свободные библиотеки программ Категория:Статьи с примерами кода Си Категория:Библиотеки текстового пользовательского интерфейса