我好像爱上了 vim + Python 这对组合了。

#####安装 vim
如果派的系统里面已经安装了 vim,需要检查一下 这个 vim 是否满足:

  • 版本大于 7.3
  • 支持 Python


输入命令 ‘vim –version’ 会出来一堆信息,包括版本号跟支持的特性,检查一下里面有没有 +python 字样。


如果预安装的 vim 并不满足需求,那么你就需要将已经安装的 vim remove 掉:

1
sudo get-install remove vim

接着安装 vim,并不能使用下面这个命令

1
sudo apt-get install vim 

这样安装之后得到的 vim 是默认的 version,缺少 Python 支持,所以很多用 Python 编写的插件都无法使用,比如说 YouCompleteMe(大量的补全插件集合)。所以你可以选择用源码编译安装 vim,而我之前就是死在了这里。于是我选择了另一个方法,亲测可用:

1
sudo apt-get install vim-nox

如果你已经将默认的软件源注释掉,更换为国内源的话,可能在装的时候会遇到一些麻烦:一些依赖没有办法满足:

1
2
3
4
The following packages have unmet dependencies:
vim-nox : Depends: vim-common (= 2:7.3.547-7) but 2:7.4.488-7 is to be installed
Depends: libperl5.14 (>= 5.14.2) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

所以这时候保证默认的源在你的 /etc/apt/source.list 文件里面是可用的:

1
deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi

顺利的话会安装完成。

#####安装 Vundle
Vundle 是 vim 的众多插件管理器之一,也算是使用最为广泛的一个。安装 Vundle:

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

该命令将下载Vundle插件管理器,并将它放置在 Vim 编辑器 bundles 文件夹中,接着,就可以通过 .vimrc 配置文件来管理所有插件了。


在用户文件夹里面创建 vim 的配置文件:

1
touch ~/.vimrc

将下面的 Vundle 配置项目添加到配置文件的顶部:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
set nocompatible              " 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'

" 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

上面中间空白的地方就是用来引入你的插件。具体格式应该怎么编写,可以参照 Vundle 的 github 地址。引入插件之后,使用下面两种任一种方法来安装:

  • 运行 vim 然后执行 :PluginInstall 命令
  • 直接在命令行执行 vim +PluginInstall +qall

#####安装插件 YouCompleteMe
YouCompleteMe 是非常强大的代码补全工具,它可以理解代码的上下文然后做出补全提示。由于我们的派是32位系统,所以我们在安装的时候不能像普通 linux 系统一样添加 clang-completer 支持。


在安装 YCM 之前,我们需要先安装一些工具:

1
sudo apt-get install python-dev cmake

注意,如果这里没有激活默认的软件源地址的话,可能会出现依赖无法满足而导致无法安装。
安装完成之后,增加一下交换内存来避免 error: virtual memory exhausted,因为待会编译 YCM 之前需要下载一堆工具。

1
2
3
4
sudo vim /etc/dphys-swapfile  
#edit this line
#CONF_SWAPFILE=100
CONF_SWAPFILE=1000

然后重启你的系统。之后如果使用 free -m 命令,会看到交换空间的大小已经增加到 1G。
接着在 ~/.vimrc 文件里面引入 YCM 插件:

1
Plugin 'Valloric/YouCompleteMe'

然后 :PluginInstall 一下,YCM 就会从 github 上面 clone 到 ~/.vim/bundle/ 里面。然后进入 YouCompleteMe 文件夹里面执行 ./install.py 执行安装,应该会提示你先执行另一个 git 命令将 thirdParty 所需要的所有库给 clone 下来,按照提示做就是了。clone 完成之后再执行 ./install.py


完成之后可以添加这个配置,来让完成补全之后 preview 窗口自动消失:

1
let g:SimpylFold_docstring_preview=1


另外如果你也不喜欢补全的时候多出一个分割小窗口显示 docstring,可以这样配置:

1
2
" 补全内容不以分割子窗口形式出现,只显示补全列表
set completeopt-=preview

#####安装插件 NERDTree
NERDTree 可以提供一个便捷的文件树形结构:

1
Plugin 'scrooloose/nerdtree'

如果你想用 tab 控制 NERDTree,可以利用vim-nerdtree-tabs插件实现:

1
Plugin 'jistr/vim-nerdtree-tabs'

然后添加下面的配置来隐藏 .pyc 文件:

1
let NERDTreeIgnore=['\.pyc$', '\~$'] "ignore files in NERDTree

之后进入 vim,使用命令 :help NERD_tree.txt 可以查看使用手册。下面列举部分用法:


1.全局命令
1.1 :NERDTree [<start-directory> | <bookmark>]
这个命令会打开一个新的 NERD tree,tree 的根节点可由参数来指定,一共有三种情况:

  1. 没有指定任何参数,那么当前目录就是根节点
  2. 指定了某个目录,那么该目录就会被使用
  3. 如果给定了一个 bookmark ,那么书签相应的目录就会被使用

例如:

1
2
:NERDTree /home/marty/vim7/src
:NERDTree foo (foo is the name of a bookmark)


1.2 :NERDTreeFromBookmark <bookmark>
从给定的 bookmark 打开 NERD tree


1.3 :NERDTreeToggle [<start-directory> | <bookmark>]
如果某个 NERD tree 已经存在了,那么这个命令会将 tree 重新打开并且渲染;如果没有 tree 存在,那么这个命令就等同于 :NERDTree


