fix: a lot of small things and adds more customization for caret (#554)
Attention: prompt_prefix will no longer add a space at the end. So if you still want a space at the end make sure your configuration has one. The default should not be changed. So if you haven't copied prompt_prefix in your config this doesn't affect you. Feat: - prompt prefix does no longer always end with space - selection_caret configurable. Default: `> ` - result_prefix configurable. Default: ` ` - more actions for git_branches - <c-t> does track the branch - <c-r> does rebase branch - also added delete branch action but not configured. See readme on how to do that Fixes: - fix docgen ci - Better error for lsp_workspace_symbols - better formatting for CONTRIBUTING.md - move from systemlist to plenary.job - git branch now supports checkout on remote branches
This commit is contained in:
@@ -264,7 +264,72 @@ actions.git_checkout = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
utils.get_os_command_output({ 'git', 'checkout', selection.value }, cwd)
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'checkout', selection.value }, cwd)
|
||||
if ret == 0 then
|
||||
print("Checked out: " .. selection.value)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when checking out: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
end
|
||||
end
|
||||
|
||||
actions.git_track_branch = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'checkout', '--track', selection.value }, cwd)
|
||||
if ret == 0 then
|
||||
print("Tracking branch: " .. selection.value)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when tracking branch: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
end
|
||||
end
|
||||
|
||||
actions.git_delete_branch = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
|
||||
local confirmation = vim.fn.input('Do you really wanna delete branch ' .. selection.value .. '? [Y/n] ')
|
||||
if confirmation ~= '' and string.lower(confirmation) ~= 'y' then return end
|
||||
|
||||
actions.close(prompt_bufnr)
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'branch', '-D', selection.value }, cwd)
|
||||
if ret == 0 then
|
||||
print("Deleted branch: " .. selection.value)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when deleting branch: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
end
|
||||
end
|
||||
|
||||
actions.git_rebase_branch = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
|
||||
local confirmation = vim.fn.input('Do you really wanna delete branch ' .. selection.value .. '? [Y/n] ')
|
||||
if confirmation ~= '' and string.lower(confirmation) ~= 'y' then return end
|
||||
|
||||
actions.close(prompt_bufnr)
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'rebase', selection.value }, cwd)
|
||||
if ret == 0 then
|
||||
print("Rebased branch: " .. selection.value)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when rebasing branch: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
end
|
||||
end
|
||||
|
||||
actions.git_staging_toggle = function(prompt_bufnr)
|
||||
|
||||
@@ -79,20 +79,15 @@ end
|
||||
git.branches = function(opts)
|
||||
local output = utils.get_os_command_output({ 'git', 'branch', '--all' }, opts.cwd)
|
||||
|
||||
local tmp_results = {}
|
||||
local results = {}
|
||||
for _, v in ipairs(output) do
|
||||
if not string.match(v, 'HEAD') and v ~= '' then
|
||||
v = string.gsub(v, '.* ', '')
|
||||
v = string.gsub(v, '^remotes/[^/]*/', '')
|
||||
tmp_results[v] = true
|
||||
v = string.gsub(v, '^remotes/', '')
|
||||
table.insert(results, v)
|
||||
end
|
||||
end
|
||||
|
||||
local results = {}
|
||||
for k, _ in pairs(tmp_results) do
|
||||
table.insert(results, k)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Git Branches',
|
||||
finder = finders.new_table {
|
||||
@@ -103,8 +98,13 @@ git.branches = function(opts)
|
||||
},
|
||||
previewer = previewers.git_branch_log.new(opts),
|
||||
sorter = conf.file_sorter(opts),
|
||||
attach_mappings = function()
|
||||
attach_mappings = function(_, map)
|
||||
actions.select_default:replace(actions.git_checkout)
|
||||
map('i', '<c-t>', actions.git_track_branch)
|
||||
map('n', '<c-t>', actions.git_track_branch)
|
||||
|
||||
map('i', '<c-r>', actions.git_rebase_branch)
|
||||
map('n', '<c-r>', actions.git_rebase_branch)
|
||||
return true
|
||||
end
|
||||
}):find()
|
||||
@@ -155,14 +155,14 @@ local set_opts_cwd = function(opts)
|
||||
end
|
||||
|
||||
-- Find root of git directory and remove trailing newline characters
|
||||
local git_root = vim.fn.systemlist("git -C " .. opts.cwd .. " rev-parse --show-toplevel")[1]
|
||||
local git_root, ret = utils.get_os_command_output({ "git", "rev-parse", "--show-toplevel" }, opts.cwd)
|
||||
local use_git_root = utils.get_default(opts.use_git_root, true)
|
||||
|
||||
if vim.v.shell_error ~= 0 then
|
||||
if ret ~= 0 then
|
||||
error(opts.cwd .. ' is not a git directory')
|
||||
else
|
||||
if use_git_root then
|
||||
opts.cwd = git_root
|
||||
opts.cwd = git_root[1]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -151,8 +151,11 @@ lsp.workspace_symbols = function(opts)
|
||||
local params = {query = opts.query or ''}
|
||||
local results_lsp = vim.lsp.buf_request_sync(0, "workspace/symbol", params, opts.timeout or 10000)
|
||||
|
||||
if not results_lsp or vim.tbl_isempty(results_lsp) then
|
||||
print("No results from workspace/symbol")
|
||||
-- Clangd returns { { result = {} } } for query=''
|
||||
if not results_lsp or vim.tbl_isempty(results_lsp) or
|
||||
vim.tbl_isempty(results_lsp[1]) or vim.tbl_isempty(results_lsp[1].result) then
|
||||
print("No results from workspace/symbol. Maybe try a different query: " ..
|
||||
"Telescope lsp_workspace_symbols query=example")
|
||||
return
|
||||
end
|
||||
|
||||
@@ -167,7 +170,6 @@ lsp.workspace_symbols = function(opts)
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
opts.ignore_filename = utils.get_default(opts.ignore_filename, false)
|
||||
opts.hide_filename = utils.get_default(opts.hide_filename, false)
|
||||
|
||||
|
||||
@@ -75,7 +75,21 @@ function config.set_defaults(defaults)
|
||||
set("results_height", 1)
|
||||
set("results_width", 0.8)
|
||||
|
||||
set("prompt_prefix", ">")
|
||||
set("prompt_prefix", "> ", [[
|
||||
Will be shown in front of the prompt.
|
||||
|
||||
Default: '> '
|
||||
]])
|
||||
set("selection_caret", "> ", [[
|
||||
Will be shown in front of the selection.
|
||||
|
||||
Default: '> '
|
||||
]])
|
||||
set("entry_prefix", " ", [[
|
||||
Prefix in front of each result entry. Current selection not included.
|
||||
|
||||
Default: ' '
|
||||
]])
|
||||
set("initial_mode", "insert")
|
||||
|
||||
set("border", {})
|
||||
|
||||
@@ -14,12 +14,11 @@ local telescope = {}
|
||||
---
|
||||
--- To find out more:
|
||||
--- https://github.com/nvim-telescope/telescope.nvim
|
||||
--
|
||||
-- :h telescope.setup
|
||||
-- :h telescope.builtin
|
||||
-- :h telescope.layout
|
||||
-- :h telescope.actions
|
||||
--
|
||||
---
|
||||
--- :h telescope.setup
|
||||
--- :h telescope.builtin
|
||||
--- :h telescope.layout
|
||||
--- :h telescope.actions
|
||||
---@brief ]]
|
||||
|
||||
---@tag telescope.nvim
|
||||
|
||||
@@ -57,6 +57,8 @@ function Picker:new(opts)
|
||||
preview_title = get_default(opts.preview_title, "Preview"),
|
||||
|
||||
prompt_prefix = get_default(opts.prompt_prefix, config.values.prompt_prefix),
|
||||
selection_caret = get_default(opts.selection_caret, config.values.selection_caret),
|
||||
entry_prefix = get_default(opts.entry_prefix, config.values.entry_prefix),
|
||||
initial_mode = get_default(opts.initial_mode, config.values.initial_mode),
|
||||
|
||||
default_text = opts.default_text,
|
||||
@@ -112,7 +114,6 @@ function Picker:new(opts)
|
||||
preview_cutoff = get_default(opts.preview_cutoff, config.values.preview_cutoff),
|
||||
}, self)
|
||||
|
||||
|
||||
obj.scroller = p_scroller.create(
|
||||
get_default(opts.scroll_strategy, config.values.scroll_strategy),
|
||||
obj.sorting_strategy
|
||||
@@ -375,10 +376,6 @@ function Picker:find()
|
||||
local prompt_prefix = self.prompt_prefix
|
||||
if prompt_prefix ~= '' then
|
||||
a.nvim_buf_set_option(prompt_bufnr, 'buftype', 'prompt')
|
||||
|
||||
if not vim.endswith(prompt_prefix, " ") then
|
||||
prompt_prefix = prompt_prefix .. " "
|
||||
end
|
||||
vim.fn.prompt_setprompt(prompt_bufnr, prompt_prefix)
|
||||
end
|
||||
self.prompt_prefix = prompt_prefix
|
||||
@@ -655,9 +652,6 @@ function Picker:change_prompt_prefix(new_prefix, hl_group)
|
||||
if not new_prefix then return end
|
||||
|
||||
if new_prefix ~= '' then
|
||||
if not vim.endswith(new_prefix, " ") then
|
||||
new_prefix = new_prefix .. " "
|
||||
end
|
||||
vim.fn.prompt_setprompt(self.prompt_bufnr, new_prefix)
|
||||
else
|
||||
vim.api.nvim_buf_set_text(self.prompt_bufnr, 0, 0, 0, #self.prompt_prefix, {})
|
||||
@@ -733,21 +727,21 @@ function Picker:set_selection(row)
|
||||
local display, display_highlights = entry_display.resolve(self, self._selection_entry)
|
||||
|
||||
if display then
|
||||
display = ' ' .. display
|
||||
display = self.entry_prefix .. display
|
||||
a.nvim_buf_set_lines(results_bufnr, self._selection_row, self._selection_row + 1, false, {display})
|
||||
|
||||
self.highlighter:hi_display(self._selection_row, ' ', display_highlights)
|
||||
self.highlighter:hi_display(self._selection_row, self.entry_prefix, display_highlights)
|
||||
self.highlighter:hi_sorter(self._selection_row, prompt, display)
|
||||
self.highlighter:hi_multiselect(self._selection_row, self._selection_entry)
|
||||
end
|
||||
end
|
||||
|
||||
local caret = '>'
|
||||
local caret = self.selection_caret
|
||||
-- local display = string.format('%s %s', caret,
|
||||
-- (a.nvim_buf_get_lines(results_bufnr, row, row + 1, false)[1] or ''):sub(3)
|
||||
-- )
|
||||
local display, display_highlights = entry_display.resolve(self, entry)
|
||||
display = caret .. ' ' .. display
|
||||
display = caret .. display
|
||||
|
||||
-- TODO: You should go back and redraw the highlights for this line from the sorter.
|
||||
-- That's the only smart thing to do.
|
||||
@@ -757,8 +751,9 @@ function Picker:set_selection(row)
|
||||
end
|
||||
a.nvim_buf_set_lines(results_bufnr, row, row + 1, false, {display})
|
||||
|
||||
self.highlighter:hi_selection(row, caret)
|
||||
self.highlighter:hi_display(row, ' ', display_highlights)
|
||||
-- don't highlight the ' ' at the end of caret
|
||||
self.highlighter:hi_selection(row, caret:sub(1, -2))
|
||||
self.highlighter:hi_display(row, caret, display_highlights)
|
||||
self.highlighter:hi_sorter(row, prompt, display)
|
||||
self.highlighter:hi_multiselect(row, entry)
|
||||
end)
|
||||
@@ -809,7 +804,7 @@ function Picker:entry_adder(index, entry, _, insert)
|
||||
-- This is the two spaces to manage the '> ' stuff.
|
||||
-- Maybe someday we can use extmarks or floaty text or something to draw this and not insert here.
|
||||
-- until then, insert two spaces
|
||||
local prefix = ' '
|
||||
local prefix = self.entry_prefix
|
||||
display = prefix .. display
|
||||
|
||||
self:_increment("displayed")
|
||||
@@ -1109,7 +1104,7 @@ end
|
||||
|
||||
function Picker:_get_prompt()
|
||||
return vim.trim(
|
||||
vim.api.nvim_buf_get_lines(self.prompt_bufnr, 0, 1, false)[1]:sub(#self.prompt_prefix)
|
||||
vim.api.nvim_buf_get_lines(self.prompt_bufnr, 0, 1, false)[1]:sub(#self.prompt_prefix + 1)
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
@@ -466,40 +466,23 @@ previewers.git_branch_log = defaulter(function(opts)
|
||||
end
|
||||
end
|
||||
|
||||
local remotes = utils.get_os_command_output({ 'git', 'remote' }, opts.cwd)
|
||||
return previewers.new_buffer_previewer {
|
||||
get_buffer_by_name = function(_, entry)
|
||||
return entry.value
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local current_remote = 1
|
||||
local cmd = { 'git', '--no-pager', 'log', '--graph', '--pretty=format:%h -%d %s (%cr)',
|
||||
'--abbrev-commit', '--date=relative', entry.value }
|
||||
|
||||
local gen_cmd = function(v)
|
||||
return { 'git', '--no-pager', 'log', '--graph', '--pretty=format:%h -%d %s (%cr)',
|
||||
'--abbrev-commit', '--date=relative', v }
|
||||
end
|
||||
|
||||
local handle_results
|
||||
handle_results = function(bufnr, content)
|
||||
if content and table.getn(content) == 0 then
|
||||
if current_remote <= table.getn(remotes) then
|
||||
local value = 'remotes/' .. remotes[current_remote] .. '/' .. entry.value
|
||||
current_remote = current_remote + 1
|
||||
putils.job_maker(gen_cmd(value), bufnr, { cwd = opts.cwd, callback = handle_results })
|
||||
else
|
||||
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { "No log found for branch: " .. entry.value })
|
||||
end
|
||||
elseif content and table.getn(content) > 1 then
|
||||
highlight_buffer(bufnr, content)
|
||||
end
|
||||
end
|
||||
|
||||
putils.job_maker(gen_cmd(entry.value), self.state.bufnr, {
|
||||
putils.job_maker(cmd, self.state.bufnr, {
|
||||
value = entry.value,
|
||||
bufname = self.state.bufname,
|
||||
cwd = opts.cwd,
|
||||
callback = handle_results
|
||||
callback = function(bufnr, content)
|
||||
if not content then return end
|
||||
highlight_buffer(bufnr, content)
|
||||
end
|
||||
})
|
||||
end
|
||||
}
|
||||
|
||||
@@ -199,7 +199,11 @@ function utils.get_os_command_output(cmd, cwd)
|
||||
return {}
|
||||
end
|
||||
local command = table.remove(cmd, 1)
|
||||
return Job:new({ command = command, args = cmd, cwd = cwd }):sync()
|
||||
local stderr = {}
|
||||
local stdout, ret = Job:new({ command = command, args = cmd, cwd = cwd, on_stderr = function(_, data)
|
||||
table.insert(stderr, data)
|
||||
end }):sync()
|
||||
return stdout, ret, stderr
|
||||
end
|
||||
|
||||
utils.strdisplaywidth = (function()
|
||||
|
||||
Reference in New Issue
Block a user