如果仅要将Super + x,Super + c,Super + v形式的几个序列绑定到其他序列,例如Ctrl + x,Ctrl + c,Ctrl + v,以便(根据需要的OP)特定的超级键序列通常会映射到剪切和粘贴,而不会影响系统上超级键的任何其他使用,可以仅使用XKB扩展名。以下过程概述了步骤,并提供了两个不同的示例,分别说明了两种不同的启动键盘设置;希望它将提供足够的信息以适应您的系统。假定您对在系统上创建和编辑文件(包括在系统位置的文件)感到满意/usr/share/X11/xkb
。
确定您希望XKB配置树驻留的位置。首先找到系统之一。它通常位于/ usr / share / X11 / xkb中,如果它不存在,我不确定如何找到它。您可以在系统中搜索名为“ xkb”的目录。无论如何,找到它后,您可以就地修改一个系统,也可以使用您选择的任何目录。使用系统目录的优点是您可以更轻松地调用更改,但是缺点是将来的系统更新可能会覆盖更改(已警告您)。无论如何,下面提到的所有文件名都是相对于该目录的,在需要时我将其称为$ XKBLOCAL $,并且所有命令都假定这是您的当前目录。
确定当前x,c,v密钥是什么XKB“密钥”类型。最简单的方法是通过命令xkbcomp -a $DISPLAY - | grep -C 6 c,
(注意逗号是故意包含在模式中的)。在我的第一个示例设置中,这将产生:
key <AB02> {
type= "ALPHABETIC",
symbols[Group1]= [ x, X ]
};
key <AB03> {
type= "ALPHABETIC",
symbols[Group1]= [ c, C ]
};
key <AB04> {
type= "ALPHABETIC",
symbols[Group1]= [ v, V ]
};
key <AB05> {
而在我的其他示例设置中,这会产生
key <AB02> {
type= "FOUR_LEVEL",
symbols[Group1]= [ x, X, approxeq, dead_ogonek ]
};
key <AB03> {
type= "FOUR_LEVEL",
symbols[Group1]= [ c, C, ccedilla, Ccedilla ]
};
key <AB04> {
type= "FOUR_LEVEL",
symbols[Group1]= [ v, V, squareroot, U25CA ]
};
key <AB05> {
结果是,在第一个示例中,相关键的类型为“ ALPHABETIC”,而在第二个示例中,相关键的类型为“ FOUR_LEVEL”。根据您的键盘设置,您可能会发现它们完全是其他类型的。在下面的内容中,该类型将称为$ TYPE $,您必须用实际的字符串ALPHABETIC或以下命令中的任何内容替换该类型。
查找$ TYPE $的定义,并将其复制到$ XKBLOCAL $ / types目录中的新文件。这是执行此操作的命令:xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste
。我选择的文件“ cutpaste”的名称是任意的,可以使用任何您喜欢的名称,但是请注意,在以后的步骤中,您必须始终引用该文件。在第一个设置中,此文件获取内容
type "ALPHABETIC" {
modifiers= Shift+Lock;
map[Shift]= Level2;
map[Lock]= Level2;
level_name[Level1]= "Base";
level_name[Level2]= "Caps";
};
在另一个示例中,它获取内容
type "FOUR_LEVEL" {
modifiers= Shift+LevelThree;
map[Shift]= Level2;
map[LevelThree]= Level3;
map[Shift+LevelThree]= Level4;
level_name[Level1]= "Base";
level_name[Level2]= "Shift";
level_name[Level3]= "Alt Base";
level_name[Level4]= "Shift Alt";
};
编辑文件类型/剪切粘贴以执行以下两项操作:添加使它成为适当的XKB子句的前同步码和后同步码,并更改类型名称和类型定义以添加由Super对应的修饰符产生的另一层。您应该检查系统上的修饰符是什么,很可能是Mod4,如下所示。从类型/剪切粘贴的两个示例最终版本中可以明显看出必要的修改,即:
default partial xkb_types "addsuper" {
type "ALPHABETIC_SUPER" {
modifiers= Shift+Lock+Mod4;
map[Shift]= Level2;
map[Lock]= Level2;
map[Mod4]= Level3;
map[Shift+Mod4]= Level3;
map[Lock+Mod4]= Level3;
level_name[Level1]= "Base";
level_name[Level2]= "Caps";
level_name[Level3]= "With Super";
};
};
和
default partial xkb_types "addsuper" {
type "FOUR_LEVEL_SUPER" {
modifiers= Shift+LevelThree+Mod4;
map[Shift]= Level2;
map[LevelThree]= Level3;
map[Shift+LevelThree]= Level4;
map[Mod4]= Level5;
map[Shift+Mod4] = Level5;
map[LevelThree+Mod4] = Level5;
map[Shift+LevelThree+Mod4] = Level5;
level_name[Level1]= "Base";
level_name[Level2]= "Shift";
level_name[Level3]= "Alt Base";
level_name[Level4]= "Shift Alt";
level_name[Level5]= "With Super"';
};
};
将第二步中由grep输出的键符号定义复制到第二个新文件符号/剪切粘贴中,并添加类似的前同步码和后同步码,并修改定义以使用新类型,并向该定义添加操作以处理所需的键由超级版本生产。我们的两个示例中的结果是:
default partial xkb_symbols "superversions" {
replace key <AB02> {
type[Group1]= "ALPHABETIC_SUPER",
symbols[Group1]= [ x, X, NoSymbol ],
actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
};
replace key <AB03> {
type[Group1]= "ALPHABETIC_SUPER",
symbols[Group1]= [ c, C, NoSymbol ],
actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
};
replace key <AB04> {
type[Group1]= "ALPHABETIC_SUPER",
symbols[Group1]= [ v, V, NoSymbol ],
actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
};
};
和
default partial xkb_symbols "superversions" {
replace key <AB02> {
type[Group1]= "FOUR_LEVEL_SUPER",
symbols[Group1]= [x,X,approxeq,dead_ogonek,NoSymbol],
actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
};
replace key <AB03> {
type[Group1]= "FOUR_LEVEL_SUPER",
symbols[Group1]= [c,C,ccedilla,Ccedilla,NoSymbol],
actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
};
replace key <AB04> {
type[Group1]= "FOUR_LEVEL_SUPER",
symbols[Group1]= [v,V,squareroot,U25CA,NoSymbol],
actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
};
};
请注意,在第二个示例中,我也挤出了一些(非重要的)空白,以使行长受到一点控制。
查找XKB当前正在使用的规则集的名称。很简单,显示在的结果中setxkbmap -query
。就我而言,它是“ evdev”。
将rules / evdev(或任何规则集的名称)的系统版本复制到$ XKBLOCAL $ / rules / evdev,并添加指向我们创建的选项的规则。您在这里有两个选择:您可以复制所有evdev或仅复制提及您实际使用的键盘型号,布局,变体和选项的部分。当然,如果要在适当位置修改系统文件,则无需进行任何复制,只需进行编辑即可。
在这种情况下,无论初始键盘设置如何,添加的内容都是相同的,因此仅举一个示例。您可以找到规则文件的以开头的部分,并在该部分! option = symbols
添加一行cutpaste:super = +cutpaste
,还可以找到规则文件的以开头的部分以及该部分! option = types
的一行cutpaste:super = +cutpaste
。
复制evdev.lst的系统版本,并为新选项添加一行。请注意,此文件的名称仅与规则文件的名称相对应,后缀.lst。与上一步一样,您可以复制整个文件,也可以仅复制所使用的模型,布局,变体和选项所引用的部分。你只需要找到这个文件的,与开头的部分! option
,并添加一行是这样的:cutpaste:super Add super equivalents of cut and paste operations
该节。
好的,现在所有配置文件都就位。如果您修改了系统文件,则现在可以使用调用新选项setxkbmap -option cutpaste:super
。另一方面,如果没有这样做,则必须让setxkbmap知道$ XKBLOCAL $目录在哪里。更糟糕的是,服务器也不知道该目录在哪里,而setxkbmap也不知道(或者也许不知道,因为最终服务器可能正在另一台机器上运行)。因此,您必须将setxkbmap的输出传递给xkbcomp,并告诉该命令$ XKBLOCAL目录在哪里。因此,完整的命令行为setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY
。