如何配置YouCompleteMe实现类Bash的Vim自动补全行为?
解决YouCompleteMe补全行为匹配Bash风格的需求
为什么wildmode设置不生效
YouCompleteMe(YCM)的补全逻辑独立于Vim原生的wildmenu,它有自己的补全UI和触发机制,所以原生的wildmode配置不会影响YCM的补全行为。
仅实现公共前缀补全(行为2)
可以通过编写VimScript函数结合YCM的接口实现,核心思路是:按下补全键时,先获取YCM的补全候选,计算所有候选的最长公共前缀并插入,若候选只有一个则直接补全完整内容。
将以下配置加入你的vimrc:
" 获取YCM补全候选的最长公共前缀并插入 function! CompleteYCMCommonPrefix() let completions = YcmCompleter GetCompletions if len(completions) == 0 return "\<Tab>" " 无候选时保留原Tab功能 endif " 计算最长公共前缀 let prefix = completions[0].word for item in completions[1:] while item.word !~ '^' . escape(prefix, '\^$.*+?|()[]{}') let prefix = prefix[:-2] if empty(prefix) break endif endwhile if empty(prefix) break endif endfor if !empty(prefix) && prefix != getline('.')[col('.')-2 : col('.')-2 + len(prefix)-1] " 插入公共前缀 call setline('.', getline('.')[:col('.')-2] . prefix) return '' endif " 只有单个候选时直接补全 if len(completions) == 1 return "\<C-y>" endif " 无公共前缀时显示候选列表 return "\<C-x>\<C-o>" endfunction " 将Tab映射为触发公共前缀补全 inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : CompleteYCMCommonPrefix() inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
实现两种补全行为的切换(理想状态)
可以新增一个模式切换变量,让补全键根据当前模式执行公共前缀补全或循环候选的行为:
在上述配置基础上添加:
" 初始化补全模式为公共前缀模式 let g:ycm_completion_mode = 'prefix' " 切换补全模式的函数 function! ToggleYCMCompletionMode() let g:ycm_completion_mode = g:ycm_completion_mode == 'prefix' ? 'cycle' : 'prefix' echo "YCM补全模式:" . (g:ycm_completion_mode == 'prefix' ? "公共前缀" : "循环候选") endfunction " 根据当前模式执行补全 function! YCMComplete() if g:ycm_completion_mode == 'prefix' return CompleteYCMCommonPrefix() else return pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>" endif endfunction " 更新Tab映射为模式化补全 inoremap <expr> <Tab> YCMComplete() " 新增模式切换快捷键(可自行修改为习惯的按键) nnoremap <leader>tc :call ToggleYCMCompletionMode()<CR>
是否需要自行编写补全器?
不需要。YCM提供了YcmCompleter GetCompletions接口可以直接获取补全候选,结合VimScript即可实现所需的补全逻辑,无需从头编写自定义补全器。
内容的提问来源于stack exchange,提问作者pnarvor
相关产品推荐
相关产品推荐

