Vim编辑器

注意:本文只对熟悉 Vim 的基本操作想进一步把 Vim 打造成一个较通用的 IDE 的人有帮助,如果对 Vim 的基本操作不熟悉的话,请先看完下文推荐的书或者通过看 Vim 的帮助文档来熟悉 Vim 的基本使用方法。

并且,本文是一个完整的整体,不可以切割成部分来阅读,请务必从头到尾通读一遍,不可以跳过其中的任何一个步骤。


什么是 Vim ?维基百科中是这样描述的:

Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。

听过 Vim 的估计也听过 Emacs,对于 Emacs 的配置,可以从 这儿 直接 clone 下来用。

学习 Vim 的基本使用技巧,除了查看 Vim 的帮助文档之外,推荐一本书:《Vim 实用技巧》

图片 From 豆瓣

下面直入主题,分别谈谈 Vim 在 Mac 环境下(即 MacVim)的基本配置以及对于不同语言(C、C++、Python、Javascript、HTML、CSS)的配置。

基本配置


关于主题配色

我的配色方案使用的是 Solarized,在终端中分别运行以下命令:

1
2
3
git clone https://github.com/altercation/vim-colors-solarized.git
cd vim-colors-solarized/colors
mv solarized.vim ~/.vim/colors/

然后在你的 .vimrc(一般在主文件夹下,如果没有请新建一个) 文件中分别写入以下设置后保存:

1
2
3
4
5
6
7
syntax enable
if has('gui_running')
set background=light
else
set background=dark
endif
colorscheme solarized

其他配色方案也可以用类似的方式将其放在 ~/.vim/colors 文件夹后在 .vimrc 中进行相应配置。

其他杂七杂八

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
""""""""""""""""""""""""""""""""""""""""""""""""""""
" 显示和杂七杂八 "
""""""""""""""""""""""""""""""""""""""""""""""""""""
" 不显示开始界面的援助 poor children 信息
set shortmess=atI
" 不要图形按钮,使用 Vim 就是为了将手指留在键盘上
set go=
" 显示行号
set number
" 语法高亮
syntax on
" 高亮显示查找的内容
set hls
" 搜索逐字符高亮
set incsearch

" 高亮当前行
set cursorline
hi CursorLine cterm=NONE ctermbg=darkred ctermfg=white guibg=darkred guifg=white

" 高亮显示匹配的括号
set showmatch
" 在分割的窗口间显示空白以便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\
" 设置状态行显示的内容
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}

" 在终端状态下的 vim 中插入模式和普通模式改变光标的形状
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
" 解决终端编辑文件时删除键失效的问题
set backspace=2
" 改变分割窗口的尺寸
nmap w= :resize +3<CR>
nmap w- :resize -3<CR>
nmap w, :vertical resize -3<CR>
nmap w. :vertical resize +3<CR>
" 自动设当前编辑的文件所在目录为当前工作路径
set autochdir
" 查找时忽略大小写
set ignorecase
" 记录命令行模式运行的200条命令
set history=200
" 显示输入的命令
set showcmd
" 自定义映射项,回溯历史命令时,结合 <C-p> <C-n> 和 <Up> <Down> 的优点
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>
" 设置自动保存
set autowrite
" 去掉输入错误的提示声音
set noeb
"禁止生成临时文件
set nobackup
set noswapfile
" 打开文件类型检测
filetype on
" 为特定的文件类型允许插件文件的载入
filetype plugin on
" %% 轻松展开当前文件所在的目录
cnoremap <expr> %% getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'
" 映射 F3 列出当前目录文件
map <f3> :e %%<CR>


""""""""""""""""""""""""""""""""""""""""""""""""""""
" 与缩进相关的内容 "
""""""""""""""""""""""""""""""""""""""""""""""""""""
" 为特定文件类型载入相关缩进文件
filetype indent on
" tab设置成 4 个空格
set tabstop=4
" 统一缩进为4
set softtabstop=4
set shiftwidth=4
" 自动缩进
set autoindent
set cindent
" 为C程序提供自动缩进
set smartindent


