💤

Neovim:一定時間操作が無かったら何かやる設定の作り方

2024/04/12に公開

この記事はVim駅伝 2024/04/12の記事です。

レシピ

local debounce_timer = nil
local is_active = true

vim.on_key(function()
  if debounce_timer then
    debounce_timer:stop()
  end
  if not is_active then
    is_active = true
    -- 復帰したときの処理
  end
  debounce_timer = vim.defer_fn(function()
    if not is_active then
      return
    end
    is_active = false
    -- 放置されたときの処理
  end, 30 * 60 * 1000)
end)

コメントの部分は好きなように置き換えて下さい。

なぜ?

A. coc.nvimを落としたかったから。
よくエディタを開きっぱなしにしたまま放置するので、使っていないLS等がリソースを食っている状況でした。
自分の性格上エディタを使い終わったら閉じることは出来ないので、ならdotfilesに書いちゃおうと言う理由です。

実例

local debounce_timer = nil
local is_coc_active = true

vim.on_key(function()
  if debounce_timer then
    debounce_timer:stop()
  end
  if not is_coc_active then
    is_coc_active = true
    vim.cmd('call coc#rpc#start_server()')
    vim.notify('Coc started', vim.log.levels.INFO, { title = 'Coc Killer' })
  end
  debounce_timer = vim.defer_fn(function()
    if not is_coc_active then
      return
    end
    is_coc_active = false
    vim.cmd('call coc#rpc#stop()')
    vim.notify('Coc was killed', vim.log.levels.INFO, { title = 'Coc Killer' })
  end, 30 * 60 * 1000)
end)

Neovim組み込みのLSクライアントでも似たような事は出来ると思います。

最後に

多分もっと良い書き方があると思います。その時はコメントに書いてくれると助かります。
ありがとうございました。

GitHubで編集を提案

Discussion