VIM 个人学习

序言

听说很多大佬最后的归宿都是 VIM ,作为一个有仪式感的男人,我觉得 VIM 目前能带给我的感觉就是编程的完整性,让你感觉敲得每一个字母都是在编程,哪怕是一个 o,而不是那种鼠标点点点的感觉,先说下我目前的使用方式吧,就是 IDEA 配合 VIM 插件开发,毕竟朋友说 VIM 学习成本太高,我目前确实没有过多的时间直接换编辑器。

编辑器选择

作为一个比较能折腾的人来讲,我用过几款编辑器,包括 Notepad++Sublime Text 3VS CodeGoLand,目前在用的是 Intellij IDEA,如果让我比较的话,站在我的角度:

  • Notepad++ 我的使用深度不高,不评价;
  • Sublime Text 3 要安装各种的插件去网上找文章,这对我这没啥事就重做个系统的人来讲,根本不能接受;
  • VS Code 用了很久,扩展仓库不得不说,很好用,而且各种主题也符合我的审美,但是自从项目越来越大,Ctrl + S 要等个 5 S 以上,就让我放弃了这个编辑器,因为真的很慢;
  • GoLand 怎么说呢,没什么具体原因,自从选择了 Intellij 我就放弃了 GoLand;

Intellij VIM 插件

我是个比较注重颜值的人,所以一般 IDEA 都会用一些主题。

image

快捷键

网上起码有不下十篇文章称自己为最全的 VIM 快捷键,但其实一对比就会发现,总有几个需要的快捷键互相查漏补缺了,甚至还有一些快捷键解释都写错了,我只想说,兄弟,Copy 的时候可不可以认真点,以下只记录一些自己常用的快捷键(逐渐补充):

光标位移

  • h or Backspace: 左移一个字符;
  • l or Space: 右移一个字符;
  • k: 上移一行;
  • j: 下移一行;
  • b: 前移一个单词,光标停在上一个单词开头;
  • B: 移动到上一个单词开头,忽略一些标点;
  • w: 后移一个单词,光标停在下一个单词开头;
  • W: 移动下一个单词开头,但忽略一些标点;
  • e: 后移一个单词,光标停在下一个单词末尾;
  • E: 移动到下一个单词末尾,如果词尾有标点,则移动到标点;
  • (: 前移1句;
  • ): 后移1句;
  • {: 前移1段;
  • }: 后移1段;
  • fc: 把光标移到同一行的下一个c字符处;
  • Fc: 把光标移到同一行的上一个c字符处;
  • 0: 移动到行首;
  • $: 移动到行尾;
  • ^: 移动到本行第一个非空白字符;
  • gg: 到文件头部;
  • G: 到文件尾部;
  • [ n ] G: 移动到 ( n ) 行的行首;

插入文本

基本插入
  • i: 在光标前插入;[ 数字+i,进入插入模式,输入任意字符,按 Esc 进入命令模式,就会出现n个字符,这在插入分割线时非常有用,如30i+就插入了36个+组成的分割线。]
  • I: 在当前行第一个非空字符前插入;
  • gI: 在当前行第一列插入;
  • a: 在光标后插入;
  • A: 在当前行最后插入;
  • o: 在下面新建一行插入;
  • O: 在上面新建一行插入;

复制粘贴

复制
  • y: 复制在可视模式下选中的文本;
  • y0: 从光标当前位置复制到行首;
  • y$: 从光标当前位置复制到行尾;
  • yG: 复制光标以下的所有行;
  • y [ n ] w: 复制 ( n ) 个单词;
  • yy or Y: 复制整行文本;
剪切 & 删除
  • d: 删除(剪切)在可视模式下选中的文本;
  • d0: 删除(剪切)当前位置到行首的内容;
  • d$ or D: 删除(剪切)当前位置到行尾的内容;
  • dG: 删除(剪切)光标以下的所有行;
  • d [ n ] w: 删除(剪切)( n ) 个单词;
  • [ n ] dd: 删除(剪切)( n ) 行。
粘贴
  • p: 在光标之后粘贴;
  • P: 在光标之前粘贴;

查找

  • / something: 在后面的文本中查找 something;
  • ? something: 在前面的文本中查找 something;
  • n: 向后查找下一个;
  • N: 向前查找下一个;

