Постоянный xmodmap в Ubuntu 13.04

Я не могу заставить xmodmap работать при входе в Ubuntu 13.04. Я искал вокруг, в том числе в Askubuntu, и все ответы, которые я нашел, не работают.

У меня есть файл с именем .Xmodmap в моей домашней папке, который содержит нужные отображения. Если я запускаю его вручную, он работает нормально, поэтому там нет ошибок. Чтобы запустить его при запуске, я попытался:

  1. Используя различные .xinitrc, содержащие одну из следующих команд:

    • xmodmap .Xmodmap [ 1126]
    • xmodmap ~/.Xmodmap
    • /usr/bin/xmodmap /home/NAME/.Xmodmap
    • if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
      fi
  2. Использование .Xresources вместо .xinitrc с такими же вариациями.

  3. Установка его в качестве запускаемого приложения.

Ничто из вышеперечисленного не работает в Ubuntu 13.04 (64-битная версия). Я также видел несколько идей о глобальном изменении раскладок клавиатуры, но большинство из них не были применимы в Ubuntu 13.04 (то есть, соответствующие файлы не существовали там, где были указаны), и я все равно предпочитаю не трогать глобальные настройки.

72
задан 19 September 2013 в 11:29

11 ответов

Для меня конфигурация xkb слишком сложна, если вы хотите переназначить 1 или 2 ключа способом, недоступным в Системных настройках. Кроме того, решение должно оставаться на стороне пользователя, без редактирования '/ usr / share / X11 / xkb / symbols /' и т. Д. Принудительная загрузка 'xmodmap ~ / .Xmodmap' с помощью автозагрузки приложений работает только до тех пор, пока вы не приостановите, не смените пользователей. или измените раскладку клавиатуры. Итак, как предполагает holocronweaver, с помощью фрагментов кода, которые я обнаружил, я создал скрипт python для загрузки при запуске сеанса, который при необходимости перезагружает файл «~ / .Xmodmap».

Проверьте сообщение об ошибке № 1243642 (комментарий № 6) и загрузите его здесь .

0
ответ дан 19 September 2013 в 11:29

У меня была эта проблема в Ubuntu 14.04, и я нашел решение здесь . Судя по всему, Ubuntu не может настроить клавиатуру сразу после входа в систему, но это немного позже. Поэтому, если вы добавите команду

sleep 4 && xmodmap ~/.Xmodmap &

в ~/.bash_profile, то она должна работать (она мне подходит).

РЕДАКТИРОВАТЬ: Кажется, это работает только после входа в систему, а не после запуска. Я должен буду исследовать это позже.

0
ответ дан 19 September 2013 в 11:29

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          ]   };
[ 1115] ПРИМЕЧАНИЕ. Чтобы заставить Xorg использовать вашу новую карту клавиатуры, вам, возможно, придется удалить существующие предварительно скомпилированные карты (* .xkm) в

/var/lib/xkb/

и затем перезапустить Xorg .

На xkb имеются различные ресурсы, но этот связан с Ubuntu.

0
ответ дан 19 September 2013 в 11:29

Я имел проблему также на Ubuntu 16.04 с fcitx и имел решение на fcitx Wiki, но этому нужен fcitx, имеет 4.2.7 или позже

  • touch ~/.Xmodmap
  • запишите конфигурацию
  • перезагрузка и fcitx попытаются загрузить его автоматически

Там также имеют некоторое объяснение по причине.

3
ответ дан 19 September 2013 в 11:29

Преобразование 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 . В общем, следует воздерживаться от использования ALL CAPS в силу как сетевого этикета , так и для разделения представления и содержания . Более того, случайное нажатие клавиши Caps Lock при редактировании текста с помощью vim не всегда сразу отмечается, но неизменно приводит к раздражающему vim поведению в дальнейшем. Отключение клавиши Caps Lock все вместе и использование ее в качестве легкодоступной клавиши Esc приводит к двойному выигрышу для использования vim.

0
ответ дан 19 September 2013 в 11:29

@ Ответ Даниэля указал мне верный путь, но я хотел бы остановиться на нем.

У меня работает на Linux Mint 17.2 и Ubuntu 16.04.

