Alt 键快捷键在 Vim 的 gnome 终端上不起作用

     2023-02-23     43

关键词:

【中文标题】Alt 键快捷键在 Vim 的 gnome 终端上不起作用【英文标题】:Alt key shortcuts not working on gnome terminal with Vim 【发布时间】:2011-10-10 08:58:29 【问题描述】:

我在 gnome 终端上运行 Vim。但是 alt 键映射不起作用。 例如(这只是一个例子):

:imap <A-i> <Esc>

它在 GVim 中运行良好。但是当我在 gnome 终端中使用 Vim 运行相同的命令时,它就不起作用了。 所以我认为问题出在终端上,对吧? 我该如何解决?

谢谢

编辑:我在同一台机器上安装了 Windows 7,并且使用 Windows 终端也可以正常工作。

【问题讨论】:

【参考方案1】:

问题

终端模拟器有两种方法可以发送 Alt 键(通常称为 Meta 键,因为实际终端没有 Alt)。它可以在使用 Alt 时发送 8 位字符并设置高位,也可以使用转义序列,将 Alt-a 发送为 &lt;Esc&gt;a。 Vim 期望看到 8 位编码而不是转义序列。

xterm 等一些终端仿真器可以设置为使用任一模式,但 Gnome 终端 不提供任何此类设置。老实说,在这些 Unicode 编辑时代,8 位编码无论如何都不是一个好主意。但是转义序列也不是没有问题的。它们无法区分 &lt;Esc&gt;j 表示 Alt-j 与按 Esc 后跟 j

在早期的终端使用中,键入 Escj 是另一种在没有 Meta 键的情况下在键盘上发送 Meta 的方法,但这不会'不适合 vi 使用 Esc 离开 insert 模式。

解决办法

可以通过配置 vim 将转义序列映射到它们的 Alt 组合来解决这个问题。

将此添加到您的 .vimrc:

let c='a'
while c <= 'z'
  exec "set <A-".c.">=\e".c
  exec "imap \e".c." <A-".c.">"
  let c = nr2char(1+char2nr(c))
endw

set timeout ttimeoutlen=50

Alt-letter 现在可以被终端中的 vi 和 gvim 识别。 timeout 设置用于解决转义序列的歧义。 50ms 内发送的 Escj 将映射到&lt;A-j&gt;,大于 50ms 将被视为单独的键。这应该有足够的时间来区分元编码和按两个键。

如果您不喜欢设置 timout,它会为其他映射的键序列超时(默认为一秒后),那么您可以改用 ttimeout。 ttimeout 仅适用于键码,不适用于其他映射。

set ttimeout ttimeoutlen=50

【讨论】:

非常感谢您!你终于解决了一个困扰我很久的问题! 将 let 更改为 'A' 并将 while 条件更改为 'Z' 以映射大写键。如果你愿意,两者都可以。 我发现使用此设置,如果我处于命令行模式或可视模式,如果我按转义键,它将执行映射或插入多字节字符。我通过使用这些设置按两次 Escape 允许自己离开这些模式来解决此问题:vnoremap &lt;Esc&gt; &lt;C-v&gt;&lt;Esc&gt;cnoremap &lt;Esc&gt; &lt;C-c&gt; @trusktr 是的,您可以设置 ttimeout。将添加到答案。 如果您在 tmux 中使用 vim 并且无法弄清楚为什么上面的方法不起作用,那是因为 tmux 在 ESC 之后插入了一个等待,并且它自己会解释键码。将 set -sg escape-time 0 放入您的 .tmux.conf 以禁用此行为。【参考方案2】:

对于Gnome-terminal,请改用以下内容:

