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内发送的Esc和j将被映射到<Aj>
,大于50ms将被视为单独的密钥。 这应该有足够的时间来区分元编码和击中两个键。
如果你不喜欢有timout设置,哪些超时为其他映射的按键序列(默认情况ttimeout
后),那么你可以使用ttimeout
来代替。 ttimeout仅适用于键码而不适用于其他映射。
set ttimeout ttimeoutlen=50
对于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><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任何东西。