Vim与Python真乃天作之合:打造强大的Python开发环境

本贴最后更新于 3302 天前,其中的信息可能已经时异事殊

本文由 EarlGrey 翻译,译文地址为编程派。原文出自 realpython,是 Vim 的爱好者专门针对利用 Sublime Text 3 设置 Python IDE 一文所写。译者本人也是依照 Sublime Text 那篇文章配置的开发环境,但一直对 Vim 作为神器的美名非常仰慕,又看到了一篇这么全面的配置文章,觉得有必要翻译过来与大家分享,想必可以省却很多自己研究如何配置的时间。

我注意到,有人在 realpython.com 宣扬 Sublime Text 3。作为公司的资深开发人员(呃,也就是老古董),我觉得有义务介绍一个真正的 Python 开发环境给大家——我要推荐的当然就是 Vim 了。不错,Vim 编辑器无处不在,速度快,从来不会崩溃。并且,它能做任何事情!

不过,不利之处也有,就是 Vim 配置起来很让人头疼。但是,别担心,本文将告诉你如何配置一个强大的 Vim 环境,专门用于天天捣鼓 Python 开发。

下面是最终效果预览。

Vim as Python IDE

如果想充分地利用好本文,你应该对如何使用 Vim 和它的命令模式至少有一个基本的了解。如果你是初学者,你可以通过 vim-adventure 或者 openvim 网站学习。在继续阅读本文之前,请花点时间浏览那两个网站的内容。

安装

因为许多 Unix 衍生系统已经预装了 Vim,我们首先要确认编辑器是否成功安装:

vim --version

如果已经安装了,你应该看到类似下面的文字:

VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Nov  5 2014 21:00:28)
Compiled by root@apple.com
Normal version without GUI.  Features included (+) or not (-):
-arabic +autocmd -balloon_eval -browse +builtin_terms +byte_offset +cindent
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
-conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs
-dnd -ebcdic -emacs_tags +eval +ex_extra +extra_search -farsi +file_in_path
+find_in_path +float +folding -footer +fork() -gettext -hangul_input +iconv
+insert_expand +jumplist -keymap -langmap +libcall +linebreak +lispindent
+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape
-mouse_dec -mouse_gpm -mouse_jsbterm -mouse_netterm -mouse_sysmouse
+mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype
+path_extra -perl +persistent_undo +postscript +printer -profile +python/dyn
-python3 +quickfix +reltime -rightleft +ruby/dyn +scrollbind +signs
+smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary
+tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title
 -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo
+vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp
 -xterm_clipboard -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -D_FORTIFY_SOURCE=0 -Iproto -DHAVE_CONFIG_H -arch i386 -arch x86_64 -g -Os -pipe
Linking: gcc -arch i386 -arch x86_64 -o vim -lncurses

在这一步,你要确保已经满足以下两点要求:

  1. Vim 编辑版本应该大于 7.3。
  2. 支持 Python 语言。在所选编辑器的功能中,确保你看到了 +python

如果满足上述要求,接下来可以安装 Vim 扩展了。如果不满足,则需要安装/升级

OS X

如果没有 Homebrew,建议马上安装,并运行:

brew update
brew install vim

Unix 衍生系统

Debian 或 Ubuntu 系统,可以使用下面的代码:

sudo apt-get remove vim-tiny
apt-get update
apt-get install vim

如果是其他版本的 Linux 系统,请查阅相应版本包管理器的文档。不清楚的话,可以先阅读这篇文章:安装 Vim

Windows

Windows 系统下安装 Vim 有很多种方法。请查阅官方文档

验证安装

确保你已经安装了 7.3 版本以上、支持 Python 的 Vim 编辑器。你可以再次运行 vim --version 进行确认。如果你想知道 Vim 中使用的 Python 版本,你可以在编辑器中运行 :python import sys; print(sys.version)

2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)]

这行命令会输出你的编辑器当前的 Python 版本。如果报错,那么你的编辑器就不支持 Python 语言,需要重装或重新编译。

Vim 编辑器安装完成后,我们来看看如何将其设置为 Python 开发的强大环境。

Vim 扩展

Vim 本身能够满足开发人员的很多需求,但是它的可扩展性也极强,并且已经有一些杀手级的扩展,可以让 Vim 拥有“现代”集成开发环境的特性。所以,你所需要的第一件东西就是一个好用的扩展管理器。

