## 事象 [[snacks.dashboard]]を開き、`Snacks.dashboard.pick('files')` で選択したファイルが開かれる直前に、ダッシュボードの内容がチラっと表示されてしまう。以下動画の `00:00:03` の部分。 ![[2025-03-30-14-33-13.webm]] ### 設定 ```lua local dashboardImagePath = vim.fn.stdpath("config") .. "/lua/snacks/dashboard.png" return { "folke/snacks.nvim", -- stylua: ignore start lazy = false, keys = { { "<C-j>f", function() Snacks.picker.files() end, silent = true }, }, -- stylua: ignore end opts = { dashboard = { row = 10, preset = { keys = { { icon = " ", key = "f", desc = "files", action = ":lua Snacks.dashboard.pick('files')", }, }, }, sections = { { section = "terminal", cmd = "chafa " .. dashboardImagePath .. " --size 48 --symbols vhalf; sleep .1", height = 30, padding = 0, }, { pane = 2, { section = "header" }, { section = "keys", gap = 1, padding = 1 }, { section = "startup" }, }, }, }, picker = { main = { current = true, }, }, }, } ``` ### 環境 | 対象 | バージョン | | --------------- | ----------- | | [[Ubuntu]] | 24.04.1 LTS | | [[Neovim]] | 0.10.3 | | [[chafa]] | 1.14.0 | | [[snacks.nvim]] | bc0630e | ## 原因 恐らくだが、[[snacks.picker]]でファイルを選択してから、それが新しい[[バッファ (Vim)|バッファ]]として開かれるまでの間に一瞬の間があり、[[フローティングウィンドウ (Neovim)|フローティングウィンドウ]]が閉じた直後にダッシュボードのコンテンツが描画されてしまっているためと思われる。 [[snacks.picker]]のREADMEには以下のように非同期処理についての言及もある。 > 💪 Finders and matchers run asynchronously for maximum performance > *[snacks\.nvim/docs/picker\.md at main · folke/snacks\.nvim](https://github.com/folke/snacks.nvim/blob/main/docs/picker.md)* ソースコードもいじってみたが、結局よく分からず...。 ## 解決方法 不明。 ## 回避策 [[snacks.dashboard]]から[[snacks.picker]]を起動したあとに、ダッシュボードの[[バッファ (Vim)|バッファ]]を削除する処理を入れる。これなら元のダッシュボードバッファを描画する処理が走らないため、一瞬チラつく現象は起こらない。 ```lua -- dashboard で picker を開いて移動する際に発生するチラツキを防止する local preventFlicker = function(handler) vim.schedule(function() Snacks.bufdelete() end) vim.schedule(function() vim.cmd([[:NoNeckPain]]) vim.cmd([[:BarbarEnable]]) end) vim.schedule(function() handler() end) end ``` ```lua opts = { dashboard = { row = 10, preset = { keys = { { icon = " ", key = "f", desc = "files", action = function() preventFlicker(Snacks.picker.files) end, }, }, }, ``` ### vim.scheduleについて `preventFlicker` の中で [[vim.schedule]] を呼び出しているのは、[[バッファ (Vim)|バッファ]]削除+[[snacks.picker]]のオープンをできるだけ最後に実行するため。以下のように実装すると、[[snacks.picker]]が表示される直前に、ダッシュボードの画像が左上に一瞬移動して別のチラつきが発生してしまう。(原因はちゃんと分かっていない) ```lua local preventFlicker = function(handler) Snacks.bufdelete() handler() end ``` また、以下のように単一の [[vim.schedule]] に処理をまとめると、[[no-neck-pain.nvim]]が上手く初期化されずエラーになってしまう。(コマンドによる) ```lua local preventFlicker = function(handler) vim.schedule(function() Snacks.bufdelete() vim.cmd([[:NoNeckPain]]) vim.cmd([[:BarbarEnable]]) handler() end) end ```