Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
5b2fdf7
fix: count and step a two-row file once in the panel
undont Sep 9, 2026
d7dc72e
feat: classify which lines of a HEAD-to-worktree diff the index holds
undont Sep 9, 2026
b68fb06
feat: build the text a partial stage should produce
undont Sep 9, 2026
d69b160
feat: show and stage an MM file as one HEAD-to-worktree diff
undont Sep 9, 2026
107e973
refactor: move the union marks under model
undont Sep 10, 2026
034de7e
fix: catch staged lines the HEAD-to-worktree diff hides
undont Sep 10, 2026
69c637f
fix: keep one per-line staged state and let u reach partial hunks
undont Sep 10, 2026
8733756
feat: give every changed path one row diffing HEAD-to-worktree
undont Sep 10, 2026
3d8ef4b
feat: add the dw local view and a ! gutter mark for hidden staged con…
undont Sep 10, 2026
7c756b6
feat: tally staged and partial hunks in the diff winbar
undont Sep 10, 2026
ecd62fd
fix: keep the winbar tally current and hide it once every hunk is staged
undont Sep 10, 2026
148b035
feat: preview the commit from the panel on gs
undont Sep 10, 2026
5709512
feat: let u drop and X revert hunks in the dw local view
undont Sep 11, 2026
dabb0e2
feat: revert staged hunks with X in the gs commit preview
undont Sep 11, 2026
4e916ea
refactor: stage through one whole-hunk splice
undont Sep 11, 2026
290df17
fix: reach an insertion staged at the edge of a hunk
undont Sep 11, 2026
cb2ae2c
fix: refuse a hunk op that would reach the next hunk
undont Sep 11, 2026
9bb947f
fix: revert a staged hunk at the file's own line numbers
undont Sep 11, 2026
eb1f4c0
fix: refuse frozen staging over an index changed outside differ
undont Sep 11, 2026
93df02c
fix: pass git literal paths and read symlinks as their target
undont Sep 11, 2026
20430d6
refactor: share the status row builder and drop dead staging paths
undont Sep 11, 2026
89f4b4e
test: fail a spec that opens a panel on the suite's own repo
undont Sep 11, 2026
5ff7d03
feat: read which whole hunks an index splices into HEAD
undont Sep 14, 2026
be09216
fix: stage and mark by whole hunk when the index is one
undont Sep 14, 2026
59b104b
test: pin hunk staging where the index diff pairs lines apart
undont Sep 14, 2026
2e4233b
fix: stage partial hunks by the index's own lines
undont Sep 14, 2026
6e9d3d4
fix: stage and unstage the whole file at once on S and U
undont Sep 14, 2026
9895adf
fix: point a shared staged change at dw
undont Sep 14, 2026
099b257
fix: refuse staging on a diff drawn before the file changed
undont Sep 14, 2026
42058c5
fix: cut the index by whole hunks first when repeated lines fit two ways
undont Sep 15, 2026
381641d
fix: place u on a ! hunk by the index the local view has written
undont Sep 15, 2026
f7ae631
fix: re-mark the diff after an outside stage that leaves the row unch…
undont Sep 15, 2026
cd36588
fix: read the index as stage 0 and refuse an op when it can't be read
undont Sep 15, 2026
6a44cd1
fix: diff a final newline change as the last line's hunk
undont Sep 15, 2026
d2aefb5
refactor: read a last line and its ending as one line when staging
undont Sep 15, 2026
4a96e76
feat: note a changed last line that has no newline after it
undont Sep 16, 2026
089f35b
refactor: move the staging decisions into model/stage.lua
undont Sep 16, 2026
7883457
refactor: write the revert sequence, whole-file revert and index path…
undont Sep 16, 2026
454f602
refactor: read staged state through a view tally and an entry's revie…
undont Sep 16, 2026
44cd7e1
refactor: drop the unread hidden reasons and the dead pairs field
undont Sep 16, 2026
acb1b5d
refactor: split git exec, index and staging out of the panel session
undont Sep 16, 2026
6b892d8
feat: flip the commit preview from the diff as well as the panel
undont Sep 16, 2026
2be1369
feat: open a row's local view from the panel with dw
undont Sep 16, 2026
cb686d1
fix: draw a staged change the worktree put back as HEAD-to-index hunks
undont Sep 16, 2026
65252ee
fix: confirm before u drops staged content no other side holds
undont Sep 16, 2026
2a89e75
refactor: narrow apply_patch to the worktree revert it is
undont Sep 16, 2026
29ae633
test: open the panel and answer confirms through shared helpers
undont Sep 16, 2026
cab85df
test: close a leaked panel between staging specs and cover the untest…
undont Sep 16, 2026
16fb38f
feat: leave the local view once its last hunk is staged
undont Sep 16, 2026
a50cf7f
docs: name both surfaces for the dw and gs keys
undont Sep 17, 2026
53bd24f
fix: discard a commit preview row by the letter the preview gives it
undont Sep 17, 2026
4f78dc4
fix: discard an add, copy or rename whose new path is gone from disk
undont Sep 17, 2026
19c5982
fix: stop cutting an index into hunk blocks past a step limit
undont Sep 17, 2026
476be86
test: pin a partial block's shared line as HEAD's
undont Sep 17, 2026
bebbdfe
test: return the prompt from confirming and drop under_confirm
undont Sep 17, 2026
c550593
fix: unstage both ends of a staged rename whose new path is gone
undont Sep 17, 2026
37fd281
fix: draw a staged add whose file was deleted as HEAD-to-index
undont Sep 17, 2026
bd2aa64
fix: take the mode of the side S and U stage
undont Sep 17, 2026
54cba47
fix: badge the HEAD-to-index fallback INDEX and shorten the winbar notes
undont Sep 18, 2026
7b3294e
fix: describe a kept deletion's copy on disk instead of pointing at u
undont Sep 18, 2026
1ff97c1
fix: stage a staged rename's old path without git add refusing it
undont Sep 18, 2026
6512a2c
fix: walk s and u through the list once and end where nothing is left
undont Sep 18, 2026
137aaf7
fix: refuse a hunk no pair can move on its own instead of rewriting t…
undont Sep 20, 2026
8364aa4
fix: let X reach the rows it is offered on, and refuse before the prompt
undont Sep 20, 2026
ad7b109
fix: end the walk with a count only of rows its local view can answer
undont Sep 20, 2026
dac0749
refactor: mark a missing final newline in the gutter, not after the line
undont Sep 20, 2026
b4044ba
docs: close off 0.1.45 and describe staging on one row
undont Sep 20, 2026
5a58e70
fix: offer dw as soon as the first s leaves a row partly staged
undont Sep 23, 2026
3e0a31c
test: pin the identity on the conflict spec's merge so a bare runner …
undont Sep 23, 2026
571e5c0
docs: re-record the demo on the one-row staging
undont Sep 23, 2026
16dbd03
feat: stop the s walk on changes only the local view shows
undont Sep 27, 2026
33d39ac
feat: drop and revert a whole-file local view's change with u and X
undont Sep 27, 2026
17ba95d
feat: revert a mode change or a binary file from the full diff with X
undont Sep 27, 2026
bf67307
fix: refuse X in the commit preview when it would discard unstaged ch…
undont Sep 27, 2026
fdf7587
fix: place X in the commit preview against the index the view opened on
undont Sep 27, 2026
445a901
feat: confirm u and U before they drop staged content nothing else holds
undont Sep 28, 2026
bb66bc6
fix: take back only the lines a ! hunk rewrote, and name the block wh…
undont Sep 28, 2026
d676137
fix: re-read a whole-file row after s or u so the next key acts on it…
undont Sep 28, 2026
d039972
fix: walk u onto ! hunks, keep a refused S or U on the file, and step…
undont Sep 28, 2026
0528968
fix: make the panel's s and X agree with the diff on deleted, kept an…
undont Sep 28, 2026
bf3820b
fix: refuse X and u before their prompts, and say plainly why a key d…
undont Sep 28, 2026
6a7c0aa
feat: bind the commit preview to ds, beside dw
undont Sep 28, 2026
76d8d43
fix: mark a missing final newline only where the two sides end differ…
undont Sep 28, 2026
fd674f1
docs: describe the walk, confirms and X fixes in the changelog
undont Sep 28, 2026
4a69283
fix: ask before u drops staged lines when the index also holds a mode…
undont Sep 29, 2026
d1a0aef
fix: let u in a local view unstage an add that changed again on disk
undont Sep 29, 2026
78e20e5
fix: stage a typechange row with staged content as a whole file
undont Sep 29, 2026
20cc3b6
fix: ask before panel u or U drops staged content nothing else holds
undont Sep 29, 2026
7e16bbb
fix: refuse commit-preview s or u on a whole-file row once the index …
undont Sep 29, 2026
3362a09
refactor: move the local view's staging into staging.lua
undont Sep 29, 2026
c779e75
fix: ask before s or S drops staged content, and reword the staging m…
undont Oct 8, 2026
18330d1
fix: reword the merge tool, sidecar, command and PR messages
undont Oct 8, 2026
f4aaa7c
docs: describe the stage confirm and message rewording in the changelog
undont Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .demo/demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified .demo/demo.mp4
Binary file not shown.
33 changes: 33 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,39 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

