Xgu.ru теперь в Контакте  — приходите и подключайтесь.
Пока мы работаем над следующими видео, вы можете подключиться в Контакте. Познакомимся и обсудим новые страницы и ролики.

Vk-big.pngYoutube-big.jpeg

GNU Readline

Материал из Xgu.ru

(Перенаправлено с readline)
Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.


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;
}

[править] Дополнительная информация

Источник — «http://xgu.ru/wiki/GNU_Readline»