Pull to refresh

Оттачиваем мастерство работы в консоли

Reading time3 min
Views64K
Original author: Sergiy Kukunin
После того, как у меня появился новый монитор на рабочем месте, я начал новую итерацию улучшения своего «безмышечного» (mouse-less, прим. пер.) опыта. Вы же знаете, что это значит, не так ли? Это значит, что каждый раз, когда вы беретесь за мышку, убирая руку с клавиатуры, вы тратите немного времени и энергии. Если вам нужно набирать много текста (а я много пишу кода), это становится существенным.

Так же существует следующий уровень «безмышечного» опыта, когда вы стараетесь избежать труднодоступных клавиш, например Delete, Backspace, Escape или даже Enter.

Если вы держите руки в стандартной позиции для 10-пальцевой слепой печати, более удобно нажать Ctrl-m вместо того, чтобы тянуться мизинцем к энтеру.

image

В этой статье я расскажу про удобные сочетания клавиши, которые можно использовать в любом терминале, хоть они работают и в многих других местах.

Для начала, сравнительная таблица:
Название Типичная клавиша Удобная альтернатива
Начало строки Home Ctrl-a
Конец строки End Ctrl-e
Один символ вперед Right Arrow Ctrl-f
Один символ назад Left Arrow Ctrl-b
Удалить символ под курсором Delete Ctrl-d
Удалить символ перед курсором Backspace Ctrl-h
Предыдущая команда в истории Up Arrow Ctrl-p
Следующая команда в истории Down Arrow Ctrl-n
Ввод команды Enter Ctrl-j или Ctrl-m
Как бонус, вот еще список удобных сочетаний:
Название Сочетание клавиш
Вырезать предыдущее слово Ctrl-w
Вырезать все к концу строки Ctrl-k
Вырезать все к началу строки Ctrl-u
Вставить вырезанное ранее Ctrl-y
Откатить изменение Ctrl-_ (Ctrl+Shift+-)
Очистить экран Ctrl-l
Не забудьте попробовать эти сочетания в других приложениях. Я думаю, вы удивитесь, насколько широко они поддерживаются.

Почему это работает


Прежде всего, существует широко используемая библиотека readline. Попробуйте удалить ее из вашей системы, и вы узнаете, сколько приложений от нее зависят (ЭТО БЫЛА ПЛОХАЯ ШУТКА. НЕ ДЕЛАЙТЕ ЭТО). Из официальной домашней страницы:

Библиотека GNU Readline предоставляет набор функций, позволяющих пользователю редактировать вводимые команды прямо в месте ввода.

Это значит, что приложение может просто использовать эту библиотеку для пользовательского ввода, и она позаботится обо всех «плюшках». Из официальной документации вы можете узнать, что она поддерживает emacs и vi режимы, где первый идет по умолчанию. Vi режим более знаком виммерам, однако есть один существенный недостаток: нет индикатора текущего режима.

readline предоставляет большинство сочетаний, но не все. Среди них есть Ctrl-h, Ctrl-m, Ctrl-j. Но почему они работают? Я думаю, вам понравится ответ.

Помните ли вы таблицу ASCII символов? Там еще в начале таблицы есть 32 старых ненужных управляющих символов. И если вы посмотрите на сочетание Ctrl-m с помощью утилиты xev, то увидите

<code>KeyRelease event, serial 34, synthetic NO, window 0x1800001,
    root 0x103, subw 0x0, time 17907461, (780,924), root:(3342,946),
    state 0x4, keycode 58 (keysym 0x6d, m), same_screen YES,
"   XLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False
</code>

что XLookupString возвращает 0x0d байт для этого сочетания. А 0x0d байт это не что иное, как управляющий символ возврата каретки, так же известный как \r. Этот управляющий символ говорит терминалу принять вашу команду, работая так же, как и Enter. Так что, управляющие символы не такие уж и ненужные (ну, по крайней мере часть из них).

Другой интересный вопрос, как же система определяет связь между Ctrl-m сочетанием и символом возврата каретки. Ответ на это не менее интересный — Caret notation: метод записи управляющих символов с помощью печатных. Правило очень простое: просто инвентируйте седьмой бит в коде управляющего символа, и получите соответствующий печатный. С одной стороны, все просто; с другой, нельзя переназначить. Но не верьте мне, проверьте сами здесь.

На этом все. Я надеюсь, материал был полезный. Совершенствуйтесь!

P.S. Индикатор режима в readline все-таки присутствует, начиная с версии 6.3. Для этого нужно добавить set show-mode-in-prompt On в ~/.inputrc. Спасибо xaizek
P.S.S.Таблицу ascii кодов можно посмотреть командой man ascii. Опять же, спасибо xaizek
Tags:
Hubs:
Total votes 68: ↑65 and ↓3+62
Comments116

Articles