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

2015-01-03 12:57:41 +08:00
 AthensBird

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

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

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

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

9087 次点击
所在节点    Vim
12 条回复
victor
2015-01-03 13:28:29 +08:00
既然你用搜狗输入法,那么这个输入法有一个功能叫做自动英文。你可以在这里勾选上,当进入 st 的时候,自动切换到英文输入状态。
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
2015-01-03 13:48:37 +08:00
在Linux下可以用fcitx. vim
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
2015-01-03 14:55:39 +08:00
Vim有一个插件叫VIMIM。可以试试。
banbanchs
2015-01-03 16:43:44 +08:00
一般要打长篇中文我都用Emacs,vim切换要按太多键了
rail4you
2015-01-03 19:35:57 +08:00
只要用第三方的输入法,这个问题就无解,能找到一些变通方案,但体验都不好。

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

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

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

这个问题困扰我多年,知道无解后,也释然了,也不会再找完美方案了。
Goooogle
2015-01-03 19:39:37 +08:00
@chanmaozha
是针对拼音用户的,使用的是云功能
顺着搜到了ywvim,适用五笔,等有时间了可以试下
sleeperqp
2015-01-03 22:16:02 +08:00
同5楼 在vim里你可以试试vimim
chanmaozha
2015-01-03 22:42:53 +08:00
@Goooogle VIMIM有音码(汉语拼音)有形码(五笔仓颉郑码等等)。
Aksura
2015-05-29 21:24:42 +08:00
在windows上用旧版的 微软输入法2007 可以达到插入模式和普通模式下中英文不同状态。
Chingim
2016-01-29 14:48:40 +08:00
我用 karabiner ,按下 esc 返回普通模式的时候自动切换为英文输入法,缺点是再进入插入模式时是英文输入状态

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/158804

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX