目的:
我想将 Alt 分配给 CapsLock 键,将 Meta 分配给 Alt 键。但这样一来,Alt-key 将不再被识别为 Alt,CapsLock-key 将不再被识别为 CapsLock。
开放SUSE 11.4
之前:
openSUSE 11.1——因为我是我的计算机的唯一用户,所以我“简单地”编辑了 /usr/share/X11/xkb/keycodes/xfree86 文件,它工作没有问题。按键连接到最低层的符号。
问题:
xkb
我创建了波兰布局(pl_ext)的一个变体,它(用于测试)由以下条目组成:
key <CAPS> { [ Alt_L ] }; modifier_map Mod1 { Alt_L, Alt_R };
然而,这根本没有任何作用,xev 中的 CapsLock 键被识别(符号)为 Alt_L,但是当我按 CapsLock 键时,它的行为类似于 CapsLock(例如,假设菜单中有文件,Alt+F 应该打开此菜单,但它不会)。
问题:如何定义布局文件将CapsLock键设置为Alt,Alt键设置为Meta?
编辑:到这里就成功一半了!现在我有这样的条目:
key <CAPS> { [ Alt_L ] }; modifier_map Mod1 { <CAPS> }; // this is a difference
这按预期工作。这不会:
key <LALT> { [ Meta_L ] } ; key <RALT> { [ Meta_R ] } ; modifier_map Mod5 { <LALT>,<RALT> };
Alt 键被 xev 识别为 Meta,但我仍然可以使用 Alt+F 打开菜单、切换窗口,但我不应该这样做。另一方面,我不能输入任何民族性格,但我应该输入。
自由86
但现在这不起作用,我猜是读取其他文件表而不是xfree86。
问题:如何找出系统(X/Gnome)使用哪个键码表文件?
编辑:对我来说最好的选择——编辑键码表——已经解决通过马西亚斯的回答!
xmodmap
到这里就成功一半了。这部分按预期工作:
删除 Lock = Caps_Lock keysym Caps_Lock = Alt_L
现在,我有了真正的 CapsLock 键,它映射到 Alt。但是这个:
键符号 Alt_L = Meta_L
...做了奇怪的事情。 xev 显示 Alt 键已映射到 Meta,但是当我按 Alt+F(这应该映射到 Meta+F --> 不执行任何操作)时,文件菜单将打开。更重要的是,当我按 Alt+Tab 时,我会得到窗口切换器(我不应该——Alt 现在是 Meta)。
问题:如何“删除”Alt 键的旧行为?
编辑:这部分的解决方法是吉尔斯的回答。
概括:
回答任何问题都会(希望)解决我的问题,但是我更喜欢完全使用 xkb,因为我可以将 xkb 的所有文件打包并在一个地方更改布局。预先感谢您的任何帮助!
答案1
编辑键码方法
我在波兰 Ubuntu 论坛上找到了答案。现在我们不再编辑“xfree86”文件,而是编辑“evdev”文件。通过这种方式,您可以进行适用于所有布局的永久性更改。
示例(应 Gilles 请求)——以 root 身份登录,转到
/usr/share/X11/xkb/keycodes
备份“evdev”文件,然后对其进行编辑。根据您的喜好更改代码,例如我的情况:
<LALT> = 66; // when I press CapsLock (66 code) system will report pressing LeftAlt
<LMTA> = 64; // I will get LeftMeta when pressing LeftAlt (64 code)
您可以通过执行命令“xev”来查找代码,但您可以简单地查看原始“evdev”文件。
注销,登录,享受您的新键盘:-)。
答案2
(这个答案仅关于 xmodmap。我确信可以使用 XKB 做到这一点,我只是不知道如何。)
修饰符和键符是独立分配的。但如果你不一致地设置它们,你会得到奇怪的效果。我认为您缺少的只是add
将修饰符分配给 的命令Meta_L
,尽管您可能还需要清除并重新分配修饰键。您可以将Mod1
and替换Mod2
为Mod3
, Mod4
and Mod5
:它们是可以互换的,只需确保不要将一个用于两个不同的目的。
clear Mod1
clear Mod2
remove Lock = Caps_Lock
keysym Caps_Lock = Alt_L
keysym Alt_L = Meta_L
add Mod1 = Alt_L Alt_R
add Mod2 = Meta_L Meta_R
答案3
尝试这个:
key <CAPS> { [ Alt_L, Alt_L ] };
key <LALT> { [ Meta_L, Meta_L ] };
modifier_map Mod1 { Alt_L, Alt_R };
modifier_map Mod5 { Meta_L, Meta_R };
注意两个级别的定义。这是因为 LALT 的默认值是 [ Alt_L, Meta_L ];如果你不重新定义第二个,它将保留为Meta_L。
看着这个答案在xkb上了解如何重新定义某些键而不需要编辑主要默认文件(因此不需要 root)。在这种情况下,您将需要在本地符号文件中包含一小部分,如下所示:
partial modifier_keys
xkb_symbols "capsasalt_altasmeta" {
replace key <CAPS> { [ Alt_L, Alt_L ] };
replace key <LALT> { [ Meta_L, Meta_L ] };
modifier_map Mod1 { Alt_L, Alt_R };
modifier_map Mod5 { Meta_L, Meta_R };
};