## 事象
[[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
```