vim 配置文件更新

时隔多年,趁着这次折腾 Golang 开发环境的机会,把 N 多年没有更新的 vim 配置文件重新改了一版。好久没使用,发现很多东西都记不清楚了,再加上这几年 vim 的插件管理也变化挺大,花了点时间学习,不过总是越来越方便了。

下面是我的 vim 配置文件(Github 地址),主要针对 go 语言的开发环境。

" Modeline and Notes {
"   vim: set foldmarker={,} foldlevel=0:
"   
"   Note: This is my personal .vimrc, I don't recommend you copy it, just
"   use the pieces you want. 
"
"   Contact:
"   tuantuan 
"
""  Usage:
"   1. Install the plugin manager 'vim-plug':
"
"     # curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
"
"   2. Copy the vimrcfile to your user configure directory
"
"     # cp the_vimrc_file ~/.vimrc
"
"   2. Reopen vim and run :PlugInstall to install the plugins:
"
"     :PlugInstall
"
"   3. (MacOS required) Install the ctags binary:
"
"     # brew install ctags
"
"   4. (Deoplete required) Install the dependency for deoplete plugin:
"
"     # pip3 install --user pynvim
"
"   Last updated: 2019-12-13 12:00:00
" }

" Basics {
    set nocompatible    " explicitly get out of vi-compatible mode
    filetype plugin indent on   " load filetype plugins/indent settings
    syntax on           " syntax highlight on
    set termguicolors   " enable 24bit color

    set backspace=indent,eol,start    " make backspace a more flexible
    set clipboard+=unnamed   " share window clipboard
    set fileformats=unix,dos,mac " support all three, in this order

    let &keywordprg=':help'		      " program to use for the |K| command.  
    let mapleader=','

    " Encodings {
        set enc=utf-8		" Sets the character encoding used inside Vim.
        set fenc=utf-8	    " Sets the character encoding for the file.
        set fencs=ucs-bom,utf-8,gb18030,gbk,gb2312,cp936		
    " }

    " set backup    " make backup files
    " set backupdir=$HOME/.vim/backup " where to put backup files
    " set autochdir  " always switch to the current file directory
" }

" Text Formatting/Layout {
    set textwidth=79
    set completeopt=menu    " use a pop up menu for completions
    set wildmenu    " turn on command line complete wild style
    set wildignore=*.dll,*.bak,*.exe,*.pyc  " ignore these list file extension
    set formatoptions=tcrql

    " Indent {
        set autoindent
        set smartindent
        set cindent "  enable automatic C program indenting.  
    " }

    " Tab {
        set tabstop=4   " real tabs should be 4
        set shiftwidth=4    " auto-indent amount
        set expandtab   " no real tabs please!
        set smarttab 
    " }
" } 

