将Super + C Super + V绑定到复制和粘贴


23

一段时间以来,我一直对将键盘上的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"

不幸的是,XF86Copy和XF86Paste似乎根本不起作用。它们在中列出/usr/include/X11/XF86keysym.hxev显示X将键序列解释为XF86Paste和XF86Copy,这些符号实际上起作用吗?他们是否需要应用程序级别的支持?

Answers:


18

将超级绑定到Ctrl

将左键绑定Windows/Logo/Super为另一个Ctrl键怎么办?

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

remove mod4 = Super_L
keysym Super_L = Control_L
add Control = Control_L

假设您保存了上述几行,super_as_ctrl.xmodmap可以通过执行以下命令来测试效果

xmodmap super_as_ctrl.xmodmap

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

(以上内容已在Ubuntu 11.10实时系统上进行了测试,但对于其他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'

按下它无效,XF86AudioMute也无效。但是,在分配字母“ a”时确实有效。因此,我想这些XF86特殊键符号存在特定问题。


3
不幸的是,即使我将Super绑定到Ctrl,我仍然必须使用Ctrl / Super + Shift + C在终端内部复制和粘贴,这是主要的诱因。感谢您确认XF86键不起作用。
2012年

您使用什么终端程序?我添加了至少与gnome-terminal兼容的解决方案。对其他人来说应该相似。
zpea 2012年

4
将控件绑定到Meta与将复制/粘贴到Meta + c / v的更改快捷方式不同。我想让MacO像Linux上的kboard快捷方式一样,所以这个答案不是很好...
Sonique 2015年

1
Shift + ctrl + c或任何太笨拙的东西,只要将Super重新绑定到Ctrl就会使用Super + c发送
终止

第一步大约是我将超级/命令变成控制的工作。这可以解决大多数问题,但是我仍然希望cmd-c和ctrl-c具有不同的功能,即使cmd在其他地方也意味着ctrl。不知道我是否可以使用xmodmap和特定于终端的快捷方式执行此操作。
tedder42

9

如果仅要将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> {
    

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

    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或以下命令中的任何内容替换该类型。

  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";
    };
    

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

    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";
    };
    
  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";
        };
    };
    

    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"';
       };
    };
    
  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)]
        };
    };
    

    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)]
        };
    };
    

    请注意,在第二个示例中,我也挤出了一些(非重要的)空白,以使行长受到一点控制。

  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符号被我留在了部分符号文件之外,因此我的文件看起来与示例相同。
JinnKo

2

这是我的工作。它不是最终的解决方案,但我试图实现最终的解决方案,但经过大量的努力却无法实现。因此,我选择了一种简单且可以满足我90%以上需求的东西。我可以在几分钟内在任何我要去的计算机(或任何新安装的Linux)上实现它。很简单。

在X终端应用程序中,设置快捷方式首选项。我在Gnome和KDE中都做到了。例如,在Konsole中,转到菜单>设置>配置快捷方式。Gnome X终端中有一个类似的菜单。只需选择快捷方式(例如“复制”),然后输入所需的按键顺序即可。

如果终端的复制和粘贴快捷方式与终端命令冲突,那么也有一个简单的解决方法。例如,如果有人要使用CTRL-C进行复制(因此X终端符合CUA标准)怎么办?

在这种情况下,您可以轻松更改stty键绑定(在.bashrc中)。继续以CTRL-C为例进行复制,例如,您希望中​​断键现在为CTRL-b(用于“ break”)。这样可以完成:

echo "stty intr \^b" >> ~/.bashrc 

然后源.bashrc。

整个解决方案非常简单,只需使用X终端设置更改快捷方式,然后(可选)使用单行echo命令解决与stty的冲突。死法简单,几乎涵盖了我需要的所有内容。


0

Windows键可能是修饰键。运行此命令,然后重试:

xmodmap -e 'remove Mod4 = Super_L'

谢谢,但不能解决问题。我知道映射是可行的,因为xev报告XF86事件。
独奏

我的第一篇文章(之后执行xmodmap -e 'remove Mod1 = Meta_L'并尝试您的命令)对我来说效果很好。
ussr 2012年

1
@solo以及是否正常工作,请考虑并非每个桌面环境或应用程序都支持它们。要确定它是否确实有效,例如在Firefox上使用它们。它支持(侦听)X键绑定。
ussr 2012年

0

我已经采纳了Glen Whitney所说的话,并设法利用该知识将macOS中的单词或文本操作行为映射到自定义键映射中。

我已经解决了Ctrl vs Super复制和粘贴问题,而没有涉及该特定解决方案,但是就像我说的那样,它对其他事情很有帮助。我也避免使用xmodmap之类的东西,因为我打算在某个时候完全支持Wayland。Kinto使用本机xkb,并且尊重预期的macOS,例如终端行为。

https://github.com/rbreaves/kinto

https://medium.com/@benreaves/kinto-a-mac-inspired-keyboard-mapping-for-linux-58f731817c0

这也是一个要点,如果您只想查看所有内容的核心,那么在需要时它不会替代您的键盘映射。Gist也不包含自定义的xkb键映射文件,这些文件设置了使用Cmd和箭头键设置macOS样式的光标/逐字操作。

https://gist.github.com/rbreaves/f4cf8a991eaeea893999964f5e83eebb

要点

# permanent apple keyboard keyswap
echo "options hid_apple swap_opt_cmd=1" | sudo tee -a /etc/modprobe.d/hid_apple.conf
update-initramfs -u -k all

# Temporary & instant apple keyboard keyswap
echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd

# Windows and Mac keyboards - GUI (Physical Alt is Ctrl, Physical Super is Alt, Physical Ctrl is Super)
setxkbmap -option;setxkbmap -option altwin:ctrl_alt_win

# Windows and Mac keyboards - Terminal Apps (Physical Alt is Super, Physical Super is Alt, Physical Ctrl is Ctrl)
setxkbmap -option;setxkbmap -option altwin:swap_alt_win

# If the hid_apple driver is not loaded for Apple keyboards, which can be found out
# by the lsmod command then the above setxkbmap commands will not work
# Use the following commands for Apple style keyboards without an hid_apple driver
#
# Note: this could also apply to hid_apple driver as well 
# if this option is set to 0 inside swap_opt_cmd
#
lsmod | grep hid_apple

# Apple keyboard without hid_apple - GUI
setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl,ctrl:swap_rwin_rctl

# Apple keyboard without hid_apple - Terminal
setxkbmap -option;setxkbmap -option altwin:alt_super_win

#
# If you want a systemd service and bash script to help toggle between
# GUI and Terminal applications then look at project Kinto.
# https://github.com/rbreaves/kinto
#
# Note: The above may not work for Chromebooks running Linux, please look
# at project Kinto for that.
#
# If anyone would like to contribute to the project then please do!
#
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.