在vim中使用不同键盘的最便捷方法是什么?


19

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

PS。列出所有清单并不会产生完美的结果。例如,q;在GR。键盘,但我们不想映射;至q。另外,由于某种原因,ZZ(zeta zeta)之后也不工作:map Ζ Z。我定义的命令\lw不能作为\λς


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

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

1
您可以使用:echo has('langmap'),如果你得到了1你,如果你得到一个0你不知道。
statox

@statox:谢谢!我更新brew install vim --override-system-vi:echo has &c现在返回1. ZZ作品。\lv&c 的问题仍然存在。
Toothrot

我不理解这一:echo has &c部分,langmap一旦您编译了vim,langmap就必须:set langmap=ΑA,ΒB,ΨC [...]在vimrc中指定映射,我也看不到它的关系。
statox

Answers:


6

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

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

使用禁用希腊作为default.You能够打开(希腊)和关闭(英文)选项<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。作为非希腊和非MacOs用户,我已经不知所措。对不起,祝你好运!
ryuichiro

10

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

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

要使用它,必须使用编译Vim +langmap,您可以通过echo has('langmap')以下命令检查是否启用了该选项:如果命令返回1了启用了该选项的其他选项,则必须在启用该选项的情况下进行设置(要知道如何做到这一点,是另一个问题)。

启用此选项后,该选项set langmap += à@将以成对字符为例,例如à,当您处于插入模式时,您可以在缓冲区中添加a ,然后键入a,àà在普通模式下键入实际上会触发a @(此示例对azerty很有用键盘以简化宏的使用)。

要在希腊的使用langmap的,你可以按照给出的示例:h 'langmap'中添加这一行到你vimrc (复制从这里这条线可能不是一个好主意,因为我真的编码的不确定,直接从帮助文件唬弄行可能更安全)

: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

这样,当您键入命令时,λςVim将会执行,lw但是我看到此方法有一些缺点:

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

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


1

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

我曾经使用操作系统的系统键盘开关进行切换。正如OP所指出的那样,这样做的问题是,它破坏了一大堆命令,因为在正常模式下,每个键都使用非英语键盘向Vim发送另一个信号。在瑞典的键盘布局,此外,非字母字符一大堆移动让位给新的角色åäö。例如,}键入使用Alt移-9(匹配开口英文键盘上括号),和反斜杠键入使用Alt移-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>

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

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

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

1
@statox没有违规。如果您拒绝我的回答,那将是有条不紊的。
安德里亚斯(Andreas)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.