在使用vim之前,曾尝试了两种方案,一是vscode + vim,配置简单,功能都还不错,问题是自动输入法切换延迟有点长,甚至使用方向键都有点卡,二是jetbrains系列的ide,windows下用来码字是体验最好的(linux下对中文输入法不友好),但资源消耗太多,且预览不是很理想
下面是这套方案的优缺点
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,先把依赖装了,主要是nodejs
和yarn
,作者给出的方法再次有点为难了,不过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 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 + l
,coc.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可以使用,但不意味着一直可以使用
coc.nvim需要python模块支持,另外fcitx.vim也需要python的vim模块以使用fcitx.py来获取更好的体验,不过这和neovim就没关系了,也可以装上,还有autoformat
插件也需要Python模块
使用pip
安装python-vim
、neovim
,并python3 -m pip install pynvim
如果你的neovim找不到Python3,则在neovim配置文件中加入let g:python3_host_prog=/path/to/python/executable/
,路径自己改
查看coc extensions,找到markdown和latex的对应扩展(按需安装),使用:CocInstall
指令安装
此外,还需要安装coc-snippets
和coc-actions
以配合snippets相关插件
查看coc language servers,找到markdown和latex,按照指示完成配置,如果遇到困难,继续往下看
这里使用:CocConfig
指令打开coc配置文件,如果你不熟悉json,特别注意,文件中的所有内容需要用{}
包起来,直接copy作者给的配置会出现语法错误
这里安装efm-langserver
和digestif
又有问题了,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的部分上面已经完成的差不多了,现在先创建一个.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编译环境,这里使用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
,保存,重新编译,看看预览是否同步改变,这里还可以设置保存时自动编译
首先安装Excuberant Ctags
,debian系和redhat系应该可以使用包管理工具直接安装,arch这次似乎进坑了,需要编译源码
访问Excuberant Ctags下载页面,没错,GFW警告,这个资源可以在网上搜,文件名为ctags-5.8,csdn上有,本来想上传一个免费的,结果死活都重复,算了
解压,cd入目录,./configure
,继续make && sudo make install
,正常情况下应该没问题了,如果有问题,请参考安装Exuberant Ctags及Tag List插件
使用vim-plug
安装
Plug 'xolox/vim-misc'
Plug 'xolox/vim-easytags'
Plug 'majutsushi/tagbar'
注意使用该插件时可能有问题,详情见github
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 + m
,markdown2ctags
的配置中需要注意更换你的markdown2ctags.py
所在路径,且注意通过:set filetype
查看你的markdown文件的文件类型名称是否是markdown,若不是,则修改ctagstype
Plug 'sbdchd/neoformat'
不要选remark作为格式化软件
arch可以直接从aur安装,其他参考install prettier
将项目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