LoginSignup
8
0

More than 1 year has passed since last update.

Neovimに雪を降らせてみた

Last updated at Posted at 2022-12-16

12月も中旬になってきて寒くなってきましたね
そろそろ雪が降ってくるころでしょうか。

snow_vim.gif

floating windowを使って何かをやってみたかったので、
Neovimに雪を降らせてみました。
やったことは、 以下です。

  1. 背景が透明で●をランダムに入力したfloating windowを作成
  2. timerを使ってwindowの高さを下げる
  3. 画面最下部に到達した時点で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とコマンドを引き数に実行すると任意のコマンドを適用できます。

例 init.lua
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 }))

終わりに

いかがでしたでしょうか。
今回は遊んでみたのですが、これらを使ってファイルを見ながら開発をしたり、
付箋のようなメモスペースを作ったりと色々できるのかなと思いました。
読んでいただきありがとうございました。

8
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0