用了 Vim 挺久了,最主要的原因可能是因为我出手汗比较严重,用普通的鼠标会经常表面一层油油的东西,Mac的触控板体验很好,但一旦发热起来,手上的汗会非常难受。所以为了能够在键盘上快速编辑文本和代码,就学习了 Vim

我的 Vim 设置很简单,就下面不到100行,具体的每一部分都有解释。

" 这部分是设置Vim本身的一些功能和显示
set nocompatible
set backspace=indent,eol,start
" 设置相对行数是为了方便跳跃和使用一些可以加数字前缀进行重复操作的命令
" 比如3dd(删除三行)、7<Cr>(向下跳七行)这种
set number
set relativenumber
set clipboard=unnamed

" 这就是状态栏设置,都是Vim本身自带的一些参数,%f是file,其它不一一解释了
set laststatus=2
set statusline=%f%m%=%l/%L

syntax on
filetype plugin indent on

" 开启sign column
" nerdtree和tagbar一类的buffer不显示sign column
set signcolumn=yes
autocmd FileType tagbar,nerdtree setlocal signcolumn=no

" 缩进规则
set tabstop=2 " tab size
set expandtab " 是否在tab键被点击时展开tab,即插入tabstop个空格,而不是制表符
set shiftwidth=2 " indentation width when indenting in normal mode
" softtabstop 使用backspace键删除空格/制表符时的空格数,通常设置为与tabstop相等,expandtab设置为false时使用

" 其实基本没用到过这块儿,最初拿过来是为了看Practical Vim时尝试一下
" nmap <leader>l :set list!<CR>
set listchars=tab:▸\ ,eol:¬

" 设置折叠,但是有些文件不太准确,就直接关掉了
" set foldmethod=syntax
" set foldlevelstart=99

" nnoremap <silent> <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>

" python文件的格式,不知道为什么没遵守上面的设置,又重新设置了一下
" autocmd FileType python set softtabstop=2 tabstop=2 expandtab shiftwidth=2

au BufNewFile,BufRead *.wxml setf html
au BufNewFile,BufRead *.wxss setf css
au BufNewFile,BufRead *.vue setf html
au BufNewFile,BufRead *.svelte setf html
au BufNewFile,BufRead *.eslintrc setf json
au BufNewFile,BufRead *.babelrc setlocal filetype=json
au BufNewFile,BufRead *.ts setlocal filetype=typescript
au BufNewFile,BufRead *.tsx setlocal filetype=typescript

" 自动去除行尾空格
autocmd BufWritePre * %s/\s\+$//e

set rtp+=~/.fzf

call plug#begin('~/.vim/plugged')

" 括号管理,非常好用
Plug 'Raimondi/delimitMate'
" 这个不说了,Vimer基本都有
Plug 'scrooloose/nerdtree'
" 我是个前端开发者
Plug 'pangloss/vim-javascript'
Plug 'leafgarland/typescript-vim'
" 这个插件是用来写文章时将窗口居中的,后来用Ulysses了
" Plug 'goyo.vim'
" 自动补全
Plug 'neoclide/coc.nvim', {'branch': 'release'}
" 显示当前文件的结构,支持跳转,也挺好用的
" Plug 'liuchengxu/vista.vim'
" 偶尔写Go
Plug 'fatih/vim-go', { 'tag': '*' }
" fzf神器,搜索文件、文本必备,我现在使用这个打开文件的频率可能比nerdtree还要高
Plug 'junegunn/fzf.vim'
" lisp插件
Plug 'kovisoft/slimv'
" 我现在用的colorscheme
Plug 'arzg/vim-colors-xcode'

call plug#end()

" delimitMate配置
let delimitMate_expand_cr = 1
let delimitMate_expand_space = 1

" 列出文件tag的命令
let g:tagbar_ctags_bin = "/usr/local/bin/ctags"

" 设置auto-pairs不自动居中
let g:AutoPairsCenterLine = 0

" 设置忽略文件/文件夹
" 方便搜索/查询时忽略部分不必要文件
set wildignore+=*/tmp/*,*.swp,*.zip,*/node_modules/*,*/dist/*

" Vista配置
let g:vista_default_executive = 'coc'

" 设置NERDTree自动开启
let NERDTreeIgnore = ['\.pyc$', '.DS_Store', '\.swp$']
let NERDTreeShowHidden = 1
let g:NERDTreeWinPos = 'right'

" go配置,因为是调的go本身的插件,这块儿不然会有问题
autocmd FileType go set updatetime=500
autocmd FileType go nnoremap <silent> <space>a  :<C-u>CocList diagnostics<cr>

" set bg=dark             "设置背景为黑色
" 这个colorscheme类似xcode,配合改了背景的iTerm2,非常舒服
colorscheme xcodedark

" 键盘映射
" 快捷切换tab,Command + left or Command + right
" 切换窗口,虽然还是gt用得多一点
nnoremap <C-H> gT
nnoremap <C-L> gt
" 这个可以在不脱离编辑模式的情况下将当前编辑行置于屏幕中央
imap <silent> <C-B> <C-O>zz
" 直接切换nerdtree
nnoremap <silent> <C-N> :NERDTreeToggle<cr>

" 这两行大杀器,是我最近使用最多的命令,一个是查找文件,一个是查找内容,完全可以替代VSCode的文件和全局搜索功能
nnoremap <silent> <C-P> :Files<cr>
nnoremap <silent> <C-A> :Ag<cr>

" go自动添加代码,写json映射的时候很好用
let g:go_addtags_transform = "camelcase"

就这些,但编辑上日常使用起来我觉得并不比VSCode差。Git功能偶尔还是会用VSCode,解决冲突时GUI要比terminal舒服得多,这点毋庸置疑。