将 vim 打造为专属的 IDE



Overview

配置自己的 .vimrc 文件

vim 的配置文件在用户家目录的 .vimrc 文件中,如果没有,自己创建一个。

打开 .vimrc 文件,输入配置,我的配置如下:

"显示行号
set nu

"启动时隐去援助提示
set shortmess=atI

"语法高亮
syntax on

"使用vim的键盘模式
set nocompatible

"不需要备份
set nobackup

"没有保存或文件只读时弹出确认
set confirm

"鼠标可用
set mouse-=a

"tab缩进
set tabstop=4
set shiftwidth=4
set expandtab
set smarttab

"文件自动检测外部更改
set autoread

"c文件自动缩进
set cindent

"自动对齐
set autoindent

"智能缩进
set smartindent

"高亮查找匹配
set hlsearch

"显示匹配
set showmatch

"显示标尺,就是在右下角显示光标位置
set ruler

"去除vi的一致性
set nocompatible

"设置键盘映射,通过空格设置折叠
nnoremap <space> @=((foldclosed(line('.')<0)?'zc':'zo'))<CR>
""""""""""""""""""""""""""""""""""""""""""""""
"不要闪烁
set novisualbell

"启动显示状态行
set laststatus=2

"浅色显示当前行
autocmd InsertLeave * se nocul

"用浅色高亮当前行
autocmd InsertEnter * se cul

"显示输入的命令
set showcmd

"被分割窗口之间显示空白
set fillchars=vert:/
set fillchars=stl:/
set fillchars=stlnc:/

" vundle 环境设置
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
" vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'altercation/vim-colors-solarized'
Plugin 'tomasr/molokai'
Plugin 'vim-scripts/phd'
Plugin 'Lokaltog/vim-powerline'
Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'Raimondi/delimitMate'
" 插件列表结束
call vundle#end()
filetype plugin indent on

" 配色方案
"set background=dark
"colorscheme solarized
"colorscheme molokai
"colorscheme phd

" 禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T

" 总是显示状态栏
set laststatus=2

" 禁止折行
set nowrap

" 设置状态栏主题风格
let g:Powerline_colorscheme='solarized256'

syntax keyword cppSTLtype initializer_list

" 基于缩进或语法进行代码折叠
"set foldmethod=indent
set foldmethod=syntax
" 启动 vim 时关闭折叠代码
set nofoldenable

"允许用退格键删除字符
set backspace=indent,eol,start

"编码设置
set encoding=utf-8

"共享剪切板
set clipboard=unnamed


vim 的插件使用 vundle 管理


安装 vundle:

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

如我的配置文件所示,Plugin '插件地址' 即为添加插件,如:

Plugin 'dyng/ctrlsf.vim'


安装插件,先找到其在 github.com 的地址,再将配置信息其加入 .vimrc 中的call vundle#begin() 和 call vundle#end() 之间,最后进入 vim 执行:

:PluginInstall

便安装完成插件。


如需删除插件,只需将 Plugin '插件地址' 删除或者注释掉,再进入 vim 执行:

:PluginClean

便将插件删除。


如需升级插件,进入 vim 执行:

:PluginUpdate

便完成升级。



主题安装


默认的 vim 主题对于编程人员来说,伤眼又难看。作为一名码代码的,个人比较偏爱暗黑色的背景,所以选在隆重给大家推荐一款主题——vim主题Tomorrow

该主题的安装也非常简单。从 github 上下载 tomorrow 主题的源文件,导入主题就能用了。

/* 从github上下载tomorrow主题 */
git clone https://github.com/chriskempson/tomorrow-theme.git


终端切换 tomorrow 主题

  • 进入 tomorrow/OS X Terminal 双击 Tomorrow Night.terminal 即可导入暗黑色的 tomorrow 主题。
  • 然后,打开终端,依次进入 Terminal->preferences,按下图的操作进行。


vim 切换 Tomorrow 主题

vim 切换 tomorrow 主题就没那么简单直接了,需要设置 .vimrc 配置文件和加入 colors 文件夹。

/* 在.vim/bundle下新建文件夹 */
~ cd ~/.vim/bundle
~ mkdir ./vim/colors
/* 进入tomorrow文件夹中的vim配置文件夹 */
~ cd tomorrow-theme/vim/colors
/* 移动配置文件到.vim/bundle/colors文件夹 */
~ mv Tomorrow-Night.vim ~/.vim/bundle

接下来,修改 .vimrc 配置文件,使主题生效。

/* 在配置文件中加入下面的配置 */
" *********************************************
" Tomorrow主题配置
" *********************************************
set t_Co=256
set background=dark
colorscheme Tomorrow-Night

重启终端和vim试试,全新的tomorrow配色就这样生效了。!!!

主题切换

:colorscheme   "查看当前主题
:colorscheme space tab "列出所有主题
:colorscheme your-theme "切换主题

有时候我们想快速浏览主题并找到一款合适的主题,change-colorscheme 将会满足我们的要求.

安装

git https://github.com/chxuan/change-colorscheme.git
cd ./change-colorscheme/plugin
cp change-colorscheme.vim ~/.vim/plugin

或者如果你有 Vundle, 将 'chxuan/change-colorscheme' 加入你的 ~/.vimrc 然后执行 :PluginInstall.

使用

你可以将下面的代码放入 ~/.vimrc:

map <F12> :NextColorScheme<CR>
imap <F12> <ESC> :NextColorScheme<CR>
map <F11> :PreviousColorScheme<CR>
imap <F11> <ESC> :PreviousColorScheme<CR>

按下 F12 将加载下一个主题,按下 F11 将加载上一个主题。 如果你想知道当前是什么主题你可以执行 :colorscheme.

注意

该插件将会在 ~/.vim/colors 搜索主题。




分割布局

在写代码的时候,最喜欢的就是开两个窗口来浏览不同的代码,这点在 vim 中可以轻易的做到,所以,自从用了 vim 就再也不想用双屏来看代码了。

为了配合快捷键来使用分割布局,我们需要在 .vimrc 文件中添加下面的配置。

" *********************************************
" 分割布局相关
" *********************************************
set splitbelow
set splitright
"快捷键,ctrl+l切换到左边布局,ctrl+h切换到右边布局
"ctrl+k切换到上面布局,ctrl+j切换到下面布局
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

保存退出,重新进入 vim 之后,就可以用命令来控制分割布局了。

:split // 水平分割打开一个新窗口
:vsplit // 垂直分割打开一个新窗口

下面是分割成四个窗口的预览图,看看是不是很酷炫,效率一下子就提升了。另外,CTRL+H/J/K/L 就可以切换到任意窗口进行编辑操作。


代码折叠

通常,在一些 IDE 里面都提供对代码进行折叠的操作,便于理清代码的思路。Vim 当然不甘示弱,这么点小功能能难倒我,而且 vim 的折叠功能更加的可控和智能。

同样,在 .vimrc 中添加如下配置来开启代码折叠功能。

" 开启代码折叠功能
" 根据当前代码行的缩进来进行代码折叠
set foldmethod=indent
set foldlevel=99

这样一来,你在 NORMAL 模式下就可以输入 za 快捷键来进行代码折叠了。为了便于操作,我们可以将 za 快捷键换成空格键。所以,您的配置文件中还需要添加如下命令:

" 将za快捷键映射到space空格键上
nnoremap <space> za


目录树

按照当初的想法,是为了将 vim 配置成 Python 开发环境,那么开发环境中的文件目录当然少不了。得益于 vim 强大的插件系统,自然会有插件来带我们完成这个功能。于是,我们找到了 NERDTree 这个插件,先来看看实用效果吧。


第一步,在 vimrc 文件中添加如下代码,和 Vbundle 放在一起。

Plugin 'gmarik/Vundle.vim'
Plugin 'scrooloose/nerdtree'
第二步,添加 NERDTree 目录树的相关配置,也是在 .vimrc 文件中
" *********************************************
" NERD插件属性
" *********************************************
au vimenter * NERDTree // 开启vim的时候默认开启NERDTree
map <F2> :NERDTreeToggle<CR> // 设置F2为开启NERDTree的快捷键

第三步,执行 :PluginInstall

" Installing plugins to /.vim/bundle"
. Plugin 'gmarik/Vundle.vim'
+ Plugin 'scrooloose/nerdtree' // 表示新添加的插件已经安装
* Helptags

Tagbar

Tagbar 可以将正在编辑的文件生成一个大纲,包含类、方法、变量等,可以选中快速跳转到目标位置,编辑大文件的时候特别有用。

Tagbar 的安装需要 Ctags 的支持,我们首先需要安装用 brew 来安装 Ctags,运行如下命令:

~ brew install ctags
然后,在 .vimrc 中添加相应的插件配置。
Plugin 'majutsushi/tagbar'
" 启动时自动focus
 map <F4> :TagbarToggle<CR>
let g:tagbar_auto_faocus =1
" 启动指定文件时自动开启tagbar
autocmd BufReadPost *.py,*.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()

做完这些之后,执行 :PluginInstall

自动补全

在 vim 下,最好用的自动补全插件非 YouCompleteMe 莫属,这款插件支持C、C++、obj-C、C# 和 python 语言的自动补全,有了它,补全各类代码都不用愁了。

安装 YCM 需要 cmake 的支持,而且 vim 的版本需要在 7.4 以上。首先,我们来安装 cmake。

~ brew install cmake

然后,按照插件的安装方法,向 .vimrc 中添加下列配置命令。

Plugin 'Valloric/YouCompleteMe'

" *********************************************
" YCM插件相关
" *********************************************
let g:ycm_autoclose_preview_window_after_completion=1
" 跳转到定义处
map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR>
" 默认tab、s-tab和自动补全冲突
let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>']
let g:ycm_auto_trigger = 1


最后,执行 :PluginInstall,执行完之后,会提示 YCM 需要编译后才能使用,去 YCM 目录下执行编译工作吧。

/* 进入ycm目录 */
~ cd .vim/bundle/YouCompleteMe/
/* 执行编译 */
./install.sh --clang-completer

编译的过程有点慢,耐心等待之后,就可以在写代码的时候自动补全了,看如下示意图,补全 python 代码。


通过 Git 安装 YCM

用 vundle 中的安装太慢, 所以自己手动安装

检查是否安装 clang、g++、cmake 等

安装插件管理工具

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim


在 .vimrc 中插件管理处加入:

Plugin 'Valloric/YouCompleteMe'


安装 ycm

cd .vim/bundle
git clone https://github.com/Valloric/YouCompleteMe.git
cd YouCompleteMe
git submodule update--init --recursive
./install.py --clang-completer


在 .vimrc 中添加下列

let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'




air-line

大家在看上述截图的时候,可以会对下方的一条状态栏感兴趣,作为外观党,实在是对这个小插件爱不释手,它的最大好处就是好看!附带的功能也一目了然,可以显示 vim 当前的状态INSERT、NORMAL、VISUAL 等,还可以配合一些插件提示语法错误。废话不多说,接下来就教大家安装这个增强型状态栏工具。

这个状态栏是由 vim-airline 插件提供,默认情况下,airline 使用 ASCII 字符来作为状态栏的分隔符, 所以安装完后,会出现一些乱码的情况。具体的修改方法后面会讲到。

首先,还是按照插件安装的方法,在 .vimrc 中添加如下配置命令。

Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'

" *********************************************
" vim-airline
" *********************************************
" 开启powerline字体
let g:airline_powerline_fonts = 1
" 使用powerline包装过的字体
set guifont=Source\ Code\ Pro\ for\ Powerline:h14

然后,执行 :PluginInstall,重启 vim 可能不会如你所愿.

因为 terminal 使用的字体一般是 menlo 或者 monaco,这些字体都没有对 powerline 的字符进行封装,所以状态栏的字符段会出现乱码,这个时候需要做的就是安装 powerline 字体。

/* 从github下载字体文件 */
git clone https://github.com/powerline/fonts.git
/* 安装powerline字体 */
cd fonts
./install.sh

等待脚本程序运行完之后,就成功安装好了 powerline 封装过的字体了。接下来,修改终端字体,个人比较偏爱 Source Code Pro 字体,所以讲终端字体修改为 Source Code Pro for Powerline,然后重启 vim 就能看到正常显示的 airline 了。


支持 UTF-8 编码

大部分情况下,进行 Python 开发时,你应该使用 UTF-8 编码,尤其是使用 Python3 的时候,为了使 vim 支持 UTF-8 编码需要在 .vimrc 中添加如下代码:

set encoding=utf-8


文件跳转 ctrlp

在进行大项目的开发时,往往需要进行文件的跳转,有时我们队要跳转的文件名只记得部分,所以需要支持模糊查找,目录树跨文件夹跳转起来太不方便,于是 ctrlp 插件登场了,当逆向打开某个文件时,只需要按下 ctrl+p 输入要打开的文件名即可实现文件跳转,所有和这个文件名匹配的文件都会被按照优先级列出来。

其安装步骤如下,在 .vimrc 中添加如下配置命令:

Plugin 'kien/ctrlp.vim'

" *********************************************
" ctrlp
" *********************************************
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'
" 设置过滤不进行查找的后缀名
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|pyc)$'

最后,执行 :PluginInstall,重启 vim,按下 CTRL+P,文件跳转就显示出来了。

使用 ctags 生成 tag 标签文件实现跳转

在当前目录下执行命令 ctags -R 就可以生成当前项目所有源文件对应的 tag 标签文件

此时,再通过 Vim 打开当前项目的某个源文件,把光标移动到某个标识符上,通过按键 Ctrl + ] 就可以跳转到对应的定义位置,命令 Ctrl + o 可以回退到原来的位置

如果当前光标下是个局部变量,在 Vim 命令模式下执行命令 gd 就可以跳转到这个局部变量的定义处

默认情况下,生成的 tags 文件必须在 vim 运行的当前目录才能在 vim 里面正确跳转

可以在 Vim 尾行模式或 Vim 配置文件 .~/.vimrc 中通过以下命令显式地指定 tag 文件路径:

:set tags+=tags文件路径



~ cd /usr/local/include
~ ctags -R
~ vim .vimrc
...
set tags+=/usr/local/include/tags
...



PEP8风格

对于 Python 代码而言,必须要支持 PEP8 风格的缩进,所以,需要在 .vim 文件中添加下面的配置文件。

" *********************************************
" python代码风格PEP8
" *********************************************
au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set expandtab|set autoindent|set fileformat=unix

au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2|set softtabstop=2|set shiftwidth=2

另外,如果需要自动缩进 python 代码的话,需要安装如下插件:

Plugin 'vim-scripts/indentpython.vim'


共享粘贴板

有时候需要从 vim 中复制一些代码出去,所以 vim 必须支持能够将代码复制到系统粘贴板上,要实现上述需求,只需要在 .vimrc 中添加如下配置参数。

set clipboard=unnamed

一键执行 Python 代码

在 .vimrc 中添加:

" F5 to run sh/python3
map <F5> :call CompileRunGcc()<CR>`
func! CompileRunGcc()
    exec "w"
    if &filetype == 'sh'
        :!time bash %
    elseif &filetype == 'python'
        exec "!time python3.7 %"
    endif
endfunc

说明:

  • F5 一键执行代码, 可以自定义.
  • 一键执行 shell 脚本的部分,不需要可以去掉.
    • 需配置更多一键执行的文件类型, 点击文末参考链接.
  • 注意:
    • Python3.7 改成自己对应的版本.

按 F5 一键运行

然后按 Enter 回到编辑界面.十分丝滑的体验!


使用 pydiction 自动补全

pydiction中主要有三个文件:

  • python_pydiction.vim – 该文件为 Vim 的 plugin 文件,实现 Python 文件的 TAB 补全功能。
  • complete-dict – 该文件为 Vim 的 dictionary 文件,其中包含 Python 关键字和模块结构等信息。是plugin 进行补全时所查找的参考文件。
  • pydiction.py – (可选)该文件是 Python script 文件,用于生成 dictionary文件。可以通过执行该脚本添加更多的可 TAB 补全模块。


1. 使用 Vundle 安装 pydiction

cd ~/.vim/bundle
git clone https://github.com/rkulla/pydiction.git


2. 转到 pydiction 文件夹,然后执行:

cp -r ./after ~/.vim

PS:按照网上的教程使用bundle安装pydiction后,还是无法使用tab补全,原因是还需要复制pydiction中的after(包含python_pydiction.vim)文件夹至.vim目录中(Linux系统都需用此步骤)。


3. 配置 .vimrc

在 vimrc 文件中添加

filetype plugin on
let g:pydiction_location = '~/.vim/bundle/pydiction/complete-dict'



其他



在编辑模式下如何快速移动光标

编辑 ~/.vimrc 配置文件,加入如下行,编辑模式下自定义的快捷键

inoremap <C-o> <Esc>o  
inoremap <C-l> <Right>
inoremap <C-h> <Left>
inoremap <C-k> <Up>
inoremap <C-j> <Down>
inoremap <C-b> <PageUp>
inoremap <C-f> <PageDown>


括号自动补齐


inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap { {}<ESC>i
inoremap ' ''<ESC>i
inoremap " ""<ESC>i


行号

显示行号

set nu

不显示行号

set nonu


禁止光标闪烁


set gcr=a:block-blinkon0


禁止显示滚动条


set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R


禁止显示菜单和工具条

set guioptions-=m
set guioptions-=T


头文件的跳转

问题:按 gf 无法跳转到指定头文件

解决:vimrc 中添加 set path=xxx

xxx 是头文件所在目录


Ctrl + 6 : 跳转回来



小结

vim 的插件太多了,针对不同的需求都有相应的插件给予辅助。本篇博客只是按照自己的需求配置了相应的插件,

" *********************************************
" Vbundle插件管理
" *********************************************
set nocompatible              " required
set nu              " required
filetype off                  " required
let python_highlight_all=1
syntax on
set hlsearch
set encoding=utf-8
set clipboard=unnamed
set ts=4
set mouse=a        "启用鼠标"

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'
Plugin 'majutsushi/tagbar'
Plugin 'scrooloose/nerdtree'
Plugin 'Valloric/YouCompleteMe'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'kien/ctrlp.vim'
Plugin 'tmhedberg/SimpylFold'
Plugin 'scrooloose/syntastic'
Plugin 'nvie/vim-flake8'
Bundle 'klen/python-mode'
Bundle 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}

" Add all your plugins here (note older versions of Vundle used Bundle instead of Plugin)
" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required

" *********************************************
" " 分割布局相关
" " *********************************************
" set splitbelow
" set splitright
" "快捷键,ctrl+l切换到左边布局,ctrl+h切换到右边布局
" "ctrl+k切换到上面布局,ctrl+j切换到下面布局
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

" *********************************************
" " Tomorrow主题配置
" " *********************************************
set t_Co=256
set background=dark
"colorscheme Tomorrow-Night

" 开启代码折叠功能
" 根据当前代码行的缩进来进行代码折叠
set foldmethod=indent
set foldlevel=99
" 将折叠za快捷键映射到space空格键上
nnoremap <space> za
let g:SimpylFold_docstring_preview=1
" *********************************************
" NERD插件属性
" *********************************************
au vimenter * NERDTree   " 开启vim的时候默认开启NERDTree
map <F2> :NERDTreeToggle<CR>  " 设置F2为开启NERDTree的快捷键
" *********************************************
" YCM插件相关
" *********************************************
let g:ycm_autoclose_preview_window_after_completion=1
" 跳转到定义处
map <leader>g  :YcmCompleter GoToDefinitionElseDeclaration<CR>
" 默认tab、s-tab和自动补全冲突
let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>']
let g:ycm_auto_trigger = 1

" 启动时自动focus
map <F4> :TagbarToggle<CR>
let g:tagbar_auto_faocus =1
" 启动指定文件时自动开启tagbar
autocmd BufReadPost *.py,*.pyc,*.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()

" *********************************************
" vim-airline
" *********************************************
" 开启powerline字体
let g:airline_powerline_fonts = 1
" 使用powerline包装过的字体
set guifont=Source\ Code\ Pro\ for\ Powerline:h14

" *********************************************
" ctrlp
" *********************************************
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'
" 设置过滤不进行查找的后缀名
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|pyc)$'

" *********************************************
" python代码风格PEP8
" *********************************************
au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set noexpandtab|set autoindent|set fileformat=unix
au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2|set softtabstop=2|set shiftwidth=2

" 多余空格
"au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/
"
"

" Python-mode
" Activate rope
" Keys: 按键:
" K             Show python docs 显示Python文档
" <Ctrl-Space>  Rope autocomplete  使用Rope进行自动补全
" <Ctrl-c>g     Rope goto definition  跳转到定义处
" <Ctrl-c>d     Rope show documentation  显示文档
" <Ctrl-c>f     Rope find occurrences  寻找该对象出现的地方
" <Leader>b     Set, unset breakpoint (g:pymode_breakpoint enabled) 断点
" [[            Jump on previous class or function (normal, visual, operator modes)
" ]]            Jump on next class or function (normal, visual, operator modes)
"            跳转到前一个/后一个类或函数
" [M            Jump on previous class or method (normal, visual, operator modes)
" ]M            Jump on next class or method (normal, visual, operator modes)
"              跳转到前一个/后一个类或方法
let g:pymode_rope = 1

" Documentation 显示文档
let g:pymode_doc = 1
let g:pymode_doc_key = 'K'

"Linting 代码查错,=1为启用
let g:pymode_lint = 1
let g:pymode_lint_checker = "pyflakes,pep8"
" Auto check on save
let g:pymode_lint_write = 1

" Support virtualenv
let g:pymode_virtualenv = 1

" Enable breakpoints plugin
let g:pymode_breakpoint = 1
let g:pymode_breakpoint_bind = '<leader>b'

" syntax highlighting 高亮形式
let g:pymode_syntax = 1
let g:pymode_syntax_all = 1
let g:pymode_syntax_indent_errors = g:pymode_syntax_all
let g:pymode_syntax_space_errors = g:pymode_syntax_all

" Don't autofold code 禁用自动代码折叠
let g:pymode_folding = 0




"显示行号
set nu

"启动时隐去援助提示
set shortmess=atI

"语法高亮
syntax on

"使用vim的键盘模式
set nocompatible

"不需要备份
set nobackup

"没有保存或文件只读时弹出确认
set confirm

"鼠标可用
set mouse-=a

"tab缩进
set tabstop=4
set shiftwidth=4
set expandtab
set smarttab

"文件自动检测外部更改
set autoread

"c文件自动缩进
set cindent

"自动对齐
set autoindent

"智能缩进
set smartindent

"高亮查找匹配
set hlsearch

"显示匹配
set showmatch

"显示标尺,就是在右下角显示光标位置
set ruler

"去除vi的一致性
set nocompatible

"设置键盘映射,通过空格设置折叠
nnoremap <space> @=((foldclosed(line('.')<0)?'zc':'zo'))<CR>
""""""""""""""""""""""""""""""""""""""""""""""
"不要闪烁
set novisualbell

