如何用vim舒适地编写markdown和latex

文章目录

  • 前言
    • 主要配置
    • 优缺点
    • 注意事项
  • vim简单配置
    • vim-plug
      • 安装
      • 使用
    • vim配置
    • 输入法自动切换
    • 相关python依赖安装
    • coc.vim配置
  • markdown
  • latex
  • 更多
  • 补充
    • 为markdown添加大纲显示
      • Excuberant Ctags
      • easytags
      • tagbar
      • markdown2ctags
      • 配置
    • 格式化插件[neoformat](https://github.com/sbdchd/neoformat)
      • 插件安装
      • 依赖安装
        • prettier for markdown
        • latexindent.pl for latex
      • 插件配置

前言

主要配置

  • 操作系统:arch linux
  • 编辑器:neovim(coc-actions仅支持neovim),如果使用vim,请换用另外的补全插件
  • 预览:markdown使用typora,latex用vimtex调用MuPDF

优缺点

在使用vim之前,曾尝试了两种方案,一是vscode + vim,配置简单,功能都还不错,问题是自动输入法切换延迟有点长,甚至使用方向键都有点卡,二是jetbrains系列的ide,windows下用来码字是体验最好的(linux下对中文输入法不友好),但资源消耗太多,且预览不是很理想

下面是这套方案的优缺点

  • linux下vim的输入法切换体验远远好于windows(笔者未使用mac os,不清楚情况)
  • windows下使用texlive安装latex相关依赖,编译latex文档时出现错误,暂时没能修复,linux下比较稳定
  • neovim以及vim比vscode + vim插件更流畅
  • 支持latex即时编译,缺点是无法正反向搜索,这点在vscode中是支持的
  • typora对markdown渲染的支持比vim以及vscode的相关插件好得多,比如支持本地mp4视频插入等,缺点是无法正反向搜索

注意事项

  • 以下步骤全靠回忆,不会有错,但可能有漏,请小心操作,避免掉坑,欢迎留言
  • 由于网页的关系,直接从本文复制的内容可能存在非法字符,复制粘贴后应当检查一下
  • arch linux可能帮你避开许多坑,如果想了解并使用arch,可参考arch wiki安装教程,若水平有限,可以在网上搜索视频安装教程,还不行的话直接装manjaro吧
  • 装好下面提到的软件时注意检查是否可以直接在终端调用

vim简单配置

vim-plug

github地址

作者提供的安装方式应该是装不上的,似乎是这个链接本身有问题,不是GFW的锅

安装

把项目克隆到本地,将项目中的plug.vim放到~/.local/share/nvim/site/autoload目录下,如果你使用vim,可以放到~/.vim/autoload目录下

使用

编辑~/.config/nvim/init.vim

一个Plug对应一个插件,如果你和我一样只是想用vim编辑markdown和latex(不包括markdown预览),那就直接copy吧(注意可以更换第一行begin后插件存放的路径)

插件依次为自动补全、文件树、文件浏览器(需要安装nnn,没有的话就不要它了)、snippets补全、snippets补全、状态栏美化、自动格式化、markdown支持、开始界面、latex支持

部分本文未涉及的插件的具体用法请自行前往github查看,或者放弃使用

call plug#begin('~/.vim/plugged')  
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'preservim/nerdtree'
Plug 'mcchrish/nnn.vim'
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
Plug 'vim-airline/vim-airline'
Plug 'Chiel92/vim-autoformat'
Plug 'plasticboy/vim-markdown'
Plug 'mhinz/vim-startify'
Plug 'lervag/vimtex'   
call plug#end()

先别急着装插件,查看coc.nvim wiki,先把依赖装了,主要是nodejsyarn,作者给出的方法再次有点为难了,不过arch linux直接用包管理器装就行,其他的可能需要折腾一会儿

另外vim-autoformat插件需要安装依赖,在vim-autoformat的github主页下查找,主要是remark for markdown以及latexindent.pl for latex,arch系linux可以先尝试从aur安装,不行的话可以按照github上作者给出的方式安装,大概又是一番折腾,特别注意,如果这两个软件无法在全局调用,需要在配置文件中加上let g:formatterpath = ['/some/path/to/a/folder', '/home/superman/formatters'],也可以选择创建符号链接使其可在全局调用(暂时有个问题,格式化markdown时会将其中的latex公式比如$\frac{}{}$变为$\\frac{}{}$,不过可以手动替换\\\,或者也可以尝试其他的格式化工具,见补充部分)

重新进入neovim,执行:PlugInstall,等待安装结束,退出

vim配置

剩余的配置如下,重要的在下面,从" vim snippets##########################################开始,前面的除了前两行都是copy自coc.nvim的基础配置,不想细看就copy吧,如果只想编写markdown或latex,则删除对应插件的配置,顺便把前面的插件也给删了

set relativenumber
set number

" TextEdit might fail if hidden is not set.
set hidden

" Some servers have issues with backup files, see #649.
set nobackup
set nowritebackup

" Give more space for displaying messages.
set cmdheight=2

" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
" delays and poor user experience.
set updatetime=300

" Don't pass messages to |ins-completion-menu|.
set shortmess+=c

" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved.
set signcolumn=yes

" Use tab for trigger completion with characters ahead and navigate.
" NOTE: Use command ':verbose imap ' to make sure tab is not mapped by
" other plugin before putting this into your config.
inoremap  
			\ pumvisible() ? "\" :
			\ check_back_space() ? "\" :
			\ coc#refresh()
inoremap  pumvisible() ? "\" : "\"

function! s:check_back_space() abort
	let col = col('.') - 1
	return !col || getline('.')[col - 1]  =~# '\s'
endfunction

" Use  to trigger completion.
inoremap   coc#refresh()

" Use  to confirm completion, `u` means break undo chain at current
" position. Coc only does snippet and additional edit on confirm.
"  could be remapped by other vim plugin, try `:verbose imap `.
if exists('*complete_info')
	inoremap   complete_info()["selected"] != "-1" ? "\" : "\u\"
else
	inoremap   pumvisible() ? "\" : "\u\"
endif

" Use `[g` and `]g` to navigate diagnostics
nmap  [g (coc-diagnostic-prev)
nmap  ]g (coc-diagnostic-next)

" GoTo code navigation.
nmap  gd (coc-definition)
nmap  gy (coc-type-definition)
nmap  gi (coc-implementation)
nmap  gr (coc-references)

" Use K to show documentation in preview window.
nnoremap  K :call show_documentation()

function! s:show_documentation()
	if (index(['vim','help'], &filetype) >= 0)
		execute 'h '.expand('')
	else
		call CocAction('doHover')
	endif
endfunction

" Highlight the symbol and its references when holding the cursor.
autocmd CursorHold * silent call CocActionAsync('highlight')

" Symbol renaming.
nmap rn (coc-rename)

" Formatting selected code.
xmap f  (coc-format-selected)
nmap f  (coc-format-selected)

augroup mygroup
	autocmd!
	" Setup formatexpr specified filetype(s).
	autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
	" Update signature help on jump placeholder.
	autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end

" Applying codeAction to the selected region.
" Example: `aap` for current paragraph
xmap a  (coc-codeaction-selected)
nmap a  (coc-codeaction-selected)

" Remap keys for applying codeAction to the current line.
nmap ac  (coc-codeaction)
" Apply AutoFix to problem on the current line.
nmap qf  (coc-fix-current)

" Map function and class text objects
" NOTE: Requires 'textDocument.documentSymbol' support from the language server.
xmap if (coc-funcobj-i)
omap if (coc-funcobj-i)
xmap af (coc-funcobj-a)
omap af (coc-funcobj-a)
xmap ic (coc-classobj-i)
omap ic (coc-classobj-i)
xmap ac (coc-classobj-a)
omap ac (coc-classobj-a)

" Use CTRL-S for selections ranges.
" Requires 'textDocument/selectionRange' support of LS, ex: coc-tsserver
nmap   (coc-range-select)
xmap   (coc-range-select)

" Add `:Format` command to format current buffer.
command! -nargs=0 Format :call CocAction('format')

" Add `:Fold` command to fold current buffer.
command! -nargs=? Fold :call     CocAction('fold', )

" Add `:OR` command for organize imports of the current buffer.
command! -nargs=0 OR   :call     CocAction('runCommand', 'editor.action.organizeImport')

" Add (Neo)Vim's native statusline support.
" NOTE: Please see `:h coc-status` for integrations with external plugins that
" provide custom statusline: lightline.vim, vim-airline.
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}

