Alt键快捷键不能在Vim的gnometerminal上工作

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

:imap <Ai> <Esc> 

它在GVim中正常工作。 但是,当我在gnometerminal中使用Vim运行相同的命令时,它不起作用。
所以我认为问题是与terminal,对不对?
我该如何解决?

谢谢

编辑:我有Windows 7安装在同一台机器上,并与Windowsterminal工作得很好。

问题

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

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

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

解决scheme

可以通过configurationvim将转义序列映射到它们的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现在可以在terminal和gvim中被vi识别。 timeout设置用于解决转义序列的歧义问题。 在50ms内发送的Escj将被映射到<Aj> ,大于50ms将被视为单独的密钥。 这应该有足够的时间来区分元编码和击中两个键。

如果你不喜欢有timout设置,哪些超时为其他映射的按键序列(默认情况ttimeout后),那么你可以使用ttimeout来代替。 ttimeout仅适用于键码而不适用于其他映射。

 set ttimeout ttimeoutlen=50 

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

 imap ^[i <Esc> 

^[i应该按Ctrl-v Alt-i键入

注意 :当你想把它复制到其他地方时,你需要yankput Vim 。 如果您只是像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><Aj> :set paste<CR>m`o<Esc>``:set nopaste<CR> nnoremap <silent><Ak> :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 

尝试

 <mi> 

或者,如果打字alt 插入一个字符(就像在我的情况下,它插入一个carret:)只是映射到该字符:

 :inoremap ˆ <esc> 

要小心,因为这个不行(至less在我的系统中,MacOS 10.6)。 脱字号等待一封信,因为它不完全是一个插话,它是一个旋律 。

同样的事情发生在我身上。 我在Google上用“gnome terminal alt key”search,发现有人问了几乎同样的问题:“ 如何禁用gnometerminal上的alt-hotkey行为? ”在find的第一个链接中。 (第二个链接就是这个问题)

所以,也许你可以尝试一下:

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

这可能是快捷键实际上来自Gnome桌面。 尝试查看Gnome键盘快捷键工具(系统菜单,首选项,键盘快捷键),通过它可以查看和修改在Gnome桌面上定义的快捷键。 如果组合键被分配到Gnome桌面上的function,那么将其移除,然后该组合键应该适当地过滤到Vim。

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

看看http://vimdoc.sourceforge.net/htmldoc/map.html的第1.10节。; 它似乎表明gnome-terminal会自动转义Alt修饰符,所以它不会切换Vim所期望的字节。 该文件似乎表明,除了使用不同的terminal(如xterm)之外,没有真正的解决办法。

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