1.4 :NERDTreeMirror
在当前 tab 共享其他 tab 的 tree。tree 中发生的变化会同时反映在两个 tab 中,就像它们是同一个 buffer 一样。
如果只有一个 tree 存在,那么该 tree 会被自动共用,否则将会询问需要共用哪个 tree。


1.5 :NERDTreeClose
关闭当前 tab 的 tree


1.5 :NERDTreeFind
在 tree 中查找当前文件。
如果没有 tree 存在并且当前文件在 vim 的 CWD(currenting working directory) 中,那么将会在 CWD 中初始化一个 tree 然后指向当前文件;否则将会在当前文件所在目录初始化一个 tree。
无论哪一种情况,都会生成一个 tree 并且指向当前文件。


1.6 :NERDTreeCWD
将 tree 的 root 改为当前目录。如果没有 tree 存在,那么将生成一个新的 tree。


2.书签(bookmark)
在 NERD tree 中,书签可以用来标记文件或者目录。例如,你可以用 bookmark 来编辑所有项目的目录。


2.1 Bookmark Table
如果一个 bookmark table 可用(see NERDTree-B and
NERDTreeShowBookmarks),它将会在 tree 上被渲染显示出来。你可以双击 bookmark 或者使用 NERDTree-o 来触发他们。See also, NERDTree-t and NERDTree-T


2.2 Bookmark commands
注意,下面这些命令仅仅在 NERD tree buffer 里面才有效。


2.2.1 :Bookmark [<name>]
将当前节点标记为名称为 name 的 bookmark。如果已经存在一个名称为 name 的 bookmark,那么原有的 bookmark 将会被覆盖。name 不能包含空格。如果没有指定一个 name,默认名称为文件或者目录的名字。对于目录,会显示一个小尾巴。


2.2.2 :BookmarkToRoot <bookmark>
将 bookmark 对应的目录作为 tree 的新根节点。如果当前 tree 中某个子节点对应这个 bookmark,那么当前 tree 将会被使用,否则会打开一个新的 tree。如果 bookmark 对应的是一个文件,那么它所在的目录就会作为根节点。


2.2.3 :RevealBookmark <bookmark>
如果 bookmark 对应的节点已经存在于当前的 tree 中,那么它将会被暴露出来,光标也会指向它。


2.2.4 :OpenBookmark <bookmark>
bookmark 必须指向一个文件。该文件将会被打开,就正如使用 NERDTree-o 命令一样。如果文件已经存在于当前 tree 中,那么它将会被 revealed。


2.2.5 :ClearBookmarks [<bookmarks>]
移除所有给定的 bookmark。如果没有指定 bookmark,那么当前节点的所有 bookmark 都会被清除。

bookmark 还是蛮便捷的。我给项目工程根目录设置了一个 bookmark,需要编码时只需要随时随地:

1
2
vim
:NERDTree Pansila

然后就可以开干了


3.配置
3.1 vim 中打开某文件时自动启用 NERD tree
在 .vimrc 中添加 autocmd vimenter * NERDTree


3.2 用组合键打开 NERDTree
在 .vimrc 中添加 map <C-n> :NERDTreeToggle<CR>


暂时记录这么多先。

#####安装插件 vim-fugitive
vim-fugitive 插件可以让你在 vim 中执行一些简单的 Git 命令。

1
Plugin 'tpope/vim-fugitive'

#####配置 Vim
安装完成这么多插件之后,接下来配置一下 Vim 让它更加顺手。


1.快速切换 split view
.vimrc 文件里面加入下面的配置:

1
2
3
4
5
"split navigations
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>

这段配置可以让我们按 Ctrl+Vim 的标准移动键,就可以切换到指定窗口。

简单来说,nnoremap将一个组合快捷键映射为另一个快捷键。


2.代码折叠
在 .vimrc 中添加下面的配置来开启代码折叠功能:

1
2
3
" Enable folding
set foldmethod=indent
set foldlevel=99

使用空格来代替 za 来实现折叠跟取消折叠:

1
2
" Enable folding with the spacebar
nnoremap <space> za

第一个命令,set foldmethod=ident 会根据每行的缩进开启折叠。但是这样做会出现超过你所希望的折叠数目。插件 SimplyFold 可以解决这个问题。在.vimrc中加入下面这行代码,通过Vundle进行安装:

1
Plugin 'tmhedberg/SimpylFold'

如果希望看到折叠代码的文档字符串,就加入下面的配置:

1
let g:SimpylFold_docstring_preview=1


3.Python 代码缩进
参考资料3对这部分讲得比较全面详细,我采用自己的配置方法:

1
2
3
4
5
set expandtab
set tabstop=8
set shiftwidth=4
set softtabstop=4
set autoindent

自动缩进有用,但是在某些情况下(比如函数定义有多行的时候),并不总是会达到你想要的效果。我们可以利用indentpython.vim插件,来解决这个问题:

1
Plugin 'vim-scripts/indentpython.vim'


4.标示不必要的空白字符
避免出现多余的空白字符,可以让 Vim 帮忙标记出来,容易删除:

1
2
3
" mark bad white space as red
highlight BadWhitespace ctermbg=red guibg=red
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/


5.支持 UTF-8 编码
大部分情况下,进行Python开发时你应该使用UTF-8编码:

1
set encoding=utf-8


6.代码着色

1
2
3
colo default " 可替换 Vim 自带的配色方案,也可以使用网上提供的配色
syntax on
set number " 显示行号

#####参考资料
1.Building Vim from source
2.Raspberry Pi install Vim and YouCompleteMe
3.Vim与Python真乃天作之合