""""""""""""""""""""""""""""""""""""""""""""""""""""
" 缓冲区和多窗口 "
""""""""""""""""""""""""""""""""""""""""""""""""""""
" 定义遍历缓冲区列表的映射项
nnoremap <silent> [b :bprevious<CR> " 跳转到前一个缓冲区
nnoremap <silent> ]b :bnext<CR> " 跳转到后一个缓冲区
nnoremap <silent> [B :bfirst<CR> " 跳转到第一个缓冲区
nnoremap <silent> ]B :blast<CR> " 跳转到最后一个缓冲区

" 重新映射在多窗口中进行窗口切换的按键操作
map <C-h> <C-w>h " <Ctrl-h> 切换到左侧窗口
map <C-j> <C-w>j " <Ctrl-j> 切换到下侧窗口
map <C-k> <C-w>k " <Ctrl-k> 切换到上侧窗口
map <C-l> <C-w>l " <Ctrl-l> 切换到右侧窗口

" 按 F1 仅显示当前窗口
map <f1> :only <CR>

Vim插件管理


对于 Vim 的插件管理,主要有两个:Vundle 和 pathogen,这里推荐使用 Vundle ,如果对 pathogen 感兴趣,可以参照 https://github.com/tpope/vim-pathogen

安装 Vundle 需要你的电脑上装有 Git,Mac 默认装有 Git,所以无需关心这一点,直接在终端中运行以下命令 Vundle 就装好了:

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

对 Vundle 的设置在 GitHub 上讲的很清楚,不过需要去掉一些你不需要的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
""""""""""""""""""""""""""""""""""""""""""""""""""
" 与Vundle 相关的内容 "
""""""""""""""""""""""""""""""""""""""""""""""""""
" https://github.com/gmarik/Vundle.vim#about 上关于 Vundle 的配置说明
set nocompatible " be iMproved, required
filetype off " required

" 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'

" 我需要的插件,把 Github 上面那些不需要的插件全都去掉
" 安装 YouCompleteMe 插件,来自 https://github.com/Valloric/YouCompleteMe
Plugin 'Valloric/YouCompleteMe'
" 安装 vim-less 插件,来自 https://github.com/groenewege/vim-less
Plugin 'groenewege/vim-less'
" 安装 vim-coloresque 插件,来自 https://github.com/gko/vim-coloresque
Bundle 'https://github.com/gorodinskiy/vim-coloresque.git'
" 安装 vim-css3-syntax 插件,来自 https://github.com/hail2u/vim-css3-syntax
Plugin 'hail2u/vim-css3-syntax'
" 安装 powerline 插件,来自 https://github.com/Lokaltog/powerline
Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}
" 安装 syntastic 插件,来自 https://github.com/scrooloose/syntastic
Plugin 'scrooloose/syntastic'
" 安装 indentLine 插件,来自 https://github.com/Yggdroot/indentLine
Plugin 'Yggdroot/indentLine'
" 安装 command-t 插件,来自 https://github.com/wincent/command-t
Plugin 'wincent/command-t'
" 安装 vim-instant-markdown 插件,来自 https://github.com/suan/vim-instant-markdown
Plugin 'suan/vim-instant-markdown'
" 安装 Ultisnips 插件,来自 https://github.com/SirVer/ultisnips
Plugin 'SirVer/ultisnips'
" 添加源代码对齐方式,来自 https://github.com/godlygeek/tabular
Plugin 'godlygeek/tabular'
" Python 代码折叠插件,来自 https://github.com/tmhedberg/SimpylFold
Plugin 'tmhedberg/SimpylFold'
" Python 自动缩进插件
Plugin 'vim-scripts/indentpython.vim'
" emmet 插件,来自 https://github.com/mattn/emmet-vim
Plugin 'mattn/emmet-vim'
" vim-jsbeautify 插件,来自 https://github.com/maksimr/vim-jsbeautify
Plugin 'maksimr/vim-jsbeautify'
" vim-autopep8 插件,来自 https://github.com/tell-k/vim-autopep8
Plugin 'tell-k/vim-autopep8'
" 自动补全符号
Bundle 'Raimondi/delimitMate'

" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal

把以上配置写入 .vimrc 文件之后,打开 Vim,运行命令 :PluginInstall ,回车,安装以上所有插件,待会一一介绍这些插件的用途和配置。

重要说明:安装好以上插件之后,由于这些插件尚未配置好,所以打开 Vim 后可能会出现各种错误、界面丑陋等情况,请忽略掉它们,按照以下教程一步步设置完成后这些错误就会全部消除。

YouCompleteMe 插件