"启动显示状态行
set laststatus=2

"浅色显示当前行
autocmd InsertLeave * se nocul

"用浅色高亮当前行
autocmd InsertEnter * se cul

"显示输入的命令
set showcmd

"被分割窗口之间显示空白
set fillchars=vert:/
set fillchars=stl:/
set fillchars=stlnc:/

" vundle 环境设置
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
" vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'altercation/vim-colors-solarized'
Plugin 'tomasr/molokai'
Plugin 'vim-scripts/phd'
Plugin 'Lokaltog/vim-powerline'
Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'Raimondi/delimitMate'
Plugin 'chriskempson/vim-tomorrow-theme'
Plugin 'majutsushi/tagbar'
Plugin 'kien/ctrlp.vim'
Plugin 'Valloric/YouCompleteMe'
Plugin 'vim-scripts/indentpython.vim'
" 插件列表结束
call vundle#end()
filetype plugin indent on

" 配色方案
"set background=dark
"colorscheme solarized
"colorscheme molokai
"colorscheme phd

" 禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T

" 总是显示状态栏
set laststatus=2

" 禁止折行
set nowrap

" 设置状态栏主题风格
let g:Powerline_colorscheme='solarized256'

syntax keyword cppSTLtype initializer_list

" 基于缩进或语法进行代码折叠
"set foldmethod=indent
set foldmethod=syntax
" 启动 vim 时关闭折叠代码
set nofoldenable

