LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4318|回复: 7

[tip] Vim 方便地进行中文输入和命令模式切换

[复制链接]
发表于 2005-11-27 17:22:11 | 显示全部楼层 |阅读模式
缘起:

由于vim存在输入模式和"正常模式",所以在要输入中文,又需要用 ESC 键频繁切换到正常模式的人来说,不断打开和关闭输入法是一件很麻烦的事。

我一直被这个问题所困扰,但是看到vim的文档里,已经有这方面的解答了。自己多次设置和实验后,发现只需要一些简单的设置就可以了:

第一步:.gvimrc 文件的设置

我的经验是:下面这些参数设置在vim下不起作用,在gvim下才行,,所以你可以直接设置.gvimrc,但是要把所有设置的行放到set nocompatible这一行的下面:


  1. set imactivatekey=C-space
  2. inoremap <ESC> <ESC>:set iminsert=0<CR>
复制代码


如果你只想要一个.vimrc文件,你也可以在该文件里如此设置,只是多了一个 if 的条件语句:

  1. if has("gui_running")
  2. set imactivatekey=C-space
  3. inoremap <ESC> <ESC>:set iminsert=0<CR>
  4. endif
复制代码


set imactivatekey=C-space
这一行的作用是让gvim控制输入法,好让下面的参数起作用。

inoremap <ESC> <ESC>:set iminsert=0<CR>
是在按下 ESC 的时候,自动关闭输入法,直接就可以修改文件了。
如果需要更多的参数,可以用 help iminsert 来查看vim的帮助文件。


第二步:设置输入法


按照上面设置以后,还不能完全顺畅地自动切换,必须在 scim 中作如下设置(我的是英文locale):

在scim的设置选项里,找到“全局设置”这里,把里面“把选字窗口嵌入到程序里”这个选项取消,让选字窗口独立于 gvim,否则输入几个字后就该功能就失灵了。

我用 fcitx 试过,发现在切换一次后,回到输入模式下,就无法输入了。用 fcitx 的朋友可以自己再试试。

第三步:和mutt 配合

我之所以要gvim和中文输入法配合,主要就是为了在用 mutt+gvim 和写 latex 时更方便。

只需要在 .muttrc 里如此设置就可以了:

  1. set editor="/usr/bin/gvim -f +'set imactivatekey=C-space' +'inoremap <ESC> <ESC>:set iminsert=2<CR>' +':set   formatoptions=tcqmM' +':set nopaste' +':set textwidth=77' +':set wrap' +'set linebreak' +\`awk '/^$/ {print i+2; exit} {i++}' %s\` %s"
复制代码


这些设置是为了让中文正确断行。
set   formatoptions=tcqmM
set nopaste
set textwidth=77
set wrap
set linebreak

但是这时必须用 inoremap <ESC> <ESC>:set iminsert=2。这是我自己实验得出的。

其它问题:

如果上面这些参数对你不起作用,可能你的gvim在编译是没有加入:
|+xim|
|+GUI_GTK|
的支持。

同时再强调一下,要把所有的设置放到set nocompatible这一行的下面才行。

遐思:

假如在 SCIM 中,能够把中、英切换键改为 ESC ,在 vim 下也许就更方便了。
发表于 2005-11-28 14:05:26 | 显示全部楼层
好技巧, 收藏!
回复 支持 反对

使用道具 举报

发表于 2005-11-28 23:53:38 | 显示全部楼层
在我这儿的  gvim 上效果很差
回复 支持 反对

使用道具 举报

发表于 2005-11-29 10:23:01 | 显示全部楼层
Windows下的VIM6.4不用设置就可以自动切换了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-29 15:36:47 | 显示全部楼层
Post by jhuangjiahua
在我这儿的  gvim 上效果很差


出了什么问题?说来听听?
回复 支持 反对

使用道具 举报

发表于 2006-5-17 21:58:34 | 显示全部楼层
顶, 好技巧阿, console下能这么用么? scim有两种设置。 GTK_IM_MODULE=xim/scim, 这有什么区别么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-13 09:50:13 | 显示全部楼层
幾年以後我回來了。當初為了這個技巧費了很多時間,現在用ibus就直接可以搞定了。滄桑之感。
回复 支持 反对

使用道具 举报

发表于 2010-6-15 19:19:33 | 显示全部楼层
Post by monpython;1333591
缘起:

遐思:

假如在 SCIM 中,能够把中、英切换键改为 ESC ,在 vim 下也许就更方便了。


发个 Patch,实现你所说的这个功能,已经用了很久了。在碰到 ESC 键时,直接切换为英文状态,中英文之间的切换仍然使用 Shift。Vim, Emacs 的快捷键都支持,也可以加入你自己的快捷键。主要是 iminsert 这种方法一直没有实验成功,并且我主要使用 terminal 下的 vim,所以还只能从输入法这个层次入手。

  1. diff -urb ../scim-original/scim-pinyin-0.5.91/src/scim_pinyin_imengine.cpp ./src/scim_pinyin_imengine.cpp
  2. --- ../scim-original/scim-pinyin-0.5.91/src/scim_pinyin_imengine.cpp        2005-08-06 23:31:08.000000000 +0800
  3. +++ ./src/scim_pinyin_imengine.cpp        2010-05-17 18:40:03.332616498 +0800
  4. @@ -774,14 +774,15 @@

  5.      if (!m_forward) {
  6.          //reset key
  7. -        if (key.code == SCIM_KEY_Escape && key.mask == 0) {
  8. -            if (m_inputed_string.length () == 0 &&
  9. -                m_converted_string.length () == 0 &&
  10. -                m_preedit_string.length () == 0)
  11. -                return false;
  12. -
  13. +        if (key.code == SCIM_KEY_Escape && key.mask == 0
  14. +             || (key.code == SCIM_KEY_bracketleft && key.mask == SCIM_KEY_ControlMask)
  15. +             || (key.code == SCIM_KEY_x && key.mask == SCIM_KEY_ControlMask)
  16. +             || (key.code == SCIM_KEY_c && key.mask == SCIM_KEY_ControlMask)) {
  17. +            m_forward = 1;
  18. +            refresh_all_properties ();
  19.              reset ();
  20. -            return true;
  21. +            m_prev_key = key;
  22. +            return false;
  23.          }

  24.          if (!m_factory->m_shuang_pin) {
复制代码


也可以看我的 blog:
http://hi.baidu.com/cs_peanuts/b ... 4f42c0d0c86a6f.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表