我使用
nvim-cmp
作为我的完成引擎,它工作正常,但想更改默认行为以禁用第一个选项的自动选择。原因是,当一行的最后一个单词有建议时,按 Enter 键将应用第一个建议,而不仅仅是插入换行符。
例如,在 haskell 中,输入
main = do<CR>
do
与 luasnip 中的 diso~
匹配,并被替换为类似
main = 2022-12-05T12:50:34
我希望建议可见,但在按下选项卡之前不会选择任何建议,如果没有选择任何建议,则
<CR>
只是换行符。这可能吗?
回答我自己的问题,我发现使用
lsp-zero
时,必须在那里进行配置。 advanced-usage.md
中的文档提供了确切的解决方案,我将其发布在这里:
local lsp = require('lsp-zero')
lsp.preset('system-lsp') -- or recommended, or whatever...
lsp.setup_nvim_cmp({
preselect = 'none',
completion = {
completeopt = 'menu,menuone,noinsert,noselect'
},
})
lsp.setup()
首先设置
completeopt=menu,preview,menuone,noselect
来配置自动完成菜单。
然后你必须修改你的
cmp
插件配置来映射CR键:
local cmp = require'cmp'
cmp.setup({
mapping = cmp.mapping.preset.insert({
['<CR>'] = cmp.mapping.confirm({ select = false }),
})
})
有关 cmp.confirm
选项的进一步说明,请参阅
cmp 插件文档。
如果您想阻止 tab 选择命令行中的第一个自动完成建议(按
:
后),那么这就是方法。您需要完全禁用 tab 和 shift+tab 键的功能:
cmp.setup.cmdline(':', {
mapping = cmp.mapping.preset.cmdline({
['<Tab>'] = function() end,
['<S-Tab>'] = function() end,
}),
sources = cmp.config.sources({
{ name = 'path' }
}, {
{ name = 'cmdline' }
})
})
您可以通过查看
cmp.mapping.preset.cmdline()
目录中的文件 lua/cmp/config/mapping.lua
找到 nvim-cmp
返回的默认映射。