YouCompleteMe 插件主要用来进行自动补全,它所支持的语言有 C/C++/Objective-C/Objective-C++/Python2/Python3/Java/JavaScript/Go/Ruby 等等等等,详情见 YouCompleteMe 的 GitHub 主页。下面先谈谈 YouCompleteMe 的基本配置,再分别针对不同语言的进行自动补全配置。

YouCompleteMe 安装完成后打开 MacVim 如果出现 Python quit unexpectedly... 错误怎么办呢?在 Shell 中运行以下命令即可解决:

1
brew unlink python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" YCM 的配置 "
" 参考 http://blog.csdn.net/sunnianzhong/article/details/18459471 "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let g:ycm_server_keep_logfiles = 1
let g:ycm_server_log_level = 'debug'
" 补全功能在注释中同样有效
let g:ycm_complete_in_comments=1
" 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示
let g:ycm_confirm_extra_conf=0
" 开启 YCM 基于标签引擎
let g:ycm_collect_identifiers_from_tags_files=1
" YCM 集成 OmniCppComplete 补全引擎,设置其快捷键
inoremap <leader>; <C-x><C-o>
" 补全内容不以分割子窗口形式出现,只显示补全列表
set completeopt-=preview
" 从第一个键入字符就开始罗列匹配项
let g:ycm_min_num_of_chars_for_completion=1
" 语法关键字补全
let g:ycm_seed_identifiers_with_syntax=1
" 设置转到定义处的快捷键为ALT + G,这个功能非常赞
nmap <M-g> :YcmCompleter GoToDefinitionElseDeclaration <C-R>=expand("<cword>")<CR><CR>
" 加载 .ycm_extra_conf.py 文件的路径
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
let g:ycm_autoclose_preview_window_after_completion=1

c/c++ 配置

首先,请确保你的 Mac 上装有 Xcode,并且确保你的 MacVim 拥有 Python 支持,打开 MacVim,运行命令 :echo has('python') || has('python3') ,如果输出结果是 1,则拥有 Python 支持,否则,你需要安装相应的 python 支持,具体方法请求教搜索引擎。接着在 shell 中安装 cmake: brew install cmake ,如果还没有安装 homebrew 的话,参见 http://brew.sh/

在 shell 中分别运行以下命令新建工作文件夹:

1
2
3
4
cd ~
mkdir ycm_build
mkdir -p ycm_temp/llvm_root_dir
cd ycm_build

然后去 LLVM 下载 Mac 的 pre-built 版本,将压缩包里面的文件解压缩到刚才新建的文件夹 ycm_temp/llvm_root_dir 中,即确保 llvm_root_dir 文件夹中含有 bin, lib, include 等文件夹。然后回到 shell 中,在文件夹 ycm_build 中运行以下命令:

1
cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=~/ycm_temp/llvm_root_dir . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp

运行结束之后,再接着在文件夹 ycm_build 中运行以下命令:

1
cmake --build . --target ycm_core

运行完毕之后,再接着在 shell 中运行以下命令:

1
echo "" | g++ -v -x c++ -E -

找到位于 #include search starts here:End of search list. 之间的部分,如图所示,将其复制到剪贴板。

打开文件 .vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py,在 flags 列表中粘贴刚才复制到剪贴板中的内容(别忘了加上单引号和逗号):

这样,通过 YouCompleteMe 就可以实现 C/C++ 自动补全了,现在你不妨停下来测试一下行不行。

python 配置

python 自动补全依赖于 jedi,所以先要在 shell 中安装 jedi:

1
pip install jedi

如果出现 pip: command not found,那么在 shell 中运行以下命令:

1
sudo easy_install pip

针对 python 3.5,则在 shell 中运行以下命令:

1
sudo easy_install-3.5 pip

(easy_install-,将 替换为相应的 python 版本号)

安装完 jedi,YouCompleteMe 就可以对 python 自动补全了。针对 python 3 自动补全的话需要在 .vimrc 中加入以下代码:

1
let g:ycm_python_binary_path='/Library/Frameworks/Python.framework/Versions/3.5/bin/python3'

后面的路径需要替换为自己的路径,在 shell 中用下面的命令获取这个路径:

1
which python3

就这么简单就可以自动补全 python 代码了。

JavaScript 配置

