疫情在家期间,也在新电脑上准备用vim写科研论文。但是之前配置好的.vimrc文件中的配置在实验室的电脑上,我自己又懒得再配置一遍,于是作罢,选择了sublime来进行科研写作,顺便写了一篇《使用Sublime Text3撰写科研论文》。现在已经在实验室了,于是乎我将我的vim配置文件介绍介绍,放在网上,以防万一。同时,也给有需要的人借鉴参考。虽然去年在文章《使用Vim撰写科研论文》介绍了如何利用vim编写论文,只是介绍了与LaTex相关的插件。这里,我们将介绍一般性的编辑工作所需要的配置。
安装插件代码如下:
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
然后,我们可以在主题中选择颜色样式,主题列表见链接。可使用如下命令指定主题:
let g:airline_theme="solarized"
呈现效果如图1:
关于状态栏每个区域的含义可以见vim-airline的描述文件,这里不再赘述。
安装插件代码如下:
Bundle 'kien/ctrlp.vim'
常用设置代码如下:
"-------Shortcuts for the plugin ctrlp
let g:ctrlp_map = ''
let g:ctrlp_cmd = 'CtrlP'
let g:ctrlp_by_filename=1
" set the types of files that can be ignored
let g:ctrlp_custom_ignore = {
\ 'dir': '\v[\/]\.(git|hg|svn|rvm)$',
\ 'file': '\v\.(exe|so|dll|zip|tar|tar.gz|pyc)$',
\ }
这样我们可以通过Ctrl+p
打开文件搜索,这时,我们可以通过Ctrl+f
或者Ctrl+b
在不同模式(mru, files, buffers)中选择,然后输入要搜索的文件名,如下图2:
在搜索结果中,我们可以使用Ctrl+j,k
来上下选择我们想要的文件,最后enter
就可以打开该文件了。更多操作可见该项目的说明文档。
安装插件代码如下:
Plugin 'altercation/vim-colors-solarized'
设置代码如下:
set t_Co=256
set background=dark
colorscheme solarized
这里我们设置为深色模式,比较契合MacOS的深色模式,如上图2所示。注意本文中的所有设置是针对MacVIM的,对于在终端使用vim(而不是gvim)打开的vim编辑器,会出现雾面现象,主要是颜色的支持问题,如下图所示:
还有,我们可以使用如下命令来设置界面的透明化程度:
set transparency=2
安装插件代码如下:
Plugin 'scrooloose/nerdtree'
设置代码如下:
"-------Settings for NERDTree--------
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
autocmd vimenter * NERDTree
"Close vim when the NERDTree is the only window
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
let NERDTreeIgnore=['\.pyc','\~$','\.swp']
let g:NERDTreeShowLineNumbers=1
经过上述设置,每次打开一个新文件时,左侧都会有目录,效果如下图(目录中的图标和颜色设置会在下一小节中介绍):
但是,左侧的目录并不会随着打开的文件所在目录而更新。为此,我们可以添加如下命令:
"To update the NERDTree when change the Tab by gt
nnoremap gt gt:NERDTreeFind<CR><C-w>l
这样我们可以通过gt
来切换tab,同时更新左侧的目录。关于NERDTree的更多操作,可以直接在目录窗口,输入?
来查看说明。
对于我们日常工作科研来说,常遇到的就是这几类文件:.tex
, .pdf
, .c
, .py
等等文件。为了在NERDTree目录中高亮显示,我们需要安装如下插件:
Plugin 'ryanoasis/vim-devicons'
Plugin 'tiagofumo/vim-nerdtree-syntax-highlight'
其中,vim-devicons
是给不同文件类型显示不同图标;vim-nerdtree-syntax-highlight
是让不同类型文件显示不同颜色。
其常用设置如下:
" NERDTress File highlighting
"Set the vim-devicons
"Can be enabled or disabled
"vim-nerdtree-syntax-highlight settings
""""""""""""""""""""""""""""""
let g:WebDevIconsDisableDefaultFolderSymbolColorFromNERDTreeDir = 1
let g:WebDevIconsDisableDefaultFileSymbolColorFromNERDTreeFile = 1
" not to show brackets around flags
let g:webdevicons_conceal_nerdtree_brackets = 1
" enable folder/directory glyph flag (disabled by default with 0)
let g:WebDevIconsUnicodeDecorateFolderNodes = 1
" enable open and close folder/directory glyph flags (disabled by default with 0)
let g:DevIconsEnableFoldersOpenClose = 1
" use double-width(1) or single-width(0) glyphs
" only manipulates padding, has no effect on terminal or set(guifont) font
let g:WebDevIconsUnicodeGlyphDoubleWidth = 0
" Force extra padding in NERDTree so that the filetype icons line up vertically
let g:WebDevIconsNerdTreeGitPluginForceVAlign = 1
"Highlight full name (not only icons). You need to add this if you don't have vim-devicons and want highlight.
let g:NERDTreeFileExtensionHighlightFullName = 1
let g:NERDTreeExactMatchHighlightFullName = 1
let g:NERDTreePatternMatchHighlightFullName = 1
"Highlight full name (not only icons). You need to add this if you don't have vim-devicons and want highlight.
let g:NERDTreeHighlightFolders = 1
"highlights the folder name
let g:NERDTreeHighlightFoldersFullName = 1
"you can add these colors to your .vimrc to help customizing
let s:brown = "905532"
let s:aqua = "3AFFDB"
let s:blue = "689FB6"
let s:darkBlue = "44788E"
let s:purple = "834F79"
let s:lightPurple = "834F79"
let s:red = "AE403F"
let s:beige = "F5C06F"
let s:yellow = "F09F17"
let s:orange = "D4843E"
let s:darkOrange = "F16529"
let s:pink = "CB6F6F"
let s:salmon = "EE6E73"
let s:green = "8FAA54"
let s:Turquoise = "40E0D0"
let s:lightGreen = "31B53E"
let s:white = "FFFFFF"
let s:rspec_red = "FE405F"
let s:git_orange = "F54D27"
let s:gray = "808A87"
let g:NERDTreeExtensionHighlightColor = {} " this line is needed to avoid error
let g:NERDTreeExtensionHighlightColor['py'] = s:orange " sets the color of py files to blue
let g:NERDTreeExtensionHighlightColor['tex'] = s:yellow " sets the color of tex files to blue
let g:NERDTreeExtensionHighlightColor['c'] = s:green " sets the color of c files to blue
let g:NERDTreeExtensionHighlightColor['pdf'] = s:beige " sets the color of pdf files to blue
let g:NERDTreeExtensionHighlightColor['c++'] = s:green " sets the color of c++ files to blue
上述设置都是参考官方主页https://github.com/tiagofumo/vim-nerdtree-syntax-highlight 和 https://github.com/ryanoasis/vim-devicons 。其效果如下:
安装上述两个包时,需要安装nerd-fonts这个字体库。在MacOS中可以使用方法4(Homebrew Fonts)安装,即在终端输入:
brew tap homebrew/cask-fonts
brew cask install font-hack-nerd-font
brew cask install font-droid-sans-mono-nerd-font
brew cask install font-droid-sans-mono-for-powerline
使用上述第一条命令时,要经过漫长的等待过程,并且经常会出现如下错误:
error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
这时可以采用如下链接:https://www.jianshu.com/p/24c7430fa124 解决。接下来的三条命令是具体字体的安装,所有的字体可见链接:https://github.com/Homebrew/homebrew-cask-fonts/tree/master/Casks 。完成上述命令后,我们需要在MacVim中的.vimrc文件中添加配置命令来防止目录的图标乱码不显示:
set encoding=UTF-8
set guifont=DroidSansMono_Nerd_Font:h16
效果如上图5所示。我们发现,图5中的图标会出现显示不完全的情况,这是一个Open issue (未完全解决):https://github.com/ryanoasis/vim-devicons/issues/133,一个可能的方式是在.vimrc
文件中添加如下命令:
augroup custom_nerdtree_options
autocmd!
autocmd FileType,WinEnter * :call <SID>SetNerdTreeOptions()
augroup END
function! s:SetNerdTreeOptions() abort
if &l:filetype ==# 'nerdtree'
let g:default_opts = {
\ 'ambiwidth': &ambiwidth,
\ 'listchars': &listchars,
\ 'list' : &l:list,
\ }
setlocal ambiwidth=double listchars=space:. nolist
else
if exists('g:default_opts')
let [&ambiwidth, &listchars, &l:list] = [
\ g:default_opts.ambiwidth,
\ g:default_opts.listchars,
\ g:default_opts.list
\ ]
unlet g:default_opts
endif
endif
endfunction
这样,图标就能完全显示了:
这样做其实还有一个bug:当在一个macvim窗口用多个tab打开多个文件时,图标又会显示不完全,但是此时当焦点在目录时,图标会完全显示。
安装插件如下:
Plugin 'tpope/vim-surround'
常用设置代码如下:
"-------Shortcuts for the plugin tpope/vim-surround
nmap ) ysiw)
nmap } ysiw}
nmap " ysiw"
关于快捷键的详细设置,我们可以参考其主页,或则直接使用命令 :help surround
在Vim中查看。我们发现很多命令都需要按多个键,比如上面的用括号包围一个单词,命令为ysiw)
。在我的日常使用场景(写文章),最常用的就是中括号和大括号。为方便起见,我就用上述的快捷键映射就可以只需要输入,)
即可,这里的逗号是我定义的
。
安装插件如下:
Plugin 'skywind3000/asyncrun.vim' "for running C
快捷键设置如下:
"-------settings for the plugin asyncrun
"open quickfix windown, the height is 6
let g:asyncrun_open =6
"The bell rings when the task is finished
let g:asyncrun_bell =1
let g:asyncrun_rootmarks = ['.svn', '.git', '.root', '_darcs', 'build.xml']
"call for the quickfix window
autocmd FileType c,cpp nnoremap <leader>c :call asyncrun#quickfix_toggle(6)
"Shortcuts for compiling and run the c file
autocmd FileType c,cpp nnoremap <silent> <leader>b :AsyncRun -cwd=<root> make <cr>
autocmd FileType c,cpp nnoremap <silent> <leader>r :AsyncRun -cwd=<root> -raw make run <cr>
这样我们就可以使用
和
来分别编译和运行C/C++项目了。关于这个插件更详细的介绍说明,可以参考主页或者该作者的博客。
需要注意的是,如果只有单个文件,上面这些设置已经足够了。但是,一般来说,一个项目会包含多个源文件,这时我们就得自己编写makefile文件来关联多个源文件。下面以一个简单的例子来说明:有三个文件,分别为hello.h
,hello.c
, test.c
(主文件)。其内容分别为:
hello.h
#include
void hello();
hello.c
#include"hello.h"
void hello()
{
printf("Hello World From hello.c!\n");
}
test.c
#include
#include
#include"hello.h"
#include
int main()
{
int abstact=1;
printf("Hello World From test.c!\n");
hello();
return 0;
}
这里我们直接编译会报错如下:
这就是提醒我们需要编写makefile文件,具体如何编写makefile文件,请自行网上搜索。下面给出了对于这个例子的makefile文件:
makefile
objects=test.o hello.o
cc=g++
test:$(objects)
cc -o test $(objects)
test.o:test.c
hello.o:hello.h
run: test
./test
.PHONY:clean
clean:
rm test $(objects)
这样我们就有四个文件:hello.h
,hello.c
, test.c
和 makefile
。这时,我们按下
编译项目可得:
最后按键
运行该项目可得:
从上面可以看出,使用Vim来开发大型项目(源文件很多)是不太方便,使用集成开发环境VS或者VS code是一个相对更好的选择。Vim更适合来编写单个文件,比如我经常来写论文的.tex文件。当然,在写论文时,我们也可以将不同部分(比如 abstract, introduction, system model等等)分成不同的.tex文件,然后在主文件中使用\input
命令直接调用即可,这里就没有这里的C/C++项目复杂,不要自己编写makefile。另外需要注意的是,我也是设置
编译.tex文件。在编译C项目后,在同一vim窗口不同tab再编译.tex文件会产生错误。这里我们可以用一个新的vim窗口打开.tex文件编译即可。
在写较长的文章或则程序时,我们可以借助这里的目录导航快速跳转到想到的地方去。安装该插件的代码如下:
Plugin 'majutsushi/tagbar'
其常用设置如下:
"-------Configurations for the plugin ctags
let g:tagbar_ctags_bin='/usr/local/bin/ctags'
let g:tagbar_width=30
let g:tagbar_right=1
"AutoOpen tagbar for c/c++ files
autocmd BufReadPost *.cpp,*.c,*.h,*.hpp,*.cc call tagbar#autoopen()
"Open or close tagbar
map <leader>tb :TagbarToggle<CR>
这样,我们可以通过
打开和关闭目录侧边栏。
如下图10所示,在c文件中,右侧显示的每个函数名:
如下图11所示,在.tex文件中,右侧显示的是每个part和label:
左侧显示的是vimtex插件自带的目录,其快捷键我定义为
。可见,ctags所显示的目录个人觉得更加具有条理性。
插件安装代码如下:
Plugin 'scrooloose/nerdcommenter'
配置代码如下:
" Add a space before comments
let g:NERDSpaceDelims=1
这样们可以通过
来进行注释或者批量注释,通过
进行反注释,相比于VS的Ctrl + k + c
和Ctrl + k + u
的注释方便多了。注释时,会在注释符和代码前加个空格,更多的个性化设置请见其主页。
插件安装代码如下:
Plugin 'Yggdroot/indentLine'
配置代码如下:
"-------Settings for the plugin indentline
let g:indentLine_char='|'
let g:indentLine_enabled=1
这个对齐线对于python编程应该比较友好,毕竟python语法对于缩进敏感,其效果图如图12:
更多的样式设置请参考其主页。
插件安装代码如下:
Plugin 'KeitaNakamura/tex-conceal.vim'
配置代码如下:
set conceallevel=2
let g:tex_conceal='abdmg'
这样一些数学的LaTeX代码就显示为数学符号,即所见即所得。如下图13所示:
插件安装代码如下:
Plugin 'vim-scripts/indentpython.vim'
配置代码如下:
"-------Configurations for Python
set encoding=utf-8
au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set expandtab|set autoindent|set fileformat=unix
set clipboard=unnamed
let python_highlight_all=1
function CheckPythonSyntax()
let mp = &makeprg
let ef = &errorformat
let exeFile = expand("%:t")
setlocal makeprg=python3\ -u
set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
silent make %
copen
let &makeprg = mp
let &errorformat = ef
endfunction
au filetype python map <leader>b :w <cr> :call CheckPythonSyntax() <cr> :cw<cr>
这样我们只需要通过命令
来编译运行.py文件了,如图14:
这里有个缺点就是,输出是使用quickfit window (使用:copen
打开该窗口),无法交互式输入。所以我还是推荐使用pycharm来作为python的开发环境吧。