gVim 和 Sublime Text Vintage 模式中英文输入法切换麻烦的解决思路 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AthensBird
V2EX    Vim

gVim 和 Sublime Text Vintage 模式中英文输入法切换麻烦的解决思路

  •  
  •   AthensBird 2015-01-03 12:57:41 +08:00 9604 次点击
    这是一个创建于 3962 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在vim和sublime vintage模式下用中文输入法输入文字,在中文输入状态下按esc键切换到v模式,这时候按下hjkl不会移动光标,而是输入文字。因此每次在切换到v模式的时候需要把输入法切换到英文才能移动光标。在v模式和i模式间切换是频率很高的操作,如果每次都要带一次输入法切换很痛苦。

    我想借助AutoHotkey可以解决这个问题。如果当前输入法是中文输入法,在vim或者sublime text中按下esc键,自动把输入法切换为英文。这就解决了按下esc键后,要手动切换一次输入法的麻烦。但是,转换回i模式之后,是否自动切换到中文输入法却不一定。

    搜狗输入法等主流拼音输入法中按下shfit一次可以在中英文间切换。所以我想到,按下esc键的时候,模拟按下shfft键一次。接下来若是按下了i键,那么也附带模拟按下shift一次。由于shift键是组合键,大多数情况下单独按一次不会有反应。所以这个实现思路略粗糙却很简单,有可行性。

    在此抛砖引玉,希望能引出更好的解决方案。

    12 条回复    2016-01-29 14:48:40 +08:00
    victor
        1
    victor  
       2015-01-03 13:28:29 +08:00
    既然你用搜狗输入法,那么这个输入法有一个功能叫做自动英文。你可以在这里勾选上,当进入 st 的时候,自动切换到英文输入状态。
    caixiexin
        2
    caixiexin  
       2015-01-03 13:48:06 +08:00
    windows下 百度输入法默认解决vim的esc键中英文切换问题,搜狗输入法1楼的说法应该可以。
    linux下 fcitx输入法有vim插件,或者直接在vimrc配置文件里加下面的配置即可。(方法是从archlinux 的wiki里看到的)
    "##### linux auto fcitx input method ###########
    let g:input_toggle = 1
    function! Fcitx2en()
    let s:input_status = system("fcitx-remote")
    if s:input_status == 2
    let g:input_toggle = 1
    let l:a = system("fcitx-remote -c")
    endif
    endfunction

    function! Fcitx2zh()
    let s:input_status = system("fcitx-remote")
    if s:input_status != 2 && g:input_toggle == 1
    let l:a = system("fcitx-remote -o")
    let g:input_toggle = 0
    endif
    endfunction

    set ttimeoutlen=150
    "退出插入模式
    autocmd InsertLeave * call Fcitx2en()
    "进入插入模式
    autocmd InsertEnter * call Fcitx2zh()
    "##### linux auto fcitx input method end ######
    Goooogle
        3
    Goooogle  
       2015-01-03 13:48:37 +08:00 via Android
    在Linux下可以用fcitx. vim
    jiyee
        4
    jiyee  
       2015-01-03 14:27:49 +08:00
    我用的是Sublime的Vintagous插件,同样有这个问题。我的解决方案比较复杂,主要在Karabiner里解决,判断当前输入法是不是中文,如果是切换到英文输入法,但是Vintagous有一个bug,在中文输入法有输入字符的时候,esc键不会flush出已输入的字符也不会隐藏中文输入法栏,然后只能模拟一下。。

    <item>
    <name>ESC to escape and change us input method in Sublime Text and PinYin</name>
    <identifier>private.esc_to_esc_plus_right_command2</identifier>
    <only>APP_SUBLIME</only>
    <inputsource_only>IME_PINYIN</inputsource_only>
    <autogen>
    --KeyToKey--
    KeyCode::ESCAPE,
    KeyCode::ESCAPE,
    KeyCode::F12 | ModifierFlag::OPTION_L | ModifierFlag::CONTROL_L | ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L,
    KeyCode::F11 | ModifierFlag::OPTION_L | ModifierFlag::CONTROL_L | ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L,
    </autogen>
    </item>

    KeyCode::ESCAPE是为了flush之前输入的字符,
    KeyCode::F12 | ModifierFlag::OPTION_L | ModifierFlag::CONTROL_L | ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L是切换到英文输入法(不是切换输入法,是切到英文输入法)的快捷键
    KeyCode::F11 | ModifierFlag::OPTION_L | ModifierFlag::CONTROL_L | ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L是模拟vi的ESC按键,就是切换到normal模式

    {"keys": ["super+alt+ctrl+shift+f11"], "command": "press_key", "args": {"key": "<esc>"}, "context": [{"key": "vi_command_mode_aware"}]},
    chanmaozha
        5
    chanmaozha  
       2015-01-03 14:55:39 +08:00   1
    Vim有一个插件叫VIMIM。可以试试。
    banbanchs
        6
    banbanchs  
       2015-01-03 16:43:44 +08:00
    一般要打长篇中文我都用Emacs,vim切换要按太多键了
    rail4you
        7
    rail4you  
       2015-01-03 19:35:57 +08:00
    只要用第三方的输入法,这个问题就无解,能找到一些变通方案,但体验都不好。

    原因是大部分的输入法没有可编程能力,你没法在vim下通过脚本识别输入法状态,也没法写脚本在各种模式下切换中英文输入模式,ahk等原始hack方式治标不治本,很多情况兼容都不够好。

    使用vim输入法插件能在一定程度解决问题,Linux的fcitx有编程功能,可以编写插件控制输入法,效果也很不错。

    emacs的快捷键组合也有这个问题,只要遇到单字母的按键,emacs也无法自动切换输入法,比如ctrl+c,v这种按键组合,后面的v追随输入法状态,中文状态下输入这种命令很麻烦。

    这个问题困扰我多年,知道无解后,也释然了,也不会再找完美方案了。
    Goooogle
        8
    Goooogle  
       2015-01-03 19:39:37 +08:00
    @chanmaozha
    是针对拼音用户的,使用的是云功能
    顺着搜到了ywvim,适用五笔,等有时间了可以试下
    sleeperqp
        9
    sleeperqp  
       2015-01-03 22:16:02 +08:00
    同5楼 在vim里你可以试试vimim
    chanmaozha
        10
    chanmaozha  
       2015-01-03 22:42:53 +08:00
    @Goooogle VIMIM有音码(汉语拼音)有形码(五笔仓颉郑码等等)。
    Aksura
        11
    Aksura  
       2015-05-29 21:24:42 +08:00
    在windows上用旧版的 微软输入法2007 可以达到插入模式和普通模式下中英文不同状态。
    Chingim
        12
    Chingim  
       2016-01-29 14:48:40 +08:00
    我用 karabiner ,按下 esc 返回普通模式的时候自动切换为英文输入法,缺点是再进入插入模式时是英文输入状态
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2640 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 14:20 PVG 22:20 LAX 06:20 JFK 09:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86