Vim 的扩展通常也被成为 bundle 或插件

Vundle

Vim 有多个扩展管理器,但是我们强烈推荐 Vundle。你可以把它想象成 Vim 的 pip。有了 Vundle,安装和更新包这种事情不费吹灰之力。

我们现在来安装 Vundle:

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

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

将配置文件添加到你的用户的 home 文件夹中:

touch ~/.vimrc

接下来,把下来的 Vundle 配置添加到配置文件的顶部:

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 前的设置。之后,你就可以在配置文件中添加希望安装的插件,然后打开 Vim 编辑器,运行下面的命令:

:PluginInstall

这个命令告诉 Vundle 施展它的魔法——自动下载所有的插件,并为你进行安装和更新。

vim PluginInstall image

对于 Windows 用户,请查阅 Windows 安装指南

开始打造 IDE 吧

本文不可能列举 Vim 的全部功能,只能快速介绍一些 Vim 自带的强大功能,它们对于 Python 开发来说是非常有用的。

扔掉鼠标

或许,Vim 编辑器最重要的功能就是它不要求使用鼠标(除了 GUI 版本外)。一开始,你可能会觉得这是个非常糟糕的做法,但是只要你投入时间——是的,这很花时间——学习快捷组合键,就可以大幅提升工作流的速度。

分割布局(Split Layouts)

Split layout of vim

使用 :sv <filename> 命令打开一个文件,你可以纵向分割布局(新文件会在当前文件下方界面打开),使用相反的命令 :vs <filename>, 你可以得到横向分割布局(新文件会在当前文件右侧界面打开)。

你还可以嵌套分割布局,所以你可以在分割布局内容再进行分割,纵向或横向都可以,直到你满意为止。众所周知,我们开发时经常需要同时查看多个文件。

专业贴士:记得在输入完 :sv 后,利用 tab 补全功能,快速查找文件。

专业贴士:你还可以指定屏幕上可以进行分割布局的区域,只要在 .vimrc 文件中添加下面的代码即可:

set splitbelow
set splitright

专业贴士:想要不使用鼠标就切换分割布局吗?只要将下面的代码添加到 .vimrc 文件中,你就可以通过快捷组合键进行切换。

"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-j 切换到下方的分割窗口
  • Ctrl-k 切换到上方的分割窗口
  • Ctrl-l 切换到右侧的分割窗口
  • Ctrl-h 切换到左侧的分割窗口

换句话说, 按 Ctrl+Vim 的标准移动键,就可以切换到指定窗口。

等等,nnoremap 是什么意思?——简单来说,nnoremap 将一个组合快捷键映射为另一个快捷键。no 部分,指的是在 Vim 的正常模式(Normal Mode)下,而不是可视模式下重新映射。基本上,nnoremap <C-J> <C-W><C-j> 就是说,当我在正常模式按下时,进行操作。更多信息请看这里

缓冲区(Buffers)

虽然 Vim 支持 tab 操作,仍有很多人更喜欢缓冲区和分割布局。你可以把缓冲区想象成最近打开的一个文件。Vim 提供了方便访问近期缓冲区的方式,只需要输入 :b <buffer name or number>,就可以切换到一个已经开启的缓冲区(此处也可使用自动补全功能)。你还可以通过 ls 命令查看所有的缓冲区。

专业贴士: 在 :ls 命令输出的最后,Vim 会提示“敲击 Enter 继续查看”,这时你可以直接输入 :b <buffer name>,立即选择缓冲区。这样可以省掉一个按键操作,也不必去记忆缓冲区的名字。

代码折叠(Code Folding)

大多数“现代”集成开发环境(IDE)都提供对方法(methods)或类(classes)进行折叠的手段,只显示类或方法的定义部分,而不是全部的代码。

你可以在 .vimrc 中添加下面的代码开启该功能:

" Enable folding
set foldmethod=indent
set foldlevel=99

这样就可以实现,但是你必须手动输入 za 来折叠(和取消折叠)。使用空格键会是更好的选择。所以在你的配置文件中加上这一行命令吧:

" Enable folding with the spacebar
nnoremap <space> za

现在你可以轻松地隐藏掉那些当前工作时不需要关注的代码了。

第一个命令,set foldmethod=ident 会根据每行的缩进开启折叠。但是这样做会出现超过你所希望的折叠数目。但是别怕,有几个扩展就是专门解决这个问题的。在这里,我们推荐 SimplyFold。在 .vimrc 中加入下面这行代码,通过 Vundle 进行安装:

