🗾

eskk.vimで 日本語をバリバリ打とう。

2021/06/02に公開2

こんにちは、koutarnです。
今日はvimで日本語を入力する際にかなり強力なeskk.vimについて書いていこうと思います。

eskk.vimとは

https://github.com/tyru/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は押すのが疲れるので上手く押し分けると便利です。

追記

https://github.com/tyru/eskk.vim/blob/3cf9c54a01a6d0a464545fc7b94176b9e27597ed/autoload/eskk.vim#L1533
デフォルトで;が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を抜けるようにしました。

https://github.com/kuuote/dotvim/blob/56c96e8876d994b3414645a4781fa932f03b5739/conf/plug/eskk.vim#L12-L14
この設定は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

woodywoody

便利な設定を分かりやすく書いていただき助かります.自分もこれにほぼ倣って設定し,快適なeskkライフを送れています.
s:markdown_eskk()という関数を定義してらっしゃるところですが,たとえば

autocmd InsertEnter *.md if g:toggle_markdown_eskk | call eskk#enable() | endif

のようにするとやや長くなるもののワンライナーですっきりと書けそうです.ご参考までに.

koutarnkoutarn

便利なワンライナーを教えていただきありがとうございます。
たしかにこの 方法だと無駄に関数を定義する必要もなさそうですね。ありがとうございました!