解释

解释

我安装了剪贴板补丁,并在我的config.h

#define MODKEY Mod1Mask
#define TERMMOD (Mod1Mask|ShiftMask)

{ ShiftMask,            XK_Insert,      clippaste,      {.i =  0} },
{ TERMMOD,               XK_c,           clipcopy,       {.i =  0} },
{ TERMMOD,               XK_v,           clippaste,      {.i =  0} },
{ MODKEY,               XK_p,           selpaste,       {.i =  0} },

有趣的是Shift+Insert,中键单击鼠标可以让我从剪贴板粘贴,但使用上面的TERMMOD和组合MODKEY则不行。使用TERMMOD和 的其他快捷方式MODKEY(例如放大/缩小、打印屏幕、滚动)有效。我尝试使用其他组合,Ctrl+Shift+c/v但没有乐趣。相同的组合可以在 xterm、urxvt 和 alacritty 上运行(我还没有详尽地测试其他模拟器)。

任何人都可以解释一下吗?

答案1

在里面st源中的默认键绑定,绑定使用XK_V(注意大写)。

    { TERMMOD,              XK_C,           clipcopy,       {.i =  0} },
    { TERMMOD,              XK_V,           clippaste,      {.i =  0} },
    { TERMMOD,              XK_Y,           selpaste,       {.i =  0} },

XK_v尝试将小写改回原来的大小写(同时保留 的新值TERMMOD)。

解释

XK_vXK_V在 X11 包含文件中定义为 0x76 和 0x56 keysymdef.h。它们被认为是不同的按键。您可以使用以下xev工具进行测试:

没有Shift

KeyRelease event, serial 47, synthetic NO, window 0x4c00001,
    root 0x4cf, subw 0x0, time 433723403, (134,121), root:(1235,171),
    state 0x0, keycode 55 (keysym 0x76, v), same_screen YES,
    XLookupString gives 1 bytes: (76) "v"
    XmbLookupString gives 1 bytes: (76) "v"
    XFilterEvent returns: False

按住时Shift,相同的keycode结果会不同keysym

KeyPress event, serial 47, synthetic NO, window 0x4c00001,
    root 0x4cf, subw 0x0, time 433724571, (134,121), root:(1235,171),
    state 0x1, keycode 55 (keysym 0x56, V), same_screen YES,
    XLookupString gives 1 bytes: (56) "V"
    XmbLookupString gives 1 bytes: (56) "V"
    XFilterEvent returns: False

当您与, 和containsXK_v结合使用时,您是在告诉您要在按下时收到小写字母时进行粘贴。但是当您按住 时,X 服务器会发送一个大写密钥。这不是我们想要的,所以它什么也没做。TERMMODTERMMODShiftMaskstvShiftShiftVst

相关内容