summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/telescope/actions/init.lua15
-rw-r--r--lua/telescope/builtin/git.lua29
2 files changed, 24 insertions, 20 deletions
diff --git a/lua/telescope/actions/init.lua b/lua/telescope/actions/init.lua
index 527e0b5..4b152b6 100644
--- a/lua/telescope/actions/init.lua
+++ b/lua/telescope/actions/init.lua
@@ -243,11 +243,20 @@ actions.git_checkout = function(prompt_bufnr)
os.execute('git checkout ' .. val)
end
-actions.git_add = function(prompt_bufnr)
+actions.git_staging_toggle = function(prompt_bufnr)
local selection = actions.get_selected_entry(prompt_bufnr)
+
+ -- If parts of the file are staged and unstaged at the same time, stage
+ -- changes. Else toggle between staged and unstaged if the file is tracked,
+ -- and between added and untracked if the file is untracked.
+ if selection.status:sub(2) == ' ' then
+ os.execute('git restore --staged ' .. selection.value)
+ else
+ os.execute('git add ' .. selection.value)
+ end
actions.close(prompt_bufnr)
- local val = selection.value
- os.execute('git add ' .. val)
+ require('telescope.builtin').git_status()
+ vim.api.nvim_feedkeys('i', 'n', false)
end
-- ==================================================
diff --git a/lua/telescope/builtin/git.lua b/lua/telescope/builtin/git.lua
index 16d4554..2122fb9 100644
--- a/lua/telescope/builtin/git.lua
+++ b/lua/telescope/builtin/git.lua
@@ -106,18 +106,9 @@ git.branches = function(opts)
end
git.status = function(opts)
- local output = vim.split(utils.get_os_command_output('git status -s'), '\n')
- local results = {}
- for _, v in ipairs(output) do
- if v ~= "" then
- local mod, fname = string.match(v, '(..)%s(.+)')
- if mod ~= 'A ' and mod ~= 'M ' and mod ~= 'R ' and mod ~= 'D ' then
- table.insert(results, { mod = mod, file = fname })
- end
- end
- end
+ local output = utils.get_os_command_output('git status -s')
- if vim.tbl_isempty(results) then
+ if output == '' then
print('No changes found')
return
end
@@ -125,19 +116,23 @@ git.status = function(opts)
pickers.new(opts, {
prompt_title = 'Git Status',
finder = finders.new_table {
- results = results,
+ results = vim.split(output, '\n'),
entry_maker = function(entry)
+ if entry == '' then return nil end
+ local mod, file = string.match(entry, '(..).*%s[->%s]?(.+)')
return {
- value = entry.file,
- ordinal = entry.mod .. ' ' .. entry.file,
- display = entry.mod .. ' ' .. entry.file,
+ value = file,
+ status = mod,
+ ordinal = entry,
+ display = entry,
}
end
},
previewer = previewers.git_file_diff.new(opts),
sorter = conf.file_sorter(opts),
- attach_mappings = function()
- actions.goto_file_selection_edit:replace(actions.git_add)
+ attach_mappings = function(_, map)
+ map('i', '<tab>', actions.git_staging_toggle)
+ map('n', '<tab>', actions.git_staging_toggle)
return true
end
}):find()