替换

  • :s/old/new - 用 new 替换当前行第一个 old;
  • :s/old/new/g - 用 new 替换当前行所有的 old;
  • :n1,n2s/old/new/g - 用 new 替换文件 n1 行到 n2 行所有的 old;
  • :%s/old/new/g - 用 new 替换文件中所有的 old;
  • :%s/^/xxx/g - 在每一行的行首插入 xxx,^ 表示行首;
  • :%s/$/xxx/g - 在每一行的行尾插入 xxx,$ 表示行尾;
  • 所有替换命令末尾加上 c,每个替换都将需要用户确认。 如:%s/old/new/gc,加上 i 则忽略大小写 ( ignore );

批量注释 & 反注释

  • :起始行号,结束行号s/^/注释符/g
  • :起始行号,结束行号s/^注释符//g

大小写转换

  • ~: 反转光标所在字符的大小写;
  • u or U [ 可视模式 ]: 把选中的文本变为大写或小写;

  • qa: 开始录制宏 a(键盘操作记录);
  • q: 停止录制;
  • @a: 播放宏 a;
  • .: 重复上一个编辑动作;

编程辅助

  • gd: 跳转到局部变量的定义处;
  • gD: 跳转到全局变量的定义处,从当前文件开头开始搜索;
  • g;: 上一个修改过的地方;
  • g,: 下一个修改过的地方;

插件管理器(vim-plug)

  • 管理器安装
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  • 查看插件状态
$ :PlugStatus
  • 插件安装
$ :PlugInstall

个人配置

" 关闭兼容模式
set nocompatible

set nu! " 设置行号
set cursorline "突出显示当前行

" set cursorcolumn " 突出显示当前列
set showmatch " 显示括号匹配
set guioptions-=L " 隐藏左侧滚动条

" tab 缩进
set tabstop=4 " 设置Tab长度为4空格
set shiftwidth=4 " 设置自动缩进长度为4空格
set autoindent " 继承前一行的缩进方式,适用于多行注释
set smartindent " 开启新行时使用智能自动缩进

" 定义快捷键的前缀,即<Leader>
let mapleader=";"

" 开启实时搜索
set incsearch

" 搜索时大小写不敏感
set ignorecase
syntax enable
syntax on                    " 开启文件类型侦测
filetype plugin indent on    " 启用自动补全

" 窗口分割时,进行切换的按键热键需要连接两次,比如从下方窗口移动
" 光标到上方窗口,需要<c-w><c-w>k,非常麻烦,现在重映射为<c-k>,切换的
" 时候会变得非常方便.
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

" 插件开始的位置
call plug#begin('~/.vim/plugged')

" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
" 可以快速对齐的插件
Plug 'junegunn/vim-easy-align'

" 用来提供一个导航目录的侧边栏
Plug 'scrooloose/nerdtree'

" 可以使 nerdtree 的 tab 更加友好些
Plug 'jistr/vim-nerdtree-tabs'

" 可以在导航目录中看到 git 版本信息
Plug 'Xuyuanp/nerdtree-git-plugin'

" 查看当前代码文件中的变量和函数列表的插件,
" 可以切换和跳转到代码中对应的变量和函数的位置
" 大纲式导航, Go 需要 https://github.com/jstemmer/gotags 支持
Plug 'majutsushi/tagbar'

" 自动补全括号的插件,包括小括号,中括号,以及花括号
Plug 'jiangmiao/auto-pairs'

" Vim状态栏插件,包括显示行号,列号,文件类型,文件名,以及Git状态
Plug 'vim-airline/vim-airline'

" 有道词典在线翻译
Plug 'ianva/vim-youdao-translater'

" 代码自动完成,安装完插件还需要额外配置才可以使用
Plug 'Valloric/YouCompleteMe'

" 可以在文档中显示 git 信息
Plug 'airblade/vim-gitgutter'


" 下面两个插件要配合使用,可以自动生成代码块
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'

" 可以在 vim 中使用 tab 补全
Plug 'vim-scripts/SuperTab'

Plug 'Blackrush/vim-gocode'

" 可以在 vim 中自动完成
Plug 'Shougo/neocomplete.vim'

" go 主要插件
Plug 'fatih/vim-go', { 'tag': '*' }
" go 中的代码追踪,输入 gd 就可以自动跳转
Plug 'dgryski/vim-godef'

" markdown 插件
Plug 'iamcco/mathjax-support-for-mkdp'
Plug 'iamcco/markdown-preview.vim'