### Added

- `dw` in the diff or the panel shows a partly staged file's changes since staging, works as a toggle
- `ds` in the panel or the diff previews the commit: only the staged changes, each diffed against `HEAD`, also works as a toggle
- `s` and `u` act on a hunk the index holds only part of, and the diff winbar tallies staged and partial hunks
- `X` in the diff reverts a file whose only change is its mode, and a binary file

### Changed

- A file changed in both the index and the worktree lists once now, under a new `Partial` section, and its diff shows the whole change with the staged lines shaded
- Staged content that can't be shown in the standard diff is marked `!`, openable by `dw`
- `X` on a hunk discards it from the index and the file together, instead of asking you to unstage it first
- `s` and `u` walk the change set once and end with what is left, and `s` stops on a file whose remaining change only `dw` shows until you finish it there or leave it with `]f`
- `s`, `S`, `u` and `U` ask before dropping staged content that neither `HEAD` nor the file on disk holds
- Prompts and notices say plainly what an action loses, or why it did nothing and where to do it instead
- `X` in the panel on a staged edit whose file was then deleted brings it back as staged, instead of resetting it to `HEAD`

### Fixed

- A change to a file's final newline showed only a notice. It now shows as a hunk on the last line, with a `¬` in the gutter on whichever side ends without one
- A file whose name holds glob characters, or starts with a digit and a colon, could stage or diff the wrong content, and a symlink diffed the content it points at
- Staging a renamed file from the panel reported "stage failed" although the rename was staged
- Discarding a staged rename or add whose file had been deleted from disk failed
- A file swapped for a symlink refused every staging key in the diff
- `s` in the panel on a staged deletion reported "stage failed"
- `X` in the panel on a submodule asked to discard it and then did nothing. It now says why
- A sidecar that failed to start or kept crashing reported the error twice
- Submitting a review after the PR head moved showed two warnings
- `gh` errors that already said to run `gh auth login` repeated the advice
- Git errors in notices ended with a blank line

