vim+latex(1.00)

vim operator
vim configure information
vim translate

Vim LaTeX 完整配置指南 (Fedora 44)

环境: Fedora 44 / Vim 9.2 / Python 3.14 / Zathura 0.5.14 / TeX Live 2026
最后更新: 2026-04-22


目录

  1. 系统依赖安装
  2. Vim 插件安装
  3. .vimrc 配置详解
  4. UltiSnips 代码片段
  5. 编译 LaTeX
  6. 查看 PDF
  7. VimTeX 常用命令
  8. 完整工作流示例
  9. 常见问题

1. 系统依赖安装

TeX Live (LaTeX 编译器)

# 最小安装 — 只有 pdflatex/xelatex/lualatex 基础功能
sudo dnf install texlive-scheme-basic

# 推荐安装 — 包含常用宏包 (booktabs, hyperref, listings, beamer 等)
sudo dnf install texlive-scheme-basic texlive-collection-latexrecommended

# 中文支持 (如果需要写中文论文)
sudo dnf install texlive-collection-langchinese

# 检查安装
which pdflatex xelatex lualatex latexmk

Zathura (PDF 阅读器)

# Zathura — 轻量级 PDF 阅读器,支持 VimTeX 正向/反向搜索
sudo dnf install zathura zathura-pdf-poppler

Python (UltiSnips 的 Python snippet 需要)

# Fedora 44 默认自带 Python 3
python3 --version    # 3.14.3

2. Vim 插件安装

~/.vimrccall plug#begin('~/.vim/plugged')call plug#end() 之间添加:

" LaTeX 编辑核心插件
Plug 'lervag/vimtex'               " LaTeX 全套支持:编译、补全、正向/反向搜索、语法检查

" LaTeX 数学符号隐藏显示 (让公式看起来更清爽)
Plug 'KeitaNakamura/tex-conceal.vim'

" 代码片段引擎 — 快速展开模板和常用结构
Plug 'sirver/ultisnips'

" 代码片段补全源 (可选,提供 LaTeX 默认 snippets)
Plug 'honza/vim-snippets'

安装命令:

# 打开 Vim 后执行
:PlugInstall

插件说明

插件 作用
vimtex LaTeX 编辑的瑞士军刀:编译、错误跳转、目录、补全、参考文献管理
tex-conceal.vim \alpha 隐藏显示为 α\rightarrow 显示为 ,纯视觉美化
ultisnips 代码片段引擎,输入缩写后按快捷键展开为完整代码
vim-snippets (可选) UltiSnips 的默认 snippet 库,包含 LaTeX 常用片段

3. .vimrc 配置详解

以下是与 LaTeX 相关的完整配置,添加到 ~/.vimrc 中:

" ===================== VimTeX =====================

" 指定 LaTeX 风格 (默认用 LaTeX,而非 Plain TeX)
let g:tex_flavor = 'latex'

" PDF 查看器 — 使用 Zathura
let g:vimtex_view_method = 'zathura'

" 关闭自动打开 quickfix 窗口 (编译错误列表)
" 如果想自动弹出错误列表,设为 1
let g:vimtex_quickfix_mode = 0

" 正向搜索: Vim 编译后自动跳转到 Zathura 对应位置
" 反向搜索: 在 Zathura 中双击/Ctrl+点击 跳回 Vim 对应行
" 需要配合 Zathura 的 synctex 支持
let g:vimtex_view_zathura_options = '-x "vim --remote-silent +%l %f"'

" VimTeX 项目根目录标记
" 在这些文件所在的目录向上搜索作为项目根
let g:vimtex_root_markers = ['.git', '.latexmkrc', 'main.tex']

" ===================== tex-conceal =====================

" 隐藏级别: 1 = 部分隐藏, 2 = 全部隐藏, 0 = 不隐藏
set conceallevel=1

" 控制哪些符号被隐藏显示:
" a = \alpha→α, b = \beta→β, d = \delta→δ,
" m = 数学符号, g = 希腊字母
let g:tex_conceal = 'abdmg'

" 隐藏后的背景色设为透明 (避免出现方块)
hi Conceal ctermbg=none

" ===================== UltiSnips =====================

" 展开 snippet 的触发键 — Ctrl+j
" 注意: 不要用 Tab,会和 coc.nvim 补全冲突
let g:UltiSnipsExpandTrigger = '<C-j>'

" snippet 内光标向前跳 (下一个占位符)
let g:UltiSnipsJumpForwardTrigger = '<C-j>'

" snippet 内光标向后跳 (上一个占位符)
let g:UltiSnipsJumpBackwardTrigger = '<C-k>'

" 展开后删除snippet触发词 (默认就是删除)
let g:UltiSnipsRemoveSnippetMarker = 1

