我在一个gnome终端上运行Vim。但alt键映射不起作用。
例如(这只是一个例子):
:imap <A-i> <Esc>
它在GVim中运行良好。但是当我在gnome终端中使用Vim运行相同的命令时,它就无法正常工作。
所以我认为问题出在终端上,对吗?
我该如何解决?
由于
编辑:我在同一台计算机上安装了Windows 7,并且在Windows终端上也能正常运行。
答案 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
中需要put
和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><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)