Известно, что оболочка bash (да и прочие shell'ы) имеют емаксо-подобные клавиатурные сокращения для перемещения курсора и прочей работы с текстом.
C-f и C-b перемещают курсор на символ вперёд и назад соответственно.
M-f и M-b перемещяют курсор на слово вперёд и назад соответственно.
C-a и C-e перемещают курсор в начало и конец строки соответственно.
C-w и M-Backspace удаляют слово перед курсором (немного разное поведение в bash).
M-d удаляет слово после курсором.
C-u вставляет текст из буфера обмена, а M-u перебирает различные варианты из буфера.
C-t переставляет местами буквы - до и после точки (до курсора и курсор).
M-t переставляет местами слова - до и после точки.
M-u переводит всё слово после курсора в верхний регистр.
M-l - в нижний регистр.
M-c - первую букву слова в верхний, а остальное в нижний.
Здесь C- означает нажать и удерживать Ctrl, а M- - нажать и удерживать Alt или нажать и отпустить Esc, а потом нажать следующую клавишу.
Лично я без большинства комбинаций обхожусь с трудом, привык к ним ещё в емаксе, поэтому постоянно использую их при работе в командной строке.
Но есть неприятный момент
Не все эти комбинации не работают у меня в иксах, в исковых терминалах (xterm, rxvt-unicode) если раскладка клавиатуры кириллическая. При этом в чистой консоли (tty) работает всё независимо от раскладки! В иксах у меня не работают все комбинации с участием клавиши Alt - вместо этого рисуются символы из расширенной ASCII-таблицы, а все Ctrl-сочетания работают независимо от используемого языка. Когда я нажимал на M-f, то получал знак «°», а если на M-b, то - «,».
Я не из тех, кто использует Emacs вообще для всего, мне он в основном интересен в качестве лишь текстового редактора для всего, поэтому запускать shell в Emacs - это не мой вариант. Итак, для меня было важно разрешить эту проблему, заставить в исковых терминалах функционировать вышеперечисленные комбинации с участием Alt (Meta).
Решение
Путь к решению был довольно долгим. Для начала я попробовал поковыряться в насройках терминала. Для rxvt-unicode пробовал править Xresources на предмет keysym. Даже добился какого-то результата, но не очень удачно - от запуска к запуску терминалы по-разному обрабатывали эти ресурсы, так что работало не всегда. Я просил помощи на линуксфоруме, но безрезультатно. Так что уже и забив на всё это, я был очень удивлён, что решение было настолько очевидным.
Насколько я понимаю, терминал обрабатывает escape-последовательности,
давая в результате тот или иной результат. Надо его заставить при
появлении определённой escape-последовательности генерить заданное
действие. На помощь пришёл файл inputrc. Для общесистемных
настроек нужно редактировать /etc/inputrc
, для пользовательских -
~/.inputrc
.
Пишем в inputrc русские буквы!
В этот файл я пытался вносить различные возможные записи
последовательностей, в octal и hex-форматах. Но это не работало. И
каково же было моё удивление, что можно просто написать в inputrc
кириллические символы! Этого я ожидать никак не мог. В итоге, прочитав
как называются команды в bash (man bash), получилось следующее:
"\eа": forward-word # M-f "\eи": backward-word # M-b "\eв": kill-word # M-d "\eе": transpose-words # M-t "\eг": upcase-word # M-u "\eд": downcase-word # M-l "\eс": capitalize-word # M-c
Здесь \e - по сути Esc записано в латинской раскладке, а после неё русские буквы. Можно попробовать не \e, а \M-, что по идее должно было заработать, но не заработало в xterm (а в rxvt-unicode сработало удачно). Теперь можете запустить urxvt и проверить работоспособность.
Пинаем XTerm
Но на этом приключения не заканчиваются! Ещё надо завести XTerm, а в моём случае он не сразу завёлся. Если вдруг даже после этих правок, он при нажатии на описанные комбинации клавиш он вываливает в терминал квадраты, русские буквы или юникодные символы, то правим файл ~/.Xresources. Необходимо, чтобы там содержались следующие строки:
XTerm*metaSendsEscape: true XTerm*eightBitInput: false
После этого
$ xrdb ~/.Xresourcesи запускайте новый XTerm.
Теперь должно всё работать. Отныне можно пользоваться всеми прелестями оболочки независимо от используемой иксовой раскладки.
Вообще-то я это затевал также и для того, чтобы jabber-клиентом mcabber было гораздо удобнее пользоваться в режиме набора текста. Однако, как оказалось, этого было недостаточно! Для mcabber я тоже решил эту проблему, путём правки исходников, но об этом чуть попозже.
Копируете статью - поставьте ссылку на оригинал!
Достаточно было только использовать SCIM для переключения раскладки в иксах и все перечисленные проблемы бы ушли...
ОтветитьУдалитьМороки меньше, а плюсов намного больше...
О как! Спасибо за наводку! Однако для меня это не вариант, по крайней мере как я понимаю SCIM.
ОтветитьУдалитьДело в том, что я использую изменённую под свои нужды раскладку (http://tuxray.blogspot.com/2009/03/linux.html), а в SCIM есть только стандартный набор, а как создавать там свою я не понял.
А как-нибудь можно сделать свою раскладку в SCIM? Поскольку дело это весьма непопулярное, в гугле ничего не находил.