## [0.1.45] — 2026-09-12

### Added

- `context` accepts `"full"` in config, matching `:Differ context full`, and it is now the default (`math.huge` still works)
- A fold you open in the diff view stays open for the rest of the session, including when you come back to its file

Expand Down
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ require("differ").setup({

-- diffs
toggle_layout = "dl", -- flip between stacked / split
toggle_local = "dw", -- diff/panel: a partly staged file's changes since staging, and back
commit_preview = "ds", -- panel/diff: only the staged changes, each as HEAD↔index, and back
more_context = "d=", less_context = "d-",
stage = "s", unstage = "u", -- stage/unstage[all] work on hunks/files (diff buffer/panel)
stage_all = "S", unstage_all = "U",
Expand Down Expand Up @@ -224,6 +226,14 @@ The highlight groups differ defines are listed in [recipes](RECIPES.md#highlight

Sources with worktree on the new side (`:Differ`, `:Differ <rev>`, `:Differ <a>...`) also list untracked files. `git diff` can't see them whatever refs you pass it, so differ unions in `git ls-files --others --exclude-standard` to bring them in with the other changes.

### Staging

Every changed path takes only one row. Its diff spans `HEAD` to the worktree, with the lines already in the index shaded, and each row can either be `Conflicts`, `Staged`, `Unstaged`, `Partial` (not fully staged file) or `Untracked`. In the diff, `s` and `u` stage and unstage a hunk respectively, with repeated presses walking through/back your hunks; `X` discards a hunk on both sides (effectively hard resetting the hunk). Similarly in the panel, `s` and `u` stage and unstage entire rows/files (works on sections, directories and individual rows). `S` and `U` are available in both contexts as stage/unstage-all.

Certain changes can't be displayed in that span, e.g. a change staged and then put back on disk, or a staged and then further modified hunk. Those hunks carry a `!` in the gutter and the winbar says how many exist in the current file. `dw` opens a view to show what changed since staging, where they show as hunks of their own. `ds` opens a view of **only** the files with staged changes, each diffed against the index, i.e. what is about to be committed, where `u` takes one back out.

A hunk on a file's last line whose final newline differs between the two sides carries a `¬` in the gutter on the side that ends without one, since the two lines otherwise read the same.

### Runtime controls

| Command | Effect |
Expand Down
2 changes: 2 additions & 0 deletions RECIPES.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ Every group is defined with `default = true`, so a `:highlight` of your own wins
| `differStagedWordAdd` / `differStagedWordDelete` | the word patch inside a staged line |
| `differStagedLine` | a staged line with no add/delete kind (links `CursorLine`) |
| `differStagedSign` | the staged-hunk gutter glyph |
| `differHiddenSign` | the `!` gutter glyph on a hunk holding staged content the diff can't show |
| `differNoEol` | the `¬` gutter glyph on a line its side ends on with no newline |

### File panel

Expand Down
7 changes: 7 additions & 0 deletions doc/differ-recipes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,13 @@ STAGING *differ-recipes-highlight-groups-staging*
kind (links CursorLine)

differStagedSign the staged-hunk gutter glyph

differHiddenSign the ! gutter glyph on a hunk
holding staged content the diff
can’t show

differNoEol the ¬ gutter glyph on a line its
side ends on with no newline
-----------------------------------------------------------------------

FILE PANEL *differ-recipes-highlight-groups-file-panel*
Expand Down
28 changes: 28 additions & 0 deletions doc/differ.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Table of Contents *differ-table-of-contents*
- Other managers |differ-installation-other-managers|
4. Configuration |differ-configuration|
5. Usage |differ-usage|
- Staging |differ-usage-staging|
- Runtime controls |differ-usage-runtime-controls|
- PR review |differ-usage-pr-review|
- Session and sidecar commands |differ-usage-session-and-sidecar-commands|
Expand Down Expand Up @@ -200,6 +201,8 @@ you’re in doubt, `:Differ sidecar` reports which one is actually running.

-- diffs
toggle_layout = "dl", -- flip between stacked / split
toggle_local = "dw", -- diff/panel: a partly staged file's changes since staging, and back
commit_preview = "ds", -- panel/diff: only the staged changes, each as HEAD↔index, and back
more_context = "d=", less_context = "d-",
stage = "s", unstage = "u", -- stage/unstage[all] work on hunks/files (diff buffer/panel)
stage_all = "S", unstage_all = "U",
Expand Down Expand Up @@ -286,6 +289,31 @@ you pass it, so differ unions in `git ls-files --others --exclude-standard` to
bring them in with the other changes.


STAGING *differ-usage-staging*

Every changed path takes only one row. Its diff spans `HEAD` to the worktree,
with the lines already in the index shaded, and each row can either be
`Conflicts`, `Staged`, `Unstaged`, `Partial` (not fully staged file) or
`Untracked`. In the diff, `s` and `u` stage and unstage a hunk respectively,
with repeated presses walking through/back your hunks; `X` discards a hunk on
both sides (effectively hard resetting the hunk). Similarly in the panel, `s`
and `u` stage and unstage entire rows/files (works on sections, directories and
individual rows). `S` and `U` are available in both contexts as
stage/unstage-all.

Certain changes can’t be displayed in that span, e.g. a change staged and
then put back on disk, or a staged and then further modified hunk. Those hunks
carry a `!` in the gutter and the winbar says how many exist in the current
file. `dw` opens a view to show what changed since staging, where they show as
hunks of their own. `ds` opens a view of **only** the files with staged
changes, each diffed against the index, i.e. what is about to be committed,
where `u` takes one back out.

A hunk on a file’s last line whose final newline differs between the two
sides carries a `¬` in the gutter on the side that ends without one, since the
two lines otherwise read the same.


RUNTIME CONTROLS *differ-usage-runtime-controls*

------------------------------------------------------------------------------
Expand Down
17 changes: 10 additions & 7 deletions lua/differ/command.lua
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ end
function M.layout(arg)
local view = require("differ").active_view()
if not view then
return notify("no diff view here", vim.log.levels.WARN)
return notify("no differ view open", vim.log.levels.WARN)
end
if arg == nil or arg == "" then
view:toggle_layout()
elseif arg == "stacked" or arg == "split" then
view:set_layout(arg)
else
notify("layout: expected 'stacked' or 'split'", vim.log.levels.ERROR)
notify("layout: expected 'stacked' or 'split'", vim.log.levels.WARN)
end
end

Expand All @@ -30,7 +30,7 @@ end
function M.context(arg)
local view = require("differ").active_view()
if not view then
return notify("no diff view here", vim.log.levels.WARN)
return notify("no differ view open", vim.log.levels.WARN)
end
if arg == "full" then
view:set_context(math.huge)
Expand All @@ -41,7 +41,7 @@ function M.context(arg)
else
local n = tonumber(arg)
if not n then
return notify("context: expected a number, 'full', '+' or '-'", vim.log.levels.ERROR)
return notify("context: expected a number, 'full', '+' or '-'", vim.log.levels.WARN)
end
view:set_context(math.max(0, math.floor(n)))
end
Expand Down Expand Up @@ -270,15 +270,18 @@ function M.sidecar(arg)
if err then
-- a spawn/handshake failure already carries the binary's own stderr; a
-- protocol-level one doesn't, so fall back to whatever it last said
local msg = "sidecar: " .. (err.message or err.code)
local msg = err.message or err.code
if not vim.startswith(msg, "sidecar") then -- transport errors already say so
msg = "sidecar: " .. msg
end
local exit = sidecar.last_exit()
if not msg:find("\n", 1, true) and exit then
msg = sidecar.with_tail(msg, exit.stderr)
end
return notify(msg, vim.log.levels.ERROR)
end
notify(
("sidecar ok — binary %s, protocol %d"):format(info.binary or "?", info.protocol or 0)
("sidecar ok: binary %s, protocol %d"):format(info.binary or "?", info.protocol or 0)
)
end)
end
Expand All @@ -287,7 +290,7 @@ end
---@param arg string|nil
function M.cache(arg)
if arg ~= "clear" then
return notify("cache: expected 'clear'", vim.log.levels.ERROR)
return notify("cache: expected 'clear'", vim.log.levels.WARN)
end
require("differ.sidecar").request("cache_clear", nil, function(err)
if err then
Expand Down
2 changes: 2 additions & 0 deletions lua/differ/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,8 @@ M.defaults = {
close = "dc", -- diff/panel/history: end the session (merge, pr or local)
toggle_panel = "dd", -- diff/panel: hide/show the file panel sidebar
toggle_layout = "dl", -- diff: flip stacked / split
toggle_local = "dw", -- diff/panel: a partly staged file's changes since staging, and back
commit_preview = "ds", -- panel/diff: list only what a commit would take, HEAD↔index rows
-- merge tool, bound on the result buffer. nav + take-this resolution,
-- the result buffer is the real worktree
-- file and stays editable, so the whole choose family sits behind <leader>
Expand Down
128 changes: 128 additions & 0 deletions lua/differ/git/exec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
-- spawning git, and telling the user (or a stale buffer) about it. every git module
-- runs through here, so the argv prefix and the message shape sit in one place

local M = {}

-- every path differ hands git is a real file name, never a glob
M.GIT = { "git", "--literal-pathspecs" }

---@param msg string
---@param level integer|nil
function M.notify(msg, level)
vim.notify("differ: " .. msg, level or vim.log.levels.INFO)
end

-- spawn git and wait. vim.system raises when the process can't start, so that comes
-- back as `err`; a nil res with no err is wait() answering nothing at all
---@param cmd string[]
---@param opts table
---@return { code: integer, stdout: string|nil, stderr: string|nil }|nil res, string|nil err
local function run(cmd, opts)
local ok, obj = pcall(vim.system, cmd, opts)
if not ok then
return nil, tostring(obj)
end
return obj:wait()
end

-- run git in `cwd`: stdout on success, nil + stderr on failure. `text = true`
-- normalises `\r\n`, which is right for plumbing output but would corrupt file content
-- read via `git show`; content reads use git_raw instead
---@param args string[]
---@param cwd string
---@param opts? { timeout?: integer, env?: table<string, string> }
---@return string|nil stdout, string|nil stderr
function M.git(args, cwd, opts)
local cmd = vim.list_extend({}, M.GIT)
vim.list_extend(cmd, args)
opts = opts or {}
local res, err = run(cmd, {
cwd = cwd,
text = true,
timeout = opts.timeout,
env = opts.env,
})
if err then
return nil, err -- never started
end
-- a killed process exits 124 with an empty stderr, or answers nothing at all when a
-- child outlives it holding the pipes. both are the budget, and neither says so
if opts.timeout and (not res or res.code == 124) then
return nil, ("git %s timed out after %ds"):format(args[1], opts.timeout / 1000)
end
if not res then
return nil, "git exited without a result"
end
if res.code ~= 0 then
return nil, res.stderr
end
return res.stdout
end

-- like `git`, but byte-true stdout (CRLF kept): for content reads (`git show` on the
-- index, a rev, a conflict stage), never for plumbing output
---@param args string[]
---@param cwd string
---@return string|nil stdout, string|nil stderr
function M.git_raw(args, cwd)
local cmd = vim.list_extend({}, M.GIT)
vim.list_extend(cmd, args)
local res, err = run(cmd, { cwd = cwd })
if not res then
return nil, err
end
if res.code ~= 0 then
return nil, res.stderr
end
return res.stdout
end

-- run git and report a failure where the user can see it. the wrapper owns the message,
-- so a caller branching on the boolean alone can't swallow one
---@param args string[]
---@param cwd string
---@param what string -- names the operation in the message
---@return boolean ok
function M.git_ok(args, cwd, what)
local out, err = M.git(args, cwd) -- nil out is exactly a non-zero exit; stderr can be empty
if not out then
M.notify(M.with_stderr(what .. " failed", err), vim.log.levels.ERROR)
return false
end
return true
end

-- `lead`, followed by what git said when it said anything
---@param lead string
---@param stderr string|nil
---@return string
function M.with_stderr(lead, stderr)
local said = vim.trim(stderr or "")
if said == "" then
return lead
end
return lead .. ": " .. said
end

-- strip trailing whitespace from a git output line (e.g. rev-parse, show, log)
---@param s string
---@return string
function M.chomp(s)
return (s:gsub("%s+$", ""))
end

-- a buffer on a file differ just rewrote keeps the old content until something checks,
-- and a window switch doesn't. checktime leaves unsaved edits alone, so fire it always
---@param root string
---@param relpath string
function M.reload_buffer(root, relpath)
local buf = require("differ.util.buf").find(root .. "/" .. relpath)
if buf and vim.api.nvim_buf_is_loaded(buf) then
-- silent!: the file may be gone entirely (a discarded untracked file)
pcall(vim.api.nvim_buf_call, buf, function()
vim.cmd("silent! checktime")
end)
end
end

return M
Loading
Loading