У терминала Gnome действительно есть предопределенные действия, связанные с Shift + Home и Shift + End. Однако не GT определяет это поведение, а скорее из-за VTE, на котором основан GT. Насколько я могу судить, этот аспект не настраивается, и единственный способ исправить это - исправить VTE. Я описал, как это сделать, в своем блоге, исправляя сочетания клавиш Ctrl-Home, Ctrl-End, Shift-Home и Shift-End в Gnome Terminal в Ubuntu 13.04. Ниже в основном копия этого поста.
Что я должен был сделать, так это следовать классическим инструкциям из этого ответа. Я изменил их для моего конкретного случая.
Примечание. Приведенные ниже инструкции основаны на Ubuntu 13.04, который у меня под рукой, но я полагаю, что они могут быть применены, возможно, с небольшими изменениями, к другим версиям дистрибутива.
В Ubuntu 13.04 есть два libvte*
. Итак, прежде всего, я должен был выяснить, от какого терминала Gnome зависит:
$ apt-cache depends gnome-terminal | grep libvte
Требуемая версия была libvte-2.90-9
. Я скачал исходный код:
$ apt-get source libvte-2.90-9
Затем я изменил это:
$ cd vte3-0.34.2
$ vim src/vte.c
Здесь я должен был найти нежелательные ярлыки, они последовали после этого комментария:
/* Keypad/motion keys. */
Так что я просто удалил все до следующего комментария:
/* Let Shift +/- tweak the font, like XTerm does. */
Оказалось, что удаление этих ярлыков было недостаточно из-за ошибки этого VTE. Поэтому я применил патч, упомянутый в комментариях к ошибке:
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -284,6 +284,8 @@ static const struct _vte_keymap_entry _vte_keymap_GDK_Home[] = {
{cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "1~", -1, X_NULL},
{cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "h", -1, X_NULL},
{cursor_all, keypad_all, fkey_nothpvt, 0, X_NULL, 0, "kh"},
+ {cursor_default, keypad_all, fkey_default, 0, _VTE_CAP_CSI "H", -1, X_NULL},
+ {cursor_app, keypad_all, fkey_default, 0, _VTE_CAP_SS3 "H", -1, X_NULL},
{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, X_NULL},
};
@@ -291,6 +293,8 @@ static const struct _vte_keymap_entry _vte_keymap_GDK_End[] = {
{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, "@7"},
{cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "4~", -1, X_NULL},
{cursor_all, keypad_all, fkey_notvt220, 0, X_NULL, 0, "@7"},
+ {cursor_default, keypad_all, fkey_default, 0, _VTE_CAP_CSI "F", -1, X_NULL},
+ {cursor_app, keypad_all, fkey_default, 0, _VTE_CAP_SS3 "F", -1, X_NULL},
{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, X_NULL},
};
@@ -507,6 +511,8 @@ static const struct _vte_keymap_entry _vte_keymap_GDK_KP_End[] = {
{cursor_all, keypad_default, fkey_vt220, 0, "1", 1, X_NULL},
{cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "4~", -1, X_NULL},
{cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "q", -1, X_NULL},
+ {cursor_default, keypad_all, fkey_default, 0, _VTE_CAP_CSI "F", -1, X_NULL},
+ {cursor_app, keypad_all, fkey_default, 0, _VTE_CAP_SS3 "F", -1, X_NULL},
{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, X_NULL},
};
@@ -568,6 +574,8 @@ static const struct _vte_keymap_entry _vte_keymap_GDK_KP_Home[] = {
{cursor_all, keypad_default, fkey_vt220, 0, "7", 1, X_NULL},
{cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "1~", -1, X_NULL},
{cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "w", -1, X_NULL},
+ {cursor_default, keypad_all, fkey_default, 0, _VTE_CAP_CSI "H", -1, X_NULL},
+ {cursor_app, keypad_all, fkey_default, 0, _VTE_CAP_SS3 "H", -1, X_NULL},
{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, X_NULL},
};
@@ -1279,6 +1287,8 @@ _vte_keymap_key_get_modifier_encoding_method(guint keyval)
case GDK_KEY (Right):
case GDK_KEY (Insert):
case GDK_KEY (Delete):
+ case GDK_KEY (Home):
+ case GDK_KEY (End):
case GDK_KEY (Page_Up):
case GDK_KEY (Page_Down):
case GDK_KEY (KP_Up):
@@ -1287,6 +1297,8 @@ _vte_keymap_key_get_modifier_encoding_method(guint keyval)
case GDK_KEY (KP_Right):
case GDK_KEY (KP_Insert):
case GDK_KEY (KP_Delete):
+ case GDK_KEY (KP_Home):
+ case GDK_KEY (KP_End):
case GDK_KEY (KP_Page_Up):
case GDK_KEY (KP_Page_Down):
case GDK_KEY (F1):
Там не было никаких конфликтов.
Затем я перестроил пакет:
$ sudo apt-get build-dep libvte-2.90-9
$ dch -i # here I updated the version to 0.34.2-customized-0ubuntu3
$ debuild -us -uc -b
И установил это:
$ cd ..
$ sudo dpkg -i libvte-2.90-common_0.34.2-customized-0ubuntu3_all.deb
$ sudo dpkg -i libvte-2.90-9_0.34.2-customized-0ubuntu3_amd64.deb
Хотя этих двух пакетов было достаточно, чтобы устранить проблему, я установил все остальные, которые были сгенерированы командой debuild
.
После перезапуска терминала Gnome Shift + Home и Shift + End начали работать как положено.