Plugin 'tmhedberg/SimpylFold'

不要忘记执行安装命令::PluginInstall

专业贴士: 希望看到折叠代码的文档字符串?

let g:SimpylFold_docstring_preview=1

Python 代码缩进

当然,想要代码折叠功能根据缩进情况正常工作,那么你就会希望自己的缩进是正确的。这里,Vim 的自带功能无法满足,因为它实现不了定义函数之后的自动缩进。我们希望 Vim 中的缩进能做到以下两点:

  • 首先,缩进要符合 PEP8 标准。
  • 其次,更好地处理自动缩进。

PEP8

要支持 PEP8 风格的缩进,请在 .vimrc 文件中添加下面的代码:

au BufNewFile,BufRead *.py
\ set tabstop=4
\ set softtabstop=4
\ set shiftwidth=4
\ set textwidth=79
\ set expandtab
\ set autoindent
\ set fileformat=unix

这些设置将让 Vim 中的 Tab 键就相当于 4 个标准的空格符,确保每行代码长度不超过 80 个字符,并且会以 unix 格式储存文件,避免在推送到 Github 或分享给其他用户时出现文件转换问题。

另外,对于全栈开发,你可以设置针对每种文件类型设置 au 命令:

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

自动缩进

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

Plugin 'vim-scripts/indentpython.vim'

标示不必要的空白字符

我们希望避免出现多余的空白字符。可以让 Vim 帮我们标示出来,使其很容易发现并删除。

au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/

这会将多余的空白字符标示出来,很可能会将它们变成红色突出。

支持 UTF-8 编码

大部分情况下,进行 Python 开发时你应该使用 UTF-8 编码,尤其是使用 Python 3 的时候。确保 Vim 设置文件中有下面的命令:

set encoding=utf-8

For the most part, you should be using UTF8 when working with Python, especially if you’re working with Python 3. Make sure VIM knows that with the following line:

自动补全

支持 Python 自动补全的最好插件是 YouCompleteMe。我们再次使用 Vundle 安装:

Bundle 'Valloric/YouCompleteMe'

YouCompleteMe 插件其实底层使用了一些不同的自动补全组件(包括针对 Python 开发的 Jedi),另外要安装一些 C 库才能正常工作。插件官方文档提供了很好的安装指南,我就不在这里重复了。切记跟随文档的步骤进行安装。

安装完成后,插件自带的设置效果就很好,但是我们还可以进行一些小的调整:

let g:ycm_autoclose_preview_window_after_completion=1
map <leader>g  :YcmCompleter GoToDefinitionElseDeclaration<CR>

上面的第一行确保了在你完成操作之后,自动补全窗口不会消失,第二行则定义了**“转到定义”**的快捷方式。

支持 Virtualenv 虚拟环境

上面**“转到定义”**功能的一个问题,就是默认情况下 Vim 不知道 virtualenv 虚拟环境的情况,所以你必须在配置文件中添加下面的代码,使得 Vim 和 YouCompleteMe 能够发现你的虚拟环境:

"python with virtualenv support
py << EOF
import os
import sys
if 'VIRTUAL_ENV' in os.environ:
  project_base_dir = os.environ['VIRTUAL_ENV']
  activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
  execfile(activate_this, dict(__file__=activate_this))
EOF

这段代码会判断你目前是否在虚拟环境中编辑,然后切换到相应的虚拟环境,并设置好你的系统路径,确保 YouCompleteMe 能够找到相应的 site packages 文件夹。

语法检查/高亮

通过安装 syntastic 插件,每次保存文件时 Vim 都会检查代码的语法:

Plugin 'scrooloose/syntastic'

还可以通过这个小巧的插件,添加 PEP8 代码风格检查:

Plugin 'nvie/vim-flake8'

最后,让你的代码变得更漂亮:

let python_highlight_all=1
syntax on

配色方案

配色方案可以和你正在使用的基础配色共同使用。GUI 模式可以尝试 solarized 方案, 终端模式可以尝试 Zenburn 方案

Plugin 'jnurmine/Zenburn'
Plugin 'altercation/vim-colors-solarized'

接下来,只需要添加一点逻辑判断,确定什么模式下使用何种方案就可以了:

if has('gui_running')
  set background=dark
  colorscheme solarized
else
  colorscheme Zenburn
