以下在Windows8.1环境测试通过
思路来自 fcitx vim for osx ,调用一条命令行就可以依据当前模式切换输入法, 苦于一直没找到合适的软件,直到搜到 caps min alt shift noexit 这个小工具「a simple console program. Enables you to switch the layout using Caps Lock」,后台静默运行无配置就实现CAPS
切换输入语言,试用后感觉不错,想着 @xcodebuild 的方法,在evil exit&entry-hook
时执行一次模拟CAPS按键,所以autohotkey派上用场,最终成功实现需求,可以凑合着用。
先编译smartSwitchIMEcn.ahk
得到exe文件放到环境变量路径处
#SingleInstance
Send, {CapsLock}
Sleep, 200
emacs 中的配置
(defun evil-mode-smart-switch-ime ()
"between evil insert and normal state auto switch input method"
;; (interactive)
(shell-command "smartSwitchIMEcn"))
(add-hook 'evil-insert-state-exit-hook 'evil-mode-smart-switch-ime)
(add-hook 'evil-insert-state-entry-hook 'evil-mode-smart-switch-ime)
PS:
- 务必先添加新的美式键盘布局的语言输入源,默认
Alt+Shift
切换 - 中英状态反过来了,可以直接按
CAPS
恢复 - capslang有几个版本,caps min alt shift noexit虽没退出的快捷键,但使用体验最好
最后对以上用到的工具的作者表示感谢,现在很好地解决了Windows上使用Emacs和Vim编辑器的痛点,想着又能愉快的码字了就会高兴
参考
- Exclude an input language from Alt+Shift/Ctrl+Shift switching cycle on Windows - Super User
- Google Code Archive - Long-term storage for Google Code Project Hosting.
- https://codefalling.com/2015/11/02/fcitx-vim-for-OS-X/
- GitHub - lilydjwg/fcitx.vim: keep and restore fcitx state when leaving/re-entering insert mode
- Linux下fictx输入法切换
Vim也是OK
" from fcitx.vim bundle
if exists("g:loaded_fcitx")
finish
endif
let g:loaded_fcitx = 1
function FcitxToggle()
silent call system("smartSwitchIMEcn") "有弹出窗口的问题
endfunction
function BindAu()
augroup Fcitx
au InsertLeave * call FcitxToggle()
au InsertEnter * call FcitxToggle()
augroup END
endfunction
function UnBindAu()
au! Fcitx InsertLeave *
au! Fcitx InsertEnter *
endfunction
if (has("win32") || has("win95") || has("win64") || has("win16"))
call BindAu()
endif