Neovimで日本語のファイル内をうろついているときに、もっといい感じで移動できるといいのに、と常々感じてはいたのですが。実はだいぶ前に deton/jasentence.vim と deton/jasegment.vim というのを見つけてまして、もうちょっとちゃんといじってみようかなと。
jasentence.vim は )( を使って「。」や「、」への移動(センテンス移動)を行えるプラグインです。"、。,.?!" を見てくれるらしいので、ついでに "「" や "」" も見てくれればいいのにな、と思ったり思わなかったり。まあそれはさておき。
英語だと w や e での移動は単語単位になりますが、文の構造上単語を切り出すのが難しい日本語では、漢字・カタカナ・ひらがな・その他という感じで大雑把な単位での移動になってしまいます。:help word-motions では、
- w: 次のwordの先頭に移動
- b: 直前のwordの先頭に移動
- e: 次のwordの末尾に移動
- W: 次のWORDの先頭に移動
- B: 直前のWORDの先頭に移動
- E: 次のWORDの末尾に移動
- word: 空白(space, tab, <EOL>)で区切られた文字の連続。空白行もwordとして扱われる。
- WORD: 空白(space)で区切られた文字の連続。空白行もWORDとして扱われる。
などとなっています。
当然、日本語でも同じキーで移動したいわけで、じゃあやっぱり形態素解析で文を見てもらったほうがいい感じで動作するのかな、と。
jasegment.vim がそのへんをうまくやってくれるようで、後ろで動いてくれるエンジンには CaboCha や TinySegmenter、MeCab などを使えるようです。デフォルトでは KNBコーパスで文節を学習させたデータが使われるようで、それでもいいんですが、ここは MeCab を使ってみようかと。
Windows用バイナリは MeCab: Yet Another Part-of-Speech and Morphological Analyzer に用意されているのですが、せっかくなので WSL2 上の ArchLinux で動作させてみようかなと。幸い、AUR をmecabで検索すると mecab、mecab-git、mecab-ipadic、python-mecab、mecab-ipadic-neologd-git などが登録されているようですので、ビルドとインストールは makepkg でうまいこといきそうです。ちなみにソースは mecab だと tarball を拾ってきて、mecab-git だと github から拾ってくるようです。github のほうは ipadic と jumandic をソースツリーに取り込んでるように見えます。ここでは github からのほうを使ってみます。
ということで早速始めます。
git clone https://aur.archlinux.org/mecab-git.git
cd mecab-git
makepkg -sri
でも辞書はインストールされていません。なので mecab-ipadic をインストールします。
git clone https://aur.archlinux.org/mecab-ipadic.git
cd mecab-ipadic
makepkg -sri
辞書は /usr/lib/mecab/dic/ipadic 以下にインストールされました。さらに mecab-ipadic-neologd-git もインストールします。
git clone https://aur.archlinux.org/mecab-ipadic-neologd-git.git
cd mecab-ipadic-neologd-git
makepkg -sri
こちらの辞書は /usr/lib/mecab/dic/mecab-ipadic-neologd にインストールされました。
MeCab の辞書指定は /etc/mecabrc で行います。
dicdir = /usr/lib/mecab/dic/ipadic
標準では ipadic が指定されていますが、不満が出てこなければこのままでもいいか、と手を付けずに置きます。
念の為、mecab になにか食わせてみます。
% mecab
念の為、mecab になにか食わせてみます。
念 名詞,一般,*,*,*,*,念,ネン,ネン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
為 名詞,非自立,副詞可能,*,*,*,為,タメ,タメ
、 記号,読点,*,*,*,*,、,、,、
mecab 名詞,一般,*,*,*,*,*
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なにか 副詞,助詞類接続,*,*,*,*,なにか,ナニカ,ナニカ
食わ 動詞,自立,*,*,五段・ワ行促音便,未然形,食う,クワ,クワ
せ 動詞,接尾,*,*,一段,連用形,せる,セ,セ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
み 動詞,非自立,*,*,一段,連用形,みる,ミ,ミ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS
次にコマンドプロンプトから食わせてみます。
C:\Users\kats$ wsl mecab
念の為、mecab になにか食わせてみます。
念 名詞,一般,*,*,*,*,念,ネン,ネン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
為 名詞,非自立,副詞可能,*,*,*,為,タメ,タメ
、 記号,読点,*,*,*,*,、,、,、
mecab 名詞,一般,*,*,*,*,*
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なにか 副詞,助詞類接続,*,*,*,*,なにか,ナニカ,ナニカ
食わ 動詞,自立,*,*,五段・ワ行促音便,未然形,食う,クワ,クワ
せ 動詞,接尾,*,*,一段,連用形,せる,セ,セ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
み 動詞,非自立,*,*,一段,連用形,みる,ミ,ミ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS
ちゃんとできてますね。
では、Neovimでやってみます。
まず knbc_bunsetu から。
次に、以下のコマンドを実行して mecab で動かします。
let g:jasegment#mecab#cmd = 'wsl mecab'
let g:jasegment#model = 'mecab'
できてるようですね。パチパチパチ。
でも、どちらかというとカーソル移動では knbc_bunsetu のほうが好みかも。