Я попробовал все повороты, которые только мог придумать, чтобы использовать xmodmap, но все они терпят неудачу, когда система переходит в режим сна. То же самое справедливо и для сценариев запуска приложений, которые используют setxkbmap в тех случаях, когда демон * settings (для меня это 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 была клавишей Shift уровня 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, как описано выше.

0
ответ дан 19 September 2013 в 11:29

ПЕРЕСМОТР

Обновление в начале 2018 года повредило персистентность - автоперезагрузка контурной карты после приостанавливает или в спящем режиме. Так как методы с помощью/etc/pm/sleep.d сценарии прекратили работать (удержанный от использования?), который оставил только более новый путь, с помощью/lib/systemd/system-sleep и немного отличающиеся сценарии (который начал работать над контурными картами!).

Таким образом, это сообщение обновляется к более новому методу для персистентности, и включать нормальную начальную загрузку контурной карты, которая также начала работать. Стандартная программа для преобразования.Xmodmap файла к .xkbmap остается неизменной.

Обратите внимание, что это - решение в расчете на пользователя. Для ответа для каждого устройства посмотрите, как применить контурную карту к единому устройству. Этот метод мог быть адаптирован к использованию здесь.

Сначала измените.Xmodmap файл, как желаемый. Их легче отредактировать непосредственно, чем .xkbmap файлы. Когда это загружается:

xmodmap.Xmodmap

затем преобразуйте в .xkb файл:

$DISPLAY$HOME/.xkbmap xkbcomp

Чтобы автоматически загрузиться на запуске, откройте 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

(Касательно). Как выше, замена "пользователь" с фактическим именем пользователя.

Контурная карта должна теперь автоматически загрузиться и остаться персистентной.Примечание:

  • Относится к текущему выпуску LTS, 16.04, и вероятно более поздние также.
  • Взятый из сообщения 14 из вышеупомянутых - связанный поток ошибки.
  • Более ранние комментарии относились к исходному сообщению.
2
ответ дан 19 September 2013 в 11:29

Это также заставило меня запнуться, когда я обновил Ubuntu с 12.04 до 13.04.

К счастью, этот параметр теперь (или, возможно, всегда) был легко доступен в настройках клавиатуры и может быть изменен несколькими щелчками мыши.

  1. Перейти к Системные настройки > Раскладка клавиатуры > Опции ...
  2. В параметрах раскладки клавиатуры нажмите стрелку, чтобы отобразить опции position Ctrl .
  3. Поставьте галочку в , поменяйте местами Ctrl и Caps Lock .

Вот и все: левый регулятор и Caps Lock поменялись местами.

Не забудьте удалить ~/.Xmodmap после внесения изменений.

0
ответ дан 19 September 2013 в 11:29

Я считаю, что добавление этого скрипта в автозагрузку удовлетворяет:

while true;do 
    xmodmap -e "keycode 87=Prior"
    xmodmap -e "keycode 88=Next"
    sleep 5
done

Я пытался использовать xmodmap ./Xmodmap, но каждый раз, когда он выполняется, будет происходить заметная задержка.

0
ответ дан 19 September 2013 в 11:29

Шаги, упомянутые в принятом ответе (также описанные здесь), являются постоянным решением, но у меня не сработало в случае изменения буквенных клавиш.

Если вы разочаровались, попробовав другие варианты, или хотите сэкономить время, попробуйте выполнить шаги, упомянутые в статье — https://medium.com/@saplos123456/persistent-keyboard-mapping-on-ubuntu- using-xmodmap-cd01ad828fcd

  1. Создайте новую копию xmodmap.
xmodmap -pke > .Xmodmap
  1. Отредактируйте новый файл с помощью следующей команды и измените коды клавиш в соответствии с вашими требованиями.
gedit .Xmodmap
  1. Активируйте эти изменения. Новые изменения должны отразиться после этого.
xmodmap .Xmodmap
  1. Шаг, который можно пропустить — Создать файл xkb с новым сопоставлением.
xkbcomp $DISPLAY $HOME/.xkbmap
  1. Все вышеперечисленные изменения являются временными и будут заменены при перезагрузке. Создайте программу запуска для запуска следующей команды
xkbcomp /home/user/.xkbmap ":0"   // if you followed the 4th step
OR
xmodmap .Xmodmap    // if you skipped the 4th step
2
ответ дан 1 September 2020 в 17:34

другие решения загружают 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 в будущем.

1
ответ дан 5 September 2020 в 21:21

Другие вопросы по тегам:

Похожие вопросы: