【问题标题】:Ubuntu terminal: How to remap keybindings from default terminalUbuntu 终端:如何从默认终端重新映射键绑定
【发布时间】:2014-06-10 08:11:14
【问题描述】:

运行cat -t后,我测试了以下情况:

  • ctrl + tab 只添加了一个tab 空格

  • ctrl + / 添加了^_

  • ctrl + ` 添加了^@

  • ctrl + shift + backspace 删除到左侧(与backspace 的行为相同)。

另一方面,以下键绑定保持一致:

  • ctrl + n 添加^N

  • ctrl + y 添加^Y

  • 所有字母数字字符[a-zA-Z0-9]添加对应的字母数字字符

有没有办法将组合键重新映射到首选输出?例如,在上面的前四个示例中,我想将它们重新映射为以下内容:

  • ctrl + tab<C-tab>(而不是 TAB

  • ctrl + /^/(而不是 ^_

  • ctrl + `^`(而不是 ^@

  • ctrl + shift + backspace<C-S-backspace>(而不是 DEL

背景 (TLDR)

我想在远程机器上编辑时运行emacs -nw,但我注意到在运行emacsemacs -nw 之间检测到的几个键组合并不一致。以下是一些不一致的键映射,我在 Emacs 中使用 C-h k <key-binding> 进行了验证:

  • ctrl + tabemacs 中被检测为<C-tab>,但在emacs -nw 中被检测为TAB

  • ctrl + /emacs 中被检测为C-/,但在emacs -nw 中被检测为C-_

  • ctrl + `emacs 中被检测为C-`,但在emacs -nw 中被检测为C-@

  • ctrl + shift + backspaceemacs 中被检测为<C-S-backspace>,但在emacs -nw 中被检测为DEL

关于如何向我的无窗口 emacs 发送正确的组合键有什么想法吗?所有检测到不一致的键组合都涉及ctrl 的使用,但并非所有带有控件的键绑定都检测到不一致。例如,C-n 始终被检测到。

我使用的是 Ubuntu 14.04,但 Debian Wheezy 也存在这个问题。对于终端信息,我的所有服务器和本地机器上都有以下信息:

[lucas@server]/home/lucas/bin$ echo $TERM
screen

[lucas@server]/home/lucas/bin$ echo $SHELL
/bin/bash

我通常在tmux 中运行我的会话,但是无论我是否在 tmux 会话中,这个问题都仍然存在。

【问题讨论】:

  • 你用什么终端?它也可以翻译键。
  • Emacs 可以处理它接收到的任何东西,但是大多数终端仿真器在它们可以发送的东西上受到严格限制(忠实地模拟特定终端的限制)。所以并不是 Emacs 检测到了错误的键序列;问题是终端从一开始就没有发送所需的序列。 FWIW Thomas Dickey's XTerm 是我所知道的最强大的终端,在发送修改后的键序列方面。
  • 在您的终端中运行cat -t,然后尝试各种按键序列可能会很有启发性。 (可能还需要在给定的键前面加上 C-v 前缀。也许有一种更简单的方法可以让所有输入的内容都达到这种效果?)
  • this answer 中有一些类似问题的链接(尽管对于其他键)。
  • 我会说一定要试试 XTerm;但配置可能是问题所在。将其配置为使终端 Emacs 和 GUI Emacs 完全等效是我的待办事项列表中长期搁置的事情,因此我没有方便的指针。 (我相信这是可能的,但上次我查找时找不到适合我的配置,而且我从来没有做过必要的工作来解决这个问题。emacswiki.org/emacs/XtermExtras 总是听起来很有希望,大概是为作者(所以 YMMV),但不幸的是,为我打破了很多绑定。)

标签: ubuntu emacs terminal


【解决方案1】:

我怀疑您遇到的问题不止一个层面。这意味着您需要在不同的点/级别调整配置。

设置新机器时我需要做的第一件事就是检查并删除或更改所有地方的键绑定。主要原因是因为我广泛使用 emacs,而现在,很多东西在交付给 emacs 之前就“窃取”了它们的键击。

请注意,我很少在终端中运行 emacs。我几乎只在自己的窗口中运行 emacs,并将我的环境变量(例如 EDITOR 等)设置为 emacsclient。这意味着我可以比打开终端和运行 emacs 更快地打开 emacs 框架。目前,我正在运行 Ubuntu Gnome,但我正在认真考虑切换回 Sawfish 或 Stumpwm。

如果您要在 gnome 下的终端中运行 emacs,则需要查看与键绑定相关的三个“层”。

第 1 层:会话(gnome)层。 wm 可以窃取许多“标准”emacs 键绑定。我通常进入键盘设置选项,要么禁用与我想在 emacs 中使用的绑定冲突的快捷键,要么将它们重新绑定到另一个键。

第 2 层:终端仿真器。这可能会有所不同,具体取决于您使用的终端。一般来说,由于终端仿真器翻译按键事件并将它们发送到应用程序的方式,在这个级别上事情会受到更多限制。终端还可以窃取一些关键事件。还有一个问题是,某些终端仿真器将比其他仿真器更符合传统的“控制台”界面,在这种情况下,xsession 层可能的某些键组合在终端层是不可能的。对于 gnome 终端,您需要查看“编辑->键盘快捷键”下的设置以及“编辑->配置文件首选项”下的兼容性部分。

第 3 层:在某些情况下,您可能需要调整 emacs 中的键转换表,以便它理解终端发送的键转换。

您想在终端中运行 emacs 而不是作为原生 X11 客户端运行 emacs 有什么特别的原因吗?有时这样做是有原因的(例如使用 tmux 与远程同事协作)。但是,如果没有在终端下运行的强大案例,我强烈建议在 GUI 模式下运行。这将消除至少 1 层。我还发现,在本机运行时,面部设置似乎比在终端下运行时更加一致,并且您避免了在终端中使用 emacs 和运行外部接口功能(例如 ssh、tramp 等)时可能遇到的一些问题。

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 2017-11-01
    • 1970-01-01
    • 2021-09-03
    • 2019-05-24
    • 2022-06-12
    • 2020-08-28
    • 2016-01-30
    • 2012-12-15
    相关资源
    最近更新 更多