" snippet 文件存放目录
" 默认就是 ~/.vim/UltiSnips/,不需要改
" UltiSnips 会自动加载该目录下所有与 filetype 匹配的 .snippets 文件
" 例如打开 .tex 文件时自动加载: tex.snippets + latex.snippets

UltiSnips 与 coc.nvim 的 Tab 冲突解决

问题: coc.nvim 用 Tab 做补全,UltiSnips 也想用 Tab 展开 snippet,两者冲突。

解决: UltiSnips 改用 Ctrl-j / Ctrl-k,Tab 留给 coc。

" coc.nvim 的 Tab 映射 (保持不变)
inoremap <silent><expr> <TAB>
      \ coc#pum#visible() ? coc#pum#next(1) :
      \ CheckBackspace() ? "\<Tab>" :
      \ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"

" UltiSnips 用 Ctrl-j 展开/前进,Ctrl-k 后退
let g:UltiSnipsExpandTrigger = '<C-j>'
let g:UltiSnipsJumpForwardTrigger = '<C-j>'
let g:UltiSnipsJumpBackwardTrigger = '<C-k>'

4. UltiSnips 代码片段

文件结构

~/.vim/UltiSnips/
├── tex.snippets        # 数学公式 snippet (分数、上下标、bra/ket、sympy)
├── latex.snippets      # 文档结构 snippet (模板、章节、图表、列表)
└── markdown.snippets   # Markdown 笔记 snippet

注意: docrp 模板默认包含 todonotes 宏包以支持 todo snippet。
如果用 xelatex 编译,模板已移除 inputenc(xelatex/lualatex 不需要也不兼容该宏包)。

tex.snippets — 数学公式

触发 展开结果 说明
mk $...$ 行内公式
dm \[...\] 行间公式
// \frac{}{} 分数
sr ^2 平方
cb ^3 立方
td ^{} 自定义上标
bar \overline{} 上划线
hat \hat{} 帽子
X2 X_2 自动下标 (字母+数字)
sympy...sympy 计算结果 sympy 实时求值

特殊功能:

  • 输入 a2 自动展开为 a_2 (正则匹配,任何字母+单个数字)
  • 输入 3a/5 自动展开为 \frac{3a}{5} (括号前的内容自动变分子)
  • sympy 块: 输入 sympy integrate(x**2, x) sympy 自动计算为 LaTeX

latex.snippets — 文档结构

触发 展开结果 说明
doc 完整 article 模板 含 amsmath, graphicx, booktabs, hyperref, todonotes
rp 完整 report 模板 含目录, todonotes
beamer 完整 beamer 模板 16:9 比例
sec / ssec / sssec \section{} / \subsection{} / \subsubsection{} 章节标题
para \paragraph{} 段落标题
enum / item / desc 列表环境 有序/无序/描述列表
ali / gat align* / gather* 多行公式对齐
cases cases 环境 分段函数
mat 矩阵环境 可选 p/b/B/v/V 前缀
fig figure 环境 含 \includegraphics
tab table 环境 含 booktabs 三线表
code lstlisting 环境 代码清单
bf / it / ul \textbf{} / \textit{} / \underline{} 常用格式
cite / ref / href 引用/链接
fn \footnote{} 脚注
todo \todo[]{} 待办标记 (需 todonotes 宏包)
note 居中框注 \fbox{\parbox{...}{}}

markdown.snippets — 笔记

触发 展开结果 说明
h1~h4 # ~ #### 标题层级
b / i / s **bold** / *italic* / ~~strike~~ 格式
code / codeblock `code` / 代码围栏 代码
link / img Markdown 链接/图片
ul / ol / tl 无序/有序/任务列表
tbl Markdown 表格
date 2026-04-22 自动插入当天日期
datetime 2026-04-22 14:30 自动插入日期时间
front YAML front matter 含 title, date, tags
note / tip / warn Obsidian 风格 callout > [!note]

Snippet 语法速查

" 基本格式
snippet 触发词 "描述" 选项
展开内容,$1 $2 是光标跳转点,$0 是最终位置
endsnippet

" 选项说明:
" b = 只在行首触发 (beginning of line)
" i = 不要求词边界 (in-word, 如 X2 中的 2)
" w = 要求词边界 (word boundary)
" A = 自动触发 (不需要额外确认)
" r = 正则触发

" Python 代码执行 (用 `!p 标记)
`!p snip.rv = "动态内容"    `

" 占位符
$1  ${1:默认值}  $0(最终光标位置)

5. 编译 LaTeX

方法一: VimTeX 内置编译 (推荐)

" 在 Vim 中,打开 .tex 文件后:
\ll          " 编译当前文件 (默认用 latexmk)
\lv          " 查看 PDF (启动/跳转到 Zathura)
\lk          " 停止编译进程
\le          " 查看错误
\lc          " 清理辅助文件

