251129.33 · 2cf1c8e50ef4e54d938d07a19dde815cee8fb8f6
feat: new picker for `undotree`
reading declarations
@@ -1179,6 +1179,10 @@ Search `:tags` Neovim's autocmds +#### undotree++History undo tree+ #### keymaps Neovims key mappings
@@ -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>
@@ -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
@@ -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
@@ -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",
@@ -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 },
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 ││
@@ -2,7 +2,7 @@ 01| 02|~ 03|~ ╭───────────────────── Files ─────────────────────╮ -04|~ │> 89/89 (0) │ +04|~ │> 90/90 (0) │ 05|~ │──────────────────────────────────────────────── │ 06|~ │▌ LICENSE ││ 07|~ │ Makefile ││
@@ -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 │