пятница, 4 сентября 2009 г.

Перемещение курсора в X-терминале при русской раскладке

Известно, что оболочка 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 я тоже решил эту проблему, путём правки исходников, но об этом чуть попозже.

Копируете статью - поставьте ссылку на оригинал!

2 комментария:

  1. Достаточно было только использовать SCIM для переключения раскладки в иксах и все перечисленные проблемы бы ушли...
    Мороки меньше, а плюсов намного больше...

    ОтветитьУдалить
  2. О как! Спасибо за наводку! Однако для меня это не вариант, по крайней мере как я понимаю SCIM.

    Дело в том, что я использую изменённую под свои нужды раскладку (http://tuxray.blogspot.com/2009/03/linux.html), а в SCIM есть только стандартный набор, а как создавать там свою я не понял.

    А как-нибудь можно сделать свою раскладку в SCIM? Поскольку дело это весьма непопулярное, в гугле ничего не находил.

    ОтветитьУдалить