summaryrefslogtreecommitdiff
path: root/lua/telescope/previewers/buffer_previewer.lua
diff options
context:
space:
mode:
authorSimon Hauser <Simon-Hauser@outlook.de>2021-06-14 21:50:46 +0200
committerGitHub <noreply@github.com>2021-06-14 21:50:46 +0200
commit6ac5ee0854fe02d651cadf2fc97a2463ff92f322 (patch)
treed6a7b492246db153e786762f9b0d650dc907ccf6 /lua/telescope/previewers/buffer_previewer.lua
parent0c1bc129da3f684b04d72530dddaedb5255f12ef (diff)
feat: cycle previewers with commit and bcommit already using it (#528)
- new git previewers - jump to line in bcommit previewer - vimdiff for bcommits - dynamic preview window titles - more previewers documentation Cycle previewers are not mapped yet. So you need to setup yourself: ```lua require('telescope').setup { defaults = { mappings = { i = { ["<C-s>"] = actions.cycle_previewers_next, ["<C-a>"] = actions.cycle_previewers_prev, }, }, } } ``` Co-authored-by: Thore Strassburg <thore@weilbier.net>
Diffstat (limited to 'lua/telescope/previewers/buffer_previewer.lua')
-rw-r--r--lua/telescope/previewers/buffer_previewer.lua222
1 files changed, 176 insertions, 46 deletions
diff --git a/lua/telescope/previewers/buffer_previewer.lua b/lua/telescope/previewers/buffer_previewer.lua
index 52710d8..f2f49b9 100644
--- a/lua/telescope/previewers/buffer_previewer.lua
+++ b/lua/telescope/previewers/buffer_previewer.lua
@@ -59,6 +59,25 @@ local colorize_ls = function(bufnr, data, sections)
end
end
+local search_cb_jump = function(self, bufnr, query)
+ if not query then return end
+ vim.api.nvim_buf_call(bufnr, function()
+ pcall(vim.fn.matchdelete, self.state.hl_id, self.state.winid)
+ vim.cmd "norm! gg"
+ vim.fn.search(query, "W")
+ vim.cmd "norm! zz"
+
+ self.state.hl_id = vim.fn.matchadd('TelescopePreviewMatch', query)
+ end)
+end
+
+local search_teardown = function(self)
+ if self.state and self.state.hl_id then
+ pcall(vim.fn.matchdelete, self.state.hl_id, self.state.hl_win)
+ self.state.hl_id = nil
+ end
+end
+
previewers.file_maker = function(filepath, bufnr, opts)
opts = opts or {}
if opts.use_ft_detect == nil then opts.use_ft_detect = true end
@@ -107,6 +126,8 @@ previewers.new_buffer_previewer = function(opts)
local opt_setup = opts.setup
local opt_teardown = opts.teardown
+ local opt_title = opts.title
+ local opt_dyn_title = opts.dyn_title
local old_bufs = {}
local bufname_table = {}
@@ -140,6 +161,24 @@ previewers.new_buffer_previewer = function(opts)
end
end
+ function opts.title(self)
+ if opt_title then
+ if type(opt_title) == 'function' then
+ return opt_title(self)
+ else
+ return opt_title
+ end
+ end
+ return "Preview"
+ end
+
+ function opts.dyn_title(self, entry)
+ if opt_dyn_title then
+ return opt_dyn_title(self, entry)
+ end
+ return "Preview"
+ end
+
function opts.setup(self)
local state = {}
if opt_setup then vim.tbl_deep_extend("force", state, opt_setup(self)) end
@@ -228,8 +267,15 @@ previewers.new_buffer_previewer = function(opts)
return Previewer:new(opts)
end
-previewers.cat = defaulter(function(_)
+previewers.cat = defaulter(function(opts)
+ opts = opts or {}
+ local cwd = opts.cwd or vim.loop.cwd()
return previewers.new_buffer_previewer {
+ title = "File Preview",
+ dyn_title = function(_, entry)
+ return path.normalize(from_entry.path(entry, true), cwd)
+ end,
+
get_buffer_by_name = function(_, entry)
return from_entry.path(entry, true)
end,
@@ -244,7 +290,10 @@ previewers.cat = defaulter(function(_)
}
end, {})
-previewers.vimgrep = defaulter(function(_)
+previewers.vimgrep = defaulter(function(opts)
+ opts = opts or {}
+ local cwd = opts.cwd or vim.loop.cwd()
+
local jump_to_line = function(self, bufnr, lnum)
if lnum and lnum > 0 then
pcall(vim.api.nvim_buf_add_highlight, bufnr, ns_previewer, "TelescopePreviewLine", lnum - 1, 0, -1)
@@ -256,10 +305,13 @@ previewers.vimgrep = defaulter(function(_)
end
return previewers.new_buffer_previewer {
+ title = "Grep Preview",
+ dyn_title = function(_, entry)
+ return path.normalize(from_entry.path(entry, true), cwd)
+ end,
+
setup = function()
- return {
- last_set_bufnr = nil
- }
+ return { last_set_bufnr = nil }
end,
teardown = function(self)
@@ -326,6 +378,7 @@ previewers.ctags = defaulter(function(_)
end
return previewers.new_buffer_previewer {
+ title = "Tags Preview",
teardown = function(self)
if self.state and self.state.hl_id then
pcall(vim.fn.matchdelete, self.state.hl_id, self.state.hl_win)
@@ -354,16 +407,8 @@ end, {})
previewers.builtin = defaulter(function(_)
return previewers.new_buffer_previewer {
- setup = function()
- return {}
- end,
-
- teardown = function(self)
- if self.state and self.state.hl_id then
- pcall(vim.fn.matchdelete, self.state.hl_id, self.state.hl_win)
- self.state.hl_id = nil
- end
- end,
+ title = "Grep Preview",
+ teardown = search_teardown,
get_buffer_by_name = function(_, entry)
return entry.filename
@@ -381,14 +426,7 @@ previewers.builtin = defaulter(function(_)
conf.buffer_previewer_maker(entry.filename, self.state.bufnr, {
bufname = self.state.bufname,
callback = function(bufnr)
- vim.api.nvim_buf_call(bufnr, function()
- pcall(vim.fn.matchdelete, self.state.hl_id, self.state.winid)
- vim.cmd "norm! gg"
- vim.fn.search(text, "W")
- vim.cmd "norm! zz"
-
- self.state.hl_id = vim.fn.matchadd('TelescopePreviewMatch', text)
- end)
+ search_cb_jump(self, bufnr, text)
end
})
end
@@ -397,16 +435,8 @@ end, {})
previewers.help = defaulter(function(_)
return previewers.new_buffer_previewer {
- setup = function()
- return {}
- end,
-
- teardown = function(self)
- if self.state and self.state.hl_id then
- pcall(vim.fn.matchdelete, self.state.hl_id, self.state.hl_win)
- self.state.hl_id = nil
- end
- end,
+ title = "Help Preview",
+ teardown = search_teardown,
get_buffer_by_name = function(_, entry)
return entry.filename
@@ -420,16 +450,8 @@ previewers.help = defaulter(function(_)
conf.buffer_previewer_maker(entry.filename, self.state.bufnr, {
bufname = self.state.bufname,
callback = function(bufnr)
- vim.api.nvim_buf_call(bufnr, function()
- vim.cmd(':ownsyntax help')
-
- pcall(vim.fn.matchdelete, self.state.hl_id, self.state.winid)
- vim.cmd "norm! gg"
- vim.fn.search(query, "W")
- vim.cmd "norm! zz"
-
- self.state.hl_id = vim.fn.matchadd('TelescopePreviewMatch', query)
- end)
+ putils.regex_highlighter(bufnr, 'help')
+ search_cb_jump(self, bufnr, query)
end
})
end
@@ -441,6 +463,7 @@ previewers.man = defaulter(function(opts)
return vim.fn.executable('col') == 1 and 'col -bx' or ''
end)
return previewers.new_buffer_previewer {
+ title = "Man Preview",
get_buffer_by_name = function(_, entry)
return entry.value
end,
@@ -483,6 +506,7 @@ previewers.git_branch_log = defaulter(function(opts)
end
return previewers.new_buffer_previewer {
+ title = "Git Branch Preview",
get_buffer_by_name = function(_, entry)
return entry.value
end,
@@ -506,6 +530,7 @@ end, {})
previewers.git_stash_diff = defaulter(function(opts)
return previewers.new_buffer_previewer {
+ title = "Git Stash Preview",
get_buffer_by_name = function(_, entry)
return entry.value
end,
@@ -521,25 +546,128 @@ previewers.git_stash_diff = defaulter(function(opts)
}
end, {})
-previewers.git_commit_diff = defaulter(function(opts)
+previewers.git_commit_diff_to_parent = defaulter(function(opts)
return previewers.new_buffer_previewer {
+ title = "Git Diff to Parent Preview",
+ teardown = search_teardown,
get_buffer_by_name = function(_, entry)
return entry.value
end,
define_preview = function(self, entry, status)
- putils.job_maker({ 'git', '--no-pager', 'diff', entry.value .. '^!' }, self.state.bufnr, {
+ local cmd = { 'git', '--no-pager', 'diff', entry.value .. '^!' }
+ if opts.current_file then
+ table.insert(cmd, '--')
+ table.insert(cmd, opts.current_file)
+ end
+
+ putils.job_maker(cmd, self.state.bufnr, {
value = entry.value,
bufname = self.state.bufname,
- cwd = opts.cwd
+ cwd = opts.cwd,
+ callback = function(bufnr)
+ search_cb_jump(self, bufnr, opts.current_line)
+ end
})
putils.regex_highlighter(self.state.bufnr, 'diff')
end
}
end, {})
+previewers.git_commit_diff_to_head = defaulter(function(opts)
+ return previewers.new_buffer_previewer {
+ title = "Git Diff to Head Preview",
+ teardown = search_teardown,
+
+ get_buffer_by_name = function(_, entry)
+ return entry.value
+ end,
+
+ define_preview = function(self, entry, status)
+ local cmd = { 'git', '--no-pager', 'diff', '--cached', entry.value }
+ if opts.current_file then
+ table.insert(cmd, '--')
+ table.insert(cmd, opts.current_file)
+ end
+
+ putils.job_maker(cmd, self.state.bufnr, {
+ value = entry.value,
+ bufname = self.state.bufname,
+ cwd = opts.cwd,
+ callback = function(bufnr)
+ search_cb_jump(self, bufnr, opts.current_line)
+ end
+ })
+ putils.regex_highlighter(self.state.bufnr, 'diff')
+ end
+ }
+end, {})
+
+previewers.git_commit_diff_as_was = defaulter(function(opts)
+ return previewers.new_buffer_previewer {
+ title = "Git Show Preview",
+ teardown = search_teardown,
+
+ get_buffer_by_name = function(_, entry)
+ return entry.value
+ end,
+
+ define_preview = function(self, entry, status)
+ local cmd = { 'git', '--no-pager', 'show' }
+ local cf = opts.current_file and path.make_relative(opts.current_file, opts.cwd)
+ local value = cf and (entry.value .. ':' .. cf) or (entry.value)
+ local ft = cf and pfiletype.detect(value) or 'diff'
+ table.insert(cmd, value)
+
+ putils.job_maker(cmd, self.state.bufnr, {
+ value = entry.value,
+ bufname = self.state.bufname,
+ cwd = opts.cwd,
+ callback = function(bufnr)
+ search_cb_jump(self, bufnr, opts.current_line)
+ end
+ })
+ putils.highlighter(self.state.bufnr, ft)
+ end
+ }
+end, {})
+
+previewers.git_commit_message = defaulter(function(opts)
+ local hl_map = {
+ 'TelescopeResultsIdentifier',
+ 'TelescopePreviewUser',
+ 'TelescopePreviewDate'
+ }
+ return previewers.new_buffer_previewer {
+ title = "Git Message",
+ get_buffer_by_name = function(_, entry)
+ return entry.value
+ end,
+
+ define_preview = function(self, entry, status)
+ local cmd = { 'git', '--no-pager', 'log', '-n 1', entry.value }
+
+ putils.job_maker(cmd, self.state.bufnr, {
+ value = entry.value,
+ bufname = self.state.bufname,
+ cwd = opts.cwd,
+ callback = function(bufnr, content)
+ if not content then return end
+ for k, v in ipairs(hl_map) do
+ local _, s = content[k]:find('%s')
+ if s then
+ vim.api.nvim_buf_add_highlight(bufnr, ns_previewer, v, k - 1, s, #content[k])
+ end
+ end
+ end
+ })
+ end
+ }
+end, {})
+
previewers.git_file_diff = defaulter(function(opts)
return previewers.new_buffer_previewer {
+ title = "Git File Diff Preview",
get_buffer_by_name = function(_, entry)
return entry.value
end,
@@ -565,6 +693,7 @@ end, {})
previewers.autocommands = defaulter(function(_)
return previewers.new_buffer_previewer {
+ title = "Autocommands Preview",
teardown = function(self)
if self.state and self.state.last_set_bufnr and vim.api.nvim_buf_is_valid(self.state.last_set_bufnr) then
pcall(vim.api.nvim_buf_clear_namespace, self.state.last_set_bufnr, ns_previewer, 0, -1)
@@ -623,6 +752,7 @@ end, {})
previewers.highlights = defaulter(function(_)
return previewers.new_buffer_previewer {
+ title = "Highlights Preview",
teardown = function(self)
if self.state and self.state.last_set_bufnr and vim.api.nvim_buf_is_valid(self.state.last_set_bufnr) then
vim.api.nvim_buf_clear_namespace(self.state.last_set_bufnr, ns_previewer, 0, -1)