"允许用退格键删除字符
set backspace=indent,eol,start

"编码设置
set encoding=utf-8

"共享剪切板
set clipboard=unnamed

" Tomorrow主题配置
" *********************************************
set t_Co=256
set background=dark
colorscheme Tomorrow-Night

" 分割布局相关
" *********************************************
set splitbelow
set splitright
"快捷键,ctrl+l切换到左边布局,ctrl+h切换到右边布局
"ctrl+k切换到上面布局,ctrl+j切换到下面布局
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

" 开启代码折叠功能
" 根据当前代码行的缩进来进行代码折叠
set foldmethod=indent
set foldlevel=99

" NERD插件属性
" *********************************************
" 开启vim的时候默认开启NERDTree
au vimenter * NERDTree
"" 设置F2为开启NERDTree的快捷键
map <F2> :NERDTreeToggle<CR>

" 启动时自动focus
 map <F4> :TagbarToggle<CR>
let g:tagbar_auto_faocus =1
" 启动指定文件时自动开启tagbar
autocmd BufReadPost *.py,*.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()

" YCM插件相关
" *********************************************
let g:ycm_autoclose_preview_window_after_completion=1
" 跳转到定义处
map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR>
" 默认tab、s-tab和自动补全冲突
let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>']
let g:ycm_auto_trigger = 1

