Files
telescope.nvim/lua/telescope/make_entry.lua

173 lines
3.6 KiB
Lua

local has_devicons, devicons = pcall(require, 'nvim-web-devicons')
local utils = require('telescope.utils')
local make_entry = {}
make_entry.types = {
GENERIC = 0,
FILE = 1,
}
local transform_devicons
if has_devicons then
transform_devicons = function(filename, display, opts)
if opts.disable_devicons then
return display
end
return (devicons.get_icon(filename, string.match(filename, '%a+$')) or ' ') .. ' ' .. display
end
else
transform_devicons = function(_, display, _)
return display
end
end
function make_entry.gen_from_string()
return function(line)
return {
valid = line ~= "",
entry_type = make_entry.types.GENERIC,
value = line,
ordinal = line,
display = line,
}
end
end
function make_entry.gen_from_file(opts)
opts = opts or {}
local cwd = vim.fn.expand(opts.cwd or vim.fn.getcwd())
local make_display = function(line)
local display = line
if opts.shorten_path then
display = utils.path_shorten(line)
end
display = transform_devicons(line, display, opts)
return display
end
return function(line)
local entry = {
ordinal = line,
value = line,
entry_type = make_entry.types.FILE,
filename = line,
path = cwd .. '/' .. line,
}
entry.display = make_display(line)
return entry
end
end
function make_entry.gen_from_vimgrep(opts)
opts = opts or {}
local display_string = "%s:%s%s"
local make_display = function(entry)
local display = entry.value
local display_filename
if opts.shorten_path then
display_filename = utils.path_shorten(entry.filename)
else
display_filename = entry.filename
end
local coordinates = ""
if not opts.disable_coordinates then
coordinates = string.format("%s:%s:", entry.lnum, entry.col)
end
display = transform_devicons(
entry.filename,
string.format(display_string, display_filename, coordinates, entry.text),
opts
)
return display
end
return function(line)
-- TODO: Consider waiting to do this string.find
-- TODO: Is this the fastest way to get each of these?
-- Or could we just walk the text and check for colons faster?
local _, _, filename, lnum, col, text = string.find(line, [[([^:]+):(%d+):(%d+):(.*)]])
local ok
ok, lnum = pcall(tonumber, lnum)
if not ok then lnum = nil end
ok, col = pcall(tonumber, col)
if not ok then col = nil end
return {
valid = line ~= "",
value = line,
ordinal = line,
display = make_display,
entry_type = make_entry.types.FILE,
filename = filename,
lnum = lnum,
col = col,
text = text,
}
end
end
function make_entry.gen_from_quickfix(opts)
opts = opts or {}
local make_display = function(entry)
local to_concat = {}
if not opts.hide_filename then
local filename = entry.filename
if opts.shorten_path then
filename = utils.path_shorten(filename)
end
table.insert(to_concat, filename)
table.insert(to_concat, ":")
end
table.insert(to_concat, entry.text)
return table.concat(to_concat, "")
end
return function(entry)
return {
valid = true,
value = entry,
ordinal = (
not opts.ignore_filename and entry.filename
or ''
) .. ' ' .. entry.text,
display = make_display,
filename = entry.filename,
lnum = entry.lnum,
col = entry.col,
text = entry.text,
start = entry.start,
finish = entry.finish,
}
end
end
return make_entry