eskk.vimで 日本語をバリバリ打とう。
こんにちは、koutarnです。
今日はvimで日本語を入力する際にかなり強力なeskk.vimについて書いていこうと思います。
eskk.vimとは
eskk.vimとはvim上でSKKを扱えるように想定したプラグインです。
SKKについては wikipediaをご覧下さい。
eskk.vimのメリット
最初に断言しておくとSKKを使えない人でも、
eskk.vimを使うためにSKKを覚えたほうが良いくらいメリットがあります。
- 本来IME連携が必要な日本語入力中にノーマルモードに移行する事がvim上で簡単に行える。
 - 「markdownはインサートモードに入ると必ず日本語入力から初める」等が簡単に出来る。
 - 全角/半角キー等を押さないでもスムーズに入力文字を切り替えれる
 
特に1つめ、2つめの内容が強力です。vimの中でIMEが存在している状態のため
日本語入力についてかなり自由度が高く設定を行う事が出来ます。
ノーマルモードに戻りたいけど、日本語入力になっていて
jjを打ったつもりが っjになってしまい頭を抱えていませんか? eskk.vimを使いましょう
オススメの使い方
ここからはeskk.vimの簡単な使いかたとオススメの設定等を紹介していきます。
プラグインを入れる
Plug 'tyru/eskk.vim'
まず、tyru/eskk.vimを自分のプラグインマネージャーで入れましょう。
SKK辞書を入れる
let g:eskk#directory = "~/.config/eskk"
let g:eskk#dictionary = { 'path': "~/.config/eskk/my_jisyo", 'sorted': 1, 'encoding': 'utf-8',}
let g:eskk#large_dictionary = {'path': "~/.config/eskk/SKK-JISYO.L", 'sorted': 1, 'encoding': 'euc-jp',}
SKK辞書をダウンロードして所定の箇所に置いたあと、
vimrcに上記のように辞書ファイルの場所を設定します。
この時、文字コードの設定に注意してください。
基本的な設定
let g:eskk#kakutei_when_unique_candidate = 1 "漢字変換した時に候補が1つの場合、自動的に確定する
let g:eskk#enable_completion = 0             "neocompleteを入れないと、1にすると動作しなくなるため0推奨
let g:eskk#no_default_mappings = 1           "デフォルトのマッピングを削除
let g:eskk#keep_state = 0                    "ノーマルモードに戻るとeskkモードを初期値にする
let g:eskk#egg_like_newline = 1              "漢字変換を確定しても改行しない。
"表示文字を変更(オレ サンカクデ ハンダン デキナイ)
let g:eskk#marker_henkan = "[変換]"
let g:eskk#marker_henkan_select = "[選択]"
let g:eskk#marker_okuri = "[送り]"
let g:eskk#marker_jisyo_touroku = "[辞書]"
基本的な設定です。割と好みの部分が大きいですが、
私はこんな感じで設定しています。
Sticky Shiftを入れる
autocmd User eskk-initialize-post call s:eskk_initial_pre()
function! s:eskk_initial_pre() abort
  EskkUnmap -type=sticky Q
  EskkMap -type=sticky ;
endfunction
上記のように設定すると;を押すと変換/送り開始になるSticky Shiftを設定出来ます。
毎回Shiftは押すのが疲れるので上手く押し分けると便利です。
追記
デフォルトで;がSticky Shiftになっていました。
特定のファイルタイプの際はeskkに最初から入った状態で開始する。
augroup vimrc_eskk
  autocmd!
  "markdownは日本語を打つ前提
  autocmd InsertEnter * call s:markdown_eskk()
  autocmd Filetype markdown nnoremap <buffer><silent> <F1> :call <SID>markdown_eskk_toggle()<CR>
augroup END
let g:toggle_markdown_eskk = 1
function! s:markdown_eskk() abort
  if &filetype == 'markdown' && g:toggle_markdown_eskk ==# 1
    call eskk#enable()
  endif
endfunction
function! s:markdown_eskk_toggle() abort
  let g:toggle_markdown_eskk = g:toggle_markdown_eskk == 1 ? 0 : 1
  if g:toggle_markdown_eskk ==# 1
    echomsg 'Markdown日本語入力モードON'
  else
    echomsg 'Markdown日本語入力モードOFF'
  endif
endfunction
これも好みですが、私は基本的にmarkdownを書く際は
日本語入力をメインとしているのでこのように設定しています。
一応<F1>で切り変えが出来るように関数を定義しています。
eskkの英字はインサートモードで行うようにする。
少しややこしい話なのですが、eskkを入れると入力に関する状態が以下のようになります。
(ざっくりと話をしたいので、ここではビジュアルモードやeskkの英字全角などは含めていません)
- ノーマルモード
 - インサートモード
 - インサートモード(eskk) 日本語入力
 - インサートモード(eskk) 英字入力
 - インサートモード(eskk) カタカナ入力
 
たとえば、デフォルト状態でeskkを扱おうとすると以下のような形になると思います。
ノーマルモード→i(インサートモード)→<C-j>(インサートモード(eskk) 日本語入力)
さらにこの状態からインサートモード(eskk) 英字入力に入り、ノーマルモードまで抜けると
インサートモード(eskk) 日本語入力→l(インサートモード(eskk) 英字入力)→<ESC>(ノーマルモード)
ここで一つ面倒な事が起きます。
通常のインサートモードとインサートモード(eskk) 英字入力では
同じ英字入力でもeskkの設定が入るため微妙にバインドが変り不便でした。
また、同じ英字入力なのに複数の入力モードがあることで、複雑になっていると感じました。
augroup vimrc_eskk
  autocmd!
  autocmd User eskk-enable-post lmap <buffer> l <Plug>(eskk:disable)
augroup END
imap jk <Plug>(eskk:toggle)
cmap jk <Plug>(eskk:toggle)
なので上記のように設定し、lを入力するとeskkを抜けるようにしました。
この設定はkuuoteさんに教えてもらいました。感謝です。
また、eskkの切り替えに<C-j>を挟むと操作性が悪いと感じたので、jkに統一しました。
私はノーマルモードへの切り変えをjjに割りあてているので人差し指だけで変換が完結します。
ノーマルモード→i(インサートモード)→jk(インサートモード(eskk) 日本語入力)→
l(インサートモード)→jk(インサートモード(eskk) 日本語入力)→jj(ノーマルモード)
inoremap <silent><expr> ;; pumvisible() ? coc#_select_confirm() : coc#refresh()
余談ですがcoc等を使用している方は;;にポップアップメニューの確定を設定すると便利です。
まとめ
みんなもeskk.vimを使ってレッツSKK Life!
Discussion
便利な設定を分かりやすく書いていただき助かります.自分もこれにほぼ倣って設定し,快適なeskkライフを送れています.
s:markdown_eskk()という関数を定義してらっしゃるところですが,たとえば
のようにするとやや長くなるもののワンライナーですっきりと書けそうです.ご参考までに.
便利なワンライナーを教えていただきありがとうございます。
たしかにこの 方法だと無駄に関数を定義する必要もなさそうですね。ありがとうございました!