- from https://github.com/hrsh7th/nvim-cmp/wiki/Example-mappings#confirm-candidate-on-tab-immediately-when-theres-only-one-completion-entry - BREAKING CHANGE: tab behaviour has changed
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- See `:help cmp`
 | |
| local cmp = require 'cmp'
 | |
| local luasnip = require 'luasnip'
 | |
| require('luasnip.loaders.from_vscode').lazy_load()
 | |
| require('luasnip.loaders.from_lua').lazy_load()
 | |
| luasnip.config.setup {
 | |
|   history = true,
 | |
|   updateevents = "TextChanged,TextChangedI",
 | |
|   enable_autosnippets = true,
 | |
| }
 | |
| 
 | |
| local has_words_before = function()
 | |
|   unpack = unpack or table.unpack
 | |
|   local line, col = unpack(vim.api.nvim_win_get_cursor(0))
 | |
|   return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
 | |
| end
 | |
| 
 | |
| cmp.setup {
 | |
|   snippet = {
 | |
|     expand = function(args)
 | |
|       luasnip.lsp_expand(args.body)
 | |
|     end,
 | |
|   },
 | |
|   completion = {
 | |
|     completeopt = 'menu,menuone,noinsert',
 | |
|     autocomplete = false,
 | |
|   },
 | |
|   mapping = cmp.mapping.preset.insert {
 | |
|     ['<C-n>'] = cmp.mapping.select_next_item(),
 | |
|     ['<C-p>'] = cmp.mapping.select_prev_item(),
 | |
|     ['<C-b>'] = cmp.mapping.scroll_docs(-4),
 | |
|     ['<C-f>'] = cmp.mapping.scroll_docs(4),
 | |
|     ['<C-Space>'] = cmp.mapping.complete {},
 | |
|     ['<CR>'] = cmp.mapping.confirm {
 | |
|       behavior = cmp.ConfirmBehavior.Replace,
 | |
|       select = true,
 | |
|     },
 | |
|     ['<C-e>'] = cmp.mapping({ i = cmp.mapping.abort(), c = cmp.mapping.close() }),
 | |
|     ['<Tab>'] = cmp.mapping(function(fallback)
 | |
|       if cmp.visible() then
 | |
|         if #cmp.get_entries() == 1 then
 | |
|           cmp.confirm({select = true})
 | |
|         else
 | |
|           cmp.select_next_item()
 | |
|         end
 | |
|       elseif luasnip.expand_or_locally_jumpable() then
 | |
|         luasnip.expand_or_jump()
 | |
|       elseif has_words_before() then
 | |
|         cmp.complete()
 | |
|         if #cmp.get_entries() == 1 then
 | |
|           cmp.confirm({select = true})
 | |
|         end
 | |
|       else
 | |
|         fallback()
 | |
|       end
 | |
|     end, { 'i', 's' }),
 | |
|     ['<S-Tab>'] = cmp.mapping(function(fallback)
 | |
|       if cmp.visible() then
 | |
|         cmp.select_prev_item()
 | |
|       elseif luasnip.locally_jumpable(-1) then
 | |
|         luasnip.jump(-1)
 | |
|       else
 | |
|         fallback()
 | |
|       end
 | |
|     end, { 'i', 's' }),
 | |
|   },
 | |
|   sources = {
 | |
|     { name = 'nvim_lsp' },
 | |
|     { name = 'luasnip' },
 | |
|     { name = 'path' },
 | |
|   },
 | |
| }
 |