写在前面
距离上一篇VIM的Blog已经过去很久了,现在我的常用工作环境基本都是vim8.2甚至vim9了。此时这篇Blog就是将我的配置重新更新一番。一些基础知识就不再重复,建议先看看之前的那篇Blog。
在服务器上做深度学习开发时,我最常用的还是vscode+remotessh,由于这套东西相当大,vim在我的工作之中仍是必装工具。
我试用过neovim,确实非常现代化,lazynvim也非常强,让人感觉一步迈入新时代。但如果想用上它,需要安装很多依赖,由于公共的服务器很多并没有root权限,安装依赖较为困难。此外,很多nvim主题都要求终端支持真彩色才能获得比较好的体验,有不少终端现在只支持256色。
考虑到vim自身也做了多次升级,这里还是基于vim的配置,在vim8.2+下测试可用。我在下面的配置算是比较简单轻便,供大家参考。下面的配置还是基于vim-nox这个版本的vim。使用命令是sudo apt install vim-nox。这个版本是一个大而全的非GUI版本。很多服务器都是安装好的。
配置方法
插件airline和vim-fern需要一些特殊符号,所以建议安装针对性修改的字体,建议一步到位nerdfont。可以在Google搜索 “字体名+Nerd Font Mono” 查找对应的字体。我喜欢Consolas这个字体,有好心人已经提供了打包好的版本(https://github.com/wclr/my-nerd-fonts.git)。
配置方法很简单,首先在$HOME目录下新建一个文件.vimrc。将下面的内容全部复制进去。
这个配置中我加了很多注释,方便大家学习修改。
set nocompatible " be iMproved, required
filetype off " required
" 启用vim-plug来管理vim插件 {
" vim-plug安装方法:
" curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
" 常用命令
" :PlugStatus - 查看已经安装的插件
" :PlugInstall - 安装插件
" :PlugUpdate - 更新插件
" :PlugClean - 删除插件,把安装插件对应行删除,然后执行这个命令即可
" h: vim-plug - 获取帮助[?]
" 指定插件安装目录 (建议)
call plug#begin('~/.vim/plugged')
" 安装插件写在这之后, 使用 GitHub 用户名/仓库名
Plug 'vim-airline/vim-airline'
Plug 'altercation/vim-colors-solarized'
Plug 'tomasr/molokai'
Plug 'lambdalisue/vim-fern' " nerdtree的替代品,更快
Plug 'lambdalisue/vim-fern-git-status'
Plug 'yianwillis/vimcdoc' " vim中文文档
Plug 'mechatroner/rainbow_csv' " csv高亮
Plug 'ervandew/supertab' " 替代 'Valloric/YouCompleteMe'
" 安装插件写在这之前
call plug#end()
filetype plugin on " required
" 限制最大并行下载线程数为 2 应对网络不佳 (默认通常为 16)
let g:plug_threads = 2
" } vim-plug 的配置到此结束,下面是你自己的配置
set nu! " 显示行号
syntax on " 代码高亮
set mouse=a " 启用鼠标
set cursorline " 突出显示当前行
" set cursorcolumn " 突出显示当前列
set laststatus=2 "永远显示状态栏
set t_Co=256 "在windows中用xshell连接打开vim可以显示色彩
set background=dark
" 在 vim 的命令模式下输入 :digraph,就可以查看想要的字符,记住字符左边的输入方式。
" 在插入模式下,点击快捷键 Ctrl-k,然后输入上一步你记住的编码,就可以了。
" 设置一个 tab 显示出来是多少个空格的长度,默认8
set tabstop=4
" 这个设置表示缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进。
set expandtab
" 表示在编辑模式的时候按退格键的时候退回缩进的长度,简单的说就是去掉自动缩进产生的空格,当
" set expandtab 的时候如果你不设置这个选项的时候,你必须一格一格的往前删除,
" 如果设置了这个选项的话,就可以一次就往前删除指定个数的空格
set softtabstop=4
" 表示当缩进的时候,每一级的缩进长度
set shiftwidth=4
" Show invisible characters
set listchars=eol:¬,tab:>-,trail:~,extends:>,precedes:<
set list
" Theme, color settings {
"colorscheme solarized
colorscheme molokai
" colorscheme desert
" solarized theme
let g:solarized_termtrans=1
let g:solarized_contrast="normal"
let g:solarized_visibility="normal"
" monokai原始背景色
let g:molokai_original = 1
" 让空白字符的颜色不显眼
" 非可见字符 eol extends precedes 是由 NonText 高亮组来控制显示颜色的
hi NonText ctermfg=235 " 239
" nbsp tab trail 是由 SpecialKey 高亮组来定义颜色的
hi SpecialKey ctermfg=235 " 239
" }
" airline {
" 打开tabline功能,方便查看Buffer和切换,这个功能比较不错"
" 我还省去了minibufexpl插件,因为我习惯在1个Tab下用多个buffer"
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_nr_show = 1
" 这个是安装字体后 必须设置此项
" let g:airline_powerline_fonts = 1
" }
" vim-fern {
" 进入 Fern 窗口时禁用行号和相对行号
augroup Fern_settings
autocmd!
autocmd FileType fern setlocal nonumber norelativenumber
augroup END
" }
" SuperTab {
" 启用上下文补全,让 SuperTab 能够识别路径
let g:SuperTabDefaultCompletionType = "context"
" (可选) 设置当不在路径或特定上下文时,默认使用的补全方式(推荐 <C-n>)
let g:SuperTabContextDefaultCompletionType = "<c-n>"
" }
" F1 - F5 Key settings {
" can type :help on my own, thanks. Protect your fat fingers from the evils of <F1>
noremap <F1> <Esc>"
" 开关文件树窗口
noremap <F2> :Fern . -drawer -toggle<CR>
" F3 显示可打印字符开关
function! HideNumberInfo()
set list!
set number!
endfunc
nnoremap <F3> :call HideNumberInfo()<CR>
" :exec ':set list! list? :set number! number?'<CR>
" F4 换行开关
function ToggleWrap()
if &wrap
echo "Wrap OFF"
setlocal nowrap
set virtualedit=all
silent! nunmap <buffer> <Up>
silent! nunmap <buffer> <Down>
silent! nunmap <buffer> <Home>
silent! nunmap <buffer> <End>
silent! iunmap <buffer> <Up>
silent! iunmap <buffer> <Down>
silent! iunmap <buffer> <Home>
silent! iunmap <buffer> <End>
else
echo "Wrap ON"
setlocal wrap linebreak nolist
set virtualedit=
setlocal display+=lastline
noremap <buffer> <silent> <Up> gk
noremap <buffer> <silent> <Down> gj
noremap <buffer> <silent> <Home> g<Home>
noremap <buffer> <silent> <End> g<End>
inoremap <buffer> <silent> <Up> <C-o>gk
inoremap <buffer> <silent> <Down> <C-o>gj
inoremap <buffer> <silent> <Home> <C-o>g<Home>
inoremap <buffer> <silent> <End> <C-o>g<End>
endif
endfunction
nnoremap <F4> :call ToggleWrap()<CR>
" F6 语法开关,关闭语法可以加快大文件的展示
nnoremap <F6> :exec exists('syntax_on') ? 'syn off' : 'syn on'<CR>
set pastetoggle=<F5> " when in insert mode, press <F5> to go to
" paste mode, where you can paste mass data
" that won't be autoindented
" disbale paste mode when leaving insert mode
au InsertLeave * set nopaste
" F5 粘贴模式paste_mode开关,用于有格式的代码粘贴
" Automatically set paste mode in Vim when pasting in insert mode
function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return ""
endfunction
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
" }
" leader key settings {
" 将 Leader key 设置为空格键
let mapleader = " "
nnoremap <Leader>w :w<CR>
" 使用 <Leader> + 数字 快速切换到对应 buffer (替代ctrl+6)
nnoremap <Leader>1 :buffer 1<CR>
nnoremap <Leader>2 :buffer 2<CR>
nnoremap <Leader>3 :buffer 3<CR>
nnoremap <Leader>4 :buffer 4<CR>
nnoremap <Leader>5 :buffer 5<CR>
nnoremap <Leader>6 :buffer 6<CR>
nnoremap <Leader>7 :buffer 7<CR>
nnoremap <Leader>8 :buffer 8<CR>
nnoremap <Leader>9 :buffer 9<CR>
nnoremap <Leader>0 :buffer 10<CR>
" }
然后,就如注释里所说的,首先安装插件管理器vim-plug
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
之后用vim命令打开vim,忽视报错信息,输入:PlugInstall安装插件。
如果遇到网络问题安装失败,按R再安装一次即可。
进一步美化
上述的vimrc配置完之后,vim-fern会用+号和竖线来显示文件树,有两种美化方式。
1. 如果用nerdfont,且vim版本较高,额外添加一些插件:
Plug 'lambdalisue/vim-nerdfont'
Plug 'lambdalisue/vim-fern-renderer-nerdfont'
Plug 'lambdalisue/vim-glyph-palette'
再加几行配置激活glyph-palette插件:
augroup my-glyph-palette
autocmd! *
autocmd FileType fern call glyph_palette#apply()
autocmd FileType fall-list call glyph_palette#apply()
autocmd FileType nerdtree,startify call glyph_palette#apply()
augroup END
2. 如果不想用nerdfont,还想复现nerdtree的风格,对符号做一些修改:
" Fern 渲染器配置 设置文件夹展开和收起时的图标 (NERDTree 风格)
let g:fern#renderer#default#leading = " "
let g:fern#renderer#default#root_symbol = " "
let g:fern#renderer#default#leaf_symbol = " "
let g:fern#renderer#default#collapsed_symbol = "▸ "
let g:fern#renderer#default#expanded_symbol = "▾ "
至此安装结束,效果如图(采用了方案1美化)
一些改进总结
相比之前,主要改动如下:
- nerd-tree –> vim-fern: 在之前我使用nerd-tree时,nerd-tree在打开包含很多文件的目录时容易导致主界面卡死。vim-fern采用多线程异步处理,是nerd-tree的很好的替代。注意,vim-fern 用 快捷键
l打开,h折叠。 - vundle –> vim-plug:同样升级多线程下载支持。
- 加入原生中文文档插件。
- 对leader key做了一些设置,更方便了。
- 放弃了YouCompleteMe,用SuperTab来补全,这是一个简单跨平台方案。
自动补全
为了方便,这里使用vim内置的补全。默认补全有多种, 现在直接改成了tab,按一下就可以补全了。
切换查看buffers
注意在vim中buffer和tab不是一个概念。功能类似浏览器标签页的是buffer (在上述配置方案中显示在最上方)。vim默认使用 :bn, :bp, :b <buffer编号>, :b name, 和 ctrl-6 可以在buffer之间切换。 还有<buffer编号>ctrl-6 ,可以切换到编号为<buffer编号>的buffer。使用 :ls列出所有buffers。
在这次的配置中,切换buffer支持使用<space><buffer编号>,比默认方便了很多。