TL; DR
こういうVim pluginを作りました。
https://github.com/hisaknown/nanomap.vim
Sublime TextにおけるMinimap
オシャレテキストエディタとして有名なSublime Textには、Minimapという機能があります。
画面の右側に出る、コードの縮小表示です。
私は主にVimを使っているのですが、Vimにもこういう機能が欲しいなあと常々思っていました。
偉大な先達たち
実はこれまでにもVimでMinimapしようとした人々はいらっしゃいます。
- https://github.com/koron/minimap-vim
- kaoriya-vimも配布しているKoRoNさんの実装
- Minimap対象のGVimに隣接させて、フォントサイズの小さいGVimを立ち上げるという
変態的な実装
- https://github.com/severin-lemaignan/vim-minimap
- Lemaignanさんの実装
- 別バッファでMinimapを表示する
- PythonのDrawilleを使って、そこそこ表現力の高いマップを実現している
問題点
- KoRoNさん実装
- GVimでしか動かない & GVim複数起動はちょっと……
- Lemaignanさん実装
- スクロールしていくと表示が崩れる…… @ GVim on Windows
- (そもそも論ですが) 元々のMinimapってカーソル周辺の縮小表示しかない (i.e. 大きいファイルが対象の場合、Minimap自体にスクロールが発生する) けど、どっちかというとカーソル周辺よりはファイル全体のoverviewが見たい
作ったもの
https://github.com/hisaknown/nanomap.vim
機能
- 対象バッファの右側に、細長いバッファをつくってファイル全体の密度を濃淡で表示
- Unicodeの上半分ブロック (▀) を使うことで、解像度を底上げ
- 現在の表示位置をハイライト表示
- マップの任意の行で
<CR>
すると該当行に移動 - (最近の流行りに乗って、
timer
とjob
を使って実装) - (
setbufline
も使っているので、最近のVim (たぶん8.0.1274
以降) でないと動かない)
Future work & Known issues
/
で検索したときに、どこにマッチがあるか表示したい- やればできそう
- syntaxとhighlihgtを大量に定義しているので (?)、マップの更新時 (デフォルトでは500msおき) に若干もたつくことがある
- これはどうにかしたいけれど、どうすれば良さそうか分からない……
- Workaroundとしては、使う色数を減らすとよいと思われる
- もうちょっと気の利いた配色を作りたい
おわりに
初Vim pluginなのでbuggyだと思われますが、ぜひ使ってみてください!