最新のmacOS上の最新のVimでもMigemoの恩恵を受けたい

筆者はテキストエディタのVimを愛用しています．筆者に技術者のイロハを指導して下さった方がVim使いだったことが大きく影響しています．LinuxやMacなどの所謂Unix系OSには必ずインストールされており，WindowsでもWSL環境を構築すればVimが使えます．またシンプルな作りと高いカスタマイズ性が気に入っております．特に`.vimrc`は随分育ってしまったため，失われてしまうと大損失．．．:scream: :scream_cat: GitHubで大切に管理しています．そんなVimで以前から日本語の単語をアルファベットで検索出来れば良いのにと思っていました．Vimは様々なコマンドを駆使して使います．よってキーボードは常に半角英数モードにしておくことが望ましいのですが，日本語の文章(テキスト)で日本語の単語を調べる時は，標準の検索機能だと全角モードに切り換える必要が有り，大変煩雑になります．これは大変悩ましい問題です．本記事ではかつてそんな悩みを解決するために開発されたものの，近年の技術の進歩で正しく動作しなくなったプVimラグインをGitHubで発掘し，修正(魔改造)→Pull Request→Mergeを経て復活させた物語です．

# そもそもMigemoとは？
日本語の単語をローマ字のまま検索が出来るアプリケーションです．仕組みとして検索された文字列と辞書ファイルに専用の辞書ファイルに登録されている単語(アルファベット表記，日本語表記のペア)を照合して検索します．

* 参考

http://0xcc.net/migemo/

# 日本語文章でもアルファベットでインクリメント検索を
テキストエディタとして筆者は長らくVimを愛用していますが，シンプルさとカスタマイズ性の高さが魅力だと思っています．ただ，日本語が含まれているテキストの検索はVimのコマンドの合間に`かな`モードに切り換えながら打鍵する必要が有り，非常に煩わしさを感じていました．何か良い手立てはないものかと探っていた所，以下の記事を発見しました．

https://qiita.com/otakumesi/items/2f3104b6978e4af28b9d

ここではMigemoのセットアップ，Vimへのプラグインの導入方法なども詳しく記載されています．ところが，この記事で紹介されている`vim-migemo`は最新のmacOS(2022/10現在：12.6 Monterey)では正常に動作しません．最新の環境向けに修正を実施してPull Requestを出してみようとも思ったのですが，10年近くソースが修正されていないのと，筆者自身VimScriptを全く知らないため，修正は難しいと判断．他に良いプラグインが無いかと探っていた所，`migemo-search.vim`というプラグインの存在を知りました．

https://github.com/rhysd/migemo-search.vim

こちらもVimScriptで実装されていますが，前述のプラグインと比較してソースの構造がシンプルで仮に動作しなかったとしても，原因分析，改修はまだ容易と判断しました．そして，今回無事`migemo-search.vim`の改修に成功し，無事動作を確認しました．(改修内容の詳細に興味のある方は上記URLのGitHubでご確認ください)これ以降は最新のmacOS環境で動作するように改修を経た`megemo-search.vim`を実際にVimに導入する方法[^brew]を御紹介します．

[^brew]: Homebrewのインストールは終わっているものとします．

:warning: 本記事ではMacを対象としていますがUnix系OSのLinuxでも動作します．

# C/Migemoのインストール
まずHomebrewを用いてC/Migemoをインストールします．以下のコマンドを実行するだけです．

```bash
brew install cmigemo
```

Linux(例えばUbuntu)でインストールする場合は，以下を実行します．

```bash
sudo apt install -y cmigemo
```

# migemo-search.vimをインストール
筆者はVim-Plugを用いてVimのプラグインを管理しています．よってVim-Plugによるインストール方法を記載しますが，お使いのプラグイン管理ツールに合った方法でインストールしてください．Vim-Plugの場合は`.vimrc`に以下を追記します．

```vimscript:.vimrcに追記する内容
call plug#begin()
Plug 'rhysd/migemo-search.vim'
call plug#end()
```

一度Vimを再起動し，`:PlugInstall`コマンドを実行します．これでインストール完了です．

# migemo-search.vimを有効化
`.vimrc`に以下を追記します．GitHubの公式リポジトリのREADMEの記載と若干異なります．これは公式のREADMEの記載内容で有効化するとMigemoで検索した結果が検索対象の本文に反映させるために余分にEnterを打鍵しなければならなくなるためです．

```vimscript:以下を.vimrcに追記
if executable('cmigemo')
    cnoremap <expr><CR> migemosearch#replace_search_word()."\<CR>\<CR>"
endif
```

## 2022/10/11追記
上記の方法では困った事が発生します．Vimではコマンドモードで`:行番号`を入力すると指定の行にジャンプできますが，そのジャンプが指定した行よりⅠ行下の行にジャンプしてしまうという問題です．これは困ったものです．その解決方法は．．．後述します．

# 検索テスト
以下の日本語テキストを仮にtest.txtという名前で保存し，検索をテストしてみましょう．


```text
今日は土曜日で天気は晴
```

* 検索例1: kyou
* 検索例2: doyoubi
* 検索例3: tenki
* 検索例4: hare


:warning: あくまで単語単位の検索となります．よって`kyouha`と検索するとヒットしなくなります．
:warning: 単語の対応が"いい加減"とのことです．よって検索パターンによってはヒットしない場合も有ります．（Migemo公式より)

検索結果が本文中にハイライトとして出力されれば成功です．

# まとめ
Vim上で日本語混じりのテキストを扱う場合に，日本語の単語でもアルファベット表記インクリメント検索に対応させるため，プラグイン`migemo-search.vim`の発掘，改修，PR,Mergeを経て無事アルファベット表記インクリメント検索に対応させることが出来ました．これを機会にVimScriptを含めてVimを再勉強してみようと思った次第です．

# 2022/10/11追記: もっと便利なプラグインを発見．これぞ正に最終解決策
vim-easymotion.vimというプラグインを発見しました．これで全ての問題は解決です．但し，最新のmacOS向けの修正が必要だったため，Issue+PRのサブミットをしています．(2022/10/11現在)

https://github.com/easymotion/vim-easymotion

公式READMEに従ってインストール後，以下を.vimrcに追加すれば一先ず利用出来ます．まだ全容を把握出来ていないため，今後研究を重ねて便利に利用していこうと思います．

```vimscript
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`に以下の修正を追加します．

```diff:辞書のPathを追加
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

```

https://github.com/easymotion/vim-easymotion/pull/492/files

# Reference

https://vim-jp.org/vimdoc-ja/

https://vim-jp.org/vim-users-jp/2010/01/08/Hack-115.html