Я использую следующие строки в моем ~/.xprofile
на Ubuntu 20.04 для отображения Капслок к ESC и Ctrl:
# заставить CapsLock вести себя как Ctrl:
setxkbmap -опция ctrl:nocaps
# заставить короткое нажатие Ctrl вести себя как Escape:
xcape -e 'Control_L=Escape'
который отлично работает для меня.
Моя проблема в том, что он не выдерживает приостановки/возобновления надежно.Для этого я пробовал 2 разных решения:
1. Через скрипт CapsMap
положить в /usr/lib/systemd/системный сон/
#!/бин/баш
случай "$1" в
предварительно)
#выполнение кода ПЕРЕД спящим режимом/гибернацией/приостановкой
;;
публиковать)
#выполнение кода ПОСЛЕ возобновления
/usr/bin/echo "выполнение: /usr/bin/setxkbmap -option ctrl:nocaps"
/usr/bin/setxkbmap -опция ctrl:nocaps
/usr/bin/echo "выполнение: /usr/bin/xcape -e 'Control_L=Escape'"
/usr/bin/xcape -e 'Control_L=Escape'
;;
эсак
выход 0
Я сделал скрипт исполняемым с помощью sudo chmod +x capsmap
и по логам видно, что он вызывается в нужное время:
$ журналctl
...
Окт 09 13:29:12 nb systemd-sleep[401221]: работа системы возобновлена.
Окт 09 13:29:12 nb ядро: Bluetooth: hci0: Версия устройства 5
Окт 09 13:29:12 ядро nb: Bluetooth: hci0: безопасная загрузка включена
Окт 09 13:29:12 nb ядро: Bluetooth: hci0: блокировка OTP включена
Окт 09 13:29:12 nb ядро: Bluetooth: hci0: блокировка API включена
Окт 09 13:29:12 ядро nb: Bluetooth: hci0: блокировка отладки отключена
Окт 09 13:29:12 nb ядро: Bluetooth: hci0: Минимальная версия прошивки 1 неделя 10 2014
Окт 09 13:29:12 nb ядро: Bluetooth: hci0: Найдено прошивка устройства: intel/ibt-11-5.sfi
Окт 09 13:29:12 nb systemd-sleep[401287]: выполнение: /usr/bin/setxkbmap -option ctrl:nocaps
Окт 09 13:29:12 nb systemd-sleep [401288]: не удается открыть дисплей «по умолчанию»
Окт 09 13:29:12 nb systemd-sleep[401291]: выполнение: /usr/bin/xcape -e 'Control_L=Escape'
Окт 09 13:29:12 nb systemd-sleep[401293]: невозможно подключиться к дисплею X11. $DISPLAY установлен?
Окт 09 13:29:12 nb systemd[1]: systemd-suspend.service: успешно.
Окт 09 13:29:12 nb systemd[1]: Готово Приостановка.
Окт 09 13:29:12 nb systemd[1]: остановлен целевой спящий режим.
Окт 09 13:29:12 nb systemd[1]: Достигнута цель Приостановить.
Окт 09 13:29:12 nb systemd[1]: цель остановлена Приостановить.
...
Однако отображение применяется лишь иногда. Довольно часто, Капслок просто ведет себя нормально.
2. Через сервис systemd
Я добавил служебный файл capsmap.service
к и т.д./системд/система/
со следующим содержанием:
[Ед. изм]
Description=Сопоставить Capslock с ESC и Ctrl
После=приостановить.цель
[Оказание услуг]
Тип = ваншот
ExecStart=/usr/local/bin/capsmap
Тайм-аутсек=0
Стандартный вывод = системный журнал
[Установить]
WantedBy=multi-user.target suspend.target
с файлом /usr/местные/бен/capsmap
как
#!/бин/баш
# заставить CapsLock вести себя как Ctrl:
/usr/bin/echo "выполнение: /usr/bin/setxkbmap -option ctrl:nocaps"
/usr/bin/setxkbmap -опция ctrl:nocaps
# заставить короткое нажатие Ctrl вести себя как Escape:
/usr/bin/echo "выполнение: /usr/bin/xcape -e 'Control_L=Escape'"
/usr/bin/xcape -e 'Control_L=Escape'
выход 0
затем включил службу с помощью sudo systemctl включить capsmap.service
.
Также в этом случае я вижу с журналctl
что скрипт выполнился успешно, но нормальный Капслок поведение все еще присутствует.
$journalctl
...
Окт 09 13:07:56 nb systemd[1]: цель остановлена Приостановить.
Окт 09 13:07:56 nb NetworkManager[1049]: <info> [1633777676.0331] менеджер: сон: запрошено пробуждение (в спящем режиме: да включено: да)
Окт 09 13:07:56 nb ModemManager[1137]: система <info> [sleep-monitor] возобновляет работу
Окт 09 13:07:56 nb NetworkManager[1049]: <info> [1633777676.0332] устройство (enp0s31f6): изменение состояния: активировано -> неуправляемое (причина «спящий», sys-iface-state: «управляемый»)
Окт 09 13:07:56 nb systemd[1761]: Остановлен целевой Bluetooth.
Окт 09 13:07:56 nb upowerd[1344]: обработка события изменения как добавления в /sys/devices/pci0000:00/0000:00:00:14.0/usb1/1-8
Окт 09 13:07:56 nb capsmap[378798]: выполнение: /usr/bin/setxkbmap -option ctrl:nocaps
Окт 09 13:07:56 nb systemd[1761]: достигнут целевой Bluetooth.
Окт 09 13:07:56 nb NetworkManager[1049]: <info> [1633777676.0498] dhcp4 (enp0s31f6): транзакция DHCP отменена
Окт 09 13:07:56 nb capsmap[378799]: не удается открыть дисплей «по умолчанию»
Окт 09 13:07:56 nb NetworkManager[1049]: <info> [1633777676.0498] dhcp4 (enp0s31f6): состояние изменено привязка -> выполнено
Окт 09 13:07:56 nb avahi-daemon[1041]: отзыв записи адреса для 192.168.178.54 на enp0s31f6.
Окт 09 13:07:56 nb avahi-daemon[1041]: выход из группы многоадресной рассылки mDNS на интерфейсе enp0s31f6.IPv4 с адресом 192.168.178.54.
Окт 09 13:07:56 nb avahi-daemon[1041]: Интерфейс enp0s31f6.IPv4 больше не актуален для mDNS.
Окт 09 13:07:56 nb avahi-daemon[1041]: отзыв записи адреса для fe80::778b:d324:d55d:a503 на enp0s31f6.
Окт 09 13:07:56 nb avahi-daemon[1041]: выход из многоадресной группы mDNS на интерфейсе enp0s31f6.IPv6 с адресом fe80::778b:d324:d55d:a503.
Окт 09 13:07:56 nb avahi-daemon[1041]: Интерфейс enp0s31f6.IPv6 больше не актуален для mDNS.
Окт 09 13:07:56 nb systemd[1]: Начата загрузка/сохранение состояния переключателя отключения RF.
Окт 09 13:07:56 nb capsmap[378800]: выполнение: /usr/bin/xcape -e 'Control_L=Escape'
Окт 09 13:07:56 nb NetworkManager[1049]: <info> [1633777676.0545] менеджер: состояние NetworkManager теперь CONNECTED_GLOBAL
Окт 09 13:07:56 nb capsmap[378805]: невозможно подключиться к дисплею X11. $DISPLAY установлен?
Окт 09 13:07:56 nb ядро: kauditd_printk_skb: подавлено 9 обратных вызовов
Окт 09 13:07:56 nb ядро: аудит: тип = 1107 аудит (1633777676.068: 1737): pid = 1047 uid = 103 auid = 4294967295 ses = 4294967295 subj = unconfined msg = 'apparmor = "DENIED" operation = "dbus_signal" bus="system" path="/org/freedesktop/NetworkManager/ActiveConnection/30" interface="org.fr>
exe="/usr/bin/dbus-daemon" sauid=103 hostname=? адрес=? терминал=?'
Окт 09 13:07:56 nb ядро: аудит: тип = 1107 аудит (1633777676.068: 1738): pid = 1047 uid = 103 auid = 4294967295 ses = 4294967295 subj = unconfined msg = 'apparmor = "DENIED" operation = "dbus_signal" bus="system" path="/org/freedesktop/NetworkManager/ActiveConnection/30" interface="org.fr>
exe="/usr/bin/dbus-daemon" sauid=103 hostname=? адрес=? терминал=?'
Окт 09 13:07:56 nb аудит[1047]: USER_AVC pid=1047 uid=103 auid=4294967295 ses=4294967295 subj=unconfined msg='apparmor="DENIED" operation="dbus_signal" bus="system" path=" /org/freedesktop/NetworkManager/ActiveConnection/30" interface="org.freedesktop.NetworkManager.Connect>
exe="/usr/bin/dbus-daemon" sauid=103 hostname=? адрес=? терминал=?'
Окт 09 13:07:56 nb аудит[1047]: USER_AVC pid=1047 uid=103 auid=4294967295 ses=4294967295 subj=unconfined msg='apparmor="DENIED" operation="dbus_signal" bus="system" path=" /org/freedesktop/NetworkManager/ActiveConnection/30" interface="org.freedesktop.NetworkManager.Connect>
exe="/usr/bin/dbus-daemon" sauid=103 hostname=? адрес=? терминал=?'
Окт 09 13:07:56 nb systemd[1]: capsmap.service: успешно.
...