@ 261105.2

251129.33 · 2cf1c8e50ef4e54d938d07a19dde815cee8fb8f6

feat: new picker for `undotree`

reading declarations

OPTIONS.md

@@ -1179,6 +1179,10 @@ Search `:tags`  Neovim's autocmds +#### undotree++History undo tree+ #### keymaps  Neovims key mappings

README.md

@@ -333,6 +333,7 @@ Fzf-Lua conveniently comes with a VS-Code like picker by default | `spellcheck`           | misspelled words in buffer                    | | `spell_suggest`        | spelling suggestions                          | | `packadd`              | :packadd <package>                            |+| `undotree`             | history undo tree                             |  </details> <details>

doc/fzf-lua-opts.txt

@@ -1,4 +1,4 @@-*fzf-lua-opts.txt*       For Neovim >= 0.8.0      Last change: 2025 October 02+*fzf-lua-opts.txt*       For Neovim >= 0.8.0      Last change: 2025 October 24  ============================================================================== Table of Contents                             *fzf-lua-opts-table-of-contents*@@ -1626,6 +1626,12 @@ Neovim's autocmds                                                                                 +undo                                                       *fzf-lua-opts-undo*++History undo tree+++                                                                               keymaps                                                 *fzf-lua-opts-keymaps*  Neovims key mappings

lua/fzf-lua/actions.lua

@@ -1327,17 +1327,23 @@ M.zoxide_cd = function(selected, opts)   end end +M.undo = function(selected, _opts)+  if not selected[1] then return end+  local seq = selected[1]:match("%d+")+  vim.cmd.undo({ seq, mods = { silent = true } })+  utils.info("Undo jump to %s.", seq == "0" and "origin" or "change #" .. tostring(seq))+end -local parse_entry    = function(e) return e and e:match("%((.-)%)") or nil end+local parse_entry = function(e) return e and e:match("%((.-)%)") or nil end -M.serverlist_kill    = function(sel)+M.serverlist_kill = function(sel)   vim.iter(sel):map(parse_entry):each(function(addr)     local ok, err = utils.rpcexec(addr, "nvim_exec2", "qa!", {})     assert(ok or tostring(err):match("Invalid channel"), err)   end) end -M.serverlist_spawn   = function()+M.serverlist_spawn = function()   libuv.uv_spawn(     vim.fn.exepath("nvim"), { args = { "--headless" }, env = { NVIM = "" } }) end

lua/fzf-lua/config.lua

