Постоянный xmodmap в Ubuntu 13.04
Я не могу запустить xmodmap при входе в Ubuntu 13.04. Я искал вокруг, в том числе в Askubuntu и все ответы, которые я нашел, не работают.
У меня есть файл с именем.Xmodmap в моей домашней папке, который содержит желаемые сопоставления. Если я запускаю его вручную, он работает нормально, поэтому там нет ошибок. Чтобы запустить его при запуске, я попытался:
Используя различные
.xinitrc
содержащий одну из следующих команд:xmodmap .Xmodmap
xmodmap ~/.Xmodmap
/usr/bin/xmodmap /home/NAME/.Xmodmap
if [ -s ~/.Xmodmap ]; then
xmodmap ~/.Xmodmap
fi
С помощью
.Xresources
вместо.xinitrc
с такими же вариациями.Установка его в качестве запуска приложения.
Ничто из вышеперечисленного не работает в Ubuntu 13.04 (64-битная версия). Я также видел несколько идей о глобальном изменении раскладок клавиатуры, но большинство из них не были применимы в Ubuntu 13.04 (т. Е. Соответствующие файлы не существовали там, где были указаны), и я все равно предпочитаю не трогать глобальные настройки.
9 ответов
Ubuntu больше не использует xmodmap
, но вместо этого использует xkb
(насколько я понимаю, это облегчает раскладку клавиатуры для каждого окна, между прочим).
Общесистемные файлы карт находятся в
/usr/share/X11/xkb/symbols/
Карты, кажется, загружены иерархически, с pc
карта как корень и любой язык (например, en
) как дитя корня.
В моем конкретном случае я физически поменял местами Page Up с Home и Page Down с End на своей клавиатуре, поэтому я очень грубо внес изменения в систему в целом. pc
карта, следующим образом:
key <HOME> { [ Prior ] };
key <PGUP> { [ Home ] };
key <END> { [ Next ] };
key <PGDN> { [ End ] };
ПРИМЕЧАНИЕ. Чтобы заставить Xorg использовать вашу новую карту клавиатуры, вам, возможно, придется удалить существующие предварительно скомпилированные карты (*.xkm) в
/var/lib/xkb/
а затем перезапустите Xorg.
Есть различные ресурсы на xkb
, но этот связан с Ubuntu.
Для меня конфигурация xkb слишком сложна, если вы хотите переназначить 1 или 2 ключа способом, недоступным в Системных настройках. Кроме того, решение должно оставаться на стороне пользователя, без редактирования '/usr/share/X11/xkb/symbols/' и т. Д. Принудительная загрузка 'xmodmap ~/.Xmodmap' с помощью автозагрузки приложений работает только до тех пор, пока вы не приостановите, не смените пользователей. или измените раскладку клавиатуры. Итак, как предполагает holocronweaver, с помощью фрагментов кода, которые я обнаружил, я создал скрипт python для загрузки при запуске сеанса, который при необходимости перезагружает файл ~ /.Xmodmap.
Проверьте сообщение об ошибке № 1243642 (комментарий № 6) и загрузите его здесь.
Конвертировать Caps Lock в Esc для vim
использование
Вот мой вариант сценария запуска сопоставления клавиш. Он преобразует Caps Lock в Esc на любой клавиатуре для использования с vi
, vim
или же gvim
,
В отличие от ответа q4w56, этот ответ не использует бесконечный while; do
петля. В противном случае одно ядро моего двухъядерного ЦП будет разряжаться на 42% каждые 5 секунд, что серьезно снизит заряд батареи моего ноутбука.
#!/bin/bash
sleep 4
xmodmap -e "clear Lock"
xmodmap -e "keysym Caps_Lock = Escape"
Сохраните это как скрипт. Сделайте файл исполняемым с chmod +x
, Добавьте имя и местоположение скрипта в Session and Startup → Application Autostart
(в Xubuntu).
Поведение клавиатуры для этого пользователя останется постоянным после перезагрузки и выхода из системы, но не будет приостановлено. Постоянство с помощью приостановки может быть достигнуто, но, к сожалению, только на системном уровне, а не на уровне пользователя.
Обоснование этой переназначения клавиатуры
В современном компьютерном мире очень мало пользы для клавиши Caps Lock. В целом, следует воздерживаться от использования ВСЕХ КОПИЙ в силу как сетевого этикета, так и разделения представления и контента. Кроме того, случайно нажав клавишу Caps Lock при редактировании текста с vim
не всегда сразу отмечается, но неизменно приводит к довольно раздражающему vim
поведение дальше. Отключение клавиши Caps Lock все вместе и использование ее как легко доступной клавиши Esc приводит к двойному выигрышу vim
использовать.
У меня была эта проблема в Ubuntu 14.04, и я нашел решение здесь. Судя по всему, Ubuntu не может настроить клавиатуру сразу после входа в систему, но это немного позже. Так что, если вы добавите команду
sleep 4 && xmodmap ~/.Xmodmap &
в ~/.bash_profile
тогда это должно работать (это делает для меня).
РЕДАКТИРОВАТЬ: Кажется, это работает только после входа в систему, а не после запуска. Я должен исследовать это позже.
@ Ответ Даниэля указал мне правильный путь, но я хотел бы остановиться на нем.
У меня работает на Linux Mint 17.2 и Ubuntu 16.04.
Я перепробовал все повороты, которые мог придумать, чтобы продолжать использовать xmodmap
, но все они терпят неудачу, когда система переходит в спящий режим. То же самое верно и для сценариев запуска приложений, которые используют setxkbmap
в случаях, когда *settings-daemon (для меня это xfce4) запускается позже, чем сценарий --- и порядок не может влиять.
То, что я наконец придумал, имеет следующие ингредиенты:
1) Напишите минимальный файл сопоставления клавиатуры для /usr/share/X11/xkb/symbols
, Позволяет вызвать файл mylayout
Это может быть так просто, как
xkb_symbols "basic" {
name[Group1] = "My Layout";
include "us"
key <AE03> { [ 3, numbersign, sterling, sterling] };
include "level3(ralt_switch)"
}
basic
это просто имя, мы встретимся позже.-
name[Group1]
похоже, это просто имя, но позже оно не сыграет никакой роли. include "us"
включает в себя простую клавиатуру США. На самом делеus
это другой файл в том же каталоге. Это раскладка клавиатуры, которую мы адаптируем. Выберите другой по мере необходимости. Примечание: нет точки с запятой в конце этой строки.-
key
Линия - это одно из приспособлений клавиатуры, больше может последовать.<AE03>
можно найти в файлах под/usr/share/X11/xkb/keycodes
, Использоватьxev
программа, чтобы выяснить, что клавиша "3" имеет код клавиши 12 и в файле кодов клавишXfree86
это сопоставлено с<AE03>
, - Наконец еще один
include
указание активировать другую опцию клавиатуры, в этом случае я хочу, чтобы правая клавиша Alt была клавишей переключения уровня 3, то есть клавишей, которая дает доступ кsterling
знак, который я определил выше.level3
это просто имя файла в той же папке сralt_switch
один раздел этого. Посмотрите вокруг и выберите, что вам нужно включить.
2) я не ставил mylayout
в системную папку. Скорее я сделал только мягкую ссылку из системной папки на папку, которая мне по вкусу, чтобы сразу увидеть, что это не стоковое программное обеспечение.
3) Дальше я не налаживал evdev.xml
, опять же, чтобы предотвратить обновление хлопот. Но это было бы необходимо найти mylayout в редакторе конфигурации клавиатуры (для xfce4 это xfce4-keyboard-settings
). Вместо этого я использовал xfce4-settings-editor
и изменился keyboard-layout->XkbLayout
в mylayout
(имя файла) и XkbVariant
в basic
(см. выше). После этого, mylayout/basic
также отображается в редакторе настроек клавиатуры. Запись в evdev.xml
Кажется, необходимо только иметь возможность выбрать макет.
Таким образом, настройки клавиатуры теперь выживают в спящем режиме и перезагружаются.
Дополнительную информацию можно найти здесь: http://www.charvolant.org/~doug/xkb/html/node5.html.
Другой подход к решению проблемы режима сна (не пробовал сам) можно найти здесь: https://www.vinc17.net/unix/xkb.en.html.
ОБНОВЛЕНИЕ: работал с Mint 18.3 в тот же момент, когда я изменил настройки в xfce4-settings-editor, как описано выше.
ОБНОВЛЕНИЕ: с 18.04, gdm3 в качестве диспетчера отображения и XFCE4 в качестве диспетчера окон, выглядит так, как будто ~/.Xmodmap читается снова, и настройки, кажется, выдерживают приостановку. (Я редко использую режим ожидания, и я никогда не уверен, в каком режиме работает ноутбук).
У меня тоже была проблема на Ubuntu 16.04 с fcitx, и у меня было решение на fcitx wiki, но для этого нужно, чтобы fcitx был 4.2.7 или новее
touch ~/.Xmodmap
- напиши конфиг
- перезагрузите компьютер и fcitx попытается загрузить его автоматически
Там также есть некоторые объяснения причин.
ПЕРЕСМОТР
Обновление в начале 2018 года нарушило постоянство - автоматическая перезагрузка раскладки клавиатуры после приостановки или спящего режима. Поскольку методы, использующие сценарии /etc/pm/sleep.d, перестали работать (устарело?), Это оставило только новый путь, с использованием /lib/systemd/system-sleep и немного другого сценария (который начал работать с клавишными картами!).
Таким образом, этот пост обновлен до более нового метода для сохранения и включения нормальной начальной загрузки таблицы ключей, которая также начала работать. Процедура преобразования файла.Xmodmap в.xkbmap остается неизменной.
Обратите внимание, что это решение для каждого пользователя. Ответы для каждого устройства см. В разделе о том, как применить раскладку ключей к одному устройству. Этот метод может быть адаптирован для использования здесь.
Сначала измените файл.Xmodmap по желанию. Их проще редактировать напрямую, чем файлы.xkbmap. Когда он загружен:
xmodmap.Xmodmap
затем преобразовать в файл.xkb:
xkbcomp $ DISPLAY $ HOME /.xkbmap
Для автоматической загрузки при запуске откройте Startup Applications, нажмите Add, и в командной строке введите:
xkbcomp /home/user/.xkbmap ": 0"
("пользователь" заменяется реальным именем пользователя.) Для "Имя", возможно, введите "Загрузить карту клавиатуры". Добавьте комментарий, если хотите, и нажмите Сохранить.
Карта ключей теперь будет загружаться каждый раз при загрузке системы, но не выдержит приостановку или спящий режим. Для этого создайте новый файл в /lib/systemd/system-sleep, возможно, с именем 60_xkbmap, который содержит:
#!/bin/sh
case $1/$2 in
pre/*)
# Place pre-suspend commands here
exit 0
;;
post/*)
# Place post-suspend commands here
export DISPLAY=":0"
export XAUTHORITY="/home/user/.Xauthority"
su user -c "xkbcomp /home/user/.xkb/xkb-map $DISPLAY 2>/dev/null"
;;
esac
( См. Выше). Замените "user" на фактическое имя пользователя.
Карта клавиш должна теперь автоматически загружаться и оставаться постоянной. Замечания:
- Относится к текущей версии LTS от 16.04 и, вероятно, к более поздним.
- Взято из поста 14 вышеупомянутой ветки ошибок.
- Более ранние комментарии относились к оригинальному сообщению.
Шаги, упомянутые в принятом ответе (также описанном здесь), являются постоянным решением, но не сработали для меня в случае изменения алфавитных клавиш.
Если вы разочаровались, попробовав другие варианты, или хотите сэкономить время, попробуйте шаги, упомянутые в статье - https://medium.com/@saplos123456/persistent-keyboard-mapping-on-ubuntu-using-xmodmap-cd01ad828fcd
- Сделайте новую копию
xmodmap
.
xmodmap -pke > .Xmodmap
- Отредактируйте новый файл с помощью следующей команды и измените коды клавиш в соответствии с вашими требованиями.
gedit .Xmodmap
- Активируйте эти изменения. После этого должны появиться новые изменения.
xmodmap .Xmodmap
- Шаг с возможностью пропуска - создание файла xkb с новым сопоставлением
xkbcomp $DISPLAY $HOME/.xkbmap
- Все указанные выше изменения являются временными и будут заменены при перезагрузке. Создайте программу запуска, чтобы запустить следующую команду
xkbcomp /home/user/.xkbmap ":0" // if you followed the 4th step
OR
xmodmap .Xmodmap // if you skipped the 4th step
Большинство других решений загружаются xmodmap
при запуске сеанса (или ранее), но затем ваши настройки стираются, когда вы подключаете новую клавиатуру (или переключаете переключатель KVM). Вот решение, которое переустанавливаетxmodmap
после подключения USB-устройства. Я использую его с тех пор, как Linux ввел всю путаницу Alt/Meta (примерно в 2006 году).
! ~/.Xmodmap file
!
! Part 1 (since about 2006)
! Avoid BadValue (TODO: debug why we get BadValue otherwise)
clear mod1
clear mod4
! Actually, my keyboard doesn't have 0xcc/0xcd keys, thank you...
keycode 0xcc = NoSymbol
keycode 0xcd = NoSymbol
! mod3 is Alt. I'm sure this is documented somewhere.
! It works that way in every program!
add mod3 = Alt_L
add mod3 = Alt_R
! In addition to Alt keys, my keyboard has ... drumroll ... *Windows* keys!
! These are *Meta* keys. Say, in Windows web browsers.
! Don't take my word for it, hit F12 and type:
! onkeydown = function(e){console.log(e);}
! And, um, Alt is already taken, so obviously Meta = Windows key.
! Also Windows keys = Meta in some FreeBSD distros out of the box.
! Is Windows keys = Meta not clear to someone, or is someone just being annoying
! with all this "Alt = Meta" garbage?
keycode 0x85 = Meta_L
keycode 0x86 = Meta_R
! No, mod1 is not Alt!
! In every program, mod1 is actually meta!
add mod1 = Meta_L
add mod1 = Meta_R
remove mod1 = Alt_L
remove mod1 = Alt_R
! Part 2 (since about 2015)
! What is going on?? USB thinks it can just wipe my xmodmap???
!
! 1. Locate xkb rulefile using
!
! udevadm control --log-priority=info
!
!
! It will be something like
!
! /lib/udev/rules.d/64-xorg-xkb.rules
!
!
! 2. Edit /lib/udev/rules.d/64-xorg-xkb.rules. Add:
!
! RUN += "/big/usb_fix.sh"
!
! and do:
!
! udevadm control --reload-rules
!
! note: using /big is intentional... on new Ubuntus, the system dies
! with "a start job is running..." in disk mounting. So we prevent this
! script from running ig /big is not mounted yet.
!
!
! 3. Create the /big/usb_fix.sh script:
!
! #!/bin/sh
! echo "xmodmap ~/.Xmodmap" >> /usr/local/usb_fix.log
!
! and make it executable.
!
!
! 4.
! mkfifo /usr/local/usb_fix.log
!
!
! 5.
! Create a script (e.g. named ~/bin/usb_fix_client)
!
! #!/bin/sh
! yes 'cat /usr/local/usb_fix.log | sh' | sh
!
! and put this in your .xinitrc.
! Part 3 (since about 2018)
!
! Every now and then, apt-get can overwrite the xorg-xkb-rules?
! solution for now is turn off automatic updates.
Если вы настроили его правильно, xmodmap должен сказать:
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Meta_L (0x85), Meta_R (0x86)
mod2 Num_Lock (0x4d)
mod3 Alt_L (0x40), Alt_R (0x6c)
mod4
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
И вуаля, ваши клавиши meta и alt работают!
Если слишком сложно найти и отключить какое-либо программное обеспечение, которое продолжает перезаписывать ваши правила USB (для меня приходит какое-то программное обеспечение, которое затирает его примерно два раза в год), тогда просто добавьте сценарий RC, чтобы скопировать ваши правила USB обратно. Кроме того, вы можете скопировать свои улучшенные правила в файл с большим номером перед ним, чтобы он переопределил любые другие причуды, которые в будущем будут стирать ваш xmodmap.
Это также заставило меня споткнуться, когда я обновился с Ubuntu 12.04 до 13.04.
К счастью, этот параметр теперь (или, возможно, всегда) был легко доступен в настройках клавиатуры и может быть изменен несколькими щелчками мыши.
- Перейдите в Настройки системы > Раскладка клавиатуры > Параметры...
- В параметрах раскладки клавиатуры нажмите стрелку, чтобы отобразить параметры положения клавиши Ctrl.
- Поставьте галочку в Swap Ctrl и Caps Lock.
Там вы идете: левый контроль и Caps Lock поменялись местами.
Не забудьте удалить ~/.Xmodmap
как только вы внесли изменения.
Я считаю, что добавление этого скрипта в автозагрузку удовлетворяет:
while true;do
xmodmap -e "keycode 87=Prior"
xmodmap -e "keycode 88=Next"
sleep 5
done
Я пытался с помощью xmodmap ./Xmodmap
, но каждый раз, когда он выполняется, будет происходить заметное отставание.