" Plugins { 
    " Vim plugin manager start here
    call plug#begin('~/.vim/plugged')

    Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
    Plug 'scrooloose/nerdtree'
    Plug 'majutsushi/tagbar'
    Plug 'vim-airline/vim-airline'
    Plug 'arcticicestudio/nord-vim'

    " Deoplete completion
    Plug 'Shougo/deoplete.nvim'
    Plug 'roxma/nvim-yarp'
    Plug 'roxma/vim-hug-neovim-rpc'

    " Initialize plugin system
    call plug#end()

    " Vim-go settings
    let g:go_fmt_command = "goimports"
    let g:go_list_type = "quickfix"
    let g:go_gopls_complete_unimported = 1
    let g:go_version_warning = 1
    let g:go_highlight_types = 1
    let g:go_highlight_fields = 1
    let g:go_highlight_functions = 1
    let g:go_highlight_function_calls = 1
    let g:go_highlight_operators = 1
    let g:go_highlight_extra_types = 1
    let g:go_highlight_methods = 1
    let g:go_highlight_generate_tags = 1
    let g:go_highlight_format_strings = 1

    " NERDTree settings
    nnoremap n :NERDTreeToggle

    let NERDTreeShowLineNumbers=1
    let NERDTreeAutoCenter=1
    let NERDTreeShowHidden=0
    let NERDTreeIgnore=['\.pyc','\~$','\.swp']
    let NERDTreeShowBookmarks=2
    let g:nerdtree_tabs_open_on_console_startup=1

    autocmd VimEnter * NERDTree | wincmd p
    autocmd StdinReadPre * let s:std_in=1
    autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif
    autocmd BufEnter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

    " Tagbar settings
    nnoremap t :TagbarToggle
    autocmd FileType go nested :TagbarOpen

    let g:tagbar_compact = 1
    let g:tagbar_autoshowtag = 1
    let g:tagbar_type_go = {
        \ 'ctagstype' : 'go',
        \ 'kinds'     : [
            \ 'p:package',
            \ 'i:imports:1',
            \ 'c:constants',
            \ 'v:variables',
            \ 't:types',
            \ 'n:interfaces',
            \ 'w:fields',
            \ 'e:embedded',
            \ 'm:methods',
            \ 'r:constructor',
            \ 'f:functions'
        \ ],
        \ 'sro' : '.',
        \ 'kind2scope' : {
            \ 't' : 'ctype',
            \ 'n' : 'ntype'
        \ },
        \ 'scope2kind' : {
            \ 'ctype' : 't',
            \ 'ntype' : 'n'
        \ },
        \ 'ctagsbin'  : 'gotags',
        \ 'ctagsargs' : '-sort -silent'
    \ }

    " Deoplete.nvim settings
    inoremap   pumvisible() ? "\" : "\"
    inoremap   pumvisible() ? "\" : "\"
    inoremap   pumvisible() ? "\" : "\"

    let g:deoplete#enable_at_startup = 1
    if exists('g:deoplete#enable_at_startup')
        call deoplete#custom#option('omni_patterns', { 'go': '[^. *\t]\.\w*' })
    endif
" }

" UI {
    set number  " turn on line number
    set numberwidth=5   " we are good up to 99999 lines
    set report=0    " tell us when anything is changed via :...
    set ruler   " always show current positions along the bottom
    set showcmd " show the command being typed
    set showmode    " show editing mode
    set showmatch   " show matching brackets
    set matchpairs+=<:>
    set splitbelow " show split window below
    set splitright
    set completeopt=longest,menu    " use a pop up menu for completions

    " Highlight {
        "set cursorcolumn    " highlight the current column
        "highlight cursorcolumn guibg=lightblue

        set cursorline  " highlight the current line
        highlight cursorline cterm=bold
        "highlight linenr ctermfg=darkcyan
    " }

    " Colorscheme {
        set background=dark
        colorscheme nord
    " }

    " Search {
        set hlsearch    " highlight search result.
        set incsearch   " do search as you type your search phrase
        set ignorecase smartcase    " smart ignore case when searching.
    " }

    " Statusline {
        set laststatus=2    " always show the status line
        set statusline=
        set statusline+=%-3.3n                       " buffer number
        set statusline+=%t                           " filename
        set statusline+=%h%m%r%w                     " status flags
        set statusline+=[%{&ff}]                     " file format
        set statusline+=[%{strlen(&ft)?&ft:'none'}]  " file type
        set statusline+=%=                           " right align remainder
        set statusline+=0x%-8B                       " character value
        set statusline+=%-14(%l,%c%V%)               " line, character
        set statusline+=%<%LL                        " file lines
    " }
" }

" GUI {
    if has('gui_running')
        set lines=999 columns=999 " size of gvim window

        " Remove toolbar and menubar
        set guioptions-=T
        set guioptions-=m

        " Font. Very important.
        if has('win32') || has('win64')
            set guifont=Consolas:h11:cANSI
        elseif has('gui_macvim')
            set transparency=10
            set guifont=Monaco:h12
            "set showtabline=2

            " Remove scrollbar also
            set guioptions-=r
            set guioptions-=R
            set guioptions-=l
            set guioptions-=L
        elseif has('unix')
            set guifont=Monospace\ 12
        endif
    endif
" }

" User-defined {
    " Easy edit of files in the same directory.
    if has('unix')
        nnoremap ,e :e =expand("%:p:h") . "/" 
    else
        nnoremap ,e :e =expand("%:p:h") . "\\" 
    endif

    " Typical keypress errors:
    iabbr teh the

    " Abbreviations for some words in common use
    iabbr #c  # coding=utf-8
    iabbr #p  #!/usr/bin/env python
    iabbr #b  #!/bin/bash
" }