Показаны сообщения с ярлыком x11. Показать все сообщения
Показаны сообщения с ярлыком x11. Показать все сообщения

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


Читать далее…

среда, 8 апреля 2009 г.

Копирование текста из иксов в буфер Emacs

Известно, что с помощью выделения и нажатия средней кнопки мыши в иксах можно копировать и вставлять текст. Однако при вставке таким образом кириллицы в Emacs возникает проблема с отображением кириллических шрифтов - они имеют бо́льшие размеры, чем им положено быть в ширину. Таким образом, неизбежны проблемы с форматированием текста. На просторах рунета найден рецепт как от этой неприятности избавиться (в частности, об этом говорит gentoo-wiki). Необходимо в конфигурационный файл .emacs добавить следующее:

;; Возможность копирования кириллицы из иксов!!!
(set-selection-coding-system 'compound-text-with-extensions)
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))
Теперь проблем в случае локали UTF-8 не будет, и текст можно копировать/вставлять по выделению и щелчку.
Читать далее…

вторник, 31 марта 2009 г.

Изменение раскладки клавиатуры в Linux. Модифицируем машинописную раскладку

В своё время я много извращался с разнообразными раскладками. Одно время даже вовсю пользовался фонетической ЯВЕРТЫ. Потом серьезно задался целью отказаться от раскладки ЙЦУКЕН, которая была на самом деле придумана за бургом (стыд и позор нашим). Серьезный стимул появился после прочтения статьи господина Зубачёва о неэффективности вражеской раскладки, ставшей стандартом. Проблема ЙЦУКЕН в том, что основная нагрузка ложится на указательные пальцы. Если в эпоху печатных машинок это было позитивным моментом, то сейчас пальцы не так устают от нажатий на клавиши на современных клавиатурах. Стало быть, желательно бы задействовать больше пальцев, чем практически два, как это и бывает на ЙЦУКЕН. Зубачёв предложил свой вариант раскладки, но осилить его я не смог - уж больно много бы времени понадобилось для её изучения. К сожалению, статья Зубачёва пропала из интернета (гугл выдает только старые темы уже несуществующего форума), но пользователь atommix в своем профиле на клавогонках опубликовал информацию о её подключении. Увы, без статьи понять её преимущества тяжело.

Поскольку сил на эту раскладку будущего у меня не хватило, я решил отделаться модифицированием машинописной раскладки typewriter под себя. Об этом я и опишу в этой заметке.

Почему я выбрал машинописную и что меня не устроило в winkeys?

  • Запятая на шифте
  • Цифры в нижнем регистре, в то время как на клавиатуре и так места не хватает для нашего слегка большего алфавита по сравнению с латинским, а для цифр, которые не так часто встрачеются при написании текста и так есть дополнительная клавиатура

Что меня не устроило в оригинальной машинописной раскладке, так это расположение некоторых знаков на тех же клавишах с цифрами. Например, мне совершенно непонятно зачем было на цифру "8" вешать знак подчеркивания "__", в то время как он и так есть в нижнем регистре знака "минус". По мне, так расположить там знак умножения, как на английской раскладке куда как полезнее. Также я решил расположить на цифре "2" кавычки, а на цифре "3" знак "№". Поскольку я часто занимаюсь написанием текста в LaTeX, то установка неразрывного пробела "~" доставляла постоянно головную боль. Дабы не сильно отдаляться от английской раскладки, я поставил знак "~" в верхний регистр, так же, как и в us-раскладке. При использовании LaTeX также приходится печатать скобки, фигурные и квадратные, если с фигурными у меня еще справляется пакет auctex.el для Emacs, расставляя их автоматом при установке латеховского макроса, то с квадратными это не так. Хотя... вот сейчас даже и не припомню где мне пригодились квадратные скобки при написании русского текста. Пожалуй, только при использовании PSTricks для создания иллюстраций и русских подписей. Однако, факт остаётся фактом - я убрал твёрдый знак и поставил его в верхний регистр мягкого знака (при необходимости большой мягкий знак можно напечатать, используя CAPS LOCK), а не его место в нижнем регистре поставил "[", а в верхнем, соотвественно, "]".