" ctrlp
" *********************************************
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'
" 设置过滤不进行查找的后缀名
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|pyc)$'

" python代码风格PEP8
" *********************************************
au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set expandtab|set autoindent|set fileformat=unix

au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2|set softtabstop=2|set shiftwidth=2



set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

Plugin 'scrooloose/nerdtree' " 显示目录结构

Plugin 'scrooloose/nerdcommenter' " 注释

Plugin 'Valloric/YouCompleteMe' " 提示

Plugin 'vim-airline/vim-airline' " 底栏

Plugin 'tomasr/molokai' " 主题

Plugin 'python-mode/python-mode' " 代码检查

Plugin 'vim-latex/vim-latex' " LaTex

Plugin 'godlygeek/tabular' " 对齐

Plugin 'plasticboy/vim-markdown' " Markdown

Plugin 'tyru/open-browser.vim' " previm需要,vim内打开浏览器

Plugin 'previm/previm' " Markdown预览

Plugin 'mattn/emmet-vim' " HTML,CSS

Plugin 'luochen1990/rainbow' " 括号层级显示

Plugin 'ap/vim-css-color' " 显示CSS颜色

Plugin 'yggdroot/indentline' " 显示缩进指示线

Plugin 'pangloss/vim-javascript' " JavaScript

Plugin 'posva/vim-vue' " Vue

