沧歌


起风了,唯有努力生存


Vim 配置更新

写在前面

距离上一篇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美化)

vim-screenshot

一些改进总结

相比之前,主要改动如下:

  • 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编号>,比默认方便了很多。

更早的文章

博客小站翻修小记

实话说,用Github Pages写博客虽然显得高端,但实际上并没有那么方便。我中途也想换用CSDN之类的网站,但试了试感觉上面的氛围还是不符合自己的性子。这期间发现喵神的博客居然更新了,功能丰富大变样,自己也想把自己的博客捡起来。先尝试了喵神用的chirpy模版,结果发现虽然功能很多,但默认的效果不如我现在的配置好看。所以这里先试着将喵神博客的一些新特性加入到自己的网站中,在此过程中,记录...…

Jekyll Github继续阅读