Vim/Neovim中Deoplete词典补全失效及动态切换问题求助
首先咱们先搞定你当前Deoplete无法给出词典补全的问题,再实现和拼写检查联动的动态切换词典功能。
一、修复Deoplete词典补全无效的问题
你的配置没生效大概率是这几个常见原因,咱们一步步排查调整:
1. 确认词典文件路径正确
很多Linux发行版的拼写词典路径不是/usr/share/myspell/,比如Debian/Ubuntu、Fedora等主流系统用的是/usr/share/hunspell/。先验证文件是否存在:
ls /usr/share/myspell/de_AT.dic /usr/share/myspell/en_US.dic
如果输出提示文件不存在,换成/usr/share/hunspell/再试,找到正确路径后更新你的dictionary配置。
2. 降低触发补全的字符阈值
你设置了min_pattern_length=4,意味着输入少于4个字符不会触发补全。可以先把这个值改小(比如2)来快速测试是否能触发:
call deoplete#custom#source('dictionary', 'min_pattern_length', 2)
3. 确保Deoplete加载了dictionary源
部分情况下Deoplete不会默认启用dictionary源,你可以手动把它加入全局源列表:
let g:deoplete#sources = {'_': ['dictionary', 'around', 'buffer']}
这里把dictionary和其他常用补全源一起添加,确保它被正常加载。
最终修复后的基础配置
整合上面的调整,你的配置应该类似这样(记得替换成你系统的实际词典路径):
" 配置词典路径(替换为你系统的正确路径) set dictionary=/usr/share/hunspell/de_AT.dic set dictionary+=/usr/share/hunspell/en_US.dic " 配置Deoplete的dictionary源 call deoplete#custom#source('dictionary', 'matchers', ['matcher_head']) call deoplete#custom#source('dictionary', 'sorters', []) call deoplete#custom#source('dictionary', 'min_pattern_length', 2) " 确保dictionary补全源被启用 let g:deoplete#sources = {'_': ['dictionary', 'around', 'buffer']}
二、实现动态切换补全词典(和拼写检查联动)
完全可以实现和拼写检查同步切换补全词典,只需要修改你现有的映射,在切换拼写检查的同时更新dictionary选项即可。
优化后的映射配置
咱们把词典路径存成变量方便后续维护,然后修改映射:
" 定义词典路径(替换为你系统的正确路径) let s:dict_de = '/usr/share/hunspell/de_AT.dic' let s:dict_en = '/usr/share/hunspell/en_US.dic' set nospell " 切换德语:同时开启德语拼写检查+设置德语补全词典 nnoremap <silent> <leader>de :setlocal spell spelllang=de_at spelllang?<CR>:setlocal dictionary=<SID>dict_de<CR> " 切换英语:同时开启英语拼写检查+设置英语补全词典 nnoremap <silent> <leader>en :setlocal spell spelllang=en_us spelllang?<CR>:setlocal dictionary=<SID>dict_en<CR> " 关闭拼写检查+清空补全词典 nnoremap <silent> <leader>ns :setlocal nospell spelllang= spell?<CR>:setlocal dictionary=<CR>
原理说明
Deoplete的dictionary源是实时读取Vim的dictionary选项的,所以当你通过映射修改这个选项后,下次触发补全就会自动使用新设置的词典,完美和你的拼写检查切换同步。
测试一下:按<leader>de切换到德语,输入几个德语单词前缀,应该就能看到Deoplete给出德语词典的补全建议了;切换到英语同理。
内容的提问来源于stack exchange,提问作者user9618012