Plugin 'tpope/vim-surround' " 快速添加、修改和删除括号、引号、HTML标签、XML标签等

Plugin 'terryma/vim-multiple-cursors' " 多光标操作

call vundle#end()
filetype plugin indent on

set encoding=utf-8
set nu
set mouse=a
set cursorline
set cursorcolumn
syntax on
color molokai

if has("gui_running")
    set lines=100 columns=200
endif

set guifont=Monaco\ 10

set guioptions-=m " 隐藏菜单栏
set guioptions-=T " 隐藏工具栏
set guioptions-=r " 隐藏右侧滚动条
set guioptions-=L " 隐藏左侧滚动条
set guioptions-=b " 隐藏底部滚动条

" NERDTree
autocmd vimenter * NERDTree " 自动开启NERDTree
" <F3>关闭NERDTree
map <F3> :NERDTreeToggle<CR>

" NERDCommenter
 let g:NERDSpaceDelims=1 " 于注释符后添加一个空格
" let g:NERDDefaultAlign= 'start' " 注释符左对齐
let g:NERDDefaultAlign= 'left' " 注释符左对齐
let g:NERDCommentEmptyLines=1 " 允许注释空行
let g:NERDTrimTrailingWhitespace=1 " 去掉注释时,去掉多余空格
let g:NERDToggleCheckAllLines=1 " 注释时检查所选行是否已被注释
" 注释或反注释快捷键<F2>
map <F2> <Leader>ci

