summaryrefslogtreecommitdiff
path: root/lua/telescope/mappings.lua
diff options
context:
space:
mode:
authorTJ DeVries <devries.timothyj@gmail.com>2020-07-15 17:53:30 -0400
committerTJ DeVries <devries.timothyj@gmail.com>2020-07-15 17:53:30 -0400
commitc6f0142fc651dcbd2431630956d034c046293e7e (patch)
treea53ee03b29753ad718ea711afbb6bd3bf479882e /lua/telescope/mappings.lua
parent053417dd92066e4e03b642f663bec577c0c6e59a (diff)
Get simple rg example to work
Diffstat (limited to 'lua/telescope/mappings.lua')
-rw-r--r--lua/telescope/mappings.lua124
1 files changed, 124 insertions, 0 deletions
diff --git a/lua/telescope/mappings.lua b/lua/telescope/mappings.lua
new file mode 100644
index 0000000..b779b2f
--- /dev/null
+++ b/lua/telescope/mappings.lua
@@ -0,0 +1,124 @@
+-- TODO: Customize keymap
+local a = vim.api
+local ns_telescope_selection = a.nvim_create_namespace('telescope_selection')
+
+local state = require('telescope.state')
+
+local mappings = {}
+local keymap = {}
+local telescope_selections = {}
+
+mappings.set_keymap = function(prompt_bufnr, results_bufnr)
+ local function default_mapper(map_key, table_key)
+ a.nvim_buf_set_keymap(
+ prompt_bufnr,
+ 'i',
+ map_key,
+ string.format(
+ [[<C-O>:lua __TelescopeMapping(%s, %s, '%s')<CR>]],
+ prompt_bufnr,
+ results_bufnr,
+ table_key
+ ),
+ {
+ silent = true,
+ }
+ )
+ end
+
+ default_mapper('<c-n>', 'control-n')
+ default_mapper('<c-p>', 'control-p')
+ default_mapper('<CR>', 'enter')
+end
+
+local function update_current_selection(prompt_bufnr, results_bufnr, row)
+ local status = state.get_status(prompt_bufnr)
+
+ a.nvim_buf_clear_namespace(results_bufnr, ns_telescope_selection, 0, -1)
+ a.nvim_buf_add_highlight(
+ results_bufnr,
+ ns_telescope_selection,
+ 'Error',
+ row,
+ 0,
+ -1
+ )
+
+ telescope_selections[prompt_bufnr] = row
+
+ if status.previewer then
+ vim.g.got_here = true
+
+ status.previewer.fn(
+ status.preview_win,
+ status.preview_bufnr,
+ status.results_bufnr,
+ row
+ )
+ end
+end
+
+
+function __TelescopeMapping(prompt_bufnr, results_bufnr, characters)
+ if keymap[characters] then
+ keymap[characters](prompt_bufnr, results_bufnr)
+ end
+end
+
+-- TODO: Refactor this to use shared code.
+-- TODO: Move from top to bottom, etc.
+-- TODO: It seems like doing this brings us back to the beginning of the prompt, which is not great.
+keymap["control-n"] = function(prompt_bufnr, results_bufnr)
+ if telescope_selections[prompt_bufnr] == nil then
+ telescope_selections[prompt_bufnr] = 0
+ end
+
+ local row = telescope_selections[prompt_bufnr] + 1
+ update_current_selection(prompt_bufnr, results_bufnr, row)
+end
+
+keymap["control-p"] = function(prompt_bufnr, results_bufnr)
+ if telescope_selections[prompt_bufnr] == nil then
+ telescope_selections[prompt_bufnr] = 0
+ end
+
+ local row = telescope_selections[prompt_bufnr] - 1
+ update_current_selection(prompt_bufnr, results_bufnr, row)
+end
+
+keymap["enter"] = function(prompt_bufnr, results_bufnr)
+ local extmark = a.nvim_buf_get_extmarks(
+ results_bufnr,
+ ns_telescope_selection,
+ 0,
+ -1,
+ {}
+ )
+
+ local row = extmark[1][2]
+ if row == nil then
+ print("Could not do anything...")
+ return
+ else
+ local line = a.nvim_buf_get_lines(results_bufnr, row, row + 1, false)[1]
+ if line == nil then
+ print("Could not do anything with blank line...")
+ return
+ end
+
+ local sections = vim.split(line, ":")
+
+ local filename = sections[1]
+ local row = tonumber(sections[2])
+ local col = tonumber(sections[3])
+
+ vim.cmd(string.format([[bdelete! %s]], prompt_bufnr))
+
+ local bufnr = vim.fn.bufnr(filename, true)
+ a.nvim_set_current_buf(bufnr)
+ a.nvim_buf_set_option(bufnr, 'buflisted', true)
+ a.nvim_win_set_cursor(0, {row, col})
+ end
+end
+
+return mappings