让 ubuntu 终端发送转义序列 (control+shift+up)

让 ubuntu 终端发送转义序列 (control+shift+up)

当我使用 emacs(带 -nw 选项)时,就会出现此问题。让我先解释一下。我尝试定义热键(用于 emacs),如下所示

(global-set-key [(control shift up)] 'other-window)

但它不起作用(没有错误,只是不起作用),也没有

(global-set-key [(control shift down)] 'other-window)

(global-set-key [(control shift right)] 'other-window) 

(global-set-key [(control shift left)] 'other-window)

工作!

但是因为最后两个组合键是 emacs 默认使用的,所以我不想将它们更改为其他功能。

那么我该如何制作control-shift-upcontrol-shift-down工作呢?

我已经在 Google 上搜索过“(control shift up)”,似乎control-shift-up其他人也使用过,(但结果不是很少)。

在 Stack Overflow 论坛上,Gille 给我的回答如下:

Ctrl+Shift+Up确实会向您的计算机发送信号,但您的终端仿真器显然没有为其传输任何转义序列。所以您的问题分为两部分。首先,您必须让终端仿真器发送转义序列,这取决于您的终端仿真器,并且是超级用户材料,或者如果您使用的是 unix 系统,则是 Unix.SE。然后您需要在 Emacs 中声明转义序列,我的回答解释了这一部分

所以我来这里是为了这个问题:

如何让我的终端(我使用 ubuntu 10.04 和内置终端)发送转义序列Control+Shift+Up Control+Shift+down

答案1

Ubuntu 使用 GNOME 和gnome-terminal。根据其文档 (在版本 2.30 中),用于导航回滚缓冲区,CtrlShiftUp并且CtrlShiftDown似乎没有任何方法可以关闭此“功能”(除了修改vte终端库的源代码之外)。


要在 Ubuntu 10.04 上修补 vte:

  1. 重建vte终端仿真库:

    1. 安装编译所需的软件:

      sudo apt-get install git-core fakeroot
      sudo apt-get build-dep vte
      
    2. 下载vte源代码并应用补丁:

      cd /tmp
      git clone git://gist.github.com/771667.git patches
      apt-get source vte
      cd vte-0.23.5
      patch -p1 < ../patches/vte-0.23.5.patch
      
    3. 制作 Debian 包并安装它:

      dpkg-buildpackage -us -uc
      sudo dpkg -i ../libvte9_0.23.5-*.deb
      
  2. 关闭所有gnome-terminal进程。

  3. 享受——直到下次vte更新……

0.23补丁:

diff -ur vte-0.23.5/src/vte.c vte-0.23.5+patched/src/vte.c
--- vte-0.23.5/src/vte.c    2010-01-14 02:46:18.000000000 +0200
+++ vte-0.23.5+patched/src/vte.c    2011-01-09 15:19:01.000000000 +0200
@@ -4948,26 +4948,6 @@
            }
            break;
        /* Keypad/motion keys. */
-       case GDK_KP_Up:
-       case GDK_Up:
-           if (modifiers & GDK_CONTROL_MASK 
-                            && modifiers & GDK_SHIFT_MASK) {
-               vte_terminal_scroll_lines(terminal, -1);
-               scrolled = TRUE;
-               handled = TRUE;
-               suppress_meta_esc = TRUE;
-           }
-           break;
-       case GDK_KP_Down:
-       case GDK_Down:
-           if (modifiers & GDK_CONTROL_MASK
-                            && modifiers & GDK_SHIFT_MASK) {
-               vte_terminal_scroll_lines(terminal, 1);
-               scrolled = TRUE;
-               handled = TRUE;
-               suppress_meta_esc = TRUE;
-           }
-           break;
        case GDK_KP_Page_Up:
        case GDK_Page_Up:
            if (modifiers & GDK_SHIFT_MASK) {

0.26补丁:

diff -ur vte-0.26.2/src/vte.c vte-0.26.2+patched/src/vte.c
--- vte-0.26.2/src/vte.c    2010-11-13 14:18:41.000000000 +0200
+++ vte-0.26.2+patched/src/vte.c    2011-01-09 15:06:54.870000002 +0200
@@ -5153,26 +5153,6 @@
            }
            break;
        /* Keypad/motion keys. */
-       case GDK_KEY (KP_Up):
-       case GDK_KEY (Up):
-           if (modifiers & GDK_CONTROL_MASK 
-                            && modifiers & GDK_SHIFT_MASK) {
-               vte_terminal_scroll_lines(terminal, -1);
-               scrolled = TRUE;
-               handled = TRUE;
-               suppress_meta_esc = TRUE;
-           }
-           break;
-       case GDK_KEY (KP_Down):
-       case GDK_KEY (Down):
-           if (modifiers & GDK_CONTROL_MASK
-                            && modifiers & GDK_SHIFT_MASK) {
-               vte_terminal_scroll_lines(terminal, 1);
-               scrolled = TRUE;
-               handled = TRUE;
-               suppress_meta_esc = TRUE;
-           }
-           break;
        case GDK_KEY (KP_Page_Up):
        case GDK_KEY (Page_Up):
            if (modifiers & GDK_SHIFT_MASK) {

答案2

Ctrl+ Shift+ Up/ Ctrl+ Shift+Down似乎确实被 gnome 默认终端捕获,但是我倾向于在 10.04 上使用名为“Terminator”的终端,其中这些键似乎没有被映射。

相关内容