首先去 https://nodejs.org/en/download/ 下载 Mac 版的 node.js 并安装。然后在 shell 中将你的目录切换到 ~/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/tern_runtime 下,运行一下命令:

1
npm install --production

JavaScript 的补全依赖于 .tern-project 文件,也就是说,在你的 工作目录中 或者 工作目录的上层目录中 需要有 .tern-project 文件,关于这个文件的详细设置请参阅 Tern参考手册。下面是我的 .tern-project 文件配置,可根据需要修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"ecmaVersion": 6,
"libs": [
"browser",
"jquery"
],
"plugins": {
"complete_strings": {
"maxLength": 15
},
"node": {},
"doc_comment": {
"fullDocs": true,
"strong": true
}
}
}

其实你可以直接将 .tern-project 文件放在你的主文件夹下面,然后在主文件夹下新建新的工作目录。下面测试一下补全效果:

太棒了!!!

CSS/HTML 配置

CSS/HTML 的自动补全在 .vimrc 文件中加入以下代码即可:

1
2
3
4
let g:ycm_semantic_triggers = {
\ 'css': [ 're!^\s{4}', 're!:\s+'],
\ 'html': [ '</' ],
\ }

Powerline 插件

Powerline 插件是用来美化状态栏的,如下图所示:

Powerline 插件需要用到 Powerline 字体,我用的是 Monaco for Powerline 字体,到 https://gist.github.com/baopham/1838072 把这个字体下载下来之后安装好即可。这里顺带说一下中文字体最好用微软雅黑,到 http://www.ifunmac.com/2014/08/yahei/ 下载安装好即可。这两个字体安装完成后,在 .vimrc 文件中增加以下设置:

1
2
3
4
set guifont=Monaco\ for\ Powerline:h14
set gfw=Microsoft\ YaHei:h13 " 中文字体
let Powerline_symbols = 'fancy'
set laststatus=2 " The statusline is hidden/only appears in split windows!

保存设置后重启 MacVim,就可以看到上面红色方框所示的状态栏。

Syntastic 插件

Syntastic 插件是 Vim 的一个语法错误检查插件,详情见它的 GitHub 主页。它让你可以在编译或者运行代码之前看到语法错误。它所支持的语言包括:C/C++/Java/JavaScript/Python/Objective-C/C#/HTML/CSS/TeX 等等,它自身并不会进行语法检查,所以需要与对应语言的语法检查器配合才能进行语法检查,而针对一种语言进行语法检查的检查器有很多种,详情见 https://github.com/scrooloose/syntastic/blob/master/doc/syntastic-checkers.txt。下面先谈谈 Syntastic 插件的基本配置,再分别谈谈我个人针对 C/C++/JavaScript/Python/HTML/CSS 所采用的语法检查器及其配置。

Syntastic 的基本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
let g:syntastic_check_on_open = 1

" 设置错误和警告的标记
let g:syntastic_error_symbol = '✗'
let g:syntastic_warning_symbol = '⚠'
"whether to show balloons
let g:syntastic_enable_balloons = 1

将以上配置写入 .vimrc 文件中,重启 MacVim。

C 语言配置

针对 C 语言所采用的语法检查器为 GCC,装好 Xcode 之后 Mac 默认装有 GCC,所以直接使用即可,下面是我的配置:

1
2
3
4
5
6
7
" C Checker
let g:syntastic_c_compiler = 'gcc'
let g:syntastic_c_errorformat = '%f:%l:%c: %trror: %m'
let g:syntastic_c_remove_include_errors = 1
let g:syntastic_c_compiler_options = '-ansi'
let g:syntastic_c_auto_refresh_includes = 1
let g:syntastic_c_check_header = 1

将以上配置写入 .vimrc 文件中,重启 MacVim,在写代码的过程中有没有错误提示呢?试试就知道了:

不错,真的太棒了,不但有错误提示,而且当你把光标放在错误行的时候,底部的状态栏还有错误信息出现:提示你这行末尾少了一个分号。

C++ 语言配置

仍然用 GCC 做语法检查器,下面是具体的配置:

1
2
3
4
5
6
7
" C++ Checker
let g:syntastic_cpp_compiler = 'g++'
let g:syntastic_cpp_errorformat = '%f:%l:%c: %trror: %m'
let g:syntastic_cpp_remove_include_errors = 1
let g:syntastic_cpp_compiler_options = '-std=c++11 -stdlib=libc++' " C++11 支持
let g:syntastic_cpp_auto_refresh_includes = 1
let g:syntastic_cpp_check_header = 1

