Как сопоставить CTRL + A, CTRL + E, чтобы они функционировали как Home, End для всей системы?

647
ccpizza

Есть ли способ сопоставить CTRL + A и CTRL + E для работы в масштабе всей системы, например, перейти к началу строки и соответственно перейти к концу строки?

Т.е. я хотел бы, чтобы эти ярлыки работали без проблем в любом приложении, а не только в терминале (т.е. как в OSX).

Моя основная система - Ubuntu с рабочим столом Unity, но было бы хорошо иметь универсальное решение, которое не зависело бы от рабочего стола или, по крайней мере, поддерживалось бы в Gnome, XFCE и LXDE.

4
Ctrl-A также используется `screen`, который я использую (если не доступен` tmux`). Таким образом, вы должны дважды нажать Ctrl-A, чтобы получить его. Не быстрее ли щелкнуть мышью, чтобы добраться до нужной позиции. ott-- 8 лет назад 0
xmodmap не будет делать то, что было задано (и предлагаемая ссылка не отвечает на этот конкретный вопрос). Thomas Dickey 8 лет назад 0
@MariusMatutiae: `xmodmap` не может выполнять комбинации клавиш, его можно использовать только для сопоставления отдельных ключей. @ott: нет, мышь требует смотреть на экран и указывать в нужном месте, что является дополнительной нагрузкой как для глаз, так и для пальцев. ccpizza 8 лет назад 0
Предполагая, что вы используете окно терминала, посмотрите на утилиту stty. fpmurphy1 8 лет назад 0
@ fpmurphy1: в терминале CTRL + A и CTRL + E уже работают как Home / End, при условии, что используется оболочка по умолчанию (bash). ccpizza 8 лет назад 0
Спасибо за разъяснение ваших требований. Нет, общесистемного способа сделать то, что вы хотите, нет. fpmurphy1 8 лет назад 0

1 ответ на вопрос

3
Thomas Dickey

xmodmap might seem to provide an answer, but it does not, because the keycodes it manipulates are existing keys on the keyboard, not modified keys. A controlA is a modified key.

xmodmap can only reassign existing keycodes or (their names) keysyms, as listed in its manual page:

keycode NUMBER = KEYSYMNAME ...
keycode any = KEYSYMNAME ...
keysym KEYSYMNAME = KEYSYMNAME ...

To see the keycodes that xmodmap knows about, run

xmodmap -pk 

which shows something like this (shortened for clarity):

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 shows what actually happens:

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 

The control modifier is the 0x4 in the state; the XLookupString (one of several related functions for combining key events) transforms the keysym for "a" into ^A (control/A).

Because there is no keysym for any of the control keys, reassigning keycodes using xmodmap will not be possible for OP's problem.

To solve OP's problem, one would have to have a way to tell the operating system to (essentially) refuse to deliver separate events for control and A — but Linux and X do not work that way. Limiting the scope to a particular application (xterm) or set of applications (Gtk-based programs), one might address those separately. But a solution which applies system-wide does not seem doable.

Пользователь может использовать xev, чтобы определить, какие события запускаются нажатием клавиш. steve 8 лет назад 0
Я принимаю это как ответ, который в основном говорит о том, что невозможно, какой IMO является правильным ответом. ccpizza 8 лет назад 0
Это разочаровывает :( forgetso 5 лет назад 0