在vim和sublime vintage模式下用中文输入法输入文字,在中文输入状态下按esc键切换到v模式,这时候按下hjkl不会移动光标,而是输入文字。因此每次在切换到v模式的时候需要把输入法切换到英文才能移动光标。在v模式和i模式间切换是频率很高的操作,如果每次都要附带一次输入法切换很痛苦。
我想借助AutoHotkey可以解决这个问题。如果当前输入法是中文输入法,在vim或者sublime text中按下esc键,自动把输入法切换为英文。这就解决了按下esc键后,要手动切换一次输入法的麻烦。但是,转换回i模式之后,是否自动切换到中文输入法却不一定。
搜狗输入法等主流拼音输入法中按下shfit一次可以在中英文间切换。所以我想到,按下esc键的时候,模拟按下shfft键一次。接下来若是按下了i键,那么也附带模拟按下shift一次。由于shift键是组合键,大多数情况下单独按一次不会有反应。所以这个实现思路略粗糙却很简单,有可行性。
在此抛砖引玉,希望能引出更好的解决方案。
1
victor 2015-01-03 13:28:29 +08:00
既然你用搜狗输入法,那么这个输入法有一个功能叫做自动英文。你可以在这里勾选上,当进入 st 的时候,自动切换到英文输入状态。
|
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 ###### |
3
Goooogle 2015-01-03 13:48:37 +08:00 via Android
在Linux下可以用fcitx. vim
|
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"}]}, |
5
chanmaozha 2015-01-03 14:55:39 +08:00 1
Vim有一个插件叫VIMIM。可以试试。
|
6
banbanchs 2015-01-03 16:43:44 +08:00
一般要打长篇中文我都用Emacs,vim切换要按太多键了
|
7
rail4you 2015-01-03 19:35:57 +08:00
只要用第三方的输入法,这个问题就无解,能找到一些变通方案,但体验都不好。
原因是大部分的输入法没有可编程能力,你没法在vim下通过脚本识别输入法状态,也没法写脚本在各种模式下切换中英文输入模式,ahk等原始hack方式治标不治本,很多情况兼容都不够好。 使用vim输入法插件能在一定程度解决问题,Linux的fcitx有编程功能,可以编写插件控制输入法,效果也很不错。 emacs的快捷键组合也有这个问题,只要遇到单字母的按键,emacs也无法自动切换输入法,比如ctrl+c,v这种按键组合,后面的v追随输入法状态,中文状态下输入这种命令很麻烦。 这个问题困扰我多年,知道无解后,也释然了,也不会再找完美方案了。 |
8
Goooogle 2015-01-03 19:39:37 +08:00
|
9
sleeperqp 2015-01-03 22:16:02 +08:00
同5楼 在vim里你可以试试vimim
|
10
chanmaozha 2015-01-03 22:42:53 +08:00
@Goooogle VIMIM有音码(汉语拼音)有形码(五笔仓颉郑码等等)。
|
11
Aksura 2015-05-29 21:24:42 +08:00
在windows上用旧版的 微软输入法2007 可以达到插入模式和普通模式下中英文不同状态。
|
12
Chingim 2016-01-29 14:48:40 +08:00
我用 karabiner ,按下 esc 返回普通模式的时候自动切换为英文输入法,缺点是再进入插入模式时是英文输入状态
|