@@ -1061,6 +1061,7 @@ M._action_to_helpstr = {   -- [actions.buf_switch_or_edit]  = "buffer-switch-or-edit",   [actions.buf_del]              = "buffer-delete",   [actions.run_builtin]          = "run-builtin",+  [actions.undo]                 = "undo-jump",   [actions.ex_run]               = "edit-cmd",   [actions.ex_run_cr]            = "exec-cmd",   [actions.exec_menu]            = "exec-menu",

lua/fzf-lua/defaults.lua

@@ -315,6 +315,27 @@ M.defaults        = {       diff_opts = { ctxlen = 3 },       pager     = M._preview_pager_fn,     },+    ---@class fzf-lua.config.UndotreePreviewer: fzf-lua.config.Previewer+    undotree = {+      _ctor     = previewers.builtin.undotree,+      diff_opts = { ctxlen = 5 },+      show_buf  = false,+    },+    undotree_native = {+      _ctor     = previewers.fzf.undotree,+      diff_opts = { ctxlen = 5 },+      pager     = M._preview_pager_fn,+    },+    -- convenient aliaes+    undo = {+      _ctor     = previewers.builtin.undotree,+      diff_opts = { ctxlen = 5 },+    },+    undo_native = {+      _ctor     = previewers.fzf.undotree,+      diff_opts = { ctxlen = 5 },+      pager     = M._preview_pager_fn,+    },   },   formatters    = {     path = {@@ -1506,6 +1527,18 @@ M.defaults.autocmds              = {   }, } +---@class fzf-lua.config.Undotree: fzf-lua.config.Base+---@field __locate_pos? integer+M.defaults.undotree              = {+  previewer      = "undotree",+  locate         = true,+  fzf_opts       = { ["--no-multi"] = true },+  actions        = { ["enter"] = actions.undo },+  _cached_hls    = { "buf_linenr", "buf_name", "path_linenr", "dir_part" },+  _resume_reload = true,+  keymap         = { builtin = { ["<F8>"] = "toggle-preview-undo" } },+}+ ---@class fzf-lua.config.CommandHistory: fzf-lua.config.Base M.defaults.command_history       = {   fzf_opts    = { ["--tiebreak"] = "index", ["--no-multi"] = true },

lua/fzf-lua/init.lua

@@ -279,6 +279,7 @@ local lazyloaded_modules = {   git_worktrees = { "fzf-lua.providers.git", "worktrees" },   git_tags = { "fzf-lua.providers.git", "tags" },   oldfiles = { "fzf-lua.providers.oldfiles", "oldfiles" },+  undotree = { "fzf-lua.providers.undotree", "undotree" },   quickfix = { "fzf-lua.providers.quickfix", "quickfix" },   quickfix_stack = { "fzf-lua.providers.quickfix", "quickfix_stack" },   loclist = { "fzf-lua.providers.quickfix", "loclist" },@@ -439,6 +440,7 @@ end M._exported_wapi = {   toggle_preview_wrap = true,   toggle_preview_ts_ctx = true,+  toggle_preview_undo_diff = true,   preview_ts_ctx_inc_dec = true,   preview_scroll = true,   focus_preview = true,

lua/fzf-lua/previewer/builtin.lua

@@ -326,7 +326,8 @@ end  ---@param newbuf integer ---@param min_winopts boolean?-function Previewer.base:set_preview_buf(newbuf, min_winopts)+---@param no_wipe boolean?+function Previewer.base:set_preview_buf(newbuf, min_winopts, no_wipe)   if not self.win or not self.win:validate_preview() then return end   -- Set the preview window to the new buffer   local curbuf = api.nvim_win_get_buf(self.win.preview_winid)@@ -349,9 +350,11 @@ function Previewer.base:set_preview_buf(newbuf, min_winopts)     -- sets the style defined by `winopts.preview.winopts`     self:set_style_winopts()   end-  -- although the buffer has 'bufhidden:wipe' it sometimes doesn't-  -- get wiped when pressing `ctrl-g` too quickly-  self:safe_buf_delete(curbuf)+  if not no_wipe then+    -- although the buffer has 'bufhidden:wipe' it sometimes doesn't+    -- get wiped when pressing `ctrl-g` too quickly+    self:safe_buf_delete(curbuf)+  end end  ---@param bufnr integer

lua/fzf-lua/previewer/fzf.lua

@@ -9,6 +9,7 @@ local Object = require "fzf-lua.class" local Previewer = {}  ---@class fzf-lua.previewer.Fzf: fzf-lua.Object,{}+---@field close function Previewer.base = Object:extend()  -- Previewer base object@@ -39,6 +40,10 @@ function Previewer.base:setup_opts(opts)   return opts end +---@diagnostic disable-next-line: unused+function Previewer.base:close()+end+ ---@diagnostic disable-next-line: unused function Previewer.base:cmdline(_)   return ""

lua/fzf-lua/previewer/init.lua

@@ -10,6 +10,7 @@ Previewer.fzf.git_diff = function() return require "fzf-lua.previewer.fzf".git_d Previewer.fzf.man_pages = function() return require "fzf-lua.previewer.fzf".man_pages end Previewer.fzf.help_tags = function() return require "fzf-lua.previewer.fzf".help_tags end Previewer.fzf.codeaction = function() return require "fzf-lua.previewer.codeaction".native end+Previewer.fzf.undotree = function() return require "fzf-lua.providers.undotree".native end Previewer.fzf.nvim_server = function() return require "fzf-lua.previewer.fzf".nvim_server end  Previewer.builtin = {}@@ -27,6 +28,7 @@ Previewer.builtin.autocmds = function() return require "fzf-lua.previewer.builti Previewer.builtin.keymaps = function() return require "fzf-lua.previewer.builtin".keymaps end Previewer.builtin.nvim_options = function() return require "fzf-lua.previewer.builtin".nvim_options end Previewer.builtin.codeaction = function() return require "fzf-lua.previewer.codeaction".builtin end+Previewer.builtin.undotree = function() return require "fzf-lua.providers.undotree".builtin end  Previewer.swiper = {} Previewer.swiper.default = function() return require "fzf-lua.previewer.swiper".default end

lua/fzf-lua/providers/nvim.lua

@@ -828,4 +828,5 @@ M.serverlist = function(opts)     vim.defer_fn(function() f(cb) end, 50) -- wait for spawn/remote_exec?   end, opts) end+ return M

lua/fzf-lua/providers/undotree.lua

new file mode 100644@@ -0,0 +1,381 @@+---@diagnostic disable-next-line: deprecated+local uv = vim.uv or vim.loop+local core = require "fzf-lua.core"+local path = require "fzf-lua.path"+local utils = require "fzf-lua.utils"+local shell = require "fzf-lua.shell"+local config = require "fzf-lua.config"+local native = require("fzf-lua.previewer.fzf")+local builtin = require("fzf-lua.previewer.builtin")++local M = {}++-- neovim/runtime/pack/dist/opt/nvim.undotree/lua/undotree.lua++--- @param buf integer+--- @return vim.fn.undotree.entry[]+--- @return integer+local function get_undotree_entries(buf)+  local undotree = vim.fn.undotree(buf)+  local entries = undotree.entries++  --Maybe: `:undo 0` and then `undotree` to get seq 0 time+  table.insert(entries, 1, { seq = 0, time = -1 })++  return entries, undotree.seq_cur+end++--- @param ent vim.fn.undotree.entry[]+--- @param _tree vim.undotree.tree?+--- @param _last integer?+--- @return vim.undotree.tree+local function treefy(ent, _tree, _last)+  local tree = _tree or {}+  local last = _last or nil++  for idx, v in ipairs(ent) do+    local seq = v.seq++    if last then+      table.insert(tree[last].child, seq)+    else+      assert(idx == 1 and not _tree)+    end++    tree[seq] = { child = {}, time = v.time }+    if v.alt then+      assert(last)+      treefy(v.alt, tree, last)+    end+    last = seq+  end++  return tree+end++--- Returns the relative time from a given time+--- as ... ago+---@param time number+---@return string+function reltime(time)+  if time == -1 then+    return "origin"+  end+  local delta = os.time() - time+  local tpl = {+    { 1,             60,                "just now",     "just now" },+    { 60,            3600,              "a minute ago", "%d minutes ago" },+    { 3600,          3600 * 24,         "an hour ago",  "%d hours ago" },+    { 3600 * 24,     3600 * 24 * 7,     "yesterday",    "%d days ago" },+    { 3600 * 24 * 7, 3600 * 24 * 7 * 4, "a week ago",   "%d weeks ago" },+  }+  for _, v in ipairs(tpl) do+    if delta < v[2] then+      local value = math.floor(delta / v[1] + 0.5)+      return value == 1 and v[3] or v[4]:format(value)+    end+  end+  if os.date("%Y", time) == os.date("%Y") then+    ---@diagnostic disable-next-line: return-type-mismatch+    return os.date("%b %d", time) ---@type string+  end+  ---@diagnostic disable-next-line: return-type-mismatch+  return os.date("%b %d, %Y", time) ---@type string+end++---@diagnostic disable-next-line: unused+--- @param time integer+--- @return string+local function undo_fmt_time(time)+  if time == -1 then+    return "origin"+  end++  local diff = os.time() - time++  if diff >= 100 then+    if diff < (60 * 60 * 12) then+      return os.date("%H:%M:%S", time) --[[@as string]]+    else+      return os.date("%Y/%m/%d %H:%M:%S", time) --[[@as string]]+    end+  else+    return ("%d second%s ago"):format(diff, diff == 1 and "" or "s")+  end+end++---@diagnostic disable-next-line: duplicate-type+--- @class (partial) vim.undotree.tree.entry+--- @field traversed? boolean++--- @param opts fzf-lua.config.Undotree+--- @param cb function+--- @param tree vim.undotree.tree+--- @param nodes integer[]?+--- @param parents integer[]?+--- @param prefix string?+local function draw_tree(opts, cb, tree, nodes, parents, prefix)+  if not nodes or #nodes == 0 then return end+  local is_root = nodes[1] == 0+  prefix = prefix or ""+  parents = parents or {}+  table.sort(nodes)+  for i, n in ipairs(nodes) do+    local v = tree[n]+    local is_last = i == #nodes+    assert(not v.traversed)+    v.traversed = true+    -- TODO: IMHO the latter (flattened single) is nicer+    -- local is_single = #parents == 1 and #nodes == 1+    local is_single = #nodes == 1+    local node = utils.ansi_codes[opts.hls.dir_part](+          prefix .. ((is_root or is_single) and "" or is_last and "└── " or "├── "))+        .. utils.ansi_codes[opts.hls.buf_name](tostring(n))+    -- local w = 64 + string.len(node) - vim.fn.strwidth(node)+    cb(n, string.format("%s\t\t%s", node,+      utils.ansi_codes[opts.hls.path_linenr](reltime(v.time))))+    draw_tree(opts, cb, tree, v.child, nodes,+      prefix .. ((is_root or is_single) and "" or is_last and "    " or "│   "))+  end+end++---@param opts fzf-lua.config.Undotree|{}?+---@return thread?, string?, table?+M.undotree = function(opts)+  ---@type fzf-lua.config.Undotree+  opts = config.normalize_opts(opts, "undotree")+  if not opts then return end++  local contents = function(cb)+    coroutine.wrap(function()+      local co = coroutine.running()+      local entries, curseq = get_undotree_entries(utils.CTX().bufnr)+      local tree = treefy(entries)+      local count = 0++      local function add_entry(seq, e)+        count = count + 1+        if seq == curseq then+          opts.__locate_pos = count+        end+        cb(e, function(err)+          coroutine.resume(co)+          if err then cb(nil) end+        end)+        coroutine.yield()+      end++      draw_tree(opts, add_entry, tree, { 0 })++      cb(nil) -- EOF+    end)()+  end++  return core.fzf_exec(contents, opts)+end++--- @class fzf-lua.UndoInfo+--- @field buf integer buffer id+--- @field changedtick integer last change tick+--- @field tmp_buf integer tmp buffer id+--- @field tmp_file string tmp file path+--- @field tmp_undo string tmp undo file path++---+--- Credit to snacks.nvim:+--- copies the buffer to a temporary file and load the undo history.+--- This is done to prevent the current buffer from being modified,+--- also better for performance as it won't trigger LSP change tracking+---+--- @param buf integer buffer id+--- @return fzf-lua.UndoInfo+local function load_undo_buf(buf)+  local info = M._undoinfo or {}+  M._undoinfo = info+  -- do nothing if buffer is already loaded and unchanged+  local changedtick = vim.b[buf].changedtick+  if info.buf == buf and info.changedtick == changedtick then+    return info+  end+  -- always create a new tmp buffer+  if info.tmp_buf and vim.api.nvim_buf_is_valid(info.tmp_buf) then+    vim.api.nvim_buf_delete(info.tmp_buf, { force = true })+  end+  info.buf = buf+  info.changedtick = changedtick+  info.tmp_file = path.join({ vim.fn.stdpath("cache") --[[@as string]], "fzf-lua-undo" })+  info.tmp_undo = info.tmp_file .. ".undo"+  info.tmp_buf = vim.fn.bufadd(info.tmp_file)+  vim.bo[info.tmp_buf].swapfile = false+  vim.fn.writefile(vim.api.nvim_buf_get_lines(buf, 0, -1, false), info.tmp_file)+  vim.fn.bufload(info.tmp_buf)+  vim.api.nvim_buf_call(buf, function()+    vim.cmd("silent wundo! " .. info.tmp_undo)+  end)+  vim.api.nvim_buf_call(info.tmp_buf, function()+    ---@diagnostic disable-next-line: param-type-mismatch+    pcall(vim.cmd, "silent rundo " .. info.tmp_undo)+  end)+  return info+end++local function unload_undo_buf()+  local info = M._undoinfo+  if not info then return end+  assert(info.tmp_buf)+  assert(info.tmp_file)+  assert(info.tmp_undo)+  if vim.api.nvim_buf_is_valid(info.tmp_buf) then+    vim.api.nvim_buf_delete(info.tmp_buf, { force = true })+  end+  if uv.fs_stat(info.tmp_file) then vim.fn.delete(info.tmp_file) end+  if uv.fs_stat(info.tmp_undo) then vim.fn.delete(info.tmp_undo) end+  M._undoinfo = nil+end++--- @param buf integer buffer id+--- @param seq integer+--- @param diff_opts? vim.text.diff.Opts+--- @return string[], integer+local function undo_diff(buf, seq, diff_opts)+  local info = load_undo_buf(buf)+  local file = vim.api.nvim_buf_get_name(buf)++  ---@diagnostic disable-next-line: deprecated+  local diff_fn = vim.text and vim.text.diff or vim.diff++  ---@type string[], string[]+  local before, after = {}, {}++  utils.eventignore(function()+    vim.api.nvim_buf_call(info.tmp_buf, function()+      -- state after the undo+      vim.cmd("noautocmd silent undo " .. seq)+      after = vim.api.nvim_buf_get_lines(0, 0, -1, false)+      -- state before the undo+      vim.cmd("noautocmd silent undo")+      before = vim.api.nvim_buf_get_lines(0, 0, -1, false)+    end)+  end)++  local diff = diff_fn(table.concat(before, "\n") .. "\n",+    table.concat(after, "\n") .. "\n",+    diff_opts) --[[@as string]]+  local lines = vim.split(diff, "\n")+  table.remove(lines)+  file = path.relative_to(file, utils.cwd())+  table.insert(lines, 1, string.format("diff --git a/%s b/%s", file, file))+  table.insert(lines, 2, string.format("--- a/%s", file))+  table.insert(lines, 3, string.format("+++ b/%s", file))+  return lines, info.tmp_buf+end+++--- @class fzf-lua.previewer.Undotree : fzf-lua.previewer.Builtin,{}+--- @field super fzf-lua.previewer.Builtin,{}+--- @field diff_buf integer+--- @field diff_opts vim.text.diff.Opts+--- @field show_buf boolean? # show original buffer instead of diff+M.builtin = builtin.base:extend()++---@diagnostic disable-next-line: unused+---@return boolean+function M.builtin:should_clear_preview(_)+  return false+end++function M.builtin:gen_winopts()+  local winopts = {+    wrap       = self.win.preview_wrap,+    cursorline = false,+  }+  return vim.tbl_extend("keep", winopts, self.winopts)+end++---@param o fzf-lua.config.UndotreePreviewer+---@param opts fzf-lua.config.Undotree+---@return fzf-lua.previewer.Undotree+function M.builtin:new(o, opts)+  M.builtin.super.new(self, o, opts)+  self.buf = utils.CTX().bufnr+  self.file = path.relative_to(vim.api.nvim_buf_get_name(self.buf), utils.cwd())+  self.diff_opts = o.diff_opts+  self.show_buf = o.show_buf+  return self+end++function M.builtin:close()+  if self.diff_buf and vim.api.nvim_buf_is_valid(self.diff_buf) then+    vim.api.nvim_buf_delete(self.diff_buf, { force = true })+  end+  unload_undo_buf()+  M.builtin.super.close(self)+end+++function M.builtin:toggle_undo_diff()+  self.show_buf = not self.show_buf+  self.win:redraw_preview()+end++function M.builtin:populate_preview_buf(entry_str)+  local seq = assert(entry_str:match("%d+"))+  local lines, buf = undo_diff(self.buf, seq, self.diff_opts)+  if tonumber(seq) > 0 and not self.show_buf then+    if not self.diff_buf or not vim.api.nvim_buf_is_valid(self.diff_buf) then+      self.diff_buf = self:get_tmp_buffer()+      self.diff_buf = vim.api.nvim_create_buf(false, true)+      vim.bo[self.diff_buf].modeline = true+      vim.bo[self.diff_buf].modifiable = true+      vim.bo[self.diff_buf].bufhidden = ""+      vim.bo[self.diff_buf].ft = "diff"+    end+    vim.api.nvim_buf_set_lines(self.diff_buf, 0, -1, false, lines)+    self:set_preview_buf(self.diff_buf, nil, true)+  else+    vim.bo[buf].ft = vim.bo[self.buf].ft+    self:set_preview_buf(buf, nil, true)+  end+  self.win:update_preview_title(self.file)+  self.win:update_preview_scrollbar()+end++---@class fzf-lua.previewer.UndotreeNative: fzf-lua.previewer.Fzf,{}+---@field super fzf-lua.previewer.Fzf+M.native = native.base:extend()++---@param o fzf-lua.config.UndotreePreviewer+---@param opts fzf-lua.config.Undotree+---@return fzf-lua.previewer.UndotreeNative+function M.native:new(o, opts)+  M.native.super.new(self, o, opts)+  setmetatable(self, M.native)+  self.buf = utils.CTX().bufnr+  local pager = opts.preview_pager == nil and o.pager or opts.preview_pager+  if type(pager) == "function" then pager = assert(pager()) end+  local cmd = pager and pager:match("[^%s]+") or nil+  if cmd and vim.fn.executable(cmd) == 1 then self.pager = pager end+  self.diff_opts = o.diff_opts+  return self+end++function M.native:close()+  unload_undo_buf()+  M.native.super.close(self)+end++function M.native:cmdline(o)+  o = o or {}+  local act = shell.stringify_data(function(entries, _, _)+    if not entries[1] then return shell.nop() end+    local seq = assert(utils.tointeger(entries[1]:match("%d+")))+    local lines = undo_diff(self.buf, seq, self.diff_opts)+    return table.concat(lines, "\r\n")+  end, self.opts, "{}")+  if self.pager then+    act = act .. " | " .. self.pager+  end+  return act+end++return M

lua/fzf-lua/types.lua

@@ -339,6 +339,7 @@ FzfLua.zoxide = require("fzf-lua.providers.files").zoxide ---@field toggle_preview_cw fun(direction: integer), nil ---@field toggle_preview_behavior fun(): nil ---@field toggle_preview_ts_ctx fun(): nil+---@field toggle_preview_undo_diff fun(): nil ---@field preview_ts_ctx_inc_dec fun(num: integer), nil ---@field preview_scroll fun(direction: fzf-lua.win.direction), nil ---@field close_help fun(): nil

lua/fzf-lua/win.lua

@@ -155,6 +155,7 @@ end local _preview_keymaps = {   ["toggle-preview-wrap"]    = { module = "win", fnc = "toggle_preview_wrap()" },   ["toggle-preview-ts-ctx"]  = { module = "win", fnc = "toggle_preview_ts_ctx()" },+  ["toggle-preview-undo"]    = { module = "win", fnc = "toggle_preview_undo_diff()" },   ["preview-ts-ctx-inc"]     = { module = "win", fnc = "preview_ts_ctx_inc_dec(1)" },   ["preview-ts-ctx-dec"]     = { module = "win", fnc = "preview_ts_ctx_inc_dec(-1)" },   ["preview-up"]             = { module = "win", fnc = "preview_scroll('line-up')" },@@ -1752,6 +1753,16 @@ function FzfWin:toggle_preview_ts_ctx()   end end +function FzfWin:toggle_preview_undo_diff()+  if self:validate_preview()+      and self._previewer+      ---@diagnostic disable-next-line: undefined-field+      and self._previewer.toggle_undo_diff then+    ---@diagnostic disable-next-line: undefined-field+    self._previewer:toggle_undo_diff()+  end+end+ ---@param num integer function FzfWin:preview_ts_ctx_inc_dec(num)   if self:validate_preview()

tests/screenshots/tests-api_spec.lua---api---fzf_exec---rg---1-+-args-{-1-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭─────────────────────────────────────────────────╮      -04|~      │>                                          89/89 │      +04|~      │>                                          90/90 │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ LICENSE                                       ││       07|~      │  Makefile                                      ││      

tests/screenshots/tests-api_spec.lua---api---fzf_exec---rg---1-+-args-{-false-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭─────────────────────────────────────────────────╮      -04|~      │>                                          90/90 │      +04|~      │>                                          91/91 │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ [DEBUG] [st] rg --files -g !.git -g !tests/*··││       07|~      │  LICENSE                                       ││      

tests/screenshots/tests-api_spec.lua---api---fzf_exec---rg---1-+-args-{-true-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭─────────────────────────────────────────────────╮      -04|~      │>                                          90/90 │      +04|~      │>                                          91/91 │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ [DEBUG] [mt] rg --files -g !.git -g !tests/*··││       07|~      │  LICENSE                                       ││      

tests/screenshots/tests-files_spec.lua---files---close-abort---1-+-args-{-'-c-c-'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      90/90 (0) │      +04|~      │>                                      91/91 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ [DEBUG] [mt] rg --files --sort=path -g !test··││       07|~      │  LICENSE                                       ││      

tests/screenshots/tests-files_spec.lua---files---close-abort---1-+-args-{-'-esc-'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      90/90 (0) │      +04|~      │>                                      91/91 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ [DEBUG] [mt] rg --files --sort=path -g !test··││       07|~      │  LICENSE                                       ││      

tests/screenshots/tests-files_spec.lua---files---executable---1-+-args-{-'fd'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭─────────────────── Files  h ────────────────────╮      -04|~      │>                                    103/103 (0) │      +04|~      │>                                    104/104 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ [DEBUG] [mt] fd --hidden --color=never --typ··││       07|~      │  .editorconfig                                 ││      

tests/screenshots/tests-files_spec.lua---files---executable---1-+-args-{-'find-dir'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                    103/103 (0) │      +04|~      │>                                    104/104 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ [DEBUG] [mt] find . -type f \! -path '*/.git··││       07|~      │  .editorconfig                                 ││      

tests/screenshots/tests-files_spec.lua---files---executable---1-+-args-{-'rg'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭─────────────────── Files  h ────────────────────╮      -04|~      │>                                    103/103 (0) │      +04|~      │>                                    104/104 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ [DEBUG] [mt] rg --hidden --files -g "!.git" ··││       07|~      │  .editorconfig                                 ││      

tests/screenshots/tests-files_spec.lua---files---icons---defaults---1-+-args-{-'devicons',-'+attrs'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      89/89 (0) │      +04|~      │>                                      90/90 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌  LICENSE                                     ││       07|~      │   Makefile                                    ││      

tests/screenshots/tests-files_spec.lua---files---icons---defaults---1-+-args-{-'devicons',-'-attrs'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      89/89 (0) │      +04|~      │>                                      90/90 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌  LICENSE                                     ││       07|~      │   Makefile                                    ││      

tests/screenshots/tests-files_spec.lua---files---icons---defaults---1-+-args-{-'mini',-'+attrs'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      89/89 (0) │      +04|~      │>                                      90/90 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌  LICENSE                                     ││       07|~      │  󱁤 Makefile                                    ││      

tests/screenshots/tests-files_spec.lua---files---icons---defaults---1-+-args-{-'mini',-'-attrs'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      89/89 (0) │      +04|~      │>                                      90/90 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌  LICENSE                                     ││       07|~      │  󱁤 Makefile                                    ││      

tests/screenshots/tests-files_spec.lua---files---multiprocess---1-+-args-{-false-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      90/90 (0) │      +04|~      │>                                      91/91 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ [DEBUG] [st] rg --files --sort=path           ││       07|~      │  LICENSE                                       ││      

tests/screenshots/tests-files_spec.lua---files---multiprocess---1-+-args-{-true-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      90/90 (0) │      +04|~      │>                                      91/91 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │▌ [DEBUG] [mt] rg --files --sort=path           ││       07|~      │  LICENSE                                       ││      

tests/screenshots/tests-files_spec.lua---files---preview-should-work-after-chdir-#1864

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      89/89 (0) │      +04|~      │>                                      90/90 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │  LICENSE                                       ││       07|~      │▌ Makefile                                       │      

tests/screenshots/tests-files_spec.lua---files---previewer---builtin---1-+-args-{-false,-'builtin'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      90/90 (0) │      +04|~      │>                                      91/91 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │  [DEBUG] [mt] rg --files --sort=path -g !test··││       07|~      │▌ LICENSE                                        │      

tests/screenshots/tests-files_spec.lua---files---previewer---builtin---1-+-args-{-false,-'ci'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      90/90 (0) │      +04|~      │>                                      91/91 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │  [DEBUG] [mt] rg --files --sort=path -g !test··││       07|~      │▌ LICENSE                                        │      

tests/screenshots/tests-files_spec.lua---files---previewer---builtin---1-+-args-{-true,-'builtin'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      90/90 (0) │      +04|~      │>                                      91/91 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │  [DEBUG] [mt] rg --files --sort=path -g !test··││       07|~      │▌  LICENSE                                      │      

tests/screenshots/tests-files_spec.lua---files---previewer---builtin---1-+-args-{-true,-'ci'-}

@@ -2,7 +2,7 @@ 01|                                                                 02|~                                                                03|~      ╭───────────────────── Files ─────────────────────╮      -04|~      │>                                      90/90 (0) │      +04|~      │>                                      91/91 (0) │       05|~      │──────────────────────────────────────────────── │       06|~      │  [DEBUG] [mt] rg --files --sort=path -g !test··││       07|~      │▌  LICENSE                                      │