eskk.vimで 日本語をバリバリ打とう。
こんにちは、koutarnです。
今日はvimで日本語を入力する際にかなり強力なeskk.vimについて書いていこうと思います。
eskk.vimとは
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()という関数を定義してらっしゃるところですが,たとえば
のようにするとやや長くなるもののワンライナーですっきりと書けそうです.ご参考までに.
便利なワンライナーを教えていただきありがとうございます。
たしかにこの 方法だと無駄に関数を定義する必要もなさそうですね。ありがとうございました!