LINUX.ORG.RU

настройка горячих клавиш mc в gnome-termunal

 mc gnome-terminal


0

1

Долго мучился с настройкой горячих клавиш встроенного редактора mcedit для выделения и перемещения по тексту (Shift и Ctrl + стрелки, Home, End, PgUp, PgDown) в двух эмуляторах - konsole и gnome-terminal. Для konsole здесь в форуме рецепты есть, а для gnome-terminal - вроде бы, нету. К сожалению, обработка нужных кодов «захардкордена», т.е нужные изменения можно внести только правкой исходников и пересборкой библиотеки vte, на которую опирается gnome-terminal (сам gnome-terminal править не нужно). Предлагаю свой патч и инструкции по применению.

Мой патч успешно работает в системе:

Scientific Linux 6.1, KDE 4.3.4, Gnome-terminal 2.31.3 <- vte 0.25.1 . Возможно, для Вашей системы патч следует подправить.

Экспериментально было выяснено, что для нормальной работы mcedit нужно обеспечить выдачу следующих esc-последовательностей:

		Home		End		PgUp	PgDwn	Up	Down
      <>	[OH ([1~)	[OF ([4~)	[5~	[6~	[A	[B
Alt  +<>	[1;3H		[1;3F		[5;3~	[6;3~	[1;3A	[1;3B
Shiht+<>	[1;2H		[1;2F		[5;2~	[6;2~	[1;2A	[1;2B
Ctrl +<>	[1;5H		[1;5F		[5;5~	[6;5~	[1;5A	[1;5B
Ctrl+Shiht+<>	[1;6H		[1;6F		-	-	-	-
Ctrl+  Alt+<>	[1;7H		[1;7F		-	-	-	-
Shiht+ Alt+<>	[1;4H		[1;4F		[5;4~	[6;4~	[1;4A	[1;4B
Ctrl+Shiht+Alt+<>[1;8H		[1;8F		-	-	-	-

Сочетания двух функциональных клавиш получить не удалось. У меня Ctrl+Shift переключают раскладки. В моей версии gnome-terminal выделение в редакторе по Shift+стрелки работало правильно, скроллинг истории команд вне mc по Shift+стрелки зачем-то был переключен на Alt+Shift+стрелки, Shift + любая клавиша - выдача esc-последовательностей «наверх» была заблокирована, но после «разблокирования» коды для всех срелок и PgUp, PgDown оказались настроены правильно, коды для Home и End настроены не были. Патч решает эти проблемы + :

  • делает выдачу двойного \e\e gj Esc (было: Esc -> \e, Alt+Esc -> \e\e)
  • изменяет код выдачи Секд+Enter на \e\n (позволяет вбрасывать имя текущего файла в командную строку для Ctrl+Enter в добавление к Alt+Enter)
  • делает линию курсора-подчёркивания толще на 1 пиксел.

Любые из этих изменений Вы можете переделать по своему вкусу правкой патча, кромет того, для Ваших версий «дословно» патч может и не подойти.

Скачивание пакетов исходников и инструкции по пересборке на примере rpm-based дистрибутива:

1) подготовка дерева rpmbuild:

$ yum install yum-utils rpmdevtools - ставим нужные пакеты

$ rpmdev-setuptree - подготовка rpmbuild - директорий в home

2) скачивание исходников и проверка сборки:

$ cd ~/rpmbuild/SRPMS

$ yumdownloader --source vte - cкачивание исходного кода. vte-0.25.1-7.el6.src.rpm скачен в текущую директорию.

$ sudo yum-builddep vte - установка всех необходимых devel-пакетов (sudo apt-get build-dep vte - то же для пакета vte в apt-get - системе)

$ rpm -ivh vte-0.25.1-7.el6.src.rpm - будут установлены необходимые архивы и патчи в SOURCES, файл spec в SPEC.

Проверка, что всё нормально собирается:

$ cd ../SPEC

$ rpmbuild -bp --target=`uname -m` vte.spec - сборка дерева исходников

$ rpmbuild -bb --target=`uname -m` vte.spec - сборка двух пакетов rpm, помещаются в директорию ~/rpmbuild/PRMS/i686. Этот шаг необходим, т.к. в именно на этом шаге создаются makefile и прочие служебные файлы во всех директориях. Теперь, если перейти в ~/rpmbuild/BUILD/vte-0.25.1, то можно пересобирать и устанавливать проект vte командой

$ sudo make install

Либо просто из директории ~/rpmbuild/PRMS/i686

$ sudo rpm -ivh vte-0.25.1-7.el6.i686.rpm

3) добавление патча и сборка изменённого vte:

Добавить патч в виде файла vte-0.25.1-cursor-and-mc-keys.patch в директорию ~/rpmbuild/SOURCES . Добавить в файл ~/rpmbuild/SPEC/vte.spec строки (в нужное место):

Patch5: vte-0.25.1-cursor-and-mc-keys.patch

%patch5 -p1 -d src -F 2 -b .cursor-and-mc-keys

повторно собрать дерево исходников:

$ rpmbuild -bp --target=`uname -m` vte.spec

повторно собрать makefile

$ rpmbuild -bb --target=`uname -m` vte.spec

Далее либо

$ sudo rpm -ivh --force ../RPMS/i685/vte-0.25.1-7.el6.i686.rpm ,

либо

$ cd ../BUILD/vte-025.1; sudo make install

Пока не разобрался, как здесь прикреплять файлы, поэтому патч размещаю в следующем сообщении. Буду благодарен, если его люди знающие доведут до сведения разработчиков. На сайте gnome изменения вносятся как-то с трудом....

патч vte-0.25.1-cursor-and-mc-keys.patch

diff -uNrp a/keymap.c b/keymap.c
--- a/keymap.c	2009-11-02 17:36:12.000000000 +0300
+++ b/keymap.c	2012-04-21 14:17:24.000000000 +0400
@@ -197,15 +197,17 @@ static const struct _vte_keymap_entry _v
 static const struct _vte_keymap_entry _vte_keymap_GDK_Return[] = {
 	{cursor_all, keypad_all, fkey_all,
 	 VTE_META_MASK, _VTE_CAP_ESC "\n", 2, X_NULL},
-	{cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\n", 1, X_NULL},
+//	{cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\n", 1, X_NULL},
+	{cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, _VTE_CAP_ESC "\n", 2, X_NULL},
 	{cursor_all, keypad_all, fkey_all, 0, "\r", 1, X_NULL},
 	{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, X_NULL},
 };
 
 static const struct _vte_keymap_entry _vte_keymap_GDK_Escape[] = {
-	{cursor_all, keypad_all, fkey_all,
-	 VTE_META_MASK, _VTE_CAP_ESC _VTE_CAP_ESC, 2, X_NULL},
-	{cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_ESC, 1, X_NULL},
+//	{cursor_all, keypad_all, fkey_all,
+//	 VTE_META_MASK, _VTE_CAP_ESC _VTE_CAP_ESC, 2, X_NULL},
+//	{cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_ESC, 1, X_NULL},
+	{cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_ESC _VTE_CAP_ESC, 2, X_NULL},
 	{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, X_NULL},
 };
 
@@ -280,6 +282,9 @@ static const struct _vte_keymap_entry _v
 	{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_all, keypad_all, fkey_all, VTE_META_MASK, _VTE_CAP_ESC "[1;3H", -1, X_NULL},
+	{cursor_all, keypad_all, fkey_all, GDK_SHIFT_MASK, _VTE_CAP_ESC "[1;2H", -1, X_NULL},
+	{cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, _VTE_CAP_ESC "[1;5H", -1, X_NULL},
 	{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, X_NULL},
 };
 
@@ -287,6 +292,9 @@ static const struct _vte_keymap_entry _v
 	{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_all, keypad_all, fkey_all, VTE_META_MASK, _VTE_CAP_ESC "[1;3F", -1, X_NULL},
+	{cursor_all, keypad_all, fkey_all, GDK_SHIFT_MASK, _VTE_CAP_ESC "[1;2F", -1, X_NULL},
+	{cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, _VTE_CAP_ESC "[1;5F", -1, X_NULL},
 	{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, X_NULL},
 };
 
@@ -303,6 +311,14 @@ static const struct _vte_keymap_entry _v
 	{cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "S", -1, X_NULL},
 	{cursor_all, keypad_all, fkey_notsunhp, 0, _VTE_CAP_CSI "6~", -1, X_NULL},
 	{cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "6z", -1, X_NULL},
+//  All is adjusted already. The way is not clear, but still. 
+//  The only problem was - to force submitting \e-seq. to the child application,
+//  this solved in vte.c by commenting assingments "handled = TRUE"
+//  GDK_SHIFT_MASK | GDK_CONTROL_MASK | VTE_META_MASK | VTE_NUMLOCK_MASK - masks possible
+//  {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_CSI "6~", -1, X_NULL},
+//	{cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, _VTE_CAP_CSI "6~", -1, X_NULL},
+//	{cursor_all, keypad_all, fkey_all, GDK_SHIFT_MASK, _VTE_CAP_CSI "6~", -1, X_NULL},
+//	{cursor_app, keypad_all, fkey_all, VTE_META_MASK, _VTE_CAP_ESC "6~", -1, X_NULL},
 	{cursor_all, keypad_all, fkey_all, 0, X_NULL, 0, X_NULL},
 };
 
@@ -1409,7 +1425,7 @@ _vte_keymap_key_add_key_modifiers(guint 
 		/* SS3 should have no modifiers so make it CSI instead. See
 		 * http://cvsweb.xfree86.org/cvsweb/xc/programs/xterm/input.c.diff?r1=3.57&r2=3.58
 		 */
-		if (cursor_app_mode &&
+		if ( /* cursor_app_mode && */
 			g_str_has_prefix(nnormal, _VTE_CAP_SS3)
 			&& is_cursor_key(keyval)) {
 			nnormal[1] = '[';
diff -uNrp a/vte.c b/vte.c
--- a/vte.c	2012-04-02 21:05:18.000000000 +0400
+++ b/vte.c	2012-04-21 11:41:09.000000000 +0400
@@ -5115,21 +5115,25 @@ vte_terminal_key_press(GtkWidget *widget
 		/* Keypad/motion keys. */
 		case GDK_KP_Up:
 		case GDK_Up:
-			if (modifiers & GDK_CONTROL_MASK 
-                            && modifiers & GDK_SHIFT_MASK) {
+//			if (modifiers & GDK_CONTROL_MASK 
+//                            && modifiers & GDK_SHIFT_MASK) {
+			if (modifiers & GDK_SHIFT_MASK) {
 				vte_terminal_scroll_lines(terminal, -1);
 				scrolled = TRUE;
-				handled = TRUE;
+//				handled = TRUE;
 				suppress_meta_esc = TRUE;
 			}
 			break;
 		case GDK_KP_Down:
 		case GDK_Down:
-			if (modifiers & GDK_CONTROL_MASK
-                            && modifiers & GDK_SHIFT_MASK) {
+//			if (modifiers & GDK_CONTROL_MASK
+//                            && modifiers & GDK_SHIFT_MASK) {
+//              Is changed as Ctrl+Shift is used often for lang switching
+			if (modifiers & GDK_SHIFT_MASK) {
 				vte_terminal_scroll_lines(terminal, 1);
 				scrolled = TRUE;
-				handled = TRUE;
+//              Next string suppress control sequence feeding for child application
+//				handled = TRUE;
 				suppress_meta_esc = TRUE;
 			}
 			break;
@@ -5138,7 +5142,8 @@ vte_terminal_key_press(GtkWidget *widget
 			if (modifiers & GDK_SHIFT_MASK) {
 				vte_terminal_scroll_pages(terminal, -1);
 				scrolled = TRUE;
-				handled = TRUE;
+//              Next string suppress control sequence feeding for child application
+//				handled = TRUE;
 				suppress_meta_esc = TRUE;
 			}
 			break;
@@ -5147,7 +5152,8 @@ vte_terminal_key_press(GtkWidget *widget
 			if (modifiers & GDK_SHIFT_MASK) {
 				vte_terminal_scroll_pages(terminal, 1);
 				scrolled = TRUE;
-				handled = TRUE;
+//              Next string suppress control sequence feeding for child application
+//				handled = TRUE;
 				suppress_meta_esc = TRUE;
 			}
 			break;
@@ -5156,7 +5162,8 @@ vte_terminal_key_press(GtkWidget *widget
 			if (modifiers & GDK_SHIFT_MASK) {
 				vte_terminal_maybe_scroll_to_top(terminal);
 				scrolled = TRUE;
-				handled = TRUE;
+//              Next string suppress control sequence feeding for child application
+//				handled = TRUE;
 			}
 			break;
 		case GDK_KP_End:
@@ -5164,7 +5171,8 @@ vte_terminal_key_press(GtkWidget *widget
 			if (modifiers & GDK_SHIFT_MASK) {
 				vte_terminal_maybe_scroll_to_bottom(terminal);
 				scrolled = TRUE;
-				handled = TRUE;
+//              Next string suppress control sequence feeding for child application
+//				handled = TRUE;
 			}
 			break;
 		/* Let Shift +/- tweak the font, like XTerm does. */
@@ -10584,6 +10592,7 @@ vte_terminal_paint_cursor(VteTerminal *t
 
                         line_height = (int) (((float) width) * terminal->pvt->cursor_aspect_ratio + 0.5);
                         line_height = CLAMP (line_height, VTE_LINE_WIDTH, height);
+                        line_height += 1;
 
 			vte_terminal_fill_rectangle(terminal, &terminal->pvt->palette[back],
 						     x, y + height - line_height,


Alexej1971
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.