绑定 Super+C Super+V 复制粘贴

sol*_*olo 27 linux keyboard keyboard-shortcuts xorg xmodmap

一段时间以来,我一直对将键盘上的 Windows 键 (Super_L) 绑定到“复制和粘贴”很感兴趣,除了桌面和 MacBook 之间的便利性和一致性之外,没有其他原因。

在阅读了有关 xmodmap 并执行以下操作后,我以为我已经接近了:

$ # re-map Super_L to Mode_switch, the 3rd col in keymap table `xmodmap -pke`
$ xmodmap -e "keycode  133 = Mode_switch"

$ # map Mode_switch+c to copy
$ xmodmap -e "keycode  54 = c C XF86_Copy C"

$ # map Mode_switch+v to paste
$ xmodmap -e "keycode  55 = v V XF86_Paste V"
Run Code Online (Sandbox Code Playgroud)

不幸的是,XF86Copy 和 XF86Paste 似乎根本不起作用。它们列在/usr/include/X11/XF86keysym.hxev显示键序列被 X 解释为 XF86Paste 和 XF86Copy,这些符号真的有效吗?他们是否必须有应用程序级别的支持?

zpe*_*pea 22

将 Super 绑定到 Ctrl

绑定你的左键Windows/Logo/Super作为另一个Ctrl键怎么样?

您可以使用以下 xmodmap 命令来实现:

remove mod4 = Super_L
keysym Super_L = Control_L
add Control = Control_L
Run Code Online (Sandbox Code Playgroud)

假设您保存了以上几行,因为super_as_ctrl.xmodmap您可以通过执行来测试效果

xmodmap super_as_ctrl.xmodmap
Run Code Online (Sandbox Code Playgroud)

要使更改永久(重新登录/重新启动),将文件重命名为.Xmodmap您的主文件夹中。

(以上是在Ubuntu 11.10 live系统上测试的,其他Linux发行版应该是一样的)


调整终端程序的复制/粘贴快捷方式

绑定SuperCtrl你现在Super-C几乎可以用来复制任何地方。唯一常见的例外是您的终端程序。但是,您可以在那里重新定义快捷方式。

我发现gnome-terminal现在甚至有这个选项(我没有,直到我习惯Ctrl-Shift-C了)。如果您使用那个,请转到Edit / Keyboard Shortcuts...菜单中并指定Ctrl-C复制和Ctrl-V粘贴。应该是类似的konsole等。

别担心,您不会失去使用快捷方式终止程序的能力。重新绑定终端的复制快捷方式后,您可以Ctrl-Shift-CCtrl-C以前一样使用。终端在这里不区分是否按下了 Shift。并且不再为副本捕获快捷方式。或者将终止重新绑定到另一个快捷方式,正如 MountainX 在他的回答中所建议的那样。


XF86Copy 等不起作用

关于复制和粘贴的关键符号:显然它们不起作用。我通过将复制操作分配给 Shift-ScrollLock 来快速测试它(它未使用,我想用非修饰键进行测试):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'
Run Code Online (Sandbox Code Playgroud)

按下它没有任何效果,对于 XF86AudioMute 也是如此。然而,它在分配字母“a”时确实有效。所以我猜这些 XF86 特殊键符号存在特定问题。

  • 将控件绑定到 Meta 与将复制/粘贴的快捷方式更改为 Meta+c/v 不同。我想在 Linux 上制作 MacOs 一样的 kboard 快捷方式,所以这个答案不是很好...... (4认同)
  • 不幸的是,即使我将 Super 绑定到 Ctrl,我仍然必须使用 Ctrl/Super+Shift+C 在终端内复制和粘贴,这是一个主要的诱因。感谢确认 XF86 键不起作用。 (3认同)

小智 12

