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

72

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

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

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

    • xmodmap .Xmodmap
    • 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 (т. Е. Соответствующие файлы не существовали там, где были указаны), и я все равно предпочитаю не трогать глобальные настройки.

Александр Каратаракис
источник

Ответы:

81

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.

Даниил
источник
9
Начиная с Ubuntu 14.04, это, к сожалению, самый простой способ замены ключей. Вы МОЖЕТЕ заставить xmodmap работать при входе в систему, добавив его в Startup Applications, но если вы приостанавливаете работу, переходите в спящий режим и т. Д., Вы должны вручную запустить его или создать сценарии запуска демона.
Holocronweaver
Я могу переназначить клавиши в зависимости от модификаторов: unmodified shift altgr* shift+altgr. Но как насчет left altи super key?
Фаржер
7
Я не думаю, что ваше первое предложение верно. Есть ли у вас источник для этого? Мне трудно поверить, что «способ Ubuntu» переназначения ваших клавиш будет редактировать карты клавиатуры xkb. Помимо того, что это таинственное, есть проблема, что ваши пользовательские карты удаляются при xkbобновлении.
Матеус Араужо
1
Тем не менее, это единственный надежный метод перераспределения ключей в Ubuntu, который я нашел.
Матеус Араужо
1
Должен быть лучший способ. Я знаю точный код ключа, который я хочу отобразить, но код ключа 217 даже не указан в xkb. Я даже не вижу способа добавить новые коды клавиш.
Джонатан
13

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

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

dedalu
источник
1
Все еще работает с 15.10 :-) Спасибо!
lalomartins
Ссылка на этот легендарный скрипт, похоже, не работает. Может кто-нибудь выложить это на github?
Эпигене
Отличный - и только жизнеспособный - ответ! Работаю в 16.04. Чтобы заставить его работать в Python3, изменилось: «импортировать gobject» на «из gi.repository импортировать GObject as gobject».
Крейг Хикс
1
@Epigene - ссылка там сейчас
Крейг Хикс
Хвала быть! Гениальная работа вокруг.
dmanexe
6

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

sleep 4 && xmodmap ~/.Xmodmap &

в ~/.bash_profileто он должен работать (это не для меня).

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

dremodaris
источник
1
Удачно ли настроить этот параметр для запуска после приостановки / гибернации?
Джонатан
Нет, к сожалению, я до сих пор не могу заставить его работать после загрузки. Поэтому каждый раз, когда я загружаюсь, я открываю терминал и xmodmap ~/.Xmodmap
печатаю
помните, что в Ubuntu 16.04 вы должны использовать .profile
Vitor Abella
5

Конвертировать Caps Lockв Escдля vimиспользования

Вот мой вариант сценария запуска сопоставления клавиш. Он преобразует Caps Lockв Escна любой клавиатуре для использования с vi, vimили gvim.

В отличие от ответа q4w56 , этот ответ не использует бесконечный while; doцикл. В противном случае одно ядро ​​моего двухъядерного ЦП будет разряжаться на 42% каждые 5 секунд, что серьезно снизит заряд батареи моего ноутбука.

#!/usr/bin/env 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использовании.

Серж Строобандт
источник
Замена функции Caps Lockклавиши может быть реальным спасением для vimпользователей на Apple MacBook без Escключа .
Серж Строобандт
3
Это лучше переназначить capslockк ctrl. Это решает многие проблемы еще и в Vim, то вы можете использовать capslock+ [для EscИзвините за вмешательство, но я чувствовал себя обязанным предложить это.
user907860
Что именно приостановить? Это закрывает крышку на вашем ноутбуке? После этого ваше решение не работает? Как вы используете vim после того, как закрыли крышку ноутбука?
Марко Авлияш,
@ MarkoAvlijaš Конечно, How do you use vim after you close the lid on your laptop?открыв крышку!
Серж Строобандт
Хаха, я бы никогда этого не догадался. Я имею в виду, что блокировка заглавных букв больше не предназначена для того, чтобы убежать после этого?
Марко Авлияш
3

У меня тоже была проблема на Ubuntu 16.04 с fcitx, и у меня было решение на fcitx wiki , но для этого нужно, чтобы fcitx был 4.2.7 или новее

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

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

Bluethon
источник
1
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
Видеонавт
@Videonauth Я изменил свой ответ
Bluethon
Большое спасибо :) Я все еще оставляю свой комментарий здесь, чтобы люди в обзоре могли видеть, что вы что-то изменили.
Видеонавт
@Videonauth, это мой первый ответ, и я плохо знаю английский, поэтому я ошибся. и спасибо за ваш совет. : P
Bluethon
Пожалуйста. Предоставление ответов - хороший способ внести свой вклад в сообщество.
Видеонавт
3

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

У меня работает на 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, как описано выше.

ОБНОВЛЕНИЕ: с 18.04, gdm3 в качестве диспетчера отображения и XFCE4 в качестве диспетчера окон, выглядит так, как будто ~ / .Xmodmap читается снова, и настройки, кажется, выдерживают приостановку. (Я редко использую режим ожидания, и я никогда не уверен, в каком режиме работает ноутбук).

Harald
источник
2

ПЕРЕСМОТР

Обновление в начале 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 вышеупомянутой ветки ошибок.
  • Более ранние комментарии относились к оригинальному сообщению.
u2n
источник
Я пытаюсь этот метод сейчас и сейчас, когда я запускаю терминал, я получаю кучу сообщений, таких как: Предупреждение: нет символов, определенных для <AB11> (код ключа 97) Предупреждение: Нет символов, определенных для <JPCM> (код ключа 103) Предупреждение: Не определены символы для <I120> (код 120) ...... многие еще не уверены, каковы будут последствия этого. Кто-нибудь знает?
потерянный ребенок
Этот метод, несмотря на вышеупомянутые предупреждения, работает, но только временно - через некоторое время отображение как-то забывается, и супер-ключ возвращается к своей функции по умолчанию. Поэтому я попробую все наоборот - я переназначу основные ярлыки редактирования на моем Mac, чтобы использовать клавишу Control вместо клавиши Command, и посмотрю, работает ли это. Я просто хочу, чтобы мои команды cut-copy-paste-undo-redo были одинаковыми на Mac и Ubuntu. Я очень расстраиваюсь, когда в Ubuntu появляется меню поиска каждый раз, когда я пытаюсь что-то скопировать или вставить.
потерянный ребенок
1

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

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

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

Там вы идете: левый контроль и Caps Lock поменялись местами.

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

glts
источник
Возможно, это было опровергнуто, потому что оно не относится к xmodmap, но именно так я и обнаружил, что использование Gnome Tweak могло быть причиной того, что некоторые из моих отображений вели себя странно.
dragon788
Я не вижу этого в 16.04, это все еще возможно?
Крисмаркс
1
@ chrismarx Нет, они удалили это. В настоящее время (16,04) я поставил XKBOPTIONS="ctrl:swapcaps"в /etc/default/keyboard.
Glts
0

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

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

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

golopot
источник
4
while; doСледует избегать использования любого бесконечного цикла. Это приводило к тому, что одно ядро ​​моего двухъядерного процессора каждые 42 секунды падало на 42%, что сильно уменьшало заряд батареи моего ноутбука!
Серж Строобандт