" 或用 Leader 键:
<Leader>le   " 查看错误 (如果 Leader 是空格,就是 空格+l+e)

方法二: 命令行编译

# pdflatex — 最常用的编译器
pdflatex main.tex

# latexmk — 自动处理多次编译 (目录、交叉引用、参考文献)
latexmk -pdf main.tex

# latexmk 持续模式 — 保存文件后自动重新编译
latexmk -pdf -pvc main.tex

# xelatex — 支持系统字体,适合中文
xelatex main.tex

# lualatex — 支持 Lua 脚本,最现代的编译器
lualatex main.tex

方法三: AsyncRun (你已安装的 asynctasks.vim + asyncrun.vim)

在项目根目录创建 .tasks 文件:

[project-build]
command=latexmk -pdf -interaction=nonstopmode main.tex
cwd=<root>
output=quickfix

[project-run]
command=zathura main.pdf &
cwd=<root>

然后在 Vim 中按 F7 编译,F8 查看。

latexmk 配置文件 (可选)

在 LaTeX 项目根目录创建 .latexmkrc

# 使用 xelatex 编译 (适合中文)
$xelatex = 'xelatex -synctex=1 -interaction=nonstopmode -file-line-error %O %S';
$pdf_mode = 5;  # 5 = xelatex, 1 = pdflatex, 4 = lualatex

# 或者用 pdflatex
# $pdf_mode = 1;

# 持续编译模式
# $pvc_view_file = "zathura %O %S";

# 清理时保留的文件扩展名
# $clean_ext = "aux bbl blg fdb_latexmk fls fnav_log lof lot nav out snm synctex.gz toc";

编译中文 LaTeX

% 方法 1: xelatex + ctex (推荐)
\documentclass[12pt]{article}
\usepackage{ctex}  % 自动检测系统中文字体

% 方法 2: 如果用 pdflatex,需要额外配置字体映射
% \usepackage{CJKutf8}
% \begin{CJK}{UTF8}{gbsn} ... \end{CJK}

编译命令:

xelatex main.tex
# 或
latexmk -xelatex main.tex

6. 查看 PDF

Zathura — 与 VimTeX 配合的最佳选择

# 安装
sudo dnf install zathura zathura-pdf-poppler

# 打开 PDF
zathura main.pdf

# 常用快捷键 (Zathura 内置 Vim 键位):
# J/K       上下翻页
# Ctrl+d/u  半页翻
# Space     下一页
# gg/G      首页/末页
# f         跟随链接
# Tab       显示目录
# /         搜索
# q         退出

正向搜索 (Vim → PDF)

在 Vim 中编译并跳转到 PDF 对应位置:

\lv    " 编译 + 打开 PDF 并跳转到当前光标所在行

反向搜索 (PDF → Vim)

在 Zathura 中双击或按 Ctrl+左键,自动跳转到 Vim 中对应的 LaTeX 源码行。

前提条件:

  1. 编译时需要 synctex 支持 (latexmk 默认开启)
  2. .vimrc 中已配置 vimtex_view_zathura_options

其他 PDF 阅读器

如果不想用 Zathura,VimTeX 也支持:

" Okular (KDE)
let g:vimtex_view_method = 'zathura'    " 改为 'okular'

" Skim (macOS)
" let g:vimtex_view_method = 'skim'

" General (使用系统默认 PDF 阅读器)
" let g:vimtex_view_general_viewer = 'xdg-open'

7. VimTeX 常用命令

所有 VimTeX 命令都以 \ 开头(默认前缀),在 normal 模式下输入。

编译相关

命令 说明
\ll 编译当前文件
\lv 查看 PDF (启动阅读器并跳转)
\lk 停止编译
\le 查看编译错误
\lg 查看编译日志
\lc 清理辅助文件 (.aux, .log 等)

导航相关

命令 说明
\lt 打开目录 (Table of Contents)
\lq 查看文献信息
\lr 关联文献 (bib 文件)
\lk 停止编译

文本对象 (配合 vim-surround 使用)

文本对象 说明
cid 内联数学 $...$
cd 行间数学 \[...\]
ce 环境 \begin{env}...\end{env}
cm 命令 \command{}
c$ 数学公式 (同 cid)
d$ 删除数学公式
y$ 复制数学公式
dae 删除整个环境

补全 (配合 coc.nvim 或 VimTeX 内置补全)

" VimTeX 内置补全 (不依赖 coc)
" 在 insert 模式下:
" \begin{...} 之后自动弹出环境名补全
" \cite{ 之后弹出参考文献补全
" \ref{ 之后弹出标签补全
" Ctrl+x Ctrl+o  手动触发 omni 补全

