Библиотека программного обеспечения
GNU Readline — это программная библиотека , которая обеспечивает возможности оперативного редактирования и истории для интерактивных программ с интерфейсом командной строки , таких как Bash . В настоящее время его поддерживает Чет Рэми как часть проекта GNU .
Он позволяет пользователям перемещать текстовый курсор , выполнять поиск в истории команд , управлять кольцом уничтожения (более гибкая версия буфера обмена копирования/вставки) и использовать завершение табуляции на текстовом терминале . Будучи кросс-платформенной библиотекой, readline позволяет приложениям в различных системах демонстрировать одинаковое поведение при редактировании строк.
Режимы редактирования
Readline поддерживает режимы редактирования Emacs и vi, которые определяют, как ввод с клавиатуры интерпретируется как команды редактора. См. Editor war § Сравнение .
Сочетания клавиш Emacs
Привязки клавиш режима редактирования Emacs взяты из текстового редактора Emacs .
В некоторых системах Escнеобходимо использовать вместо , поскольку ярлык конфликтует с другим ярлыком. Например, нажатие + в окне эмулятора терминала Xfce не перемещает курсор вперед на одно слово, а активирует «Файл» в меню окна терминала, если это не отключено в настройках эмулятора.AltAltAltf
- Tab ↹ : автозаполнение с позиции курсора.
- Ctrl+ a : перемещает курсор в начало строки (эквивалент клавиши ).Home
- Ctrl+ b : перемещает курсор на один символ назад (эквивалент клавиши ).←
- Ctrl+ c : отправляет сигнал SIGINT через псевдотерминал текущей задаче, которая прерывает и закрывает ее. [д]
- Ctrl+d
- Отправляет маркер EOF, который (если не отключен опцией) закрывает текущую оболочку (эквивалент команды
exit
). (Только если в текущей строке нет текста) - Если в текущей строке есть текст, удаляет текущий символ (тогда эквивалентный клавише ).Delete
- Ctrl+ e : (конец) перемещает курсор в конец строки (эквивалент клавиши ).End
- Ctrl+ f : перемещает курсор на один символ вперед (эквивалент клавиши ).→
- Ctrl+ g : Прервать обратный поиск и восстановить исходную строку.
- Ctrl+ h : удаляет предыдущий символ (аналогично Backspace).
- Ctrl+ i : эквивалент клавиши табуляции.
- Ctrl+ j : эквивалент клавиши ввода.
- Ctrl+ k : Очищает содержимое строки после курсора и копирует его в буфер обмена .
- Ctrl+ l : Очищает содержимое экрана (эквивалент команды
clear
). - Ctrl+ n : (следующий) вызывает следующую команду (эквивалент клавиши ).↓
- Ctrl+ o : выполняет найденную команду из истории и извлекает следующую строку относительно текущей строки из истории для редактирования.
- Ctrl+ p : (предыдущий) вызывает предыдущую команду (эквивалент клавиши ).↑
- Ctrl+ r : (обратный поиск) вызывает последнюю команду, включая указанные символы. Второй + вызывает следующую предшествующую команду, соответствующую поиску.Ctrlr
- Ctrl+ s : вернуться к следующей, более поздней команде обратного поиска (будьте осторожны, не выполняйте ее с терминала, поскольку эта команда также запускает XOFF). Если вы изменили настройку XOFF, используйте + для возврата.Ctrlq
- Ctrl+ t : транспонировать два предыдущих символа.
- Ctrl+ u : Очищает содержимое строки перед курсором и копирует его в буфер обмена .
- Ctrl+ v : Если следующий входной сигнал также является управляющей последовательностью, введите его буквально (например, * + + введите «^H», буквальный возврат.)Ctrlv Ctrlh
- Ctrl+ w : Очищает слово перед курсором и копирует его в буфер обмена .
- Ctrl+ + : Редактирует текущую строку в программе $EDITOR или vi , если она не определена.x Ctrle
- Ctrl+ + : прочитать содержимое файла inputrc и включить все найденные там привязки или назначения переменных.x Ctrlr
- Ctrl+ + : Поэтапная отмена, запоминается отдельно для каждой строки.x Ctrlu
- Ctrl+ + : Отобразить информацию о версии текущего экземпляра Bash.x Ctrlv
- Ctrl+ + : чередует курсор с его старой позицией. (Cx, потому что x имеет форму пересечения).x Ctrlx
- Ctrl+ y : (дергание) добавляет содержимое буфера обмена из позиции курсора.
- Ctrl+ z : отправляет сигнал SIGTSTP текущей задаче, которая приостанавливает ее. Чтобы выполнить его в фоновом режиме, можно ввести
bg
. Чтобы вернуть его с фона или приостановить fg ['process name or job id']
(передний план), можно выдать. - Ctrl+ _ : Поэтапная отмена, запоминается отдельно для каждой строки.
- Alt+ b : (назад) перемещает курсор на одно слово назад.
- Alt+ c : делает символ под курсором заглавным и перемещает его в конец слова.
- Alt+ d : вырезает слово после курсора.
- Alt+ f : (вперед) перемещает курсор на одно слово вперед.
- Alt+ l : уменьшает регистр каждого символа от позиции курсора до конца текущего слова.
- Alt+ r : Отменяет изменения и возвращает строку в том виде, в каком она была в истории.
- Alt+ u : переводит с заглавной буквы каждый символ от позиции курсора до конца текущего слова.
- Alt+ . : вставить последний аргумент предыдущей команды (последнее слово предыдущей записи истории).
Выбор GPL в качестве лицензии GNU Readline
GNU Readline примечателен тем, что является библиотекой свободного программного обеспечения , лицензируемой по лицензии GNU General Public License (GPL). Библиотеки свободного программного обеспечения гораздо чаще лицензируются по лицензии GNU Lesser General Public License (LGPL), например, библиотека GNU C , GNU gettext и FLTK . Разработчик приложения, выбравший ссылку на библиотеку с лицензией LGPL, может использовать для приложения любую лицензию. [3] Но для подключения к библиотеке, лицензируемой GPL, такой как Readline, требуется, чтобы все объединенное полученное приложение при распространении было лицензировано по GPL, чтобы соответствовать разделу 5 GPL. [4] [5]
Это лицензирование было выбрано FSF в надежде, что оно побудит программное обеспечение перейти на GPL. [6] Важным примером изменения лицензии приложения для соответствия условиям авторского лева GNU Readline является CLISP , реализация Common Lisp . Первоначально выпущенная в 1987 году, она была изменена на лицензию GPL в 1992 году [7] после обмена электронными письмами между одним из первоначальных авторов CLISP, Бруно Хейбле, и Ричардом Столлманом , в котором Столлман утверждал [8] , что связывание readline в CLISP означает что Хейбл должен был повторно лицензировать CLISP по лицензии GPL, если он хотел распространять реализацию CLISP, в которой использовалась readline. [9]
Другой ответ заключался в том, чтобы не использовать это в некоторых проектах, заставляя при вводе текста использовать для редактирования примитивный драйвер терминала Unix.
Альтернативные библиотеки
Альтернативные библиотеки были созданы с другими лицензиями, поэтому их можно использовать в программных проектах, которые хотят реализовать функции редактирования командной строки, но выпускаются с лицензией, отличной от GPL.
- Многие системы BSD имеют лицензию libedit . [10] MariaDB и PHP позволяют пользователю выбирать во время сборки, связываться ли с GNU Readline или с libedit. [11] [12]
- linenoise — это крошечная библиотека C, предоставляющая функции редактирования строк. [13]
- Haskeline — это лицензированная BSD-3-Clause библиотека, подобная readline, для Haskell. В основном он написан для компилятора Glasgow Haskell , [14] , но доступен и для других проектов Haskell, которым также необходимы услуги по редактированию строк. [15]
- PSReadLine — это реализация строки чтения под лицензией BSD-2-Clause, написанная на C# для PowerShell , вдохновленная bash и GNU Readline [16].
Образец кода
Следующий код написан на C и должен быть скомпонован с библиотекой readline, передав компилятору флаг -lreadline :
#include <stdlib.h> #include <stdio.h> #include <readline/readline.h> #include <readline/history.h> int main () { // Настройте readline для автоматического заполнения путей при нажатии клавиши табуляции. rl_bind_key ( '\t' , rl_complete ); // Включаем историю using_history (); while ( 1 ) { // Отображение приглашения и чтение входного символа * input = readline ( "prompt> " ); // Проверка EOF. если ( ! вход ) сломать ; // Добавляем данные в историю чтения. add_history ( вход ); // Делаем что-нибудь... // Свободный буфер, выделенный строкой чтения free ( input ); } вернуть 0 ; }
Привязки
Языки программирования, отличные от C, которые обеспечивают привязку языка для readline, включают в себя
- Встроенный
readline
модуль Python; - Встроенный
readline
модуль Ruby; [17] - Сторонний
Term::ReadLine
модуль Perl (CPAN), специально Term::ReadLine::Gnu
для GNU ReadLine.
Поддержка альтернатив readline различается в зависимости от этих привязок.
Примечания
- ^ GPL-3.0 или новее, начиная с версии 6.0 (20 февраля 2009 г.).
- ^ GPL-2.0 или более поздняя версия от версии 2.1 (05.06.1997) до версии 5.2 (11.10.2006).
- ^ GPL-1.0 или новее от? до версии 2.0 (04.08.1994).
- ^ Часть псевдотерминалов или PTY (для Linux), что видно из инструментов настройки терминала, таких как stty ; в типичном дистрибутиве Linux главная конечная точка PTY обрабатывает специальные символы как сигналы, которые должны быть отправлены подчиненным устройствам, например
SIGINT
[2]
Рекомендации
- ↑ Чет Рэми (26 сентября 2022 г.). «Доступна версия Readline-8.2» . Проверено 26 сентября 2022 г.
- ^ «pty(7) — страница руководства Linux» . man7.org . Проверено 30 сентября 2021 г.
- ^ "Меньшая стандартная общественная лицензия GNU" . Меньшая стандартная общественная лицензия GNU v3.0 — проект GNU . Фонд свободного программного обеспечения. 2007 . Проверено 3 сентября 2011 г.
- ^ «Универсальная общественная лицензия GNU». Стандартная общественная лицензия GNU v3.0 — проект GNU . Фонд свободного программного обеспечения. 2007 . Проверено 3 сентября 2011 г.
- ^ «Часто задаваемые вопросы о лицензиях GNU» . Часто задаваемые вопросы о лицензиях GNU — Проект GNU . Фонд свободного программного обеспечения. 2010 . Проверено 3 сентября 2011 г.
- ^ «Почему вам не следует использовать Меньшую GPL для своей следующей библиотеки» . Почему вам не следует использовать Меньшую GPL для вашей следующей библиотеки — Проект GNU — Фонд свободного программного обеспечения . Фонд свободного программного обеспечения. 2016 . Проверено 15 октября 2019 г.
- ^ «Уведомление об авторских правах CLISP» . Репозиторий CLISP. 1992 год . Проверено 3 сентября 2011 г.
- ^ «Почему CLISP находится под лицензией GPL» . Репозиторий CLISP. 1992 год . Проверено 19 января 2023 г.
- ^ «Лицензия - почему GNU GPL?». Часто задаваемые вопросы (с ответами) о CLISP . Команда КЛИСП . Проверено 3 сентября 2011 г.
- ^ "editline(3) - Страницы руководства NetBSD" . НетБСД . Проверено 13 сентября 2022 г.
Библиотека редактора командной строки (libedit, -ledit)
- ^ "MariaDB/server/blob/10.2/BUILD/SETUP.sh". Репозиторий MariaDB . Фонд МарияДБ . Проверено 24 октября 2017 г.
- ^ "php/php-src/tree/master/ext/readline". PHP-репозиторий . Группа PHP . Проверено 24 октября 2017 г.
- ↑ Санфилиппо, Сальваторе (10 мая 2020 г.). «антирез/линейный шум». Гитхаб .
- ^ «Приложения и библиотеки». Хаскелл вики . Haskell.org . Проверено 24 октября 2017 г.
- ^ Джуда Джейкобсон. «judah/haskeline: библиотека Haskell для строкового ввода в программах командной строки». Репозиторий Haskeline . Проверено 24 октября 2017 г.
- ^ «PowerShell/PSReadLine: реализация строки чтения для PowerShell, вдохновленная bash» . Репозиторий PSReadLine . Проверено 20 декабря 2023 г.
- ^ «Модуль: Readline (Ruby 3.0.2)» .
Внешние ссылки
- Вещи, которые вы не знали о GNU Readline