Linux, setxkbmap и xmodmap

May 02, 2016 20:31

Я пользуюсь Emacs, поэтому Caps Lock всегда превращаю в Ctrl.
Вот только в Linux это частенько превращается в веселье если используешь какой-нибудь легковесный wm (обычно после того, как опять надоедает бороться с багами GNOME или KDE),
где нет под это отдельной настройки.

Сегодня пришлось опять настраивать этот момент и решил записать всё пошагово.

Итак, цель процесса:

1) Установить поведение Caps Lock в Ctrl
2) Установить смену раскладки по Ctrl + Shift
3) Всё должно выполняться консольными командами, чтобы можно было легко воткнуть в процесс запуска очередного wm

И чтобы оба пункта работали одновременно! И чтобы по Caps Lock + Shift у нас раскладка тоже переключалась.

Цель понятна и вроде бы проста. Поэтому любой нормальный человек нагуглит за минуту другую что-то вроде:

Recent versions of KDE make this really easy: System Settings -> Input Devices -> Keyboard -> Advanced -> Caps Lock key behavior -> Make Caps Lock an additional ESC. You can even turn it into ctrl from the same menu, if you use an inferior text editor.

или

Only one standard config file for this. Put this in a .conf file under /etc/X11/xorg.conf.d/:

Section "InputClass"
Identifier "keyboard-layout"
MatchIsKeyboard "on"
Option "XkbOptions" "ctrl:nocaps"
EndSection

В общем и целом таких обсуждений полно: http://askubuntu.com/questions/363346/how-to-permanently-switch-caps-lock-and-esc

Покопавшись в них и поэкспериментировав с консольными командами получаем, что
переключение раскладки можно настроить с помощью команды setxkbmap

setxkbmap -layout "us,ru"
setxkbmap -option "grp:ctrl_shift_toggle"

а смену поведения Caps Lock можно изменить с помощью xmodmap. Для этого пишется файл ~/.xmodmap следующего содержания:

remove Lock = Caps_Lock
remove Control = Control_R
keysym Control_R = Caps_Lock
keysym Caps_Lock = Control_R
add Lock = Caps_Lock
add Control = Control_R

и выполняется команда xmodmap ~/.xmodmap

Но вот беда, если выполнить команды setxkbmap и xmodmap в неправильном порядке, то настройки, введённые xmodmap, сбиваются!
Крайне неприятная штука однако.

Правильным порядком запуска является:

1) Запустить setxkbmap
2) Запустить xmodmap

При любом последующем запуске setxkbmap настройки xmodmap сбиваются! Так что будьде внимательны.

Ещё одним тонким моментом является вставка данных команд в файлы инициализации какого-либо wm/dm с использованием символа &.
Во многих гайдах по настройке автозапуска советуют создавать файл автозапуска следующего вида (вот там пример):

some_stuff_1 &
some_stuff_2 &
...

Что делает символ & в bash скриптах? При его использовании в виде some_prog & программа или скрипт some_prog запускается в фоновом режиме,
а bash переходит к выполнению следующей команды (если она имеется).

Поэтому что произойдёт если мы напишем в скрипте автозапуска следующие команды:

setxkbmap -layout "us,ru" &
setxkbmap -option "grp:ctrl_shift_toggle" &
xmodmap /home/norgat/.xmodmap &

Правильно! setxkbmap может начать конфликтовать с xmodmap и настройки xmodmap собьются.
Поэтому корректно будет записать так:

setxkbmap -layout "us,ru"
setxkbmap -option "grp:ctrl_shift_toggle"
xmodmap /home/norgat/.xmodmap

Замечание: После xmodmap можно поставить &, но он и так отрабатывает мгновенно, поэтому особого смысла нет.

P.S. Использование & вполне разумно в файлах автозапуска, но только для тех приложений, что могут долго запускаться (всякие там браузеры, месседжеры и т.п.). Т.к. их параллельный запуск может сократить время запуска системы до рабочего состояния. Поэтому используйте &, но только там, где не важен порядок запуска.

setxkbmap, keyboard, linux, xmodmap

Up