(欢迎大家去我的博客观看此文:https://www.mond.top/ubuntu/vim-and-latex/
在使用 Vscode 的 LaTex Workshop 编辑 LaTex 文档很长一段时间后,我发现了这篇文章:How I’m able to take notes in mathematics lectures using LaTeX and Vim。文章作者使用 Vim 和各种快捷操作令自己撰写 LaTex 文档的速度跟上了老师板书的速度。我作为一个菜鸡,瞬间想起了多年前我发现 Vim 编辑器时的那个阳光明媚的下午。自那以来,我断断续续地尝试过使用 Vim 来提高自己的工作效率,但实际的效果并不如意。究其根本,并非是 Vim 不好用,而是还没等到自己记住那些键位,熟悉各种快捷操作,就已经产生了畏难放弃的想法。回过头来想想,学习不能这样,还是要勇于跳出自己的舒适圈。怀着这样的想法,我又开始了这一次的尝试。
本次使用的编辑器不是 Vim,而是其衍生产品 neovim(下文简称作 nvim)。有着更加现代的设计,nvim 和 vim 的区别网上也有很详细的讨论,这里就不再赘述了。总而言之,接下来记录的配置过程均在 nvim 中完成。
🔑 值得一提的是,这次尝试就是奔着用 nvim 写 Tex 这个目的去的,至于用 nvim 来编写调试 Python、C 这些功能都没有进行专门的配置,所以这份配置用来编程并不好使。
基础配置
""""""""""""""""""""""""""""""""""""""""""""""""""""
" General "
""""""""""""""""""""""""""""""""""""""""""""""""""""
" 设置256色
if (empty($TMUX))
if (has("nvim"))
let $NVIM_TUI_ENABLE_TRUE_COLOR=1
endif
if (has("termguicolors"))
set termguicolors
endif
endif
set clipboard+=unnamedplus " 剪贴板与系统共享
set number " 显示行号
set relativenumber " 显示相对行号
set cursorline " 高亮当前行
set cursorcolumn " 高亮当前列
set scrolloff=10 " 垂直滚动时,光标距离顶部/底部的位置
set autoread " 打开文件监视,如果编辑中文件发生外部改变就进行提示
set noautowrite " 移开焦点时不自动保存
set laststatus=2 " 是否显示状态栏。0 表示不显示,1 表示只在多窗口时显示,2 表示显示
set showmode " 在底部显示,当前处于命令模式还是插入模式
set showcmd " 命令模式下,在底部显示,当前键入的指令
set mouse=a " 支持鼠标
set encoding=utf-8 " 使用 utf-8 编码
" 打开文件时会逐一尝试这些进行解码,要把更严格的解码方式放在前面
set fileencodings=ucs-bom,utf-8,gbk,gb2312,cp936,gb18030,big5,euc-jp,euc-kr,latin1
scriptencoding utf-8
set autoindent " 按下回车键后,下一行的缩进会自动跟上一行的缩进保持一致
set tabstop=4 " 按下 Tab 键时,Vim 显示的空格数
set shiftwidth=4 " 按下>>(增加一级缩进)、<<或者==(取消全部缩进)时每一级的字符数
set smarttab " 根据文件中其他地方的缩进空格数来确定一个tab是多少个空格
set expandtab " 自动将 Tab 转为空格
set softtabstop=4 " Tab 转为多少个空格
set wrap " 自动折行
set linebreak " 只有遇到指定的符号才自动折行
set showbreak=>>
" set textwidth=80 " 超过这个数字会自动换行
set colorcolumn=100 " 在这个地方画一条线
set ignorecase " 搜索忽略大小写
set smartcase " 只有一个大写字母的搜索词,将大小写敏感;其他情况都是大小写不敏感
set hlsearch " 高亮显示匹配结果
set incsearch " 输入搜索模式时,每输入一个字符,就自动跳到第一个匹配的结果
set showmatch " 高亮匹配的括号
" 如果行尾有多余的空格(包括 Tab 键),该配置将让这些空格显示成可见的小方块。
set list
set listchars=tab:?\ ,eol:\ ,trail:·,extends:?,precedes:?
set fillchars=vert:│,fold:·
set nofoldenable " 代码不折叠
set foldmethod=syntax " 按语法结构进行折叠
set foldlevelstart=2
" set conceallevel=1 " 自动隐藏字符
set nobackup " 不创建备份
set nowritebackup
set undofile " 保留撤销历史
" 保存当前会话时保存的内容,下次打开时会恢复。
set sessionoptions=buffers,curdir,folds,tabpages,winpos,winsize
" 命令模式下显示自动补全候选
set wildmenu
set wildmode=longest,full
set completeopt=menu,menuone " 自动补全显示菜单
" use scriptencoding when multibyte char exists
scriptencoding utf-8
filetype plugin indent on
if !exists('g:syntax_on')
syntax enable
endif
nvim 插件
用起插件,还是要有一个插件管理器,笔者使用的是 vim-plug 。其安装方式为:
sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
安装完成后,打开 ~/.config/nvim/init.vim 来进行配置。安装插件时,将想要安装的插件放入如下结构之中:
call plug#begin('~/.config/nvim/plugged')
Plug 'author/plug-name' " 这里就是单引号内就是要装的插件
call plug#end()
单引号的内容是 GitHub 上的仓库名,比如插件的 github 地址是 https://github.com/Yggdroot/indentLine,那么放在单引号里的内容就是 Yggdroot/indentLine 。看下面装的插件就明白了。
修改配置文件后,重启 nvim,然后输入指令 :PlugInstall ,即可完成插件的安装,然后就可以对插件进行配置。
我推荐的插件如下,大家可以点进项目的 GitHub 主页查看使用方法。
Tex 相关插件
要用 nvim 写 Tex 文档并成功编译,就需要 lervag/vimtex 插件的支持。下载完成后,做如下配置:
基础配置
设置 Tex 文档是 LaTeX 语法风格的文档:
let g:tex_flavor = 'latex'
设置不自动弹出报错窗口,可以通过 :copen 来手动打开:
let g:vimtex_quickfix_mode = 0
还有两行配置:
let g:tex_conceal='abdmg'
set conceallevel=1
这两行可以让文中的一些符号以一种更直观的方式显示出来,如下:
设置编译器:
let g:vimtex_compiler_latexmk = {
\ 'build_dir' : {-> 'out'},
\ 'executable' : 'latexmk',
\ 'options' : [
\ '-xelatex',
\ '-file-line-error',
\ '-synctex=1',
\ '-interaction=nonstopmode',
\ ],
\}
这里使用 latexmk 作为编译工具,并且设置了编译的选项,用 XeLatex 进行编译。第2行是设置编译产生的中间文件放在根目录下的 out 文件夹内,这样可以使目录看上去更加整洁干净。为了能够更好的编译中文,需要在 ~/.latexmkrc 文件中写入如下配置:
$pdf_mode=5;
表示我们是使用 XeLatex 进行编译。
设置退出时自动清理中间编译的文件:
augroup vimtex_config
autocmd!
autocmd User VimtexEventQuit call vimtex#compiler#clean(0)
augroup END
设置目录显示内容和显示宽度,并设置目录的自动刷新,设置后使用快捷键 \ +l+t 就可以打开目录。
let g:vimtex_toc_config = {
\ 'name' : 'TOC',
\ 'layers' : ['content', 'todo', 'include'],
\ 'split_width' : 30,
\ 'todo_sorted' : 0,
\ 'show_help' : 1,
\ 'show_numbers' : 1,
\}
augroup VimTeX
autocmd!
autocmd BufWritePost *.tex call vimtex#toc#refresh()
augroup END
PDF 的预览和定位
设置预览 PDF 的工具是 Zathura 阅读器,在 Linux 系统下推荐这个阅读器:
let g:vimtex_view_general_viewer = 'zathura'
let g:vimtex_view_method = 'zathura'
let g:vimtex_compiler_progname = 'nvr' " 这一行默认就是这个值,但如果编译出现问题,可以手动指定试一试。
安装上面的 nvr ,也就是 neovim-remote ,在系统终端运行:
pip3 install neovim-remote
注意要在你使用 nvim 的 python 环境下进行这个包的安装。
接下来配置 Zathura 阅读器,在其配置文件 ~/.config/zathura/zathurarc 下加入如下内容:
set synctex true
set synctex-editor-command "nvr --remote-silent %f -c %l"
这样就可以通过快捷键 \+l+v 来进行定位,而按住 Ctrl 的同时点击 PDF 的某个位置,即可反向定位至编辑器中的相应位置。
进阶配置
自定义代码片段
为了更好的自动补全,我们还需要提供贴合 Tex 的补全内容,而有人已经为我们总结好了,只需要用 :CocInstall coc-vimtex 指令安装专门为 vimtex 设计的 coc.nvim 插件即可。
接下来的内容是参考前文所说的那篇文章,为了让 Tex 文档的撰写更加便捷,更加贴合自身的使用习惯,我们可以设置自定义代码片段。这就要用到 SirVer/ultisnips 插件。该插件的使用方法可以参考这里:ultisnips-zh-doc。
绘图
绘图可以采用大神写的一个工具:inkscape-figures。安装好这个工具后,在插入模式下输入图片标题,再点击 Ctrl+F 即可打开 inkscape 界面,绘图完毕后保存,图片就可以自动插入到文档中。其中自动插入的片段可以自定义,具体的使用还是参考上面的链接。
自动保存
写 Tex 如果能实时预览那一定会好用不少。实际上 vimtex 插件在点击 \+l+l 按键后就会开始实时侦测文档的变化,当检测到变化后就会自动编译文档并生成新的 PDF。我们其实只要实现自动保存功能就好,使用如下配置可以在文本变化的时候自动保存:
autocmd TextChanged,TextChangedI <buffer> silent write
但就我个人而言,有时编辑文件并不想让其自动保存,这样在编辑出问题后还可以回退到最开始的文件。所以就设置为只有文件类型为 tex 时才自动保存。首先在配置文件中加入:
filetype plugin indent on
打开文件类型检测。然后在与配置文件相同的目录下,新建一个名为 ftplugin 的目录,目录下新建 tex.vim 的文件。将上面的配置语句放入该文件,则只对类型为 tex 的文件生效。
后记
我觉得使用 Vim 这件事,唯手熟尔,只有边练边学才有效果。我平时经常用 LaTeX 记笔记,刚好以此为途径,花了好些天把 vimtex 配好,希望使用一段时间后能熟悉 vim 的各种操作。
最近杂七杂八的事情搞得自己心烦意乱,想着静下心来学习的东西迟迟没有进展。时间过得太快,自己也把握不住,感觉是得好好整理整理心情再继续努力前进了。
Reference
- How I’m able to take notes in mathematics lectures using LaTeX and Vim | Gilles Castel
- How I draw figures for my mathematical lecture notes using Inkscape | Gilles Castel
- 使用 Neovim 和 vimtex 高效撰写 LaTeX 学术论文 | SpencerWoo | 少数派
|