例如,如果您只想将 Super+x、Super+c、Super+v 形式的几个序列绑定到其他序列,例如 Ctrl+x、Ctrl+c、Ctrl+v,以便(如 OP 所需)这些特定的超级键序列通常会映射到剪切和粘贴,而不会影响系统上超级键的任何其他用途,仅使用 XKB 扩展是可能的。下面的过程概述了这些步骤,并给出了两个不同的启动键盘设置的详细信息示例;希望这将提供足够的信息以适应您的系统。它假定您对在系统上创建和编辑文件感到满意,包括系统位置中的文件,如/usr/share/X11/xkb.

  1. 确定您希望 XKB 配置树驻留的位置。首先找到系统一。它通常在 /usr/share/X11/xkb 中,如果不存在,我不太确定如何找到它;您可以在系统中搜索名为“xkb”的目录。无论如何,一旦找到它,您就可以修改系统,也可以使用您选择的任何目录。使用系统目录的优点是您可以更轻松地调用您的更改,但缺点是将来的系统更新可能会覆盖您的更改(您已被警告)。在任何情况下,下文提到的所有文件名都是相对于该目录的,我将在需要时将其称为 $XKBLOCAL$,并且所有命令都假定这是您的当前目录。

  2. 确定当前 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> {
    
    Run Code Online (Sandbox Code Playgroud)

    而在我的其他示例设置中,这会产生

    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> {
    
    Run Code Online (Sandbox Code Playgroud)

    结果是,在第一个示例中,相关键的类型为“ALPHABETIC”,而在第二个示例中,它们的类型为“FOUR_LEVEL”。根据您的键盘设置,您可能会发现它们完全属于其他类型。在下文中,该类型将被称为 $TYPE$,您必须将其替换为实际字符串 ALPHABETIC 或以下命令中的任何内容。

  3. 找到 $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";
    };
    
    Run Code Online (Sandbox Code Playgroud)

    在另一个示例中,它获取内容

    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";
    };
    
    Run Code Online (Sandbox Code Playgroud)
  4. 编辑文件类型/剪切粘贴做两件事:添加前导码和后导码,使其成为正确的 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";
        };
    };
    
    Run Code Online (Sandbox Code Playgroud)

    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"';
       };
    };
    
    Run Code Online (Sandbox Code Playgroud)
  5. 将第二步 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)]
        };
    };
    
    Run Code Online (Sandbox Code Playgroud)

    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)]
        };
    };
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,在第二个示例中,我还挤出了一些(不重要的)空格,以保持行长受到一点控制。

  6. 查找 XKB 当前使用的规则集的名称。这很简单,它显示在setxkbmap -query. 就我而言,它是“evdev”。

  7. 将 rules/evdev 的系统版本(或任何规则集的名称)复制到 $XKBLOCAL$/rules/evdev 并添加指向我们创建的选项的规则。您在这里有两个选择:您可以复制所有 evdev 或仅复制提及您实际使用的键盘型号、布局、变体和选项的部分。当然,如果你是在原地修改系统文件,你不需要做任何复制,只需编辑。

    在这种情况下,无论初始键盘设置如何,添加的内容都是相同的,因此只有一个示例。您找到以 开头的规则文件部分并在该部分! option = symbols添加一行cutpaste:super = +cutpaste,您还可以找到以 开头的规则文件部分以及该部分! option = types的一行cutpaste:super = +cutpaste

  8. 复制 evdev.lst 的系统版本并为新选项添加​​一行。请注意,此文件的名称仅对应于附加了 .lst 的规则文件的名称。与上一步一样,您可以复制整个文件,也可以仅复制您正在使用的模型、布局、变体和选项所引用的部分。你只需要找到这个文件的,与开头的部分! option,并添加一行是这样的:cutpaste:super Add super equivalents of cut and paste operations该节。

  9. 好了,现在所有的配置文件都准备好了。如果您修改了系统文件,您现在可以使用setxkbmap -option cutpaste:super. 另一方面,如果你没有,你必须让 setxkbmap 知道你的 $XKBLOCAL$ 目录在哪里。更糟糕的是,服务器也不知道该目录在哪里,并且 setxkbmap 没有(或者可能不能,因为最终服务器可能在另一台机器上运行)告诉它。因此,您必须将 setxkbmap 的输出通过管道传输到 xkbcomp,并告诉该命令您的 $XKBLOCAL 目录在哪里。因此,完整的命令行是setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY.

希望这对某人有所帮助/感兴趣,因为很少有好的权威 XKB 文档/参考。一个非常有用的参考是http://madduck.net/docs/extending-xkb/

  • 这在 Ubuntu 18.04 上对我不起作用。结果很简单,“c”、“x”和“v”键不再起作用。我能够使用“setxkbmap -option”让他们再次工作。我的本地设置几乎与 FOUR_LEVEL 示例相同,但我在部分符号文件中省略了一些 Group2、Group3 符号,因此我的文件看起来与示例相同。 (2认同)