将以上配置写入 .vimrc 文件中,重启 MacVim 即可看到效果。

JavaScript 语言配置

ESLint 作为语法检查器,安装 ESLint 需要首先安装 Node.js,前文已经安装完成,如果没有安装的请首先安装 Node.js,安装完成后,打开终端分别输入以下几条命令:

1
2
3
sudo npm install -g eslint
sudo npm install -g babel-eslint
sudo npm install -g eslint-plugin-react

然后在你的工作目录创建 .eslintrc 文件,不过最好还是在主文件夹下创建该文件(即 ~/.eslintrc),将以下配置写入 .eslintrc 文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"parser": "babel-eslint",
"env": {
"browser": true,
"node": true
},
"settings": {
"ecmascript": 6,
"jsx": true
},
"plugins": [
"react"
],
"rules": {
"strict": 0,
"quotes": 0,
"no-unused-vars": 0,
"camelcase": 0,
"no-underscore-dangle": 0
}
}

再接着将以下配置写入 .vimrc 中:

1
let g:syntastic_javascript_checkers = ['eslint']

重启 MacVim,就可以语法检查了。

Python 语言配置

用 flake8 作为语法检查器,需要安装 flake8,首先需要安装 pip。前文已经安装了 pip,如若没有安装,请参照前文。安装完成后,在终端中运行以下命令安装 flake8:

1
pip install flake8

flake8 可以让你的代码符合 PEP8 风格。接着在 .vimrc 文件中加入以下配置:

1
2
3
" Python checker
let g:syntastic_python_checkers = ['flake8']
let g:syntastic_python_flake8_args = '--ignore=E501,E225'

这样就可以进行 Python 语法检查了,最后一行的配置忽略了一些警告或错误(E501、E225是警告或错误对应的代码),如果你想严格遵守标准,不选择忽略的话,也可以把最后一行删掉。

重启 MacVim 生效。

HTML 语言配置

HTML 的语法检查使用的是 HTML tidy,在终端中输入以下命令安装 HTML tidy:

1
brew install tidy-html5

针对 HTML5,在 .vimrc 中加入以下配置后重启 MacVim:

1
let g:syntastic_html_tidy_exec = 'path/to/html-tidy'  " path/to/html-tidy换成你的路径

CSS 语言配置

CSS 的语法检查使用的是 CSSLint,安装 CSSLint 同样需要首先安装 Node.js ,如前所示。在终端中运行以下命令:

1
sudo npm install -g csslint

安装完成之后,CSS 语法检查即设置完成。

对于 CSS,还推荐安装的三个插件分别是:vim-lessvim-coloresquevim-css3-syntax,它们分别是干嘛的在其 GitHub 主页上都有说明。

indentLine 插件

这个插件用来干嘛的呢?用一张图说话吧!

没错,就是用来显示缩进级别的。我对这款插件的设置很简单,在 .vimrc 中就加入如下一行代码即可:

1
let g:indentLine_char = '┊'

如果需要插件使用 Patched font 产生上图所示的那种缩进符号效果(毕竟以上语句所设置的缩进符号看起来太丑),请继续阅读我另一篇针对此插件的补充内容:Vim 中 indentLine 插件修改对齐字符

Command-T 插件

这款插件的作用 官方 是这么说的:

Command-T is a Vim plug-in that provides an extremely fast “fuzzy” mechanism for:

Opening files and buffers

Jumping to tags and help

Running commands, or previous searches and commands

with a minimal number of keystrokes.

这个插件通过 Vundle 安装好之后,需要在 shell 中运行一下三行命令:

1
2
3
cd ~/.vim/bundle/command-t/ruby/command-t
ruby extconf.rb
make

为这个插件设置一个快捷键,写入 .vimrc 中:

1
2
" 设置调出 command-t 的快捷键为 ctrl+w 加 ctrl+f
nmap <C-w><C-f> :CommandT<CR>

重启 MacVim 后,效果如图:

vim-instant-markdown 插件