" YouCompleteMe
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口
let g:ycm_complete_in_comments = 1 "在注释输入中也能补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0 "注释和字符串中的文字也会被收入补全
let g:ycm_autoclose_preview_window_after_completion = 0 " 补全后自动关闭preview窗口
let g:ycm_extra_conf_globlist = ['~/Workspace/*'] " 载入该路径下的.ycm_extra_conf.py前不会弹出提示框
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py' " 默认库路径

" vim-airline
let g:airline#extensions#tabline#enabled=1

" python-mode
let g:pymode_warnings=0 " 允许插件警告
let g:pymode_python='python3' " 设置pymode是用的Python版本
let g:pymode_virtualenv=1 " 支持自动检测virtualenv
let g:pymode_run_bind='<F5>' " 设置<F5>为运行代码快捷键
let g:pymode_lint_sort=['E','W','C','I'] " 报错等显示顺序
let g:pymode_lint_ignore = ["E116"] " 不显示E116报错,即注释缩进报错

" vim-latex
let g:tex_flavor='latex'
let g:Tex_DefaultTargetFormat='pdf'
let g:Tex_CompileRule_pdf='xelatex -interaction=nonstopmode $*'
let g:Tex_ViewRule_pdf='xreader'

" open-browser.vim
let g:previm_open_cmd='firefox'

" rainbow
let g:rainbow_active=1
let g:rainbow_conf={
    \   'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick'],
    \   'ctermfgs': ['lightblue', 'lightyellow', 'lightcyan', 'lightmagenta'],
    \   'operators': '_,_',
    \   'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'],
    \   'separately': {
    \       '*': {},
    \       'tex': {
    \           'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/'],
    \       },
    \       'vim': {
    \           'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/', 'start=/{/ end=/}/ fold', 'start=/(/ end=/)/ containedin=vimFuncBody', 'start=/\[/ end=/\]/ containedin=vimFuncBody', 'start=/{/ end=/}/ fold containedin=vimFuncBody'],
    \       },
    \       'html': {
    \           'parentheses': ['start=/\v\<((area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)[ >])@!\z([-_:a-zA-Z0-9]+)(\s+[-_:a-zA-Z0-9]+(\=("[^"]*"|'."'".'[^'."'".']*'."'".'|[^ '."'".'"><=`]*))?)*\>/ end=#</\z1># fold'],
    \       },
    \       'css': 0,
    \   }
    \}
