如何为X11的Alt键分配另一个修饰符?


9

目标:

我想将Alt分配给CapsLock键,将Meta分配给Alt键。但是通过这种方式,Alt键将不再被识别为Alt,而CapsLock键将不再被识别为CapsLock。

openSUSE 11.4

先前:

openSUSE 11.1 -由于我是计算机的唯一用户,因此我“简单地”编辑了/ usr / share / X11 / xkb / keycodes / xfree86文件,该文件运行正常。键被连接到最低级别的符号上。

问题:

  1. xkb

    我创建了波兰语版式(pl_ext)的变体,(用于测试)由以下条目组成:

    key <CAPS> { [ Alt_L ] };
    modifier_map Mod1 { Alt_L, Alt_R };
    

    但这根本不起作用,xev中的CapsLock键被识别(符号)为Alt_L,但是当我按CapsLock键时,其行为类似于CapsLock(例如,假设您在菜单中有File,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> };
    

    xev将Alt键识别为Meta,但是我仍然可以使用Alt + F打开菜单,切换窗口,但我不应该。另一方面,我不能输入任何民族字符,应该这样做。

  2. xfree86

    但这现在不起作用,我猜是读取了其他文件表而不是xfree86。

    问题:如何找出系统使用哪个键码表文件(X / Gnome)?

    编辑:对我来说最好的选择-编辑键码表- 已由macias的答案解决

  3. xmodmap

    这里成功的一半。此部分可根据需要工作:

    删除锁= Caps_Lock键符号Caps_Lock = Alt_L

    现在,我确实有映射到Alt的CapsLock键。但是这个:

    键符Alt_L = Meta_L

    ...确实很奇怪。xev显示Alt键已映射到Meta,但是当我按Alt + F(应映射到Meta + F->不执行任何操作)时,“文件”菜单打开。而且,当我按Alt + Tab时,会出现窗口切换器(我不应该-Alt现在是Meta)。

    问题:如何“删除” Alt键的旧行为?

    编辑:这部分由吉尔斯的答案解决

摘要:

回答任何问题将(希望)解决我的问题,但是我更喜欢完全使用xkb,因为这样我就可以将xkb的所有文件打包并在一个位置更改布局。预先感谢您的任何帮助!


如果您找到了答案,请原样发布,并为可能感兴趣的其他人提供足够的信息。(如果您在其他地方或自己找到答案,则可以很好地回答自己的问题;如果愿意,您甚至可以将答案标记为已接受。)
Gilles'SO-别再作恶了

@Gilles,好的,但是我保留您的答案作为答案,只是为了防止可能的指责,我只是为了加分。此外,您的帮助对我来说非常宝贵。
greenoldman 2011年

无论如何,您不会因接受自己的答案而获得积分。(您确实会根据自己的回答获得投票的分数,这是公平的,因为您做了工作。)最重要的是要清楚地展示信息。现在,此问题有两个答案,一个是xmodmap,另一个是xkb,如果将它们都发布为答案,则页面将更加清晰。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


7

(此答案仅与xmodmap有关。我确定可以使用XKB做到这一点,我只是不知道如何。)

修饰符和键符是独立分配的。但是,如果设置不一致,就会得到奇怪的效果。我认为您所缺少的只是add为分配修饰符的命令Meta_L,尽管您可能还需要清除并重新分配修饰键。您可以将Mod1和替换Mod2Mod3Mod4Mod5:它们是可互换的,只需确保不要出于两个不同的目的而使用一个即可。

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

太谢谢了。所以的确,我使用Mod5代替Mod2来编写Meta,现在我可以按预期的方式进行编写了(我将meta + key用于许多国家字符)。但奇怪的是,现在我又遇到了CapsLock键的问题-它已绑定到... Meta。我猜为什么,因为一旦绑定到Alt,然后重新定义了Alt。那么,如何有所作为,一次坚持代码,第二次坚持符号?我不想使用原始键码,因为它们可能会在键盘之间变化。我不能交换keyyms的顺序,因为在最后一行中会出现错误。
greenoldman 2011年

问题keysym Caps_Lock = Alt_L是,如果您运行两次,它将使系统回到不希望的状态。这就是为什么我使用键码;它们在操作系统和体系结构之间(而不是在键盘之间)有所不同,但并不那么频繁。
吉尔(Gilles)“所以,别再邪恶了”,

谢谢您的解释,我猜就是:-)。如果您不介意,我会将其保留更长的时间作为未解决的问题,也许有人可以在xkb级别解决我的问题,这将更加灵活(切换布局会杀死xmodmaps)。
greenoldman 2011年

非常感谢,一直与符号/个人电脑战斗,没有成功。
科迪·克雷文

9

编辑键码方法

我在波兰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”文件即可。

注销,登录,然后使用新键盘:-)。


这可能是使用XKB的正确方法。我正在运行Linux Mint,并且遇到了一些问题,这些问题覆盖了我编写的自定义配置的Keyboard Preferences选项。由于这是一个单选按钮,因此我看不到要停止应用来自GUI的规则之一。CapslockXKB
dcunited001 2015年

您可以保留LALT的行为吗?也就是说,不将其更改为LMTA吗?我尝试过,但显然您不能有两个形式为<LALT> = ...的作业
丹尼尔(Daniel)

有了它,在ubuntu上切换LALT和RALT非常容易...非常感谢。对于所有Google员工:将alt映射到其他关键ubuntu alt到altgr ubuntu重新映射alt到ctrl
Noel Schenk

4

尝试这个:

    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 };
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.