前言

最早我也只是在服务器上编辑文件的时候用用vim来改改程序,并没有把vim当做自己的主力编辑器。但是偶然的一次机会需要改一个奇葩的输入文件的格式,用了下Vim的宏录制,尝到了甜头,于是后面就开始用Vim来写程序了,虽然使用初期有些阻力,但时间久了就会发现,双手再也不用离开键盘,即使使用sublime这样的编辑器我也要改成使用Vim模式,Vim真的能让自己一思维的速度编辑文本(对我来说就是写程序了)。

正好最近换了新的电脑,需要在新电脑上配置一下,就干脆把一些配置相关的东东记录下来吧,相关的配置文件我都放在了github(https://github.com/PytLab/dotfiles) 上并写了相应的安装和卸载脚本,给有需要的同学做个参考吧。

本文是有关配置的文章,并不对Vim的核心技巧进行说明,有需要的童鞋可以参考文档和相关书籍。这里主要配合tmux和vim可以更有优雅的帮助我们在终端中进行Python编程。

先来个大致的效果图吧:

正文

终端窗口管理工具Tmux

首先还是需要配置下tmux,它除了可以进行多window多panel以外最主要的是他提供了窗口组随时存储和恢复的功能。也可以帮助我们在一个窗口中使用多个panel一边使用vim一边在ipython中进行测试。

tmux的配置文件是当前用户主目录下的.tmux.conf文件,启动tmux时会自动加载,也可以通过在tmux中进行加载例如<prefix> : source ~/.tmux.conf

完整的配置文件参见: https://github.com/PytLab/dotfiles/blob/master/.tmux.conf

修改快捷键前缀

关于tmux的配置比较简单,我先把快捷键的前缀从Ctrl-b换成了Ctrl-l,主要是根据个人喜好,因为这样左手Ctrl右手l个人觉得比较方便。

1
2
3
# Set tmux prefix to <C-a>
set -g prefix C-l
unbind C-b

修改分屏快捷键

tmux的分屏快捷键默认值为:

  • <prefix> + " 水平分屏
  • <prefix> + % 垂直分屏

感觉好奇怪,我就改成了相对直观的方式:

  • <prefix> + |, 类似在屏幕上加一条处置线
  • <prefix> + -, 类似在屏幕上加一条水平线
1
2
3
4
5
# Split pane.
unbind '"'
bind | splitw -h
unbind '%'
bind - splitw -v

将复制模式改为vim的复制模式

由于使用vim习惯了而且不想在去碰鼠标,tmux也是可以将复制模式修改成同Vim相同的方式,只是操作的前缀不同罢了。

1
2
3
4
5
6
7
8
9
10
11
# Copy mode
# copy-mode to vi mode
setw -g mode-keys vi
# enter copy mode
bind Escape copy-mode
# paste buffer
bind C-p pasteb
# select (v)
bind -t vi-copy v begin-selection
# copy (y)
bind -t vi-copy y copy-selection

绑定面板切换快捷键

这里面板切换上,我将面板的上下左右方向绑定到了kjhl四个同Vim中光标移动一样的四个键上同Vim保持一致,这样就不需要在记住新的方向键了。

1
2
3
4
5
6
7
8
9
# Map panel switch.
# Up
bind-key k select-pane -U
# Down
bind-key j select-pane -D
# left
bind-key h select-pane -L
# right
bind-key l select-pane -R

修改面板大小的快捷键

这里为了能够将大小更灵活的移动,我将鼠标控制打开,这样就能通过鼠标进行方便精准的面板大小调整了。

1
2
3
4
5
6
7
8
# Resize panel size.
bind < resize-pane -L 10
bind > resize-pane -R 10
bind _ resize-pane -D 10
bind + resize-pane -U 10

# Use mouse to resize panel.
set -g mouse-utf8 on

配置当然要根据自己的使用习惯来设置,这里仅仅给出参考。这样我们将多窗口终端的控制玩弄于手掌之中啦。

Vim配置

解决了终端窗口问题,我们开始大刀阔斧的捣鼓编辑器啦,这里我对我使用的几个Vim插件进行整理,以及几个基本配置进行下说明。

完整的vim配置文件参见: https://github.com/PytLab/dotfiles/blob/master/.vimrc

关于Vim安装

这里主要说一下在Mac上的Vim安装,Vim的官网以及YouCompleteMe的README都有推荐使用MacVim, 但是如果我们并不想在使用Vim的时候还打开新的窗口而是直接在终端使用Vim的话需要在安装MacVim后做一点小处理。

  1. 安装MacVim

    1
    brew cask install macvim
  2. 使用MacVim的mvim脚本覆盖掉系统自带的vim

    1
    2
    alias vim='/usr/local/bin/mvim -v'
    alias vi='vim'

自动给打开的文件添加头部

例如我们编写Python脚本的时候经常会在文件开头添加执行文件的Python路径以及文件的编码方式,我们可以通过在Vim的配置文件中添加一个函数,并让他在打开一个新的缓冲区的时候自动添加到头部。

1
2
3
4
5
6
7
8
9
" Auto add head info
" .py file into add header
function HeaderPython()
call setline(1, "#!/usr/bin/env python")
call append(1, "# -*- coding: utf-8 -*-")
normal G
normal o
endf
autocmd bufnewfile *.py call HeaderPython()

这样当我们使用
1
vi new.py

的时候便会匹配到文件后缀并执行头部添加函数进行内容添加, 其他语言的脚本例如bash、perl等都是类似的方式。

安装插件管理器Vundle

如果要安装插件,必须要有个方便的插件管理器,Vim的插件管理器有很多,这里我使用了Vundle,它的全称是Vim Bundle,可以让我们轻松的安装、更新、搜索和清理Vim插件。Vundle本身是一个Vim插件,所以使我们安装所有插件中最早需要安装的插件。

Vundle的安装方式这里就不详细介绍了,可以参见:https://github.com/VundleVim/Vundle.vim

安装好后我们需要修改下.vimrc文件:

1
2
3
4
5
6
7
8
9
10
set nocompatible
filetype off

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

" 在这里添加你想安装的Vim插件

call vundle#end() " required
filetype plugin indent on " required

这样如果我们想安装插件的话我们只需要在call vundle#begin()call vundle#end()之间直接写入就好了,非常方便,写好后我们直接运行
1
vim +PluginInstall +qall

vundle便会自动下载并安装好插件,我们直接作为伸手党使用就好啦.

自动补全神器YouCompleteMe

YouCompleteMe是一个非常强大的Vim自动补全插件,他的特别之处就在于他并不是像vim自带的Ctrl-xCtrl-n那样基于文本进行补全,而是基于语义,通过分析源文件进行语法分析,这得益于强大的clang/llvm。同时YCM也整合了多种插件,其中也包含语法纠错,类似Syntastic的功能,但是只能进行C/C++/Objective-C的语法检测,对于Python的话我们后面需要安装Syntastic插件。

YCM虽然强大,但是安装却稍微麻烦些,首先他文件比较大,另外需要自己进行编译(NeoVundle插件管理器貌似可以直接帮你自动编译), 不过无论我之前在ubuntu还是现在的mac上,至少我还是没有遇到什么很大的问题的。

具体的安装请参考YCM的安装说明: https://github.com/Valloric/YouCompleteMe#installation

YCM的相关设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
" Plugin YCM settings.
set completeopt=longest,menu
let g:ycm_min_num_of_chars_for_completion=2
let g:ycm_cache_omnifunc=0
let g:ycm_seed_identifiers_with_syntax=1
let g:ycm_complete_in_comments = 1
let g:ycm_complete_in_strings = 1
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
let g:syntastic_check_on_open=1
let g:syntastic_enable_signs=1
let g:syntastic_cpp_check_header = 1
let g:syntastic_cpp_remove_include_errors = 1

YCM除了在.vimrc中进行配置外,还有一个Python的配置文件.ycm_extra_conf.py,在里面我们可以设置相应的编译选项,比如编译参数,头文件和库文件的地址等等,这样我们在编写C/C++等的时候ycm会找到相应的头文件和库文件进行编译并给出相应的提示。这个文件需要根据自己的项目根据自己的文件位置进行自定义。

我的.ycm_extra_conf.py的完整版:https://github.com/PytLab/dotfiles/blob/master/.ycm_extra_conf.py

为Python的缩进助力

写Python的时候你一定需要一款帮助你显示缩进的插件,indentLine就是一款提供缩指示线的插件,有纯文字实现,有了他在判断Python代码块的时候就方便了许多。

插件地址:https://github.com/Yggdroot/indentLine

我相应的配置:

1
2
3
4
" Plugin indentLine settings.
let g:indentLine_char = "┆"
let g:indentLine_enabled = 1
let g:autopep8_disable_show_diff=1

效果:

对打开的多个文件进行操作

当我们写代码的时候不可能每次只打开一个文件,而是打开很多个,而且要经常在这之间来回切换。vim提供了自己的buffer管理工具,但是并不直观,这时可以使用minibufexplorer插件,这样便可以像切换tab一样在Vim中进行buffer的切换来同时编辑多个文件。

效果如下图:

我们可以通过根据前面的buffer序号来使用Ctrl+w :b buffer-number来快速切换。

使用Pylint来帮助我们进行Python语法检测

首先Pylint是一个代码分析工具,它能够分析Python中的代码错误,查找不符合风格标准(默认PEP8)和有潜在问题的代码,如果单独使用的话,他还可以为我们的Python代码进行检测并生成一份报告,并为你的代码进行评分,像这样:

1
pylint incar.py --output-format=html > score.html

我们可以利用syntastic插件来使用pylint帮助我们进行语法检查。

syntastic的安装可以直接通过Vundle来进行方便的安装,安装后我们需要进行下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
" Plugin syntastic settings.
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 = 0
let g:syntastic_check_on_wq = 0
let g:syntastic_mode_map = {'mode': 'passive', 'active_filetypes': [], 'passive_filetypes': []}
" Use pylint to check python files.
let g:syntastic_python_checkers = ['pylint']
map <F5> :SyntasticToggleMode<CR> :SyntasticCheck<CR>

" Ignore warnings about newlines trailing.
let g:syntastic_quiet_messages = { 'regex': ['trailing-newlines', 'invalid-name',
\'too-many-lines', 'too-many-instance-attributes', 'too-many-public-methods',
\'too-many-locals', 'too-many-branches'] }

这里主要涉及两个部分的配置,

  1. 一个是将检测模式改成被动,由于Syntastic检测并不是异步进行的,如果每次保存的时候都进行检测,都会卡在那里等一会,如果我的代码比较大的话会更久,所以我们在想要检测的时候在检测。
  2. 忽略掉一些我们不想看到的warnign,pylint完全按照PEP8来的话,我的代码经常会各种提示的warning,比如我喜欢在代码最后一行留个空行也会有提示,因此我就通过正则表达式将次信息过滤掉,这时候就需要设置syntastic_quiet_message变量了。

树形目录方便文件查看

像其他IDE一样,左边有树形目录的话,所有文件夹和文件都一目了然那一定是极好的,所以NERDTree插件就是这么一款工具,他可以直接通过Vundle进行安装,然后在配置文件中设置启动的快捷键以及窗口大小和忽略显示的文件等等。

1
2
3
4
5
6
7
" Plugin nerdtree settings.
map <F2> :NERDTreeToggle<CR>
let NERDTreeChDirMode=1
let NERDTreeShowBookmarks=1
let NERDTreeWinSize=25
let NERDTreeShowHidden=1
let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$', '\.git$']

在项目中迅速定位文件

ctrlp.vim 顾名思义,就是提供了同Sublime的Ctrl+p的功能,可以直接通过Vundle安装,在配置文件中将其映射到功能键上便可以快速启动搜索,支持模糊匹配。

1
map <F3> :CtrlP<CR>

显示文件中的类、函数、变量

tagbar插件可以帮助我们显示当前文件中的类、函数、变量等,方便我们阅读代码,它是基于ctags的,支持很多语言,具体详见:https://github.com/majutsushi/tagbar/wiki

安装好ctags之后可以直接从Vundle中进行安装。

在配置文件中可以将其绑定到快捷键上方便快速启动。

1
map <F2> :TagbarToggle<CR>

效果如下:

其他插件

Vim 的插件很丰富,这里我就不再一一赘述了,希望这些强大的工具能让我们在终端中更优雅的编写Python(不限于Python啦),有关我使用的vim插件都在我的.vimrc中,有兴趣的童鞋可以搜索相应的插件名称进行查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
" Plugins.
Plugin 'VundleVim/Vundle.vim'
Plugin 'Valloric/YouCompleteMe'
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'fholgado/minibufexpl.vim'
Plugin 'Yggdroot/indentLine'
Plugin 'scrooloose/nerdtree'
Plugin 'ctrlpvim/ctrlp.vim'
Plugin 'majutsushi/tagbar'
Plugin 'dyng/ctrlsf.vim'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'MattesGroeger/vim-bookmarks'
Plugin 'vim-syntastic/syntastic'

同时为了方便自己我也写了相应的安装和卸载脚本,方便大家参考,github地址:https://github.com/PytLab/dotfiles

总结

本文主要简单介绍下本人平时编程中使用tmux,vim等工具的配置,希望能借此帮助大家能更好的在终端中进行程序编写提高工作效率。

最后还是建议配置文件中不要盲目复制粘贴别人的配置,最好保证里面的配置自己都知道是做什么的,而且是对自己需要的。

Comments