使用vim打造强大的Python开发环境

特别说明:

  • 基于现在有不少童鞋开始捣鼓服务器或虚拟机(linux)进行python项目的开发,虽然可以使用pycharm的远程调试功能编写代码及调度,但难免有些特殊情况下仍旧不方便,所以特以此篇教程,让大家的vim可以像IDE那样方便的编辑python代码。
  • 只篇我只对centos7系统验证过,其它系统需要自己摸索,也许使用以下方法也可以正常使用。祝大家都可以成功的应用上此功能。^^

* 升级vim到vim8

YouCompleteMe目前只支持7.4.1578+以上的版本,常规使用yum安装只能安装到7.4 , 因此建议使用以下方法升级到vim8

# 支持库
yum install perl-ExtUtils-MakeMaker -y
yum -y install perl-devel perl-ExtUtils-Embed
# 下载最新vim
cd /home/
git clone https://github.com/vim/vim.git
cd ./vim/src
# 编译安装
make clean
./configure --prefix=/usr/local/vim8 --with-features=huge --enable-python3interp --enable-pythoninterp --with-python-config-dir=/usr/lib64/python2.7/config --enable-rubyinterp --enable-luainterp --enable-perlinterp --with-python3-config-dir=/usr/local/python3/lib/python3.8/config-3.8-x86_64-linux-gnu --enable-multibyte --enable-cscope
make && make install
# 查看版本信息
/usr/local/vim/bin/vim
# 软链接
ln -s /usr/local/vim8/bin/vim /usr/bin/vim

1. 安装vim及支持库

yum install vim

已安装了vim的,你要确保已经满足以下两点要求:

  • Vim编辑版本应该大于7.3。
  • 支持Python语言。在所选编辑器的功能中,确保你看到了+python。(可通过命令 vim --version 查看)

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


2. 安装Vim扩展工具

这里我推荐使用 Vundle,你可以把它想象成Vim的pip。有了Vundle,安装和更新包这种事情不费吹灰之力。

  1. 安装Vundle:
# 该命令将下载Vundle插件管理器,并将它放置在你的Vim编辑器bundles文件夹中。
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
  1. 将配置文件添加到你的用户的home文件夹中:
vi ~/.vimrc
  1. 把下面的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前的设置。之后,将你需要安装的插件添加到.vimrc 配置文件中(怎么添加后面有介绍),你就可以使用它安装插件.

# 在vim浏览模式中输入以下命令回车即可,它将自动安装插件或更新
:PluginInstall

3. 开始打造你的IDE吧

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

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

3.1 分割布局(Split Layouts)

  • 效果展示
    分割布局

    使用:sv <filename>命令打开一个文件,你可以纵向分割布局(新文件会在当前文件下方界面打开),使用相反的命令:vs <filename>, 你可以得到横向分割布局(新文件会在当前文件右侧界面打开)。
  • 你还可以嵌套分割布局,所以你可以在分割布局内容再进行分割,纵向或横向都可以,直到你满意为止。众所周知,我们开发时经常需要同时查看多个文件。


    嵌套分割布局

小建议

  • 记得在输入完:sv 或:vs后,利用tab补全功能,快速查找文件。
  • 快捷键切换分割窗口
    将下面的代码添加到.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的标准移动键,就可以切换到指定窗口

  • 指定区域分割布局
    你还可以指定屏幕上可以进行分割布局的区域(需要进行上面的配置 快捷键切换分割窗口),只要在.vimrc文件中添加下面的代码即可:
set splitbelow
set splitright

3.2 缓冲区(Buffers)

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

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


3.3 代码折叠(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=indent会根据每行的缩进开启折叠。但是这样做会出现超过你所希望的折叠数目。有几个扩展就是专门解决这个问题的。在这里我们使用SimplyFold。在.vimrc中加入下面这行代码,通过Vundle进行安装:

Plugin 'tmhedberg/SimpylFold'

不要忘记在vim中执行安装命令::PluginInstall 执行后稍等片刻,看到done就可以了
现在你可以轻松地隐藏掉那些当前工作时不需要关注的代码了,在需要进行折叠的地方按空格键即可(记得是在vim的浏览模式下),折叠后的效果如下。

折叠后的效果,不显示dosstring

如果希望在折叠后能看到dosstring文档字符串, 可以在.vimrc中加入下面的代码

let g:SimpylFold_docstring_preview=1
折叠后的效果,显示dosstring

3.4 Python代码缩进

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

  • 首先,缩进要符合PEP8标准。

  • 其次,更好地处理自动缩进。

3.4.1 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

3.4.2 自动缩进

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

Plugin 'vim-scripts/indentpython.vim'

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

3.4.3 标示不必要的空白字符

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

hi BadWhitespace guifg=gray guibg=red ctermfg=gray ctermbg=red
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/

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

3.4.4 支持UTF-8编码

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

set encoding=utf-8

3.5 Python代码自动补全

支持Python自动补全的最好插件是YouCompleteMe,其实YouCompleteMe底层使用了一些不同的自动补全组件(包括针对Python开发的Jedi),另外要安装一些C库才能正常工作。插件官方文档提供了很好的[安装指南]

yum -y install build-essential cmake python3-dev
yum -y install python3-devel

,先将下面的代码添加到.vimrc配置文件中,然后再次使用Vundle安装,:

Bundle 'Valloric/YouCompleteMe'

不要忘记执行安装命令(安装等待时间会有点长,耐心等待会)::PluginInstall
如果安装时报以下错误,说明要使用YouCompleteMe插件,vim版本不能低于7.4.1578+,需要进行升级:

YouCompleteMe unavailable:requires vim 7.4.1578+

注意事项:如果使用Veundle安装失败,可尝试使用install.py安装

  • install.py # 仅安装支持Python的版本
  • install.py --clang-completer # 安装支持C语言家族的版本
  • install.py --all # 安装支持Js、Java、Python、go所有语言的版本
git clone https://github.com/ycm-core/YouCompleteMe.git ~/.vim/bundle/YouCompleteMe
cd ~/.vim/bundle/YouCompleteMe
git submodule update --init --recursive
python3 install.py

通常python3 install.py 都会出错的,因为通过编译方式安装的python3,大多数人都没有加上这个参数 --enable-shared ,所以会这个参数问题的提示,看到后只能通过重新编译安装一次python3

  • 重新编译安装python3 (通过Veundle插件管理工具安装成功的可以跳过此步骤)
    • 下载安装包
# 这里需要下载最好跟原来安装的python3同一个版本
cd /home/
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
  • 解压
tar -xvJf  Python-3.8.2.tar.xz
  • 安装
cd Python-3.8.2
./configure --enable-shared --prefix=/usr/local/python3 --enable-optimizations --with-ssl
make && make install
  • 这里还会出现缺 libpython3.8.so.1.0 包的问题,导致python3的命令无法执行,从python3的安装目录下拷贝到系统lib目录就行了
cp /usr/local/python3/lib/libpython3.8.so.1.0 /usr/lib64
cp /usr/local/python3/lib/libpython3.8.so.1.0 /usr/local/lib64/

到这里YouCompleteMe代码补全的插件就已经安装好,插件自带的设置效果就很好,但是我们还可以进行一些小的调整:

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

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

3.6 支持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文件夹。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容