From f7e633069283ab18dffd8821c6049d04f896c2e5 Mon Sep 17 00:00:00 2001 From: Zeroes1 Date: Tue, 21 Jul 2026 18:38:48 +0300 Subject: [PATCH] editor: eliminate brief [Loading...] flash on file open under Windows --- actions.go | 1 + async_buffer.go | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/actions.go b/actions.go index 7090ef5..0f3cdd3 100644 --- a/actions.go +++ b/actions.go @@ -367,6 +367,7 @@ func showEditor(pf *PanelsFrame, v vfs.VFS, path string, f vfs.ReadAtCloser) { if f != nil { buf = NewAsyncBuffer(context.Background(), f) + buf.prewarm() pt = piecetable.NewWithBuffer(buf) } else { pt = piecetable.New(nil) diff --git a/async_buffer.go b/async_buffer.go index a4e2242..618df01 100644 --- a/async_buffer.go +++ b/async_buffer.go @@ -45,6 +45,28 @@ func (b *AsyncBuffer) Size() int { return b.size } +// Prewarm synchronously loads the first chunk so the first render +// never sees ErrLoading, avoiding a brief [Loading...] flash. +func (b *AsyncBuffer) prewarm() { + if b.size == 0 { + return + } + sz := b.chunkSize + if sz > b.size { + sz = b.size + } + data := make([]byte, sz) + n, err := b.file.ReadAt(b.ctx, data, 0) + if b.ctx.Err() != nil { + return + } + b.mu.Lock() + defer b.mu.Unlock() + if err == nil || err == io.EOF { + b.loaded[0] = data[:n] + } +} + func (b *AsyncBuffer) Read(offset, length int) ([]byte, error) { if offset < 0 || offset >= b.size || length <= 0 { return nil, nil