如何配置Vim跨文档动态存储单词供Ctrl+N自动补全调用
Vim 动态积累个人词库实现Ctrl+N自动补全方案
完全可以通过Vim原生配置实现,不需要安装第三方插件,同时满足短词过滤、词库手动编辑的要求,配置步骤如下:
1. 初始化词库文件
首先在.vim目录下创建纯文本格式的词库文件,后续所有积累的单词都会存在这里,你随时可以手动打开编辑增删内容:
touch ~/.vim/my_personal_dict.txt
2. 写入.vimrc配置
把下面的配置粘贴到你的Vim配置文件~/.vimrc中,所有参数都可以按需调整:
" -------------------------- 个人动态词库配置开始 -------------------------- " 词库文件存储路径 let g:my_dict_path = expand('~/.vim/my_personal_dict.txt') " 短词过滤阈值:长度小于该值的单词不会存入词库,避免词库膨胀,按需修改 let g:min_word_length = 4 " 打开任意文件时自动加载个人词库作为补全源 autocmd BufReadPost * execute 'set dictionary+=' . g:my_dict_path " 配置Ctrl+N补全时同时扫描缓冲区内容和字典文件 set complete+=k " 绑定文件保存事件,自动提取当前文档的符合要求的单词存入词库 autocmd BufWritePost * call UpdatePersonalDict() function! UpdatePersonalDict() " 跳过大于10MB的大文件,避免卡顿 if getfsize(expand('%')) > 10*1024*1024 return endif let l:current_words = [] " 遍历当前文档所有行,提取符合规则的单词 for l:line in getline(1, '$') " 正则匹配单词:默认匹配字母、数字、下划线组成的串,需要支持连字符可以改成 \v[[:alnum:]_-]+ let l:match_list = split(l:line, '\W\+') for l:word in l:match_list if len(l:word) >= g:min_word_length " 不需要区分大小写就保留下面这行,要区分就删掉 let l:word = tolower(l:word) call add(l:current_words, l:word) endif endfor endfor if empty(l:current_words) return endif " 读取已有词库内容,合并新词后去重排序写回 let l:old_words = filereadable(g:my_dict_path) ? readfile(g:my_dict_path) : [] let l:all_words = sort(unique(l:old_words + l:current_words)) call writefile(l:all_words, g:my_dict_path) endfunction " -------------------------- 个人动态词库配置结束 --------------------------
3. 使用说明
- 配置生效后,每次正常保存编辑的文档,Vim会自动扫描当前文档内容,把符合长度要求的单词去重后追加到个人词库中
- 词库是纯文本格式,每行存储一个单词,你随时可以手动打开清理冗余、修正拼写、添加自定义词汇,没有格式限制
- 打开任意文件输入单词前缀时,按下
Ctrl+N/Ctrl+P就会匹配你之前所有文档中积累过的词汇,比如之前输入过Supercalifragilisticexpialidocious,后续输入Superc时按Ctrl+N即可直接补全 - 可根据自己的使用习惯调整参数:
- 修改
g:min_word_length的值调整短词过滤阈值,比如设为5就不会存储长度4及以下的短词 - 不需要大小写归一就删掉函数里的
tolower()相关行 - 需要匹配带连字符、点号的专业词汇,直接修改提取单词的正则规则即可
- 修改
初始使用时词库为空,随着编辑保存的文档越多,词库的匹配准确率会越高。如果后续发现词库体积过大,直接打开词库文件批量删除不需要的词汇即可,没有额外的维护成本。
内容的提问来源于stack exchange,提问作者jmlarson
相关产品推荐
相关产品推荐

