在使用xterm时,在.vimrc中映射Alt+umlaut无法生效。

4
以下映射不起作用:
noremap <A-ö> :do something

我使用的是Ubuntu系统中的xterm,类似于<A-j>这样的映射可以工作。单独映射ö是可行的,但是<C-ö>却不起作用。
我尝试过以下方法:
  • 在.vimrc文件开头添加set encoding=utf-8
  • noremap <M-ö>
在插入模式下按Ctrl+v,然后再按Alt+ö可以打印出ö。
有没有解决这个问题的方法?
3个回答

5

我正在使用 Vim 7.4(Windows 上的 GUI 版本),将以下内容放入我的 .vimrc 文件中对我有效:

" Alt-ö quits in normal mode
nmap <a-char-246> :q<cr>

" Alt-ö inserts an opening curly brace in insert mode
imap <a-char-246> {

246是Unicode编码中表示ö的数字。以下是其他Unicode编码的表格:链接

我尝试使用Ctrl键而不是Alt键执行相同的命令,但没有成功。


编辑: 由于上述解决方案在我的当前Debian系统上不起作用,我选择了一种不涉及CtrlAlt的解决方案:

" Map the umlauts to be an opening parenthesis/bracket/curly brace
imap öö (
imap ää {
imap üü [

我从这里得到了这个想法。这种映射对编程非常有用,特别是与delimitMate插件结合使用时。它不应该干扰德语写作,因为据我所知,没有两个连续的umlauts单词。然而芬兰人可能会有困难。

那么,您如何使用在默认vim配置中使用CTRL-]的跳转链接功能呢? - jaaq
@jaaq:我选择了另一种路线:通过配置我的操作系统切换到美国键盘布局,并从vimrc中删除了这个答案中的映射。现在,我使用Vim的digraph功能插入umlauts(和其他超出美国布局的字符):c-k o: → ö, c-k A: → Ä, c-k ss → ß。 - Matthias Braun
@jaaq:考虑发布一个单独的问题,详细说明您想要如何重新配置Vim。 - Matthias Braun
1
很好,@jaaq,玩得开心!根据你在Vim之旅中的进展,你可能会发现以下资源有所帮助:vimtutor有效文本编辑的七个习惯现代VimVim Galore。将Firefox变为Vim:vim-vixenwithExEditor - Matthias Braun
我发布了一个 [跟进问题](https://softwarerecs.stackexchange.com/q/58089/47679); 我希望能得到更多的意见。我需要一个经验丰富的 Vim 用户指导我如何快速地将 Vim 作为一个 IDE 使用,因为我很快就不得不放弃我所使用的 IDE,所以现在切换是有意义的。 - jaaq
显示剩余2条评论

2
这似乎是不可能的,因为使用Ctrl时,您将获得ASCII控制字符,这些字符的代码被定义为具有X-64的代码,其中X是您使用控件按下的字符(Ctrl-A为65-64=1=ASCII SOH 等等)。 但是,对于“Ö”没有ASCII代码可减去。
Alt也有类似的方案,我记得需要添加一些偏移量,例如128。映射Alt-Ö也会因同样的原因失败。

1
这并不能回答你的问题(在 .vimrc 中重新映射 ctrl+umlaut),但它可能实现你想要做的事情。你可以在 XKB 级别上定义按键绑定,而不是在 vim 级别上定义。使用 Xorg XKB,你可以定义重定向,例如将 CTRL-ö 重新映射为 ESC,以便我们可以方便地进入 vim 的 normal 模式。
在带有德语键盘布局的 Xorg 中,请尝试以下操作:
~/.xkb/keymap/vimremap(根据你的喜好进行调整,但保留 xkb_symbols 行末的 +vim(ctrloe))
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwertz)" };
    xkb_types     { include "complete"      };
    xkb_compat    { include "complete"      };
    xkb_symbols   { include "pc+de(nodeadkeys)+inet(evdev)+vim(ctrloe)"    };
    xkb_geometry  { include "pc(pc105)"     };
};

~/.xkb/symbols/vim

xkb_symbols "ctrloe" {
  replace key <AC10> {
        type= "LOCAL_EIGHT_LEVEL",
        symbols[Group1]= [      odiaeresis,      Odiaeresis,           doubleacute,   doubleacute],
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=<ESC>, clearmods=all)]
  };
};

在这里,我们使用LOCAL_EIGHT_LEVEL,因为这种类型将Ctrl映射到Level5。
现在加载此配置(您可以忽略有关某些缺失符号的警告):
xkbcomp -I$HOME/.xkb $HOME/.xkb/keymap/vimremap $DISPLAY

打开 xev 并检查 CTRL-ö 是否确实会产生 ESC。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接