Vim+VimTeX:带给你飞一般的LaTeX编辑体验

  • 笔者采用的环境为Windows 10+gvim+TeXLive2020
  • 本文主要参考VimTeX的使用说明vimtex.txt
  • 在此,向VimTeX的开发者lervag致以谢意,感谢他开发维护了如此amazing的插件

更新日志:

  • 2022/04/18: 采用VimtexInverseSearch进行反向搜索

1. 什么是VimTeX1

  • vimtex是一款现代化的vim/gvim编辑器插件,方便LaTeX用户在vim编辑器下编辑,编译LaTeX文件,生成pdf文件。
  • 特性
    • 它最大的特点就是增加了vim/gvim对LaTeX文件的编译支持(一定程度上也简化了一些编译操作),使得我们不需要用命令行来编译tex源文件
    • 提供了一系列LaTeX文件的编译方式(latexrun,latexmk 等 )的支持,内置了一些快捷键映射,当然也可以自行配置编译方式
    • 支持tex语法高亮, 提供pdf阅读器的接口(如可以调用sumatra pdf阅读器预览生成的latex文件)。
    • 支持pdf文件的反向搜索(反向搜索源代码),精确到行
    • 支持部分文件编译:选中某个tex文件的完整片段,只编译选中的代码片段,方便用户调试latex code
    • 统计tex文件中中西文字符的个数(其实是调用了TeXlive发行版中已经打包好的texcount脚本)
    • 支持在每个section之中快速跳转
    • 一些有用的映射,如tsf 将光标处分式在横排分式和竖排分式之间切换;cse改变光标周围的环境名称;]]自动补全右括号或环境名...(这个可以帮助我们完成括号匹配)
    • ...

2. 安装

如果您采用vim-plug管理vim插件,直接在.vimrc文件中添加

1
Plug 'lervag/vimtex'

  • 然后normal模式下运行:PlugInstall即可安装成功

3. 开始你的配置

  • 我采用的是latexmk管理我的tex文件编译+Sumatra PDF预览pdf编译结果

  • 在此贴上我的vimrc配置文件23

    E:\Latex\SumatraPDF\SumatraPDF.exe需要根据你的sumatra安装路径进行更改)

自VimTeX-commit f9fd179/tag v2.8 之后,增加了:VimtexInverseSearch支持反向搜索

VimTeX now works even better with inverse search from viewers:

  • I've added :VimtexInverseSearch that can be used by the viewer specific configuration to communicate with VimTeX in a "server agnostic" manner. See :help vimtex-synctex-inverse-search for more info.
  • The documentation on configuration of inverse search with viewers has been rewritten.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"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 = 'E:\Latex\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_general_viewer = 'E:\LaTeX\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=0

4. Hello World

用vim/gvim打开一个文件,然后输入

1
2
3
4
5
6
7
8
% !TEX program = xelatex
\documentclass{atricle}
\usepackage{ctex}
\begin{document}
Hello,LaTeX{} World!

你好,世界!
\end{document}

  • 然后,<esc>进入normal模式,:w保存,输入\ll等待一小会,就可得到一个perfect的pdf文档

  • Note:由于latexmk的特性(一旦检测到tex源文件或者相关文件的更改,就可自动编译的)。也就是说,后续修改文件,添加文字,我们只要:w保存, 之后等待vim状态栏下方回显出vimtex: Compilation completed字样,接着输入\lv就可查看更新后的pdf文档。

5. 用法

5.1. 基本用法

按键 效果 工作模式
\li vimtex-info(文件信息) n
\lt vimtex-toc-open(打开目录) n
\ll vimtex-compile(编译文件) n
\lv vimtex-view(查看pdf文档) n
\li vimtex-imap-list(查看insert 模式下已定义的映射) n
K vim-doc-package(查看宏包信息) n

5.2. imaps映射4

imaps映射
  • 举例来说, 如果你想输入 , 那么在插入模式下,只需要输入 + 8 就行了 (因为8躺下了就是

5.3. 模块编辑

  • cse:change surrounding environment 比如在一个 align周围(注意是将光标调整到align周围或环境内部),我们按下按键cse,在命令行就会出现
1
2
3
Change surrounding environment:align
>[光标]

的提示,然后我们在光标处输入equation,那么这个环境就会变成

1
2
3
\begin{equation}
...
\end{equation}


  • tsd:toggle surrounding delimiter,互换括号,这个命令经常被用到
    • (..光标..)\left(..光标\right..)之间切换
    • [..光标..]\left[..光标..\right]
    • \{..光标..\}\left\{..光标..\right\}

  • ]],自动补全右括号,右环境.%自动配对光标处的另一个括号 如
1
2
3
4
5
6
7
8
9
10
11
({[78光标
-一次]]->({[78]光标
-2]]->({[78]}光标
....................
\begin{equation}
a^2+b^2=c^2
光标
-]]->
\begin{equation}
a^2+b^2=c^2
\end{equation}光标

  • 常用的textobj模块,这些可以和y(复制),d(删除)及c(修改)搭配使用(详情请查看5)
  • ic,ac:Text object for commands
  • id,ad:Text object for delimiters
  • ae,ie:Text object for environments
  • a$,i$:Text object for inline math
  • ... 如:
    1
    2
    3
    4
    5
    ..(78787光标8ui)..
    -di(-->(光标)
    .........
    ..(78787光标8ui)..
    -da(-->..光标..
    Note:a.包括文字两侧的环境,括号,$等,i.仅仅包括被包围起来的文字。

6. vimtex的哲学

  • vimtex并不试图将vim变成一个完全的LaTeX IDLE(这样可能会拖慢vim/gvim的加载速度)
    • 几乎不提供LaTeX片段支持,因为有更好的插件实现:ultisnips+vim-snippets
    • vimtex是模块化的,你可以选择关掉那些你不喜欢的功能(例如文件折叠)

7. 进阶操作

  • ultisnips+vim-snippets可实现tex片段补全,以及编辑LaTeX文件的速度6
  • 当然为了实现上面飞一般的操作, 也许你需要安装python环境以及sympypackage
  • 后续,学习学习再补充

  1. 1.vimtex/README ↩︎
  2. 2.latexmk.pdf ↩︎
  3. 3.Is there any plan for the ``magic comments'' ↩︎
  4. 4.Vim Latex 的使用和配置技巧 (二) ↩︎
  5. 5.vimtex文档说明 ↩︎
  6. 6.世界上最好的编辑器Vim:1700多页数学笔记是如何实时完成的 ↩︎