среда, 4 ноября 2009 г.

Как я раскладки с iBus переключал

Данное действо затевалось с одной целью - переключать раскладки в emacs так же, как и в иксах, но чтобы при этом работали хоткеи. Несмотря на, казалось бы, готовые рецепты (большое спасибо @Juev ) - мне пришлось около часа ковыряться в системных скриптах, разбираясь "кто на ком стоял". Написание данного поста происходило уже в настроенном емаксе :)


* Ставим необходимые пакеты:

sudo aptitude install ibus ibus-gtk ibus-qt4 ibus-m17n im-switch m17n-contrib

остальное, судя по всему, затянется по зависимостям

* Включаем нужный режим ввода:

im-switch -z all_ALL -s ibus

Данное действие создаст в ~/.xinput.d/ симлинк all_ALL на файл с нужным методом ввода /etc/X11/xinit/xinput.d/ibus. При запуске иксовой сессии скрипт /etc/X11/Xsession.d/80im-switch запускает нужный метод ввода.


На этом предварительная настройка для пользователей KDE/GNOME/etc закончена, после перезапуска иксовой сессии iBus должен активироваться и заработать (появится иконка в трее).

* Xsession.d

Для любителей автозапуска приложений из ~/.xsessionrc ещё придётся поколдовать:

Дело в том, что запуск скрипта ~/.xsessionrc (а точнее "родительского" /etc/X11/Xsession.d/40x11-common_xsessionrc) происходит раньше чем запуск /etc/X11/Xsession.d/80im-switch, в связи с чем ibus не будет работать для приложений запущеных из ~/.xsessionrc (а у меня там xbindkeys, который, грубо говоря, запускает всё).

Остаётся либо использовать DE/WM-зависимый автозапуск (это не наш метод), либо править системные скрипты (что я не люблю делать без особой необходимости), либо сделать так, чтобы нужные переменные окружения выставлялись в скрипте /etc/X11/Xsession.d/40x11-common_xsessionrc.

Смотрим Shebang скрипта - "#!/bin/sh", sh у меня является ссылкой на dash, смотрим man dash, и видим, что dash (как и sh) при запуске выполняет скрипт ~/.profile. Вот в него-то мы и засунем нужные переменные:

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

* Теперь ...

нужно отрубить иксовую переключалку, у меня этим занимается setxkbmap (опять же, из принципа - не лезть лишний раз в системные настройки).

было:

setxkbmap us,ru -option "grp:toggle,compose:rwin,ctrl:nocaps"

стало:

setxkbmap us,ru -option "compose:rwin,ctrl:nocaps"


перезапускаем иксовую сессию (ну или свой лаунчер в нужном окружении)

* Настраиваем iBus

ibus-setup

Мне в данный момент достаточно одного метода ввода: "русский - kbd", выставляем, перезапускаем демона - вуаля, по ctrl-space (и правому Alt, кстати) переключается (у меня :) раскладка.

* Emacs

И вроде все счастливы, вроде все пляшут, но только хоткеи в Емаксе (из-за чего всё и затевалось) не пашут.

отрубаем для emacs использование ibus (правильнее сказать - xim)

echo 'Emacs*useXIM:false' >> ~/.Xdefaults && xrdb -load ~/.Xdefaults

прописываем нужный метод ввода в файл инициализации:

(setq default-input-method "russian-computer" )

и пользуемся внутренней переключалкой emacs

только неудобно это - переключать раскладку двумя клавишами (C-\). Хочется чего-то более простого и привычного. Для того, чтобы Xorg считать Alt_R не модификатором, а самостоятельной клавишей, добавим в автозапуск такую строчку:

xmodmap -e "keysym Alt_R = F13"

После чего в ibus-setup выставляем переключалкой клавиатуры наш новоявленный F13.

Для emacs:

(global-set-key (kbd "<f13>") 'toggle-input-method)