Как использовать табы с rlwrap ed?

Вопрос или проблема

На моих системах macOS и Linux я запускаю ed с alias ed='rlwrap ed'. На macOS с rlwrap 0.46.1 (2022) я могу свободно создавать файлы с табуляциями, как например:

$ ed
a
foo<TAB>bar

но на моих системах Linux с rlwrap 0.43 (2016) я не могу использовать табуляции, если не экранирую их так:

$ ed
a
foo<ESCAPE><TAB>bar

Я знаю, что мне следует обновить свои Linux-серверы; но rlwrap в данный момент является последним, согласно apt. Есть ли какая-то опция rlwrap, которая вернет мне мои табуляции? Я попробовал искать в man-странице rlwrap слово “tab”; но ничего не нашел.

Как и в любом вопросе относительно различий использования ed с rlwrap и использования ed без rlwrap, ответ обычно связан с библиотекой Readline.

В данном случае, поскольку символ табуляции является особым для Readline и вызывает автодополнение имен файлов и т.д., библиотека позволяет вставку символа табуляции через функцию tab-insert. По умолчанию эта функция привязана к M-TAB, т.е. к Escape+Tab. Вы можете перепривязать ее в вашем файле ~/.inputrc для ed конкретно, следующим образом:

$if ed
        TAB: tab-insert
$endif

Это перепривяжет функцию к клавише Tab, без необходимости сначала нажимать Escape.

Обратите внимание, что без условной проверки это отключит специальную обработку клавиши Tab в других приложениях, поддерживающих Readline, таких как bash.

Ответ или решение

Использование rlwrap с редактором ed может представлять собой определенные сложности, особенно в отношении обработки табуляции. На macOS и Linux существуют некоторые различия в конфигурации и версии rlwrap, которые могут влиять на функциональность, в частности при работе с клавишей Tab.

Теория

ed — это классический текстовый редактор, часто используемый в сценариях, где требуется минимальная зависимость от внешних библиотек. При этом rlwrap — это утилита, обеспечивающая поддержку истории и редактирования командной строки, используя возможность библиотеки Readline GNU. Одним из основных преимуществ использования rlwrap с ed является возможность облегчения ввода команд благодаря поддержке редактирования строк и навигации по истории команд.

Тем не менее, когда вы используете rlwrap, важно помнить о том, что библиотека Readline обладает встроенными функциями, такими как автодополнение, которые активно обрабатываются при нажатии определенных клавиш. Особенно это касается клавиши Tab, которая в Readline используется для автодополнения файлов и команд.

Пример

Ваша проблема заключается в том, что на macOS с rlwrap версии 0.46.1 вы можете без проблем использовать клавишу Tab в ed. Однако на ваших Linux-системах с rlwrap версии 0.43 требуется дополнительное нажатие Escape перед Tab, чтобы вставить символ табуляции, что может быть неудобным. Это различие обусловлено стандартными настройками обработки клавиатурных ввода в библиотеке Readline.

Применение

Чтобы адаптировать функциональность и вернуть контроль над клавишей Tab, вам потребуется изменить настройки Readline. Это можно сделать с помощью конфигурационного файла ~/.inputrc. В этом файле вы можете переназначить функции, связанные с обработкой клавиш, и, в частности, переназначить функцию tab-insert.

Следующий пример кода показывает, как можно настроить файл ~/.inputrc, чтобы исправить ситуацию:

$if ed
    TAB: tab-insert
$endif

Этот фрагмент кода указывает, что в случае использования программы ed, нажатие клавиши Tab будет обрабатывать вставку табуляции, а не запускать функцию автокомплементации Readline. Это позволяет использовать символ табуляции непосредственно в тексте, без необходимости использования Escape.

Однако, следует отметить, что без использования условного оператора $if ed, такие изменения могут повлиять на поведение других программ, использующих библиотеку Readline, таких как bash. То есть без уточнения условия, нажатие Tab может потерять свою функцию автодополнения в других оболочках и программах.

Заключение

Эти конфигурационные изменения должны помочь скорректировать функциональность rlwrap при использовании ed в ваших Linux-системах, обеспечив более бесшовный опыт перехода между различными операционными системами. Тем не менее, учитывая ваш текущий контекст, вполне вероятно, что обновление версии rlwrap до более современной также может решить вашу проблему, особенно если функциональность вашей дистрибуции Linux позволяет это сделать. В любом случае, выполнение описанной выше настройки гарантирует, что ваша работа с ed останется продуктивной и без ненужных раздражающих факторов.

Оцените материал
Добавить комментарий

Капча загружается...