" 括号自动补齐
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap { {}<ESC>i
inoremap ' ''<ESC>i
inoremap " ""<ESC>i

" 自动代码折叠
set foldmethod=indent
nnoremap <Space> za

" 插入头部
func AddTitlePY()
    call append(0,"# -*- coding=utf8 -*-")
    call append(1,"#")
    call append(2,"# Author       : Painter")
    call append(3,"# Created Time : ".strftime("%Y-%m-%d %a %H:%M:%S"))
    call append(4,"# Filename     : ".expand("%:t"))
    call append(5,"# Email        : painter9509@126.com")
    call append(6,"")
    call append(7,"")
endfunc

func AddTitleC()
    call append(0,"/*=======================================")
    call append(1," *")
    call append(2," * Author       : Painter")
    call append(3," * Created Time : ".strftime("%Y-%m-%d %a %H:%M:%S"))
    call append(4," * Filename     : ".expand("%:t"))
    call append(5," * Email        : painter9509@126.com")
    call append(6," *")
    call append(7," *=======================================*/")
    call append(8,"")
    call append(9,"")
endfunc

func AddTitleTeX()
    call append(0,"%")
    call append(1,"% Author      : Painter")
    call append(2,"% Created Time: ".strftime("%Y-%m-%d %a %H:%M:%S"))
    call append(3,"% Filename    : ".expand("%:t"))
    call append(4,"% Email       : painter9509@126.com")
    call append(5,"%")
    call append(6,"")
    call append(7,"")
endfunc

au BufNewFile *.py,*.pyw call AddTitlePY()

au BufNewFile *.c,*.cpp,*.h call AddTitleC()

au BufNewFile *.tex call AddTitleTeX()

" Python C C++
highlight BadWhitespace ctermbg=red guibg=darkred
au BufNewFile,BufRead *.py,*.pyw,*.c,*.cpp,*.h
    \ set tabstop=4 |
    \ set softtabstop=4 |
    \ set shiftwidth=4 |
    \ set expandtab |
    \ set autoindent |
    \ set fileformat=unix |
    \ match BadWhitespace /\s\+$/

au BufNewFile,BufRead *.c,*.cpp,*.h
    \ set cindent |
    \ set colorcolumn=80

au BufNewFile,BufRead *.tex,*.htm,*.html
    \ set tabstop=2 |
    \ set softtabstop=2 |
    \ set shiftwidth=2 |
    \ set expandtab |
    \ set fileformat=unix

" func AutoRun()
    " if &filetype=="python"
        " let mp=&makeprg
        " setlocal makeprg=python\ -u
        " silent make %
        " copen
        " let &makeprg=mp
    " endif
" endfunc

" map <F5> :w<CR> :call AutoRun()<CR>

auto BufEnter * if 0==len(filter(range(1,winnr('$')), 'empty(getbufvar(winbuf


" 让配置变更立即生效
autocmd BufWritePost $MYVIMRC source $MYVIMRC

"显示行号
set nu

"启动时隐去援助提示
set shortmess=atI

" 开启语法高亮功能
syntax enable
" 允许用指定语法高亮配色方案替换默认方案
syntax on

" 禁止光标闪烁
set gcr=a:block-blinkon0
" 禁止显示滚动条
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
" 禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T

" 开启实时搜索功能
set incsearch
" 搜索时大小写不敏感
set ignorecase
" 关闭兼容模式, 使用vim的键盘模式
set nocompatible
" vim 自身命令行模式智能补全
set wildmenu

"不需要备份
set nobackup

"没有保存或文件只读时弹出确认
set confirm

"鼠标可用
set mouse-=a

"tab缩进
set tabstop=4
set shiftwidth=4
set expandtab
set smarttab

"文件自动检测外部更改
set autoread

"c文件自动缩进
set cindent

"自动对齐
set autoindent

"智能缩进
set smartindent

"高亮查找匹配
set hlsearch

"显示匹配
set showmatch

"显示标尺,就是在右下角显示光标位置
set ruler

" 高亮显示当前行/列
set cursorline
set cursorcolumn

" 设置 gvim 显示字体
" set guifont=YaHei\ Consolas\ Hybrid\ 11.5

"去除vi的一致性
set nocompatible

"设置键盘映射,通过空格设置折叠
nnoremap <space> @=((foldclosed(line('.')<0)?'zc':'zo'))<CR>
""""""""""""""""""""""""""""""""""""""""""""""
"不要闪烁
set novisualbell

"启动显示状态行
set laststatus=2

"浅色显示当前行
autocmd InsertLeave * se nocul

"用浅色高亮当前行
autocmd InsertEnter * se cul

"显示输入的命令
set showcmd

"被分割窗口之间显示空白
set fillchars=vert:/
set fillchars=stl:/
set fillchars=stlnc:/

" vundle 环境设置
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
" vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/nerdtree' " 显示目录结构
Plugin 'scrooloose/nerdcommenter' " 注释
Plugin 'altercation/vim-colors-solarized'
Plugin 'tomasr/molokai' " 主题
Plugin 'vim-scripts/phd'
Plugin 'Lokaltog/vim-powerline'
Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'Raimondi/delimitMate'
Plugin 'chriskempson/vim-tomorrow-theme'
Plugin 'majutsushi/tagbar'
Plugin 'kien/ctrlp.vim'
Plugin 'Valloric/YouCompleteMe' " 代码补全
Plugin 'vim-scripts/indentpython.vim'
Plugin 'python-mode/python-mode' " 代码检查
Plugin 'plasticboy/vim-markdown' " Markdown
Plugin 'previm/previm' " Markdown预览
Plugin 'luochen1990/rainbow' " 括号层级显示
Plugin 'nathanaelkane/vim-indent-guides' " 缩进指南

" 插件列表结束
call vundle#end()

" 自适应不同语言的智能缩进
filetype indent on

filetype plugin indent on

" 配色方案
"set background=dark
"colorscheme solarized " 素雅
"colorscheme molokai " 多彩
"colorscheme phd " 复古

" Tomorrow主题配置
" *********************************************
" set t_Co=256
" set background=dark
" colorscheme Tomorrow-Night

" 禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T

" 总是显示状态栏
set laststatus=2

" 禁止折行
set nowrap

" 设置状态栏主题风格
let g:Powerline_colorscheme='solarized256'

syntax keyword cppSTLtype initializer_list

" 基于缩进或语法进行代码折叠
"set foldmethod=indent
set foldmethod=syntax
" 启动 vim 时关闭折叠代码
set nofoldenable

"允许用退格键删除字符
set backspace=indent,eol,start

"编码设置
set encoding=utf-8

"共享剪切板
set clipboard=unnamed

" 分割布局相关
" *********************************************
set splitbelow
set splitright
"快捷键,ctrl+l切换到左边布局,ctrl+h切换到右边布局
"ctrl+k切换到上面布局,ctrl+j切换到下面布局
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

" 开启代码折叠功能
" 根据当前代码行的缩进来进行代码折叠
set foldmethod=indent
set foldlevel=99

" NERD插件属性
" *********************************************
" 开启vim的时候默认开启NERDTree
" au vimenter * NERDTree
"" 设置F2为开启NERDTree的快捷键
map <C-T> :NERDTreeToggle<CR>
" map <F2> :NERDTreeToggle<CR>

" NERDCommenter
 let g:NERDSpaceDelims=1 " 于注释符后添加一个空格
" let g:NERDDefaultAlign= 'start' " 注释符左对齐
let g:NERDDefaultAlign= 'left' " 注释符左对齐
let g:NERDCommentEmptyLines=1 " 允许注释空行
let g:NERDTrimTrailingWhitespace=1 " 去掉注释时,去掉多余空格
let g:NERDToggleCheckAllLines=1 " 注释时检查所选行是否已被注释
" 注释或反注释快捷键<F2>
map <F2> <Leader>ci

" 启动时自动focus
 map <F4> :TagbarToggle<CR>
let g:tagbar_auto_faocus =1
" 启动指定文件时自动开启tagbar
autocmd BufReadPost *.py,*.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()

" YCM插件相关
" *********************************************
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口
let g:ycm_complete_in_comments = 1 "在注释输入中也能补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0 "注释和字符串中的文字也会被收入补全
let g:ycm_autoclose_preview_window_after_completion = 0 " 补全后自动关闭preview窗口
" let g:ycm_autoclose_preview_window_after_completion=1
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py' " 默认库路径
" 跳转到定义处
map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR>
" 默认tab、s-tab和自动补全冲突
let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>']
let g:ycm_auto_trigger = 1

" ctrlp
" *********************************************
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'
" 设置过滤不进行查找的后缀名
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|pyc)$'

" python代码风格PEP8
" *********************************************
au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set expandtab|set autoindent|set fileformat=unix
au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2|set softtabstop=2|set shiftwidth=2

" python-mode
let g:pymode_warnings=0 " 允许插件警告
let g:pymode_python='python3' " 设置pymode是用的Python版本
let g:pymode_virtualenv=1 " 支持自动检测virtualenv
" let g:pymode_run_bind='<F5>' " 设置<F5>为运行代码快捷键
let g:pymode_lint_sort=['E','W','C','I'] " 报错等显示顺序
let g:pymode_lint_ignore = ["E116"] " 不显示E116报错,即注释缩进报错

" F5 to run sh/python3
map <F5> :call CompileRunGcc()<CR>`
func! CompileRunGcc()
    exec "w"
    if &filetype == 'sh'
        :!time bash %
    elseif &filetype == 'python'
        exec "!time python3.7 %"
    endif
endfunc

" 默认tab、s-tab和自动补全冲突
let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>']
let g:ycm_auto_trigger = 1

" 括号自动补齐
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap { {}<ESC>i
inoremap ' ''<ESC>i
inoremap " ""<ESC>i

" insert mode shortcut
inoremap  <C-h>   <Left>
inoremap  <C-j>   <Down>
inoremap  <C-k>   <Up>
inoremap  <C-l>   <Right>
inoremap  <C-d>   <DELETE>

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

" 定义快捷键到行首和行尾
nmap LB 0
nmap LE $

" 设置快捷键将选中文本块复制至系统剪贴板
vnoremap <Leader>y "+y
" 设置快捷键将系统剪贴板内容粘贴至 vim
nmap <Leader>p "+p
" 定义快捷键关闭当前分割窗口
nmap <Leader>q :q<CR>
" 定义快捷键保存当前窗口内容
nmap <Leader>w :w<CR>
" 定义快捷键保存所有窗口内容并退出 vim
nmap <Leader>WQ :wa<CR>:q<CR>
" 不做任何保存,直接退出 vim
nmap <Leader>Q :qa!<CR>
" 依次遍历子窗口
nnoremap nw <C-W><C-W>
" 跳转至右方的窗口
nnoremap <Leader>lw <C-W>l
" 跳转至左方的窗口
nnoremap <Leader>hw <C-W>h
" 跳转至上方的子窗口
nnoremap <Leader>kw <C-W>k
" 跳转至下方的子窗口
nnoremap <Leader>jw <C-W>j
" 定义快捷键在结对符之间跳转
nmap <Leader>M %

" 将外部命令 wmctrl 控制窗口最大化的命令行参数封装成一个 vim 的函数
fun! ToggleFullscreen()
    call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen")
endf
" 全屏开/关快捷键
map <silent> <F11> :call ToggleFullscreen()<CR>
" 启动 vim 时自动全屏
autocmd VimEnter * call ToggleFullscreen()

" 随 vim 自启动
let g:indent_guides_enable_on_vim_startup=1
" 从第二层开始可视化显示缩进
let g:indent_guides_start_level=2
" 色块宽度
let g:indent_guides_guide_size=1
" 快捷键 i 开/关缩进可视化
:nmap <silent> <Leader>i <Plug>IndentGuidesToggle



Reference

http://zcheng.ren/2016/12/29/VimAndZshInMacTerminal/