有没有办法映射 CTRL+A 和 CTRL+E 来工作全系统移动到行首,并相应地移动到行尾?
即我希望这些快捷方式能够在任何应用程序中无缝工作,而不仅仅是在终端中(即在 OSX 中)。
我的主要系统是带有 Unity 桌面的 Ubuntu,但如果有一个与桌面无关的通用解决方案就更好了,或者至少在 Gnome、XFCE 和 LXDE 中受支持。
答案1
xmodmap
似乎提供了一个答案,但事实并非如此,因为键码它操纵的是键盘上现有的键,而不是修改的键。AcontrolA是经过修改的键。
xmodmap
只能重新分配现有的键码或(它们的名称)键符号,如其手册页所列:
keycode
数字=键符号名称...
keycode
any
=键符号名称...
keysym
键符号名称=键符号名称...
要查看已知的键代码xmodmap
,请运行
xmodmap -pk
显示的内容类似如下内容(为清楚起见已缩短):
There are 4 KeySyms per KeyCode; KeyCodes range from 8 to 255.
KeyCode Keysym (Keysym) ...
Value Value (Name) ...
8 0x0061 (a) 0x0041 (A) 0x00e5 (aring) 0x00c5 (Aring)
9 0x0073 (s) 0x0053 (S) 0x00df (ssharp) 0x00cd (Iacute)
10 0x0064 (d) 0x0044 (D) 0x08ef (partialderivative) 0x00ce (Icircumflex)
11 0x0066 (f) 0x0046 (F) 0x08f6 (function) 0x00cf (Idiaeresis)
12 0x0068 (h) 0x0048 (H) 0x01ff (abovedot) 0x00d3 (Oacute)
13 0x0067 (g) 0x0047 (G) 0x00a9 (copyright) 0x01bd (doubleacute)
14 0x007a (z) 0x005a (Z) 0x07d9 (Greek_OMEGA) 0x00b8 (cedilla)
...
xev
显示实际发生的情况:
KeyPress event, serial 34, synthetic NO, window 0xc00001,
root 0x111, subw 0xc00002, time 2209364614, (27,43), root:(47,86),
state 0x4, keycode 8 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) "^A"
XmbLookupString gives 1 bytes: (01) "^A"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0xc00001,
root 0x111, subw 0xc00002, time 2209364773, (27,43), root:(47,86),
state 0x4, keycode 8 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) "^A"
XFilterEvent returns: False
控制修饰符是0x4
处于状态的;XLookupString
(用于组合按键事件的几个相关函数之一)将键符将“a”放入^A
(control/A)。
由于任何控制键都没有任何键符,因此xmodmap
无法使用 重新分配键码来解决 OP 的问题。
到解决OP 的问题,必须有一种方法来告诉操作系统(本质上)拒绝为control和传递单独的事件A— 但 Linux 和 X 不是这样工作的。将范围限制到特定应用程序(xterm)或一组应用程序(基于 Gtk 的程序),可以单独解决这些问题。但适用于整个系统的解决方案似乎不可行。