请参考这个插件的 GitHub主页。这个是装着玩的,好用的 Markdown 编辑器那么多,个人感觉用 Atom 写 Markdown 是最好的,而且 Atom 安装插件之后也支持 vim 模式,插件极其丰富。并且,个人以为 Atom 做前后端比 Vim 爽,比 Sublime Text 也好,有兴趣的可以折腾折腾。

SimpylFold 插件

这个是 Python 折叠插件,由于 Python 是按照缩进来区分代码段的,所以 Python 的代码折叠逻辑也就显得尤为重要。

下面是与 Python 的代码折叠相关的一些配置:

1
2
3
4
5
6
7
8
" 激活代码折叠,快捷键 za
set foldmethod=indent
set foldlevel=99
" 希望看到 python 折叠代码的文档字符串
let g:SimpylFold_docstring_preview=1
" In order for SimpylFold to be properly loaded in certain cases
autocmd BufWinEnter *.py setlocal foldexpr=SimpylFold(v:lnum) foldmethod=expr
autocmd BufWinLeave *.py setlocal foldexpr< foldmethod<

写入 .vimrc 中,重启 MacVim 后就会发现敲击快捷键 za 就能对 Python 函数进行折叠了。

关于 Python 的一些其他设置

1
2
3
4
" 进行 Python 开发时使用 utf-8 编码
set encoding=utf-8
" 让代码更漂亮
let python_highlight_all = 1

将以上内容一道写入 .vimrc 中。

Emmet 插件

做前端的人都知道这是个什么东西,这里就不多说了,教程参见 http://docs.emmet.io/cheat-sheet/

vim-jsbeautify 插件

这个插件可以用来一键格式化你的 JavaScript/HTML/CSS 代码,要求先装有 Node.js,再安装 js-beautify,按前文先安装 Node.js,再在终端中输入以下命令安装 js-beautify:

1
sudo npm -g install js-beautify

然后在 .vimrc 中写入以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
" vim-jsbeautify 配置,按 ctrl-f 一键格式化你的代码
autocmd FileType javascript noremap <buffer> <c-f> :call JsBeautify()<cr> " for javascript
autocmd FileType json noremap <buffer> <c-f> :call JsonBeautify()<cr> " for json
autocmd FileType jsx noremap <buffer> <c-f> :call JsxBeautify()<cr> " for jsx
autocmd FileType html noremap <buffer> <c-f> :call HtmlBeautify()<cr> " for html
autocmd FileType css noremap <buffer> <c-f> :call CSSBeautify()<cr> " for css or scss
" 一键格式化选中范围的代码
autocmd FileType javascript vnoremap <buffer> <c-f> :call RangeJsBeautify()<cr>
autocmd FileType json vnoremap <buffer> <c-f> :call RangeJsonBeautify()<cr>
autocmd FileType jsx vnoremap <buffer> <c-f> :call RangeJsxBeautify()<cr>
autocmd FileType html vnoremap <buffer> <c-f> :call RangeHtmlBeautify()<cr>
autocmd FileType css vnoremap <buffer> <c-f> :call RangeCSSBeautify()<cr>

重启 MacVim,按组合键 ctrl-f 就可以使用这个插件了。

vim-autopep8 插件

这个插件用来格式化你的 Python 代码,使之符合 PEP8 标准。在安装这个插件之前,首先需要安装 pep8,在终端中输入以下命令:

1
pip install --upgrade autopep8

安装好 autopep8 之后,这个插件就可以使用了。在 MacVim 中打开一个 Python 文件,按 F8 就可以一键格式化你的 Python 代码。建议在每次写完你的 Python 程序后都首先按一下 F8 键进行代码格式化。

如果不需要显示格式化前后差异的话,请在 .vimrc 中加入以下配置:

1
2
" vim autopep8 不显示格式化前后的差异的窗口
let g:autopep8_disable_show_diff=1

NERD Tree 插件

NERD Tree 插件是干嘛的呢?就是我的 MacVim 截图中的目录树结构:

安装这个插件,首先需要安装 pathogen.vim,在终端中运行以下命令进行安装:

1
2
mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

安装完成之后,再在终端中运行以下命令:

1
2
cd ~/.vim/bundle
git clone https://github.com/scrooloose/nerdtree.git

NERD Tree 即安装完成,下面是我在 .vimrc 中针对该插件的配置:

1
2
3
4
5
6
7
8
9
" 此插件会自动配置 'path' 选项
execute pathogen#infect('bundle')
" Vim 打开时自动启动目录树并将光标移动到主窗口
autocmd VimEnter * NERDTree
autocmd VimEnter * wincmd p
" 映射 ctrl-n 打开/隐藏目录树结构
map <C-n> :NERDTreeToggle<CR>
" 当除了目录树之外的所有窗口都被关闭时关闭 Vim
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif

重启 MacVim 就可以看到效果了。

Conque Shell 插件

这个插件可以让你在 MacVim 中运行 shell,见下图:

首先到 这儿 下载最新版本的 conque,将其解压缩后,将得到如下四个文件夹:

将这四个文件夹中的所有文件均移动至 ~/.vim 文件下的对应文件夹下面(如果没有对应的文件夹请新建),即安装完成,安装完成后,在 MacVim 中运行 :ConqueTermSplit bash 即可得到以上截图所示的界面。

关于 ctags


ctags 可以为你的项目生成函数索引,当你需要查看某个函数的源代码时只需要在 taglist 窗口中选择该函数并回车即可,如图所示:

首先在终端中用以下命令安装 ctags:

1
brew install ctags

ctags 安装完成后需要安装 taglist 插件,去 这儿 下载最新版本的 taglist 插件,解压缩后,打开解压缩后的文件,将 plugin 文件夹下的 taglist.vim 移动至 ~/.vim/plugin 文件夹下,将 doc 文件夹下的 taglist.txt 移动至 ~/.vim/doc 文件夹下。这样,taglist 插件安装完成,下面在 .vimrc 文件中写入配置:

1
2
3
4
5
6
7
8
9
10
11
12
" 设置 ctags 命令的位置
let Tlist_Ctags_Cmd = '/usr/local/bin/ctags'
" 映射 F5 键手动执行 ctags 为当前目录及其所有子目录下的每一个文件建立索引
nnoremap <f5> :!ctags -R<CR>

" 与 taglist 相关的配置
let Tlist_Show_One_File = 1 " 只显示当前文件的 taglist
let Tlist_Exit_OnlyWindow = 1 " 如果 taglist 是最后一个窗口,则退出 Vim
let Tlist_Use_Right_Window = 1 " 在右侧窗口中显示 taglist
let Tlist_GainFocus_On_ToggleOpen = 1 " 打开 taglist 时,光标保留在 taglist 窗口
nnoremap <f7> :Tlist<CR> " 设置 F7 关闭和打开taglist窗口的快捷键
let Tlist_Auto_Open = 1 " Vim 打开后自动打开 taglist 窗口

上面 ctags 命令的位置请替换成你自己的。重启 MacVim 即可工作。

一键编译/调试/运行


针对 C/C++/Java/Python 一键编译/调试/运行相关的内容,写入 .vimrc 配置文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" C/C++/python 编译、调试相关的内容 "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" C,C++ Java 按 F9 编译
map <f9> :call CompileGcc()<CR>
func! CompileGcc()
exec "w"
if &filetype == 'c'
exec "!gcc -g -Wall % -o %<"
elseif &filetype == 'python'
exec "!python3 %"
elseif &filetype == 'cpp'
exec "!g++ -g -Wall % -o %<"
elseif &filetype == 'java'
exec "!javac %"
endif
endfunc
" C,C++ Java shell脚本 Python 运行按 F10
map <f10> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!gcc -g -Wall % -o %<"
exec "!time ./%<"
elseif &filetype == 'python'
exec "!python3 %"
elseif &filetype == 'cpp'
exec "!g++ -g -Wall % -o %<"
exec "!time ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
endif
endfunc
" 映射 F6 用 gdb 调试 C,C++ 程序
map <f6> :call Rungdb()<CR>
func! Rungdb()
exec "w"
if &filetype == 'c'
exec "!gcc -g -Wall % -o %<"
exec "!gdb ./%<"
elseif &filetype == 'cpp'
exec "!g++ -g -Wall % -o %<"
exec "!gdb ./%<"
endif
endfunc

gdb 调试需要安装 gdb,在终端中输入以下命令:

1
brew install gdb

好了,这篇文章到此结束,Vim 水很深,上面所介绍的还仅仅只是 Vim 千奇百怪的用法之中的一小部分,对于 Java 和其他语言设置的内容还没有介绍,Java 的自动补全请参照 Eclim,后续随着学习的深入会陆续补充本文的内容。