筆者はテキストエディタのVimを愛用しています.筆者に技術者のイロハを指導して下さった方がVim使いだったことが大きく影響しています.LinuxやMacなどの所謂Unix系OSには必ずインストールされており,WindowsでもWSL環境を構築すればVimが使えます.またシンプルな作りと高いカスタマイズ性が気に入っております.特に.vimrc
は随分育ってしまったため,失われてしまうと大損失...
GitHubで大切に管理しています.そんなVimで以前から日本語の単語をアルファベットで検索出来れば良いのにと思っていました.Vimは様々なコマンドを駆使して使います.よってキーボードは常に半角英数モードにしておくことが望ましいのですが,日本語の文章(テキスト)で日本語の単語を調べる時は,標準の検索機能だと全角モードに切り換える必要が有り,大変煩雑になります.これは大変悩ましい問題です.本記事ではかつてそんな悩みを解決するために開発されたものの,近年の技術の進歩で正しく動作しなくなったプVimラグインをGitHubで発掘し,修正(魔改造)→Pull Request→Mergeを経て復活させた物語です.
そもそもMigemoとは?
日本語の単語をローマ字のまま検索が出来るアプリケーションです.仕組みとして検索された文字列と辞書ファイルに専用の辞書ファイルに登録されている単語(アルファベット表記,日本語表記のペア)を照合して検索します.
- 参考
日本語文章でもアルファベットでインクリメント検索を
テキストエディタとして筆者は長らくVimを愛用していますが,シンプルさとカスタマイズ性の高さが魅力だと思っています.ただ,日本語が含まれているテキストの検索はVimのコマンドの合間にかな
モードに切り換えながら打鍵する必要が有り,非常に煩わしさを感じていました.何か良い手立てはないものかと探っていた所,以下の記事を発見しました.
ここではMigemoのセットアップ,Vimへのプラグインの導入方法なども詳しく記載されています.ところが,この記事で紹介されているvim-migemo
は最新のmacOS(2022/10現在:12.6 Monterey)では正常に動作しません.最新の環境向けに修正を実施してPull Requestを出してみようとも思ったのですが,10年近くソースが修正されていないのと,筆者自身VimScriptを全く知らないため,修正は難しいと判断.他に良いプラグインが無いかと探っていた所,migemo-search.vim
というプラグインの存在を知りました.
こちらもVimScriptで実装されていますが,前述のプラグインと比較してソースの構造がシンプルで仮に動作しなかったとしても,原因分析,改修はまだ容易と判断しました.そして,今回無事migemo-search.vim
の改修に成功し,無事動作を確認しました.(改修内容の詳細に興味のある方は上記URLのGitHubでご確認ください)これ以降は最新のmacOS環境で動作するように改修を経たmegemo-search.vim
を実際にVimに導入する方法1を御紹介します.
本記事ではMacを対象としていますがUnix系OSのLinuxでも動作します.
C/Migemoのインストール
まずHomebrewを用いてC/Migemoをインストールします.以下のコマンドを実行するだけです.
brew install cmigemo
Linux(例えばUbuntu)でインストールする場合は,以下を実行します.
sudo apt install -y cmigemo
migemo-search.vimをインストール
筆者はVim-Plugを用いてVimのプラグインを管理しています.よってVim-Plugによるインストール方法を記載しますが,お使いのプラグイン管理ツールに合った方法でインストールしてください.Vim-Plugの場合は.vimrc
に以下を追記します.
call plug#begin()
Plug 'rhysd/migemo-search.vim'
call plug#end()
一度Vimを再起動し,:PlugInstall
コマンドを実行します.これでインストール完了です.
migemo-search.vimを有効化
.vimrc
に以下を追記します.GitHubの公式リポジトリのREADMEの記載と若干異なります.これは公式のREADMEの記載内容で有効化するとMigemoで検索した結果が検索対象の本文に反映させるために余分にEnterを打鍵しなければならなくなるためです.
if executable('cmigemo')
cnoremap <expr><CR> migemosearch#replace_search_word()."\<CR>\<CR>"
endif
2022/10/11追記
上記の方法では困った事が発生します.Vimではコマンドモードで:行番号
を入力すると指定の行にジャンプできますが,そのジャンプが指定した行よりⅠ行下の行にジャンプしてしまうという問題です.これは困ったものです.その解決方法は...後述します.
検索テスト
以下の日本語テキストを仮にtest.txtという名前で保存し,検索をテストしてみましょう.
今日は土曜日で天気は晴
- 検索例1: kyou
- 検索例2: doyoubi
- 検索例3: tenki
- 検索例4: hare
あくまで単語単位の検索となります.よって
kyouha
と検索するとヒットしなくなります.
単語の対応が"いい加減"とのことです.よって検索パターンによってはヒットしない場合も有ります.(Migemo公式より)
検索結果が本文中にハイライトとして出力されれば成功です.
まとめ
Vim上で日本語混じりのテキストを扱う場合に,日本語の単語でもアルファベット表記インクリメント検索に対応させるため,プラグインmigemo-search.vim
の発掘,改修,PR,Mergeを経て無事アルファベット表記インクリメント検索に対応させることが出来ました.これを機会にVimScriptを含めてVimを再勉強してみようと思った次第です.
2022/10/11追記: もっと便利なプラグインを発見.これぞ正に最終解決策
vim-easymotion.vimというプラグインを発見しました.これで全ての問題は解決です.但し,最新のmacOS向けの修正が必要だったため,Issue+PRのサブミットをしています.(2022/10/11現在)
公式READMEに従ってインストール後,以下を.vimrcに追加すれば一先ず利用出来ます.まだ全容を把握出来ていないため,今後研究を重ねて便利に利用していこうと思います.
map / <Plug>(easymotion-sn)
omap / <Plug>(easymotion-tn)
let g:EasyMotion_use_migemo = 1
2022/10/24追記: macOS向け修正
macOSで利用する場合はvim-easymotion/autoload/EasyMotion/cmigemo.vim
に以下の修正を追加します.
if dict == ''
for path in [
\ '/usr/local/share/migemo/',
\ '/usr/local/share/cmigemo/',
\ '/usr/local/share/',
\ '/usr/share/cmigemo/',
\ '/usr/share/',
+ \ '/opt/homebrew/share/',
\ ]
let path = path . a:name
if filereadable(path)
let dict = path
break
endif
endfor
endif
Reference
-
Homebrewのインストールは終わっているものとします. ↩