summaryrefslogtreecommitdiffstats
path: root/.config/nvim/plugin/50-completion.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/plugin/50-completion.lua')
-rw-r--r--.config/nvim/plugin/50-completion.lua72
1 files changed, 72 insertions, 0 deletions
diff --git a/.config/nvim/plugin/50-completion.lua b/.config/nvim/plugin/50-completion.lua
new file mode 100644
index 0000000..94b4cbb
--- /dev/null
+++ b/.config/nvim/plugin/50-completion.lua
@@ -0,0 +1,72 @@
+--
+-- Completion configuration plugin
+--
+
+------------------------------------------------------------------------------------------------------------------------
+-- Insert mode completion
+------------------------------------------------------------------------------------------------------------------------
+-- See `:help ins-completion-menu`
+
+vim.opt.autocomplete = true -- Show completion menu automatically
+vim.opt.completeopt = {
+ "noselect", -- No item selected initially
+ "fuzzy",
+ "menuone", -- Show matches in a menu, even if there's only one match
+ "popup", -- Menu items show extra ingo in the popup window
+ "preview", -- Show extra info in the preview window
+}
+-- Completion sources (in order of priority)
+vim.opt.complete = {
+ "o", -- 'omnifunc'
+}
+vim.opt.pumwidth = 25
+vim.keymap.set("i", "<Tab>", function()
+ return vim.fn.pumvisible() == 1 and "<C-n>" or "<Tab>"
+end, { expr = true })
+vim.keymap.set("i", "<S-Tab>", function()
+ return vim.fn.pumvisible() == 1 and "<C-p>" or "<S-Tab>"
+end, { expr = true })
+
+------------------------------------------------------------------------------------------------------------------------
+-- Command-line mode completion
+------------------------------------------------------------------------------------------------------------------------
+-- See `:help cmdline-completion` and `:help cmdline-autocompletion`
+
+-- Show completion menu automatically
+vim.api.nvim_create_autocmd({ "CmdlineChanged", "CmdlineEnter" }, {
+ desc = "Autocompletion",
+ group = vim.g.dotfiles.augroup,
+ pattern = "[:\\/\\?]",
+ callback = function()
+ vim.cmd.call("wildtrigger()")
+ end,
+})
+vim.opt.wildmenu = true -- Show completions in a menu
+vim.opt.wildchar = 9 -- Char code assigned to command line wildcard expansion
+vim.opt.wildoptions = {
+ "exacttext", -- Discard regex artifacts when performing search pattern completion
+ "pum", -- Show completions in a popup menu
+ "tagfile", -- Show tag kind and file
+ "fuzzy", -- Fuzzy matching (doesn't work with files/dirs, see `:help 'wildoptions'`, but patterns do work!)
+}
+-- Completion modes triggered in order by `wildtrigger()` or 'wildchar'
+vim.opt.wildmode = {
+ "noselect", -- List matches without inserting
+ "full", -- List matches and insert first full match
+}
+-- Insert unique match
+vim.keymap.set("c", string.format("%c", vim.o.wildchar), function()
+ local complete_info = vim.fn.cmdcomplete_info()
+ if complete_info.pum_visible == 1 then
+ return #complete_info.matches == 1 and "<C-n><Space><BS>" or "<C-n>"
+ end
+ vim.fn.wildtrigger()
+end, { expr = true, desc = "Command line wildcard expansion" })
+-- Show next completion choices after accepting an entry with `<C-y>`
+vim.keymap.set("c", "<C-y>", function()
+ local complete_info = vim.fn.cmdcomplete_info()
+ if complete_info.pum_visible == 1 then
+ return complete_info.selected ~= -1 and "<Space><BS>" or "<C-e>"
+ end
+ return "<C-y>"
+end, { expr = true })