ハイパーマッスルエンジニア

Vim、ShellScriptについてよく書く

Neovim: サクッとFloatingWindowにテキストを表示するプラグイン nvim-popup-message

github.com

https://github.com/Rasukarusan/blog-assets/blob/master/vim-popup-message/demo.gif?raw=true
:messagesの最後の行をサクッと表示している

これなに

  • NeoVim専用プラグイン
  • サクッとFloatingWindowを表示する
  • 現在カーソル位置のすぐ下(または上)にFloatingWindowを作成
  • カーソル移動したらウィンドウは即消える
  • 引数で渡したテキストをFloatingWindowに載せる

インストール

Plug 'Rasukarusan/vim-popup-message'

呼び出し方

call popup_message#open(<args>)に表示したいメッセージをいれてあげればOK。

" 'MM'と入力するとメッセージを表示する
nnoremap MM :call popup_message#open('Any messages!')<CR>

関数をぶち込んでもOK。

" メッセージを返す関数
function! s:get_message()
  return 'Any messages!'
endfunction

nnoremap MM :call popup_message#open(<SID>get_message())<CR>

なんで作ったか

  • FloatingWindowはめちゃくちゃ便利だけど作成が面倒
  • Pluginとしての構造でVimScriptを作ってみたかった

元々は「:messagesの最後の行だけFloatingWindowで表示する」というものを作っていたが、汎用的なものを求めた結果こうなった。

FloatingWindowはめちゃくちゃ便利だけど作成が面倒

FloatingWindowを作るには下記のような記述が必要になる。

let config = {
  \'relative': 'editor',
  \ 'row': row,
  \ 'col': col,
  \ 'width': width,
  \ 'height': height,
  \ 'anchor': 'NW',
  \ 'style': 'minimal',
  \}
let buf = nvim_create_buf(v:false, v:true)
let win_id = nvim_open_win(buf, v:true, config)

そこまで多くないと思うかもしれないが上記の他に、位置を示すrow, colや大きさを示すwidth, heightを決める必要があって、その計算がなかなか面倒。 現在カーソル位置のすぐ下にパッと出したいだけなのにいちいち計算しないといけないのがきつい。

Pluginとしての構造でVimScriptを作ってみたかった

今まで自作のVimScriptはvimrcに全部ぶちこんでいたので、Pluginとして作ってみたかった。あとvimrcに全部書くスタイルだと、共通で使いたい関数がある場合に記述場所を上の方にしないと不便など、面倒な問題がいくつか出てきたため。

Pluginの作り方については下記の記事が大変参考になった。

knowledge.sakura.ad.jp

終わり

カーソル移動やINSERTモードに入ったときに関数を呼ぶ、というのがどうやってやるのかがわかったり、プラグイン固有の変数の値をユーザーが設定できるようにする方法など結構知らなかったことを知れたのでやってよかった。