Последний штрих: буква "ха" располагается в неудобной позиции - правее буквы "з", которая и так наживается мизинцем, что постоянно приводило меня к опечаткам. Как показывает практика, это приводит не только меня к опечаткам. Мне рассказывали истории, как в одном заявлении, адресованом некоторому господину Зуеву, случайно нажали не ту клавишу. Так вот, поскольку в машинописаи запятая и точка находятся на цифрах 6 и 7 соответственно, то необходимость в клавише правее "ю" по сути отпадает, но там сидит буква "ё". Надо только куда-то отправить слэш, что я и сделал - на нижний регистр клавиши "тильда" и букву "ё" поменять с "х" местами. Это я и сделал.

Итак, моя раскладка в нижнем регистре выглядит следующим образом:

/!"№;:,.*?%-=(

 йцукенгшщзё[

 фывапролджэ

 ячсмитьбюх
В верхнем регистре:
~1234567890_+)

 ЙЦУКЕНГШЩЗЁ]

 ФЫВАПРОЛДЖЭ

 ЯЧСМИТъБЮХ
Изменений немного, но они очень положительно сказываются на моей работе. Чтобы раелизовать такое в Linux, необходимо модифицировать файл /usr/share/X11/xkb/symbols/ru. Но сначала сделаем бэкап:
sudo cp /usr/share/X11/xkb/symbols/ru /usr/share/X11/xkb/symbols/ru.backup
чтобы потом в случае возникновения проблем и нежеланием в них разбираться сделать обратное копирование: </src> sudo cp /usr/share/X11/xkb/symbols/ru.backup /usr/share/X11/xkb/symbols/ru </src> Итак, приступим к редактированию файла в вашем любимом текстовом редакторе (например, vim):
sudo vim /usr/share/X11/xkb/symbols/ru
Находим строки вида:
partial alphanumeric_keys
xkb_symbols "typewriter" {
  include "ru(common)"
  name[Group1]= "Russia - Typewriter";
дальше идет определение клавиш. Именно здесь и определена машинописная раскладка. Я её привёл к виду:
partial alphanumeric_keys
xkb_symbols "typewriter" {
  include "ru(common)"
  name[Group1]= "Russia - Typewriter";
  key  { [ slash, asciitilde ] };
  key  { [ exclam, 1 ] };
  key  { [ quotedbl, 2 ] };
  key  { [ numerosign, 3 ] };
  key  { [ semicolon, 4 ] };
  key  { [ colon, 5 ] };
  key  { [ comma, 6 ] };
  key  { [ period, 7 ] };
  key  { [ asterisk, 8 ] };
  key  { [ question, 9 ] };
  key  { [ percent, 0 ] };
  key  { [ parenleft, parenright ] };

  key  { [ bracketleft, bracketright ]
  };
  key  { [ Cyrillic_io, Cyrillic_IO ] };
  key  { [ Cyrillic_ha, Cyrillic_HA ] };
  key  { [Cyrillic_softsign,Cyrillic_hardsign ] };
};

Строка типа

  key  { [ slash, asciitilde ] };
означает, что при нажатии на клавишу "TLDE" будет печататься в нижнем регистре слэш, а в верхнем, соответственно, тильда. Я не задавался целью понять досканально все эти обозначения, но мне хватило взгяда на примеры раскладок ru(phonetic) и us, чтобы сделать то, что и требовалось.

Теперь редактируем xorg.conf:

sudo vim /etc/X11/xorg.conf

Section "InputDevice"
 Identifier "Generic Keyboard"
 Driver "kbd"
 Option "XkbRules" "xorg"
 Option "XkbModel" "pc105"
 Option "XkbLayout" "us,ru"
 Option "XkbVariant" ",typewriter"  # <- вариант раскладки ru
 Option "XkbOptions" "grp:menu_toggle"  # <- мой способ переключения между раскладками по клавише меню (ваш может отличаться)
EndSection
Собственно, и всё. Перезапускаем иксы и проверяем. А если что не устроило - всегда можно восстановить из бэкапа файл /usr/share/X11/xkd/symbols/ru и вернуть в xorg.conf то, что было (возможно, winkeys).

Стоит отметить, что при обновлении/переустановке иксов, файл /usr/share/X11/xkd/symbols/ru перезапишется, следовательно, желательно его ещё куда-нибудь кинуть в домашний каталог.

Проблемы были обнаружены на Ubuntu 8.04. Просто Ubuntu считает себя больно умной и при старте иксов говорила, что раскладка-то не совсем такая. Однако, закрыв окно предупреждения, можно было работать без каких-либо проблем. В Ubuntu 8.10 подобное не наблюдалось, как и в Дебиане.

В дальнейшем напишу как интегрировать такую раскладку в Emacs.


Читать далее…