" 插件结束的位置,插件全部放在此行上面
call plug#end()

au InsertLeave *.go,*.rs,*.md,*.conf,*.yml,*.yaml,*.sh,*.php write

autocmd vimenter * NERDTree

"==============================================================================
"vim-go 插件
"==============================================================================

let g:go_fmt_command = "goimports" " 格式化将默认的 gofmt 替换
let g:go_autodetect_gopath = 1
let g:go_list_type = "quickfix"

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:godef_split=2


"==============================================================================
" go-def 插件
"==============================================================================

let g:godef_split=1
let g:godef_same_file_in_same_window=1

"==============================================================================
" Gotags 插件
"==============================================================================

nmap <C-O> :TagbarToggle<CR>
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'
\ }

"==============================================================================
" NERDTree 插件
"==============================================================================

" 打开和关闭NERDTree快捷键
map <F10> :NERDTreeToggle<CR>
" 显示行号
let NERDTreeShowLineNumbers=1
" 打开文件时是否显示目录
let NERDTreeAutoCenter=1
" 是否显示隐藏文件
let NERDTreeShowHidden=0
" 设置宽度
let NERDTreeWinSize=31
" 忽略一下文件的显示
let NERDTreeIgnore=['\.pyc','\~$','\.swp']
" 打开 vim 文件及显示书签列表
let NERDTreeShowBookmarks=2
" 在终端启动vim时,共享NERDTree
let g:nerdtree_tabs_open_on_console_startup=1

"==============================================================================
"  Valloric/YouCompleteMe 插件
"==============================================================================

" preview window settiing
let g:ycm_add_preview_to_completeopt = 1
let g:ycm_autoclose_preview_window_after_completion = 0
let g:ycm_autoclose_preview_window_after_insertion = 1

" typing 2 chars
let g:ycm_min_num_of_chars_for_completion = 2
" Completion when typing inside comments
let g:ycm_complete_in_comments = 1
" Query the UltiSnips plugin
let g:ycm_use_ultisnips_completer = 1
" Collect identifiers from strings and comments and tag fiels
let g:ycm_collect_identifiers_from_comments_and_strings = 1
let g:ycm_collect_identifiers_from_tags_files = 1

" some symbols
let g:ycm_error_symbol = '>>'
let g:ycm_warning_symbol = '>*'

" Specifies Python interpreter to run jedi
let g:ycm_python_binary_path = 'python3'

" " Seed its identifier database
" let g:ycm_seed_identifiers_with_syntax=1

" youcompleteme select keys
let g:ycm_key_list_select_completion = ['<C-J>']
let g:ycm_key_list_previous_completion = ['<C-K>']

" Where GoTo* commands result should be opened, same-buffer
let g:ycm_goto_buffer_command = 'horizontal-split'
" nnoremap <leader>jd :YcmCompleter GoToDefinition<CR>
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
nnoremap <leader>gd :YcmCompleter GoToDeclaration<CR>

"==============================================================================
"  其他插件配置
"==============================================================================

" markdwon 的快捷键
map <silent> <F5> <Plug>MarkdownPreview
map <silent> <F6> <Plug>StopMarkdownPreview

" tab 标签页切换快捷键
:nn <Leader>1 1gt
:nn <Leader>2 2gt
:nn <Leader>3 3gt
:nn <Leader>4 4gt
:nn <Leader>5 5gt
:nn <Leader>6 6gt
:nn <Leader>7 7gt
:nn <Leader>8 8gt
:nn <Leader>9 8gt
:nn <Leader>0 :tablast<CR>

YouCompleteMe 相关

YouCompleteMe 需要借助于 Python 插件,但是又有版本要求,由于 MacOSX 自带 python 且现在默认使用 2.7 ,所以推荐一个 python 包管理工具 pyenv

  • 安装 pyenv
$ brew install pyenv
  • 安装 pyenv-virtualenv
$ brew install pyenv-virtualenv
  • 设置环境变量
export PYENV_ROOR="$HOME/.pyenv"
export PATH=$PYENV_ROOT/shims:$PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
  • 常用命令
# 查看已安装版本
$ pyenv versions

# 查看可安装版本
$ pyenv install --list

# 安装指定版本
$ pyenv install < version >

# 指定全局版本
$ pyenv global 3.6.5

参考


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!