" Mappings using CoCList:
" Show all diagnostics.
nnoremap  a  :CocList diagnostics
" Manage extensions.
nnoremap  e  :CocList extensions
" Show commands.
nnoremap  c  :CocList commands
" Find symbol of current document.
nnoremap  o  :CocList outline
" Search workspace symbols.
nnoremap  s  :CocList -I symbols
" Do default action for next item.
nnoremap  j  :CocNext
" Do default action for previous item.
nnoremap  k  :CocPrev
" Resume latest coc list.
nnoremap  p  :CocListResume

" vim snippets##########################################
let g:UltiSnipsExpandTrigger=""
let g:UltiSnipsJumpForwardTrigger=""
let g:UltiSnipsJumpBackwardTrigger=""

" autoformat##########################################
noremap  :Autoformat

" nerdtree##########################################
map  :NERDTreeToggle

" vimtex##########################################
let g:vimtex_view_general_viewer = 'mupdf'
let g:vimtex_view_general_options_latexmk = '-reuse-instance'
let g:vimtex_view_general_options
\ = '-reuse-instance -forward-search @tex @line @pdf'
\ . ' -inverse-search "' . exepath(v:progpath)
\ . ' --servername ' . v:servername
\ . ' --remote-send \"^^'
\ . ':execute ''drop '' . fnameescape(''\%f'')^'
\ . ':\%l^:normal\! zzzv^'
\ . ':call remote_foreground('''.v:servername.''')^^\""'

set conceallevel=1
let g:tex_conceal='abdmg'
" Prevent that vim detect a file with the tex suffix as a plaintex
let g:tex_flavor='latex'
" Set the viewer method
let g:vimtex_view_method='mupdf'
" Never opened/closed the quickfix window automatically. The quickfix window shows the errors and/or warnings when compile, and we can open the quickfix windows use \le
let g:vimtex_quickfix_mode=0
" 最后两行开启自动隐藏功能,开启了这个功能,除了你光标所在的那一行之外,文本里夹杂的LaTeX代码就都会隐藏或者替换成其他符号
set conceallevel=1

let &t_SI.="\e[5 q" "SI = INSERT mode
let &t_SR.="\e[4 q" "SR = REPLACE mode
let &t_EI.="\e[1 q" "EI = NORMAL mode (ELSE)

inoremap  

说明:格式化快捷键设置成了ctrl + lcoc.nvim可以使用ctrl + n选择提示项(只能往下翻,对我来说足够了,需要更好地体验可以自行设置),按ctrl + p打开文件树

输入法自动切换

这部分很重要,极其影响体验感

首先确保你使用的是fcitx输入法,fcitx4和fcitx5都可以

下载最新版本的fcitx.vim

解压后把plugin和so两个文件夹放到~/.config/nvim,或者干脆在这个目录下解压,如果是vim,则应放到~/.vim

这里有个坑,上面已经填了,配置文件最后一行inoremap ,将ctrl + c映射为esc,默认情况下两者都可以进入普通模式,但前者不会触发相关事件,这使得插件无效(不知有没有像我一样使用ctrl + c的vimer)

如果你的ctrl + c在插入模式下另有用处,请删除该行

注意:作者并不是为neovim设计的插件,目前最新版本的neovim可以使用,但不意味着一直可以使用

相关python依赖安装

coc.nvim需要python模块支持,另外fcitx.vim也需要python的vim模块以使用fcitx.py来获取更好的体验,不过这和neovim就没关系了,也可以装上,还有autoformat插件也需要Python模块

使用pip安装python-vimneovim,并python3 -m pip install pynvim

如果你的neovim找不到Python3,则在neovim配置文件中加入let g:python3_host_prog=/path/to/python/executable/,路径自己改

coc.vim配置

查看coc extensions,找到markdown和latex的对应扩展(按需安装),使用:CocInstall指令安装

此外,还需要安装coc-snippetscoc-actions以配合snippets相关插件

查看coc language servers,找到markdown和latex,按照指示完成配置,如果遇到困难,继续往下看

这里使用:CocConfig指令打开coc配置文件,如果你不熟悉json,特别注意,文件中的所有内容需要用{}包起来,直接copy作者给的配置会出现语法错误

这里安装efm-langserverdigestif又有问题了,arch直接从aur安装再次避坑(需要先配置go语言环境,GOROOT在arch上为/usr/lib/go,如果你上网找的话,可能会被/usr/local/go给坑了,go安裝完毕后GOROOT下是有文件的,不确定是哪个可以去查看一下,另外还需要打开go module,以及给go get设置国内代理,详见go 语言依赖管理,试图那啥的可以省省了,go get不认这招,或许全系统代理可以),其他的可能需要折腾一会儿

这里附上我的coc-settings.json,copy的时候把两个路径换成自己的,另外特别注意command需要使用绝对路径

{
          languageserver : {
                   digestif : {
                          command :  /bin/digestif ,
                          filetypes : [ tex ,  plaintex ,  context ]
                 },
                  efm : {
                          command :  /bin/efm-langserver ,
                         args : [ -c ,  /home/yourUsername/.config/efm-langserver/config.yaml ],
                          filetypes : [ vim ,  eruby ,  markdown ]
                 }
        },
          suggest.noselect : false
 }

markdown

markdown的部分上面已经完成的差不多了,现在先创建一个.md文件,查看是否可以补全,nvim test.md,输入img,应该会有提示,如果没有,请检查coc.nvim以及两个关于snippets的插件

目前还有一个至关重要的问题,markdown中的latex无法补全,极其影响体验感,不过coc.nvim可以自定义sources,在~/.config/nvim/autoload/coc/source下创建latex.vim,写入

function! coc#source#latex#init() abort
	return {
				\ 'triggerCharacters': ['\'],
				\'filetype':['markdown']
				\}
endfunction

function! coc#source#latex#complete(opt, cb) abort
	let items = ['dot{}', 'ddot{}', 'bar{}', 'hat{}', 'exp', 'sin', 'cos', 'tan', 'sec', 'csc', 'vec{}', 'cot', 'arcsin', 'arccos', 'arctan', 'sinh', 'cosh', 'tanh', 'coth', 'sh', 'ch', 'th', 'max', 'min', 'partial', 'nabla', 'prime', 'backprime', 'infty', 'eth', 'hbar', 'sqrt{}', 'sqrt[]{}', 'pm', 'mp', 'times', 'div', 'cdot', 'odot', 'bigodot' , '{ \}', 'in', 'not', 'ni', 'cap', 'Cap', 'bigcap', 'cup', 'Cup', 'bigcup', 'subset', 'supset', 'supseteq', 'subseteq', 'subseteqq', 'supseteqq', 'subsetneq', 'supsetneq', 'supsetneqq', 'subsetneqq', 'sim', 'approx', 'leq', 'geq', 'parallel', 'nparallel', 'perp', 'angle', 'Box', 'bigtriangleup', 'bigtriangledown', 'forall', 'therefore', 'because', 'overline{}', 'Rightarrow', 'Leftarrow', 'rightarrow', 'leftarrow', 'leftrightarrow', 'nRightarrow', 'nLeftarrow', 'nleftarrow', 'nrightarrow', 'nleftrightarrow', 'overleftarrow{}', 'overrightarrow{}', 'overset{}', 'underline{}', 'sum', 'prod', 'lim', 'limits', 'int', 'iint', 'oint', 'iiint', 'frac{}{}', 'tfrac{}{}', 'dfrac{}{}', '\begin{matrix}\end{matrix}', '\begin{vmatrix}\end{vmatrix}', '\begin{bmatrix}\end{bmatrix}', '\begin{Bmatrix}\end{Bmatrix}', '\begin{pmatrix}\end{pmatrix}','\begin{cases}\end{cases}', '\begin{aligned}\end{aligned}', '\begin{array}\end{array}', 'alpha', 'psi', 'Delta', 'delta', 'beta', 'lambda', 'rho', 'varepsilon', 'Gamma', 'chi', 'mu', 'sigma', 'Lambda', 'tau', 'varphi', 'varPhi', 'phi', 'Phi', 'eta', 'omega', 'varrho', 'Pi', 'pi', 'gamma', 'xi', 'Psi', 'Sigma', 'varnothing', 'iiiint']
	call a:cb(items)
endfunction

关于自定义source的具体细节,请前往github,上面给出的source设定在markdown文件下加载,使用\作为触发符,这里只加入了我常用的几个命令,更多内容可以自行添加

到此,markdown部分已经完成,可以先检查一下有没有问题

latex

首先安装latex编译环境,这里使用texlive

参考arch wiki,不想折腾的话就把安装部分提到的几个包全装了,应该就问题不大了

如果还有问题,或者是其他linux发行版,可以参考Deepin Linux 安装和搭建LaTex环境和Ubuntu18.04安装LaTeX并配置中文环境,不过安装texlive-full实在太麻烦了,我装了3小时,最后似乎卡住了,手贱中断了,再也装不上了,这个包和前面arch wiki中提到的包大部分是冲突的,如果是arch系的就不要折腾这个了,如果是gentoo的话,如果坚持本地编译的话,建议备好电影小零食~~(窃以为使用gentoo的linux骨灰级玩家不需要这篇文章,强行gentoo的玩家可能还没从坑里爬出来)

安装MuPDF,当然你也可以选择别的,详见github,如果换了的话需要把上面的配置也一并修改

到此结束,测试一下,nvim test.tex,写入

\documentclass{article}
\begin{document}
你好,world!
\end{document}

在普通模式下按\ll进行编译,再按\lv预览,不要关闭预览窗口,修改成hello world,保存,重新编译,看看预览是否同步改变,这里还可以设置保存时自动编译

更多

  • linux下没有可以和FastStone媲美的截图软件,不过可以用KolourPaint快速编辑图片,需要更多操作可以使用GIMP,不建议使用Pinta,由于无法输入中文
  • markdown中可以用html语法插入mp4视频,比起gif的好处就不用多说了,缺点是略显臃肿
  • 可以再为vim配置更多插件,比如markdown自动贴图、markdown预览等等,也可以继续自定义snippets,这些部分按个人喜好配置,这里不再介绍
  • 桌面推荐i3,i3配置较为麻烦,可以保留原有桌面,简单配置i3,仅用来写markdown和latex
  • 或许可以在WSL中配置,不过暂时折腾到此为止了

补充

为markdown添加大纲显示

Excuberant Ctags

首先安装Excuberant Ctags,debian系和redhat系应该可以使用包管理工具直接安装,arch这次似乎进坑了,需要编译源码

访问Excuberant Ctags下载页面,没错,GFW警告,这个资源可以在网上搜,文件名为ctags-5.8,csdn上有,本来想上传一个免费的,结果死活都重复,算了

解压,cd入目录,./configure,继续make && sudo make install,正常情况下应该没问题了,如果有问题,请参考安装Exuberant Ctags及Tag List插件

easytags

使用vim-plug安装

Plug 'xolox/vim-misc'
Plug 'xolox/vim-easytags'

tagbar

Plug 'majutsushi/tagbar'

注意使用该插件时可能有问题,详情见github

markdown2ctags

Plug 'jszakmeister/markdown2ctags'

配置

" tagbar#####################################
nmap  :TagbarToggle

" markdown2ctags#####################################
let g:tagbar_type_markdown = {
    \ 'ctagstype': 'markdown',
    \ 'ctagsbin' : '/home/yourUsername/.vim/plugged/markdown2ctags/markdown2ctags.py',
    \ 'ctagsargs' : '-f - --sort=yes --sro=»',
    \ 'kinds' : [
        \ 's:sections',
        \ 'i:images'
    \ ],
    \ 'sro' : '»',
    \ 'kind2scope' : {
        \ 's' : 'section',
    \ },
    \ 'sort': 0,
\ }

这里给tagbar的快捷键设置为ctrl + mmarkdown2ctags的配置中需要注意更换你的markdown2ctags.py所在路径,且注意通过:set filetype查看你的markdown文件的文件类型名称是否是markdown,若不是,则修改ctagstype

格式化插件neoformat

插件安装

Plug 'sbdchd/neoformat'

依赖安装

prettier for markdown

不要选remark作为格式化软件

arch可以直接从aur安装,其他参考install prettier

latexindent.pl for latex

将项目clone到本地

安装perl,执行sudo cpan

进入cpan环境后,执行

install Log::Log4perl
install Log::Dispatch::File
install YAML::Tiny
install File::HomeDir

再次GFW警告

进入项目目录,测试latexindent.pl是否可以正常运行,并设置为可全局调用(最简单的方式是写个sh文件,cd youPathToLatexindent.pl && ./latexindent.pl,然后将其链接到/bin或者/usr/bin

插件配置

只需在init.vim中添加

let g:neoformat_latex_latexindent ={'exe':'latexindent','args':[],'stdin':1}
let g:neoformat_enabled_latex=['latexindent']

用prettier格式化markdown失败,笔者暂时未解决该错误,可以使用vim-prettier插件代替,或者手动运行prettier --wirte pathToYourFile

为不同类型的文件添加格式化快捷键

nnoremap  :Neoformat
autocmd FileType markdown nnoremap   :Prettier

你可能感兴趣的:(其他)