Summary
Vim/Neovimで日本語を入力する
こんな感じ
vimとNeovimとではちょっとやり方が変わります
vimの場合
help通りにやる( :h japanese )
functiong:ImActivateFunc(active) abort
if!a:activecall system('osascript -e "tell application \"System Events\" to key code 102" &')endifendfunctionfunction!g:ImStatusFunc() abort
letl:cmd ='ObjC.import("Carbon") ;var current_source = $.TISCopyCurrentKeyboardInputSource(); ;var cfs = $.TISGetInputSourceProperty(current_source, $.kTISPropertyInputSourceID); ;ObjC.bindFunction("CFMakeCollectable", [ "id", [ "void *" ] ]); ;Ref.prototype.toNS = function () { return $.CFMakeCollectable(this) } ;cfs.toNS()'letl:foo = system('osascript -l JavaScript -e "'.l:cmd .'" &')if stridx(l:foo,'Japanese')return1endifendfunctionset iminsert=2set imsearch=2set imcmdline
set imstatusfunc=g:ImStatusFuncset imactivatefunc=g:ImActivateFunc
Neovimの場合
function!s:imStatusFunc() abort
letl:cmd ='ObjC.import("Carbon") ;var current_source = $.TISCopyCurrentKeyboardInputSource(); ;var cfs = $.TISGetInputSourceProperty(current_source, $.kTISPropertyInputSourceID); ;ObjC.bindFunction("CFMakeCollectable", [ "id", [ "void *" ] ]); ;Ref.prototype.toNS = function () { return $.CFMakeCollectable(this) } ;cfs.toNS()'letl:foo = system('osascript -l JavaScript -e "'.l:cmd .'" &')if stridx(l:foo,'Japanese')return1endifreturn0endfunctionfunctions:imDeactivateFunc() abort
call system('osascript -e "tell application \"System Events\" to key code 102" &')endfunction
autocmd callmekohei-vimrc InsertLeave * ifs:imStatusFunc()|:calls:imDeactivateFunc()|endif
Vim/Neovim共通vim
noremap <silent><nowait><ESC><ESC>
\ :nohlsearch<CR><C-l>
\ :<C-u>call <SID>imDeactivateFunc()<CR>
みどころ
IMEの状態を見る関数
13時間ほどぶっ続けでやって結局は stack overflow に書いてあったみたいな(泣)
JavaScriptもOSXのObjective-Cとかもぜんぜんわからずにアタックしましたよwww
辛すぎ〜
see also:How can we reading / coerce CFArray and CFString etc values from within OS X JXA?
// Carbonをインポート;古いAPIを使えるようにするObjC.import('Carbon')varcurrent_source=$.TISCopyCurrentKeyboardInputSource();varcfs=$.TISGetInputSourceProperty(current_source,$.kTISPropertyInputSourceID);ObjC.bindFunction('CFMakeCollectable',['id',['void *']]);Ref.prototype.toNS=function(){return$.CFMakeCollectable(this)}cfs.toNS()
動作的に
日本語切り替えを入れると全体的に動作がもさっとします。とくにインサートからノーマルにいくときに、:w
を押す癖がついてるのですが、これができなくなるのですよ。たぶん0.3秒ほどウエイトがかかるんですけどそこにちょっと、あああな感じですけど慣れるしかないんでしょうね・・・。うん、でもそれ以外は今のところ快適ですね。
できれば・・・
いまはIME
の状態チェックでおさを(osascript)。切り替えるときにもおさを(osascript)。もったいないですよね。ここ。なんとか一つにしたいと思ってるところです。どたなたやってみませんか?