Vim中的自动命令无法正常工作,如何根据文件类型设置makeprg?

3

我使用Vim编辑器进行编程,以下是我面临的问题。

我同时使用多个选项卡编辑C++和Python文件,并在我的.vimrc文件中添加了以下内容:

filetype plugin indent on
au filetype python set mp=python3\ %
au filetype cpp set mp=g++\ -Werror\ -Wextra\ -Wall\ -ansi\ -pedantic-errors\ -g\ %

我的目标是,在我切换到一个Python文件的选项卡并运行:make时,它应该运行:!python3 %,在我切换到一个C ++文件的选项卡并运行:make时,它应该运行:!g++ -Werror -Wextra -Wall -ansi -pedantic-errors -g %

但是它没有生效,每次我切换选项卡并运行:make时,它都尝试执行!g++ -Werror -Wextra -Wall -ansi -pedantic-errors -g %。当我运行:set ft?来检查这两个文件(即Python和C ++)的文件类型是否已正确识别时,我得到了正确的结果,即python和cpp。

那么为什么这个自动命令没有起作用?我有什么遗漏吗? 感谢您的耐心。


据我所知, makecmd 与缓冲区无关, 所以最后执行的命令会生效. - Rudi
au BufRead,BufEnter,BufNewFile .cpp,.C 设定 mp = g++\ -Werror\ -Wextra\ -Wall\ -ansi\ -pedantic-errors\ -g\ % au BufRead,BufEnter,BufNewFile .py,.pyw 设定 mp = python3\ % - ghayalcoder
1个回答

9
尝试使用 setlocal 替代 set。例如:
filetype plugin indent on
au filetype python setlocal mp=python3\ %
au filetype cpp setlocal mp=g++\ -Werror\ -Wextra\ -Wall\ -ansi\ -pedantic-errors\ -g\ %

如果你阅读 :help mp, 你会发现它的设置是 'global or local to buffer global-local'。这意味着你可以使用 set 命令来全局应用 makeprg,或者使用 setlocal 命令来覆盖单个缓冲区中的设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接