imap ^[i <Esc>

^[i 应按Ctrl-v Alt-i 输入

注意:要复制到别处时需要yankputVim中。如果您只是在gedit 之类的编辑器中复制映射,则映射可能会损坏。

EDIT这里是一个例子,它使Alt-k在光标上方添加一个空行,Alt-j在当前行之后添加一个空行。

" Alt-j/k to add a blank line
if has('gui_running')
    " the following two lines do not work in vim, but work in Gvim
    nnoremap <silent><A-j> :set paste<CR>m`o<Esc>``:set nopaste<CR>
    nnoremap <silent><A-k> :set paste<CR>m`O<Esc>``:set nopaste<CR>
else
    " these two work in vim
    " shrtcut with alt key: press Ctrl-v then Alt-k
    " ATTENTION: the following two lines should not be 
    " edited under other editors like gedit. ^[k and ^[j will be broken!
    nnoremap ^[k :set paste<CR>m`O<Esc>``:set nopaste<CR>
    nnoremap ^[j :set paste<CR>m`o<Esc>``:set nopaste<CR>
endif

【讨论】:

我更喜欢 'imap i ...' 拼写,这样我的 .vimrc 中就没有控制字符了【参考方案3】:

试试

<m-i>

或者,如果键入 alti 插入一个字符(就像在我的情况下,它插入一个小括号:ˆ)只需映射到该字符:

:inoremap ˆ <esc>

要小心,因为这个不起作用(至少在我的系统中,MacOS 10.6)。插入符号等待一个字母,因为它不完全是插入符号,它是 circumflex。

【讨论】:

感谢您的回复。我也已经试过了。但它也不起作用。【参考方案4】:

同样的事情也发生在我身上。我用“gnome terminal alt key”在谷歌上搜索,发现有人在找到的第一个链接中问了几乎相同的问题:“How to disable the alt-hotkey behavior on gnome terminal?”。 (第二个链接就是这个问题)

所以,也许你可以试试:

Edit > Keyboard Shortcuts, and uncheck "Enable menu access keys"

【讨论】:

不知道这是否是 gnome-terminal 上那些奇怪的 ubuntu 上游编辑之一,但 debian 的版本并没有,只需编辑->首选项->快捷方式并禁用它们都对我有用 【参考方案5】:

这些快捷方式可能实际上来自 Gnome 桌面。尝试查看 Gnome 键盘快捷键工具(系统菜单、首选项、键盘快捷键),它可以让您查看和修改 Gnome 桌面上定义的快捷键。如果组合键被分配给 Gnome 桌面上的某个功能,则将其删除,然后该组合键应正确过滤到 Vim。

或者你可能是对的,这是终端的问题。并非所有终端都支持所有按键组合。您的问题可能是在:h map-alt-keys 的 Vim 帮助文档中描述的问题。文档提供了一种解决方法,但不是很好。

【讨论】:

由于 alt 快捷键适用于 GVim,我认为这不是键盘问题。也许问题真的是终端。你知道我可以试试 Ubuntu 的替代终端吗? 这里是 Ubuntu 的终端替代品列表:howtogeek.com/howto/ubuntu/…【参考方案6】:

查看http://vimdoc.sourceforge.net/htmldoc/map.html 的第 1.10 节。这似乎表明 gnome-terminal 自动转义了 Alt 修饰符,因此它不会以 Vim 期望的方式切换发送的字节。该文档似乎表明,除了使用不同的终端(例如 xterm)之外,实际上没有办法解决这个问题。

这当然令人沮丧,因为据我所知,Linux 机器也无法使用 D(Mac 的命令或 Linux 的超级)绑定,所以至少就终端而言,我们仅限于 Shift 和 Ctrl 修饰符,如果我们想确保我们可以在终端 Vim 上使用我们在 Gvim 中使用的所有命令,这是令人沮丧的(至少没有切换终端,我可能过于固执 - gnome-terminal 实在是太漂亮了)。我一直在寻找解决此问题的方法,但找不到任何东西。

【讨论】:

ubuntu怎样打开终端(方法5种)

...示。方法二:通过命令行打开终端。在ubuntu系统中按Alt+F2快捷键打开命令输入框,输入“gnome-terminal”命令,然后按回车键即可打开终端。方法三:使用快捷键:Ctrl+Alt+T打开终端。在ubuntu系统中按:Ctrl+Alt+T即可打开终端,此方... 查看详情

ubuntu下terminal,怎么设置开始的位置

...输入命令gnome-terminal进入“终端”。  3通过键盘快捷键(需要设置运行终端的快捷键,通常设置为Ctrl+Alt+T)进入“终端”。  4通过添加额外的启动程序方式来实现开机的时候启动“终端”。  面板主页搜... 查看详情

ubuntu怎么打开终端,ubuntu系统打开终端的方法

...的“运行”,就打开终端工具END方法三1使用终端工具的快捷键,在“键盘快捷键”里面可以看到小编的电脑打开终端的快捷键是:Ctrl+Alt+T,所以我们可以同时按下键盘的这个三个按键来打开终端END方法四1找到终端工具程序实际... 查看详情

ubuntu怎么打开终端,ubuntu系统打开终端的方法

ubuntu中可以通过按快捷键来直接打开终端。1、同时按下键盘上的CTRL+ALT+T。2、这时候就可以看到ubuntu的终端了。参考技术A方法一1点击系统菜单栏的“应用程序”,然后在弹出菜单中点击“附件”,之后在附件子菜单中选择“终... 查看详情

fedora怎样设置终端快捷键

...的一个全部设置窗口,然后在窗口里面找到键盘。切换到快捷键一栏里。然后在左下角--点击自定义快捷键。接着在自定义快捷键的旁边点击“+”号。在弹出的自定义快捷键窗口里,1)名称:可以随意填写2)命令:填写/usr/bin/g... 查看详情

vim编辑器菜单栏问题,高手大神老师快来帮忙!

vim自身的快捷键怎么去掉?按alt+h会弹出菜单栏上面的帮助!我想用alt+h是光标向左移动!现在打起来了!怎么把vim的去掉?怎么设置?C+H我不顺手想用alt+h求大神帮忙!有什么办法啊?菜单不能关掉菜单要用!按alt+h就弹出这个我... 查看详情

ubuntu中没有终端怎么打开

...的“运行”,就打开终端工具END方法三1使用终端工具的快捷键,在“键盘快捷键”里面可以看到小编的电脑打开终端的快捷键是:Ctrl+Alt+T,所以我们可以同时按下键盘的这个三个按键来打开终端END方法四找到终端工具程序实际... 查看详情

vim--终端--使用

切换到root用户:sudosu 退出root用户:exit 终端:生成多个终端:     shift+t   右击拆分在不同终端键切换    alt+数字   ctrl+上/下/左/右 vim安装插件:在~/.vimr 查看详情

第三天作业

...root用户登录GNOME图形界面,语言支持选择为汉语2、使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符Ctrl+ALT+F2,3、使用命令退出虚拟终端2上登录的用户exit 4、使用快捷键切换到虚拟终端5,使用管理员身... 查看详情

怎样在linux一个终端多个窗口

...装有linux系统的虚拟机或者电脑。二、操作步骤:1、使用快捷键(ctrl+alt+t)或者点击桌面左侧的黑色命令行的图标打开一个终端命令行2、在终端命令行中单击鼠标右键会出现菜单选择打开标签页就会打开一个新的窗口标签页。3... 查看详情

mac下使用iterm终端工具无法使用alt+b和alt+f快捷键的解决办法(代码片段)

mac下使用iTerm终端工具无法使用alt+b和alt+f快捷键的解决方法对于常在终端下工作的人来说,输入命令是家常便饭。但是当我们的命令输入错误的时候,需要调整就比较麻烦了。一般来说,不经过学习都知道,... 查看详情

终端快捷键

Ctrl+a:移动光标到命令行首Ctrl+e:移动光标到命令行尾 Ctrl+b:同键盘左键,向左移动光标Ctrl+f:同键盘右键,向右移动光标 #在mac中,需要在终端首选项中设置将Option键用做Meta键Alt+b:向前移动一个词的距离Alt+f:向后移... 查看详情

linux怎么用命令打开命令窗口

要打开只能先用快捷键打开终端,在使用命令。具体操作方法如下:1.首先打开linux操作系统在进入到桌面2.通常打开终端的快捷键是Ctrl+Alt+T,也可以自己设置,在右击桌面打开终端。3.然后就可以使用命令了。参考技术A按“Ctrl+... 查看详情

ubuntu(16.04)中安装terminator以及美化

...。虽然原生gnome还是-terminal已经很好了,无论从配色还是快捷键,但是有一个致命的缺陷就是不能分屏。曾经尝试用tmux来模拟分屏,但是不是很顺手,有时间还有bug,导致一屏的内容显示在另一屏中,最后选择了terminator。虽然默... 查看详情

emacs_快捷键列表

Emacs_快捷键列表 emacs-nw以终端模式运行emacsLC_CTYPE=zh_CN.UTF-8emacsC=ControlM=Meta=Alt|EscAlt可以粘滞Esc不能粘滞S=Shift注意:以上命令中标注的按键,大写的C代表Control,在键盘上通常是Ctrl键,而M代表Meta,在键盘上通常是Alt键,S则代表... 查看详情

xshell的快捷键(非常实用)

删除ctrl+d    删除光标所在位置上的字符相当于VIM里x或者dlctrl+h    删除光标所在位置前的字符相当于VIM里hx或者dhctrl+k    删除光标后面所有字符相当于VIM里dshift+$ctrl+u    删除光标前面所有字符相当于VIM... 查看详情

vim在.vimrc里配置快捷键

...按好几个键来实现一个功能,其实我们可以通过设置一些快捷键来加快效率。我们先设置一个前缀键。前缀键是vim使用率较高的一个键(最高的当属Esc),选一个最方便输入的键作为前缀键,将有助于提高编辑效率。找个无须眼... 查看详情

ubuntu怎么打开终端,ubuntu系统打开终端的方法

你好,我用的版本是ubuntu14.04,可以使用快捷键Ctrl+Alt+T来打开终端。然后就可以输入各种命令了。打开后还可以锁定到左边一栏的启动器(点击右键),这样下一次想打开终端再点击一下终端的图标就可以了。参考技术A把ctrl键... 查看详情