V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AthensBird
V2EX  ›  Vim

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

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

    在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   ·   实用小工具   ·   2936 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:45 · PVG 10:45 · LAX 18:45 · JFK 21:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.