问题描述
我无法在Ubuntu 13.04中登录时运行xmodmap。我搜索过,包括在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(即相应的文件在指定的位置不存在),我不想触摸全局设置。
最佳解决思路
Ubuntu不再使用xmodmap
,而是使用xkb
(据我所知,这有助于per-window键盘布局等)。
system-wideMap文件位于
/usr/share/X11/xkb/symbols/
这些Map似乎是分层加载的,pc
映射为根,以及任何语言(例如en
)作为根的子级。
在我的特殊情况下,我在键盘上将Page Up with Home和Page Down with End进行了物理交换,因此我非常粗略地对system-wide pc
Map进行了更改,如下所示:
key <HOME> { [ Prior ] };
key <PGUP> { [ Home ] };
key <END> { [ Next ] };
key <PGDN> { [ End ] };
注意:要强制Xorg使用新的键盘映射,您可能必须使用remove the existing pre-compiled maps(* .xkm)
/var/lib/xkb/
然后重启Xorg。
xkb
上有各种资源,但this one与Ubuntu有关。
次佳解决思路
对我来说,如果要以系统设置中不可用的方式重新映射1或2个密钥,则xkb配置过于复杂。此外,解决方案应保留在用户端,无需编辑’/usr/share/X11/xkb/symbols/’等。使用启动应用程序强制’xmodmap ~/.Xmodmap’加载仅适用于暂停,更改用户或更改键盘布局。因此,正如holocronweaver所建议的那样,我发现代码片段,我在会话启动时加载了一个python脚本,在需要时重新加载’~/.Xmodmap’。
检查bug report #1243642(注释#6)和download it here。
第三种解决思路
我在Ubuntu 14.04中遇到了这个问题,并找到了解决方案here。显然,Ubuntu无法在登录后立即配置键盘,但稍晚一点。所以如果你添加一个命令
sleep 4 && xmodmap ~/.Xmodmap &
到~/.bash_profile
然后它应该工作(它对我来说)。
编辑:这似乎只有在登录后才能工作,而不是在启动后。我将在稍后进行调查。
第四种思路
将Caps Lock
转换为Esc
用于vim
使用
这是我的键映射启动脚本的变体。它在任何键盘上将Caps Lock
转化为Esc
,用于vi
,vim
或gvim
。
与q4w56的答案不同,此答案不使用任何无限的while; do
循环。否则,我的双核CPU的一个核心每5秒就会达到42%,严重降低了我的笔记本电池电量。
#!/bin/bash
sleep 4
xmodmap -e "clear Lock"
xmodmap -e "keysym Caps_Lock = Escape"
将其另存为脚本。使用chmod +x
使文件可执行。将脚本名称和位置添加到Session and Startup → Application Autostart
(在Xubuntu中)。
此用户的键盘行为将通过重新引导和注销保持持久性,但不会挂起。 Persistence through suspend can be achieved,但不幸的是只在系统级别,而不是在用户级别。
此键盘重新映射的基本原理
在今天的计算世界中,Caps Lock
密钥几乎没有用处。通常,应该通过netiquette和the separation of presentation and content来避免使用ALL CAPS。此外,在使用vim
编辑文本时意外点击Caps Lock
键并不总是立即注意到,但总是导致相当烦人的vim
行为。同时禁用Caps Lock
密钥并将其重新用作易于访问的Esc
密钥,可使vim
使用双赢。
第五种思路
我在使用fcitx的Ubuntu 16.04上遇到了问题,并且在fcitx wiki上有解决方案,但它需要fcitx有4.2.7或更高版本
-
touch ~/.Xmodmap
-
写配置
-
重启,fcitx会尝试自动加载
原因也有一些解释。
第六种思路
@丹尼尔的回答指出了正确的方法,但我想延伸一下。
适用于Linux Mint 17.2和Ubuntu 16.04。
我尝试了所有可以想到继续使用xmodmap
的曲折,但是当系统进入睡眠模式时它们都会失败。对于使用setxkbmap
的up-applicication脚本,在* settings-daemon(对我来说是xfce4)运行晚于脚本的情况下启动up-applicication脚本也是如此 – 并且命令不能真正受到影响。
我最终想出的具有以下成分:
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-key成为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中的设置,如上所述。
第七种思路
修订
2018年初的更新打破了持久性 – 暂停或休眠后键盘映射的auto-reload。由于使用/etc/pm/sleep.d脚本的方法停止工作(不建议使用?),只留下了更新的方法,使用/lib /systemd /system-sleep和略有不同的脚本(开始处理键盘映射!)。
所以这篇文章更新为更新的持久化方法,并包括正常的初始键映射加载,它也开始工作。将.Xmodmap文件转换为.xkbmap的例程保持不变。
请注意,这是一个per-user解决方案。有关per-device的答案,请参阅how to apply a keymap to a single device。这种方法可以适用于此处。
首先根据需要修改.Xmodmap文件。这些比.xkbmap文件更容易直接编辑。加载时:
xmodmap .Xmodmap
然后转换为.xkb文件:
xkbcomp $DISPLAY $HOME/.xkbmap
在启动时打开auto-load,打开“启动应用程序”,单击“添加”,然后在“命令行”上输入:
xkbcomp /home/user/.xkbmap “:0”
(“user”将替换为实际用户名。)对于Name,可能输入Load Keyboard Map。如果需要,添加评论并点击保存。
现在,每次系统启动时都会加载键映射,但不会在挂起或休眠状态下继续存在。为此,在/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
(Ref.)如上所述,将”user”替换为实际用户名。
键映射现在应该是auto-load并保持持久性。注意:
-
适用于当前LTS版本,16.04,以及可能更晚版本。
-
取自above-linked错误线程的post 14。
-
早期的评论适用于原帖。