有时我需要写希腊语单词,但是当我使用希腊语键盘时,打例如<C-p>将被理解为<C-π>,而不是我想要的命令。可以使用:map <C-p> <C-π>进行修复。我可以在不列出所有字母的情况下对所有字母执行此操作吗?

PS。列出所有内容并不能产生完美的结果。例如,q是Gr上的;。键盘,但我们不想映射;至q。另外,由于某些原因,zZ(zeta zeta)在:map Ζ Z之后不起作用。我定义的命令\lw不能用作\λς

评论

我认为映射不是一个好方法:也许您正在寻找的是langmap选项(请参阅文档,其中包含有关希腊布局的示例)。实际使用此选项是为了帮助处理非拉丁键盘,例如希腊语或西里尔语。它允许您定义将在插入模式下正常解释但在其他模式下将被替换的符号对,这可能会对您有所帮助。

@statox:谢谢!我尝试使用前。但是什么也没发生。帮助说vim必须符合+ langmap选项。有没有一种简单的方法来检查是否?我使用的是Mac OS随附的版本。

如果得到1,则可以使用:echo has('langmap');如果得到0,则可以使用它。

@statox:谢谢!我更新了brew install vim --override-system-vi,并且:echo has&c现在返回1。ZZ起作用。 \ lv&c的问题仍然存在。

我不明白:echo有&c部分,我也看不到它与langmap的关系,一旦用vim编译了vim,就必须使用:set langmap = AA,ΒB,ΨC[.. 。]在您的vimrc中。

#1 楼

我建议keymap,可以解决您的麻烦。将它们放在vimrc中

" set keymap=greek_utf-8
set iminsert=0
set imsearch=-1


以禁用希腊文作为默认设置。您可以使用<ctrl>+^来打开(希腊)和关闭(英语)选项(也可以使用<ctrl>+6,它在插入模式和替换模式(在正常模式下不起作用)上映射到键上,而不是符号上。要在退出插入模式时自动禁用,可以使用

inoremap <ESC> <ESC>:set iminsert=0<CR>


有关这些的更多信息

:h iminsert
:h keymap
:h imsearch
:h i_CTRL-^


编辑到第二条评论:

如果进入插入模式(和替换模式),您可以尝试自动将希腊语打开。自动关闭(如果离开)(那么您不需要前面提到的映射)。

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END


评论


真的需要使用多调希腊语吗?在我看来,只需要正确的编码,然后使用内置的MacOS X输入即可。但这可能只是我的错误印象。您也可以在MacOS X中切换到多调希腊语键盘(并学习它,但我想这不是您想要的:-)关于the的滞后,可能会有一些映射,请尝试通过:map> a来查找,如果存在,请通过:unmap> a取消映射。作为非希腊和非MacO用户,我已经不知所措。对不起,祝你好运!

–ryuichiro
2015年9月20日下午13:31

#2 楼

就像我在评论中说的那样,映射并不旨在完成您想做的事情。此用例的一个有趣选项是langmap

此选项可让您将行为或键盘保持在插入模式,并在其他模式下更改其行为。

要使用如果Vim必须使用+langmap进行编译,则可以检查是否已使用echo has('langmap')启用了此选项:如果命令返回1启用了该选项,则必须先启用此选项来进行设置(要知道如何做,这是另一个问题。)

启用此选项后,该选项将使用成对字符,例如set langmap += à@将允许您在插入模式下键入à时在缓冲区中添加à但是在正常模式下键入à实际上会触发@(此示例在azerty键盘上可以简化宏的使用)。行到您的:h 'langmap'(从这里复制此行可能不是一个好主意,因为我可能不确定编码,直接从帮助文件中删除该行可能更安全):

:set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz


现在,根据我在您的评论中了解的内容,当您尝试使用预定义的命令:键入命令时,将触发插入模式行为,而不是langmap定义的行为。不幸的是,我不确定对此是否有好的解决方案。例如,重新定义命令的想法可能是这样的:

command λς lw


这样,当您键入命令vimrc时,Vim将执行λς,但我看到了一些缺点方法:


重新定义要使用的所有命令可能会非常麻烦。
用户定义的命令必须以大写字母开头,并且我现在已经知道在希腊这样做很方便。

因此,也许@Alexander Myshov在他对这个问题的回答中建议的插件可能会有用(因为我从未尝试过这些插件,我不知道它们是否解决了问题,但看起来确实如此)。

#3 楼

我会定期用英语和瑞典语输入。瑞典语比希腊语要解决的问题小,因为它只会用几个字符扩展英语字母,但是我认为我的解决方案可以转换为希腊语。

我以前使用操作系统的系统键盘开关进行切换。正如OP所指出的那样,这样做的问题在于,它破坏了一大堆命令,因为在正常模式下,每个键都使用非英语键盘向Vim发送另一个信号。此外,在瑞典语键盘布局中,移动了一大堆非字母字符,以让路给新字符åäö。例如,}用Alt-Shift-9键入(与英语键盘上的左括号匹配),反斜杠用Alt-Shift-7键入。切换到插入模式的原始瑞典语键盘布局会引起很多麻烦。

