描述
听说很多大佬最后的归宿都是 VIM,作为一个有仪式感的男人,我觉得 VIM 目前能带给我的感觉就是编程的完整性,让你感觉敲得每一个字母都是在编程,哪怕是一个 o,而不是那种鼠标点点点的感觉,先说下我目前的使用方式吧,就是 GoLand 配合 VIM 插件开发,毕竟朋友说 VIM 学习成本太高,我目前确实没有过多的时间直接换编辑器
编辑器选择
作为一个比较能折腾的人来讲,我用过几款编辑器,包括 Notepad++, Sublime Text 3, VS Code, GoLand, Intellij IDEA,如果让我比较的话,站在我的角度:
- Notepad++ 我的使用深度不高,不评价;
- Sublime Text 3 要安装各种的插件去网上找文章,这对我这没啥事就重做个系统的人来讲,根本不能接受;
- VS Code 用了很久,扩展仓库不得不说,很好用,而且各种主题也符合我的审美,但是自从项目越来越大,保存文件要等 5 S 以上,就让我放弃了这个编辑器,因为真的很慢;
- GoLand 和 Intellij 没什么区别,都一样,只是买正版的话 GoLand 便宜一点;
上面的编辑器基本都有 VIM 的插件,装一下就可以了。
快捷键
网上起码有不下十篇文章称自己为最全的 VIM
快捷键,但其实一对比就会发现,总有几个需要的快捷键互相查漏补缺了,甚至还有一些快捷键解释都写错了,其实出于严谨性来说这种事情不应该发生的,如果我的文章有这种问题也欢迎大家和我邮件交流,以下只记录一些自己常用的快捷键(逐渐补充)。
光标位移
- 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 编辑器则需要插件管理器(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