endif

Solarized 方案同时提供了暗色调和轻色调两种主题。要支持切换主题功能(按 F5)也非常简单,只需添加:

call togglebg#map("<F5>")

文件浏览

如果你想要一个不错的文件树形结构,那么 NERDTree 是不二之选。

Plugin 'scrooloose/nerdtree'

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

Plugin 'jistr/vim-nerdtree-tabs'

还想隐藏.pyc 文件?那么再添加下面这行代码吧:

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

超级搜索

想要在 Vim 中搜索任何文件?试试 ctrlP 插件吧:

Plugin 'kien/ctrlp.vim'

正如插件名,按 Ctrl+P 就可以进行搜索。如果你的检索词与想要查找的文件相匹配的话,这个插件就会帮你找到它。哦,对了——它不仅仅可以搜索文件,还能检索标签!更多信息,可以观看这个 Youtube 视频。
As expected, press Ctrl-P to enable the search and then just start typing. If your search matches anything close to the file you’re looking for, it will find it. Oh – and it’s not just files; it will find tags as well! For more, check out this YouTube video.

显示行号

开启显示行号:

set nu

Git 集成

想要在 Vim 中执行基本的 Git 命令?vim-fugitive 插件则是不二之选。

Plugin 'tpope/vim-fugitive'

git integration in vim

请看 Vimcasts 的这部视频,了解更多情况。

Powerline 状态栏

Powerline 是一个状态栏插件,可以显示当前的虚拟环境、Git 分支、正在编辑的文件等信息。

这个插件是用 Python 编写的,支持诸如 zsh、bash、tmux 和 IPython 等多种环境。

Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}

请查阅插件的官方文档,了解配置选项。

系统剪贴板

通常 Vim 会忽视系统剪贴板,而使用自带的剪贴板。但是有时候你想从 Vim 之外的程序中剪切、复制、粘贴文本。在 OS X 平台上,你可以通过这行代码访问你的系统剪贴板:

set clipboard=unnamed

Shell 开启 Vim 编辑模式

最后,当你熟练掌握了 Vim 和它的键盘快捷方式之后,你会发现自己经常因为 shell 中缺乏相同的快捷键而懊恼。没关系,大部分的 shell 程序都有 Vi 模式。在当前 shell 中开启 Vi 模式,你只需要在 ~/.inputrc 文件中添加这行代码:

set editing-mode vi

现在,你不仅可以在 shell 中使用 Vim 组合快捷键,还可以在 Python 解释器以及任何利用 GNU Readline 程序的工具(例如,大多数的数据库 shell)中使用。现在,你在什么地方都可以使用 Vim 啦!

结语

Vim 的设置到这里就差不多了(至少对于 Python 开发来说是这样的)。当然,开源世界里还有大量你可以使用的其他扩展,以及本文中所提到插件的替代品。你最喜爱的扩展是什么?你又是如何将 Vim 设置符合你喜好的?

这是我本人的 Vim 配置文件链接。你有没有自己的设置代码?请与我们分享!

谢谢!

资源

  1. Vim Tutor 是 Vim 自带的程序,安装结束之后,只要在命令行输入 vimtutor 即可,程序将会用 Vim 编辑器教你如何使用 Vim。
  2. Vimcasts 是一系列的高阶视频教程,内容涉及许多 Vim 的功能。
  3. Vim 官方文档
  4. Open Vim
  5. 笨办法学 Vimscript 是学习 vimscript 的极好材料。

全文结束

网友评论精选

译者也按照本文的步骤,在 Vagrant 虚拟机上尝试了 Vim 设置,但是可惜在 YouCompleteMe 插件那遇到了些问题,没有继续配置下去。在原文页,我也发现一些网友留言,说根据本文的建议进行了设置,但是碰到了问题。最后,译者从中摘取了部分,供大家参考。

Wei-Hao Lin

The commands in "Python Indentation" keep throwing "e518: unknown option: set", so i altered it and it works fine as following:

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 |

**Konstantin Gagarin **

change powerline to airlineand add powerline fonts.

**Ruslan Kiianchuk **

It seems like the hack with Python virtualenv can be solved with plugin without the need to pollute vimrc with Python code: https://github.com/jmcantrell/vim-virtualenv

  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    543 引用 • 672 回帖
  • IDE
    21 引用 • 83 回帖 • 1 关注
  • 编辑器
    32 引用 • 825 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...