自动提示任意英文单词 - 用Vim快速编写文档

来源:互联网 发布:软件定义存储 编辑:程序博客网 时间:2024/04/29 18:47

Vim的自动完成提供了多种方法:

 

1. 整行                            |i_CTRL-X_CTRL-L|
2. 当前文件内的关键字                    |i_CTRL-X_CTRL-N|
3. 'dictionary'    的关键字                |i_CTRL-X_CTRL-K|
4. 'thesaurus' 的关键字,同义词风格            |i_CTRL-X_CTRL-T|
5. 当前和头文件内的关键字                |i_CTRL-X_CTRL-I|
6. 标签                            |i_CTRL-X_CTRL-]|
7. 文件名                        |i_CTRL-X_CTRL-F|
8. 定义或宏                        |i_CTRL-X_CTRL-D|
9. Vim 命令                        |i_CTRL-X_CTRL-V|
10. 用户定义的补全                    |i_CTRL-X_CTRL-U|
11. 全能 (omni) 补全                    |i_CTRL-X_CTRL-O|
12. 拼写建议                        |i_CTRL-X_s|
13. 'complete' 的关键字                    |i_CTRL-N|

 

 

这里只需要用到Vim的字典补全就能实现自动提示任意单词,首先准备一个比较全面的英文词典:

下载Engspchk这个插件,这个插件用来检查拼写错误,当然平时就可以用,不过这里只需要用到它的英文词典

 

下载解压后将english.dict不必要的内容删去,比如标题和每行开头的Goodword,再排序成每行一个独立的单词,大概有4.8W个单词

排序是为了Vim缓存这个词典时更节省时间.将排序后的文件保存到$VIMRUNTIME/dict/english.dic,当然文件名任意取,建议这样命名.

 

接下来,你有两种方法实现自动补全英文单词,分为手动和自动的,自动需要借助neocomplcache这个插件.

 

手动提示:

如果只需要对txt类型文件提示单词,建立一个ftplugin/txt.vim文件即可,内容包含:

 

setlocal dictionary=$VIMRUNTIME/dict/english.dic  "set dict file

setlocal complete+=k  "set complete option

 

需要补全的时候,比如输入app,再按<C-X><C-K>即可弹出补全菜单以供选择需要的单词.

实际上你可以对所有文件都设置这个词典补全,将这一行加入到.vimrc即可,注意多了个+号

setlocal dictionary+=$VIMRUNTIME/dict/english.dic  "set dict file

这也许会在编辑代码的时候造成混乱,提示不需要的单词.

 

自动提示:

安装好neocomplcache后做如下设置:

let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_enable_smart_case = 1
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_enable_underbar_completion = 1
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '/*ku/*'
let g:neocomplcache_dictionary_filetype_lists = {
    / 'default' : '',
    / 'txt' : $VIMRUNTIME.'/dict/txt.dic',
    / }

" Define keyword.
if !exists('g:neocomplcache_keyword_patterns')
let g:neocomplcache_keyword_patterns = {}
endif
let g:neocomplcache_keyword_patterns['default'] = '/h/w*'
" Plugin key-mappings.
imap <C-k>     <Plug>(neocomplcache_snippets_expand)
smap <C-k>     <Plug>(neocomplcache_snippets_expand)
inoremap <expr><C-g>     neocomplcache#undo_completion()
inoremap <expr><C-l>     neocomplcache#complete_common_string()
" Recommended key-mappings.
" <CR>: close popup and save indent.
"inoremap <expr><CR>  (pumvisible() ? "/<C-y>":'') . "/<C-f>/<CR>X/<BS>"
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "/<C-n>" : "/<TAB>"
" <C-h>, <BS>: close popup and delete backword char.
inoremap <expr><C-h> pumvisible() ? neocomplcache#close_popup()."/<C-h>" : "/<C-h>"
inoremap <expr><BS> pumvisible() ? neocomplcache#close_popup()."/<C-h>" : "/<C-h>"
inoremap <expr><C-y>  neocomplcache#close_popup()
inoremap <expr><C-e>  neocomplcache#cancel_popup()

 

其中最重要的是设置字典文件:

let g:neocomplcache_dictionary_filetype_lists = {
    / 'default' : '',
    / 'txt' : $VIMRUNTIME.'/dict/txt.dic',
    / }

对txt类型文件应用字典,neocomplcache会在打开txt文件后缓存该字典并自动弹出完成菜单.

 

用neocomplcache有两个问题仍需解决:

首次打开txt文件的时候不能自动缓存词典,也就不能自动提示,需要手动设置文件类型,提交:set ft=txt这个命令后才会缓存.

每个Vim进程只需要缓存一次,大概耗时5秒钟,视不同机器而定.

当然第二次打开txt类型的文件时能自动缓存,很奇怪的问题.

缓存后的文件顺序有问题,而非升序. 目前正在和作者联系以解决.

 

最后看看效果图:

输入archit

 

按tab键选择需要的单词: