0 总述
在上一篇博客,即《Windows系统下使用gvim配置LaTeX快速书写环境》一文中,本小白试图模仿神级人物Gilles Castel,打造vim下的 LaTeX \LaTeX LATEX书写环境。实话实说,东施效颦了。虽不至于一无所得,但也仅仅算开了个头。经过一段时间的摸索和查漏补缺,我深刻地认识到在之前博客中犯了一些错误。本文试图对于其中的一个错误进行修正。
1 究竟应该如何配置插件
上文书讲到,因为github受到墙的影响,导致我们无法按照vim-plug插件的官方指导方法,通过网络安装插件的方法直接完成插件配置。因此小白随意找了一个位置把插件配置了进去。虽然通过小白一通蹩脚的配置,确实勉强可以使用。但是不知道你有没有发现,按照那个配置方法,我们是无法查看到相关help或者其他doc文件的。这样给我们学习插件使用带了很大困扰。
从第一性原理出发,理论上,插件自动安装,也无非是通过程序将相应的文件安装配置在正确的位置。那么,插件的正确安装位置应该是哪里?
小白通过不间断地尝试,在github网络较好的时候,幸运地以自动化的方式安装成功了一个插件。于是我们查看到这个插件的安装位置实际上是在
C:\\Users\\XXXX\\vimfiles\\plugged
路径下。其中XXXX指的当然就是你的用户名了。
小白查阅了一些资料,原来,如果你在gvim中输入
:echo &HOME
注意冒号和大小写,这其实是在vim的普通模式下。
则系统会返回给你$HOME的路径,而这个路径下的vimfiles文件夹才应该是插件应该待的地方。
如果你和小白一样是windows10系统下默认安装的gvim,那么你将会看到
C:\Users\XXXX
如果你打开这个路径,发现没有plugged文件夹,那就顺手建一个,同样地,不要拼错单词。
注意把你下载的几个插件解压到这个plugged文件夹下面。
同时注意把它的版本号去掉。
然后又回到我们的_vimrc配置文件中,把之前强行指定的部分全都修改掉。
" Vim with all enhancements
source $VIMRUNTIME/vimrc_example.vim
" Use the internal diff if available.
" Otherwise use the special 'diffexpr' for Windows.
if &diffopt !~# 'internal'
set diffexpr=MyDiff()
endif
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg1 = substitute(arg1, '!', '\!', 'g')
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg2 = substitute(arg2, '!', '\!', 'g')
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let arg3 = substitute(arg3, '!', '\!', 'g')
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
if empty(&shellxquote)
let l:shxq_sav = ''
set shellxquote&
endif
let cmd = '"' . $VIMRUNTIME . '\diff"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
let cmd = substitute(cmd, '!', '\!', 'g')
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
if exists('l:shxq_sav')
let &shellxquote=l:shxq_sav
endif
endfunction
set shortmess=atI
set nu
set rnu
set guifont=Consolas:h9
set showmatch
colorscheme slate
syntax enable
syntax on
filetype indent on
filetype plugin indent on
call plug#begin()
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
Plug 'lervag/vimtex'
call plug#end()
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsListSnippets="<c-tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
let g:UltiSnipsSnippetDirectories=['C:\Users\Admin\vimfiles\plugged\ultisnips']
"LaTeX配置
let g:tex_flavor='latex'
let g:vimtex_texcount_custom_arg=' -ch -total'
"映射VimtexCountWords!\lw 在命令模式下enter此命令可统计中英文字符的个数
au FileType tex map <buffer> <silent> <leader>lw :VimtexCountWords! <CR><CR>
let g:Tex_ViewRule_pdf = 'C:\Users\Admin\AppData\Local\SumatraPDF\SumatraPDF.exe -reuse-instance -inverse-search "gvim -c \":RemoteOpen +\%l \%f\""'
"这里是LaTeX编译引擎的设置,这里默认LaTeX编译方式为-pdf(pdfLaTeX),
"vimtex提供了magic comments来为文件设置编译方式
"例如,我在tex文件开头输入 % !TEX program = xelatex 即指定-xelatex (xelatex)编译文件
let g:vimtex_compiler_latexmk_engines = {
\ '_' : '-pdf',
\ 'pdflatex' : '-pdf',
\ 'dvipdfex' : '-pdfdvi',
\ 'lualatex' : '-lualatex',
\ 'xelatex' : '-xelatex',
\ 'context (pdftex)' : '-pdf -pdflatex=texexec',
\ 'context (luatex)' : '-pdf -pdflatex=context',
\ 'context (xetex)' : '-pdf -pdflatex=''texexec --xtx''',
\}
"这里是设置latexmk工具的可选参数
let g:vimtex_compiler_latexmk = {
\ 'build_dir' : '',
\ 'callback' : 1,
\ 'continuous' : 1,
\ 'executable' : 'latexmk',
\ 'hooks' : [],
\ 'options' : [
\ '-verbose',
\ '-file-line-error',
\ '-shell-escape',
\ '-synctex=1',
\ '-interaction=nonstopmode',
\ ],
\}
" 阅读器相关的配置 包含正反向查找功能 仅供参考
"let g:vimtex_view_method = 'general'
"let g:vimtex_view_general = {
\ 'method': 'general',
\ 'command': 'C:\Users\Admin\AppData\Local\SumatraPDF\SumatraPDF.exe',
\ 'args': ['--reuse-instance', '--forward-search', '"%:p"', '%l', '--inverse-search', '"^"C:\Program Files\vim\vim91\gvim.exe^" -f % -c :call cursor(%line, %col)"'],
\}
"autocmd BufWritePost *.tex silent call vimtex#compiler#compile()
let g:vimtex_view_general_viewer = 'C:\\Users\\Admin\\AppData\\Local\\SumatraPDF\\SumatraPDF.exe' "这里放置你的sumatrapdf 安装路径
"let g:vimtex_view_general_options_latexmk = '-reuse-instance'
let g:vimtex_view_general_options
\ = ' -reuse-instance -forward-search @tex @line @pdf'
\ . ' -inverse-search "' . 'cmd /c start /min \"\" ' . exepath(v:progpath)
\ . ' -v --not-a-term -T dumb -c \"VimtexInverseSearch %l ''%f''\""' "for vim/gvim
"编译过程中忽略警告信息
let g:vimtex_quickfix_open_on_warning=1
let g:vimtex_quickfix_mode=0
set conceallevel=1
let g:tex_conceal='abdmg'
小白为了书写方便把整个文件都贴上来了,其实我们主要要关注的就是:
call plug#begin()
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
Plug 'lervag/vimtex'
call plug#end()
另外就是其他一些涉及强行指定插件安装位置的语句,这些都可以不需要了。
2 如何在SumatraPDF中配置反向查看
小白尝试了很久,发现虽然_vimrc文件中的配置没有报错,但是一直没有啥效果。
需要在SumatraPDF 菜单栏中找到"设置" -> “选项”
在“设置反向搜索命令行”“请输入您双击PDF文件后调用的命令行”里填写
cmd /c start /min "" "C:\Program Files\Vim\vim91\gvim.exe" -v --not-a-term -T dumb -c "VimtexInverseSearch %l '%f'"
注意,如果你和小白一样,gvim是安装在C:\Program Files
目录下,则由于空格的存在,一定要把路径地址用双引号包围起来,否则会报错,系统找不到C:\Program
这个目录。
3 编译后在SumatraPDF中不刷新问题
这个问题困扰了小白很久,后来在vimtex的issue里找到了一些答案。按照issue里所说,其实这个问题很可能是由SumatraPDF本身导致的。小白尝试在两台电脑上安装,一台出现了这种问题,另一台没有。这个问题目前没有解决方案。vimtex的作者也说暂时不知道问题出在了何处,但是有一位用户提到,如果你在pdf文件中输入’r’键,则自动刷新后就得到了最新编译的pdf。
这个问题的相关解答可以参考# SumatraPDF doesn’t auto-reload / refresh compiled PDF when using xelatex engine #2830
4 设置 continous编译模式后会出现stopped问题
在编译过程中,当小白第二次更新文件并编译时,却发现提示
compile stopped
小白本以为这是一个bug
后来也是查到了vimtex的issue,作者解释了这个问题,意思是这不是一个bug,是编译器的正常表现。
具体解释可以查看# Compiler running after Compilation completed #2131
:VimtexCompile If the compiler supports and is set to run in
continuous mode, then this command works as
a compiler toggle. If not, this command will run
a single shot compilation.
小白暂时就发现和解决了这些疑惑。
剩余的事情还包括,要如何配置自己的snippets文件,以及如何使用那位神级小哥所说的inkscape工具快速绘图的问题。
路漫漫其修远兮,吾将上下而求索。