Alt键快捷键不适用于带有Vim的gnome终端

时间:2011-07-21 15:51:42

标签: vim mapping terminal gnome alt

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

:imap <A-i> <Esc>

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

由于

编辑:我在同一台计算机上安装了Windows 7,并且在Windows终端上也能正常运行。

7 个答案:

答案 0 :(得分:83)

问题

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

某些终端仿真器(如 xterm )可以设置为使用任一模式,但 Gnome终端不提供任何此类设置。老实说,在Unicode编辑的这些日子里,8位编码无论如何都不是一个好主意。但转义序列也没有问题;他们无法区分<Esc>j含义 Alt-j 与按 Esc 后跟 j

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

解决方案

可以通过配置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

现在,终端以及gvim中的vi将识别Alt-letter。 timeout设置用于解决转义序列的歧义。在50ms内发送的 Esc j 将映射到<A-j>,大于50ms将被视为单独的密钥。这应该足以区分元编码和击中两个键。

如果您不喜欢设置timout,其他映射键序列超时(默认情况下一秒后),则可以使用ttimeout代替。 ttimeout仅适用于键代码而不适用于其他映射。

set ttimeout ttimeoutlen=50

答案 1 :(得分:6)

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

imap ^[i <Esc>
应按^[i Ctrl-v

键入

Alt-i

注意:如果要将其复制到其他位置,则yank中需要putVim。如果您只是在gedit这样的编辑器中复制映射,则映射可能会被破坏。

编辑这是一个示例,它使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

答案 2 :(得分:2)

尝试

<m-i>

或者,如果输入 alt i 插入一个字符(就像在我的情况下,它会插入一个carret:ˆ)只是映射到该字符:< / p>

:inoremap ˆ <esc>

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

答案 3 :(得分:2)

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

所以,也许你可以尝试:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:-1)

在 Preferences-General 部分,取消勾选启用助记符和启用菜单加速键。 这对我有用。请试一试! enter image description here