You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MUcomplete与VimTex插件兼容问题:\ref{无法触发自动补全

问题描述

在Vim中配置了MUcomplete自动补全插件与VimTex插件,vimrc配置如下:

if empty(glob('~/.vim/autoload/plug.vim'))
    silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
        \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
    autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
call plug#begin('~/.vim/plugged')
Plug 'lervag/vimtex'
Plug 'lifepillar/vim-mucomplete'
call plug#end()

set completeopt+=menuone
set completeopt+=noselect
let g:mucomplete#enable_auto_at_startup = 1

let g:mucomplete#can_complete = {}
let g:mucomplete#can_complete.tex = { 'omni': { t -> t =~# g:vimtex#re#neocomplete . '$' } }

参考VimTex官方文档配置了can_complete.tex,输入\cite{时可正常触发文献关键词补全,但输入\ref{时,无法触发当前.tex文件中公式标签(如eq:1、eq:okay)的自动补全。

当前.tex文件内容:

\documentclass[11pt]{article}

\usepackage{amsmath}

\begin{document}

\begin{alignat}{2}
    \text{ }& asdfasdf              &&\quad\nonumber\\
    \text{ }&89999\times 45\leq 88  &&\quad \forall\label{eq:1}\\
        &abc                        &&\quad\exists\label{eq:okay}\\
        &\times x                   &&\quad\forall\nonumber\\
        &abcd                       &&\quad\nonumber
\end{alignat}

\bibliographystyle{apalike}
\bibliography{bibfile.bib}

\end{document}

执行:echo g:vimtex#re#neocomplete得到的正则表达式:

\v\\%(%(\a*cite|Cite)\a*\*?%(\s*\[[^]]*\]){0,2}\s*\{[^}]*|%(\a*cites|Cites)%(\s*\([^)]*\)){0,2}%(%(\s*\[[^]]*\]){0,2}\s*\{[^}]*\})*%(\s*\[[^]]*\]){0,2}\s*\{[^}]*|bibentry\s*\{[^}]*|%(text|block)cquote\*?%(\s*\[[^]]*\]){0,2}\s*\{[^}]*|%(for|hy)\w*cquote\*?\{[^}]*}%(\s*\[[^]]*\]){0,2}\s*\{[^}]*|defbibentryset\{[^}]*}\{[^}]*|\a*ref%(\s*\{[^}]*|range\s*\{[^,}]*%(}\{)?)|hyperref\s*\[[^]]*|includegraphics\*?%(\s*\[[^]]*\]){0,2}\s*\{[^}]*|%(include%(only)?|input|subfile)\s*\{[^}]*|([cpdr]?(gls|Gls|GLS)|acr|Acr|ACR)\a*\s*\{[^}]*|(ac|Ac|AC)\s*\{[^}]*|includepdf%(\s*\[[^]]*\])?\s*\{[^}]*|includestandalone%(\s*\[[^]]*\])?\s*\{[^}]*|%(usepackage|RequirePackage|PassOptionsToPackage)%(\s*\[[^]]*\])?\s*\{[^}]*|documentclass%(\s*\[[^]]*\])?\s*\{[^}]*|begin%(\s*\[[^]]*\])?\s*\{[^}]*|end%(\s*\[[^]]*\])?\s*\{[^}]*|\a*)
问题原因

你在g:mucomplete#can_complete.tex的omni触发条件中,给g:vimtex#re#neocomplete正则追加了$锚定符,强制要求输入文本必须以字母结尾才能触发补全。而输入\ref{时,结尾字符是{,无法匹配带$的正则表达式,因此MUcomplete不会调用VimTex的omnifunc来获取标签补全候选。

查看正则的最后分支|\a*,结合$后仅匹配字母结尾的输入场景,\ref{显然不符合该条件。

解决方法

修改g:mucomplete#can_complete.tex的配置,移除末尾的$:

let g:mucomplete#can_complete.tex = { 'omni': { t -> t =~# g:vimtex#re#neocomplete } }

修改后,正则表达式可以匹配\ref{这类以{结尾的输入场景,MUcomplete会触发VimTex的omni补全,自动扫描当前文档中的所有公式标签并生成补全候选。

内容的提问来源于stack exchange,提问作者Tryer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:05:23