我安装了剪贴板补丁,并在我的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_v
并XK_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 服务器会发送一个大写密钥。这不是我们想要的,所以它什么也没做。TERMMOD
TERMMOD
ShiftMask
st
vShiftShiftVst