我的解决方案是仅在insertmode中重新映射相关键,并将这些映射包装在一个函数中,以便我可以轻松地来回切换。下面的代码是我在.vimrc中执行此操作的方式。这只会将我需要的字符添加到它们在瑞典语键盘布局中的位置,而其他所有内容都保留下来。要键入被它们掩盖的字符(;:[{"'),我只需按两次键即可。幸运的是,只有愚蠢的人甚至需要连续键入两个ä。 (如果这种双击不适合,您可以将它们映射到Ctrl或类似的东西。基本原理是,被掩盖的字符保留在键盘上的位置,但消除了一个键击。我发现这要容易得多而不是移动它们。)这意味着当我想输入瑞典语时,我点击了<Leader>s,它切换到这些映射并应用瑞典语拼写检查。要切换回去,我执行<Leader>e

现在,对于希腊语,这将涉及到整个字母的映射,实际上,这听起来比麻烦的事要少,而一旦您掌握了原理,听起来就很麻烦。然后,棘手的部分将是在切换到英语时取消映射所有这些更改。也许有人可以想出一种巧妙的方法来实现这一目标。

我正计划对下面的插入函数(如阿拉伯语,我经常键入的另一种语言)进行插入。我可能会在这里报告在过程中。

" Switch to Swedish
function! SweType()
  set spelllang=sv
  inoremap ; ö
  inoremap ;; ;
  inoremap : Ö
  inoremap :: :
  inoremap [ å
  inoremap { Å
  inoremap ' ä
  inoremap '' '
  inoremap " Ä
  inoremap "" "
  inoremap [[ [
  inoremap {{ {
endfunction
nmap <Leader>s :<C-U>call SweType()<CR>


" Switch to English
function! EngType()
  set spelllang=en_us
  inoremap ; ;
  iunmap ;;
  inoremap : :
  iunmap ::
  inoremap [ [
  iunmap [[
  inoremap { {
  iunmap {{
  inoremap ' '
  iunmap ''
  inoremap " "
  iunmap ""
endfunction
nmap <Leader>e :<C-U>call EngType()<CR>


评论


我可能是错的,但我认为您的回答允许在插入模式下轻松获取非英文字符,而OP的问题是在除插入模式外的其他模式下轻松获取英文字符。我不确定您的答案是否解决了最初的问题。函数启用/禁用映射的想法仍然很有趣。

–statox♦
2015年9月19日下午13:49

@statox嗯,我可能误解了这个问题,但是如果问题是要在保持正常模式功能的同时轻松地在insertmode中插入非英语字符,我相信我的问题至少会尝试解决该问题。

–安德烈亚斯(Andreas)
2015年9月19日15:59

抱歉,我并不想冒犯我:我是指出问题和答案之间可能存在差距,但是您当然想解决这个问题,正如我所说,我真的很喜欢功能启用的想法并禁用映射。我确实没有否认您的答案,对此感到非常抱歉。

–statox♦
2015年9月19日在16:05

@statox没有采取任何进攻。如果您拒绝我的回答,那将是有条不紊的。

–安德烈亚斯(Andreas)
2015年9月19日下午16:24

#4 楼

我也输入两种语言:俄语和英语。现在我使用这个插件https://github.com/lyokha/vim-xkbswitch。此插件依赖于本地键盘布局切换器,对于Mac OS X,您可以使用我的一个https://github.com/myshov/xkbswitch-macosx。