自定义快捷键 (可选)

" 编译和查看
nmap <Leader>ll <Plug>(vimtex-compile)
nmap <Leader>lv <Plug>(vimtex-view)

" 目录
nmap <Leader>lt <Plug>(vimtex-toc-open)

" 快速插入常用环境
autocmd FileType tex nnoremap <buffer> <Leader>ie i\begin{env}<CR>\end{env}<Esc>O
autocmd FileType tex nnoremap <buffer> <Leader>if i\frac{}{}<Esc>i
autocmd FileType tex nnoremap <buffer> <Leader>im i\[
<CR>\]<Esc>O

8. 完整工作流示例

从零开始写一篇 LaTeX 文档

# 1. 创建项目目录
mkdir -p ~/latex/my-paper && cd ~/latex/my-paper

# 2. 创建 main.tex
vim main.tex

# 3. 在 Vim 中输入 doc 然后 Ctrl-j,展开为完整模板
#    填写标题、作者,开始写内容

# 4. 编译: 在 Vim 中按 \ll
# 5. 查看 PDF: 按 \lv (自动打开 Zathura 并跳转)
# 6. 继续编辑,保存,再次 \ll 编译

# 7. 或者用 latexmk 持续模式,保存即编译:
#    在终端运行: latexmk -pdf -pvc main.tex

日常编辑技巧

# 快速插入行内公式: mk + Ctrl-j → $...$
# 快速插入行间公式: dm + Ctrl-j → \[...\]
# 输入 3/5 自动展开为 \frac{3}{5}
# 输入 a2 自动展开为 a_2
# 输入 xbar 自动展开为 \overline{x}
# 输入 sec + Ctrl-j 插入 \section{}
# 输入 fig + Ctrl-j 插入 figure 环境模板

# 选中文字后用 vim-surround:
# cs$  → 把选中内容包在 $...$ 中
# csd  → 把选中内容包在 \[...\] 中

Beamer 幻灯片

vim slides.tex
# 输入 beamer + Ctrl-j 展开模板
# 添加新的 frame:
\begin{frame}{标题}
内容
\end{frame}
# 编译: \ll
# 查看: \lv

9. 常见问题

Q: 编译报错 "File xxx.sty not found"

# 缺少宏包,搜索并安装:
dnf search texlive | grep 宏包名
sudo dnf install texlive-xxx

Q: 中文显示乱码或报错

# 确保用 xelatex 编译,并在文档中加 \usepackage{ctex}
xelatex main.tex

# 如果还报错,安装中文支持:
sudo dnf install texlive-collection-langchinese

Q: VimTeX 编译后 Zathura 没有打开

# 检查 synctex 是否启用 (编译输出中找 synctex)
latexmk -pdf -synctex=1 main.tex

# 检查 Zathura 是否安装:
which zathura

Q: UltiSnips snippet 不生效

# 1. 确认 UltiSnips 已安装: 在 Vim 中 :echo exists('g:loaded_ultisnips')
# 2. 确认 snippet 文件位置: ~/.vim/UltiSnips/
# 3. 确认文件名与 filetype 匹配: .tex 文件 → tex.snippets / latex.snippets
# 4. 确认触发键: Ctrl-j 而不是 Tab
# 5. 查看 snippet 定义: 在 Vim 中 :UltiSnipsEdit

Q: coc.nvim 和 UltiSnips Tab 冲突

" 已解决: UltiSnips 用 Ctrl-j,coc 用 Tab
" 如果 Ctrl-j 被其他插件占用,可以在 .vimrc 中检查:
" :verbose imap <C-j>

Q: tex-conceal 不生效

" 确认 conceallevel > 0
set conceallevel=1

" 确认 g:tex_conceal 已设置
let g:tex_conceal = 'abdmg'

" 注意: conceal 只影响显示,不影响实际内容和编译

Q: latexmk 编译很慢

# 用持续模式,首次编译后增量编译会很快
latexmk -pdf -pvc main.tex

# 或只编译当前章节 (需要子文件结构)
# \input{chapter1}

文件清单

~/.vimrc                              # Vim 配置文件
~/.vim/plugged/vimtex/                # VimTeX 插件
~/.vim/plugged/tex-conceal.vim/       # 符号隐藏插件
~/.vim/plugged/ultisnips/             # UltiSnips 引擎
~/.vim/plugged/vim-snippets/          # 默认 snippet 库 (可选)
~/.vim/UltiSnips/tex.snippets         # 数学公式 snippet
~/.vim/UltiSnips/latex.snippets       # 文档结构 snippet
~/.vim/UltiSnips/markdown.snippets    # Markdown 笔记 snippet
posted @ 2026-01-26 21:39  游翔  阅读(22)  评论(0)    收藏  举报