diff --git a/README.md b/README.md index 20228e5..19f8298 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,7 @@ nnoremap lua require('fzf-lua').files() |`colorschemes`|color schemes| |`builtin`|fzf-lua builtin methods| |`git_files`|`git ls-files`| +|`git_status`|`git status`| |`git_commits`|git commit log (project)| |`git_bcommits`|git commit log (buffer)| |`git_branch`|git branches| @@ -223,6 +224,10 @@ require'fzf-lua'.setup { cmd = "head", args = nil, }, + git_diff = { + cmd = "git diff", + args = "--color", + }, }, -- provider setup files = { @@ -249,6 +254,14 @@ require'fzf-lua'.setup { file_icons = true, -- show file icons? color_icons = true, -- colorize file|git icons }, + status = { + prompt = 'GitStatus❯ ', + cmd = "git status -s", + previewer = "git_diff", + file_icons = true, + git_icons = true, + color_icons = true, + }, commits = { prompt = 'Commits❯ ', cmd = "git log --pretty=oneline --abbrev-commit --color", diff --git a/lua/fzf-lua/config.lua b/lua/fzf-lua/config.lua index e19746f..f903c11 100644 --- a/lua/fzf-lua/config.lua +++ b/lua/fzf-lua/config.lua @@ -94,6 +94,11 @@ M.globals = { args = nil, _new = function() return require 'fzf-lua.previewer'.head end, }, + git_diff = { + cmd = "git diff", + args = "--color", + _new = function() return require 'fzf-lua.previewer'.cmd_async end, + }, builtin = { treesitter = true, _new = function() return require 'fzf-lua.previewer'.builtin end, @@ -131,6 +136,15 @@ M.globals.git = { git_icons = true, actions = M.globals.files.actions, }, + status = { + prompt = 'GitStatus> ', + cmd = "git status -s", + previewer = "git_diff", + file_icons = true and M._has_devicons, + color_icons = true, + git_icons = true, + actions = M.globals.files.actions, + }, commits = { prompt = 'Commits> ', cmd = "git log --pretty=oneline --abbrev-commit --color", @@ -356,8 +370,8 @@ M.winopts = function(opts) } end -M.preview_window = function() - local o = M.globals +M.preview_window = function(opts) + local o = vim.tbl_deep_extend("keep", opts, M.globals) local preview_veritcal = string.format('%s:%s:%s:%s', o.preview_opts, o.preview_border, o.preview_wrap, o.preview_vertical) local preview_horizontal = string.format('%s:%s:%s:%s', diff --git a/lua/fzf-lua/core.lua b/lua/fzf-lua/core.lua index 3ce2782..a6be4e8 100644 --- a/lua/fzf-lua/core.lua +++ b/lua/fzf-lua/core.lua @@ -30,7 +30,7 @@ M.build_fzf_cli = function(opts, debug_print) utils._if(opts.fzf_binds, opts.fzf_binds, vim.fn.shellescape(table.concat(config.globals.fzf_binds, ','))), vim.fn.shellescape(opts.prompt), - utils._if(opts.preview_window, opts.preview_window, config.preview_window()), + utils._if(opts.preview_window, opts.preview_window, config.preview_window(opts)), utils._if(#opts.preview_offset>0, ":"..opts.preview_offset, ''), utils._if(opts.preview and #opts.preview>0, opts.preview, "''"), -- HACK: support skim (rust version of fzf) @@ -167,10 +167,12 @@ M.fzf_files = function(opts) end - local preview_opts = config.globals.previewers[opts.previewer] - if preview_opts then - local preview = preview_opts._new()(preview_opts, opts) - opts.preview = preview:cmdline() + if not opts.preview then + local preview_opts = config.globals.previewers[opts.previewer] + if preview_opts then + local preview = preview_opts._new()(preview_opts, opts) + opts.preview = preview:cmdline() + end end local selected = fzf.fzf(opts.fzf_fn, diff --git a/lua/fzf-lua/init.lua b/lua/fzf-lua/init.lua index 039d378..5b30c69 100644 --- a/lua/fzf-lua/init.lua +++ b/lua/fzf-lua/init.lua @@ -56,6 +56,7 @@ M.grep_cWORD = require'fzf-lua.providers.grep'.grep_cWORD M.grep_visual = require'fzf-lua.providers.grep'.grep_visual M.grep_curbuf = require'fzf-lua.providers.grep'.grep_curbuf M.git_files = require'fzf-lua.providers.git'.files +M.git_status = require'fzf-lua.providers.git'.status M.git_commits = require'fzf-lua.providers.git'.commits M.git_bcommits = require'fzf-lua.providers.git'.bcommits M.git_branches = require'fzf-lua.providers.git'.branches diff --git a/lua/fzf-lua/providers/git.lua b/lua/fzf-lua/providers/git.lua index 19f81ac..c6cb3ca 100644 --- a/lua/fzf-lua/providers/git.lua +++ b/lua/fzf-lua/providers/git.lua @@ -30,6 +30,19 @@ M.files = function(opts) return core.fzf_files(opts) end +M.status = function(opts) + if not git_status() then return end + opts = config.normalize_opts(opts, config.globals.git.status) + if opts.preview then opts.preview = vim.fn.shellescape(opts.preview) end + opts.fzf_fn = fzf_helpers.cmd_line_transformer(opts.cmd, + function(x) + -- greedy match anything after last space + x = x:match("[^ ]*$") + return core.make_entry_file(opts, x) + end) + return core.fzf_files(opts) +end + local function git_cmd(opts) if not git_status() then return end coroutine.wrap(function ()