12月も中旬になってきて寒くなってきましたね
そろそろ雪が降ってくるころでしょうか。
floating windowを使って何かをやってみたかったので、
Neovimに雪を降らせてみました。
やったことは、 以下です。
- 背景が透明で●をランダムに入力したfloating windowを作成
- timerを使ってwindowの高さを下げる
- 画面最下部に到達した時点でwindowを削除
この時使ったfloating window関連や便利だったものをご紹介します。
作り方と動かし方
基本的に:h api-floatwin
で細かな内容を確認できます。
作り方
基本的に以下2つで新しくFloating Windowを作成します。
nvim_open_win
nvim_open_win(buffer, focus, config)
これでウィンドウを開くことができます。
ここにはバッファとウィンドウの場所や大きさなどの設定を渡すことができます。
ここで渡すバッファは次の方法で作成できます。
nvim_create_buf
これで新しいバッファを作ります。
戻り地でバッファIDを得られるのでこちらをnvim_open_win
に渡すと任意のバッファをFloating Windowで開くことができます。
動かし方
nvim_win_set_config
こちらに動かしたいバッファと設定を渡せば動かすことができます。
今回、雪が降ってくる動作のとき、redraw
が必要です。
使わない場合、関数実行したあとに描画がされないようです。
スムーズで任意のタイミングで描画させたい場合はいれる必要があります。
let config = {'relative': 1,'row': 2,'col': 2}
call nvim_win_set_config(win_id, config)
nvim_win_set_option
アクティブなウィンドウではset
コマンドを使えると思いますが、
非アクティブなウィンドウにもコマンド実行したいことがあると思います。
そんなときに便利な関数です。
ウィンドウIDとコマンドを引き数に実行すると任意のコマンドを適用できます。
call nvim_win_set_option(win_id, 'winblend', 40)
winblend
set windblend=100
の形でFloating Windowの背景を透明っぽく見せることができます。
「っぽく」というのは、重なった部分の色を混ぜて透明に見えるように
していて、実際に透けていないためです。
そのため、文字は透けず、一番上の文字が優先されています。
timer関数
雪を断続的に降らせるために使いました。
timer_start
以下のように間隔、関数、オプションを引き数に実行できます。
call timer_start(200, function("s:snow", [win_id]), { 'repeat': -1 })
自分で止めるまで関数実行し続けてほしかったため、repeat: -1
を使っています。
指定回数を設定することで任意の回数分実行できます。
timer_stop
上記のtimer_start
の戻り値を渡すことで実行を辞めることができます。
今回は以下のように配列に入れたtimer idをtimer_stop
にいれることで止めています。
let s:timers_list = []
call add(s:timer_list, timer_start(200, function("s:snow", [win_id]), { 'repeat': -1 }))
終わりに
いかがでしたでしょうか。
今回は遊んでみたのですが、これらを使ってファイルを見ながら開発をしたり、
付箋のようなメモスペースを作ったりと色々できるのかなと思いました。
読んでいただきありがとうございました。