将Vim打造成Python IDE(二):代码格式化的一些问题

写完 《将Vim打造成Python IDE(一):解决80%的问题》 这篇文章后,不代表我就完全会使用Vim编写Python代码了,只是一个入门,了解了某些插件能解决的问题,以及这些插件的大概用法,如果要真正掌握,还得实践。

这些天写了些代码,对插件使用也更有体会了,今天主要讲讲和代码格式有关的一些插件。

其实也有很多同学提供了其他Python IDE,那为什么我还要坚持用Vim?大概有这几方面原因:

1:Vim是所有平台上直接支持的软件,尤其和Linux联系的非常紧密,大部分软件,只要涉及到文件操作,都可以通过Vim打开,也就是说通用性非常好。

2:经常使用ssh命令行操作Linux,没有桌面环境,在这种情况下,Vim就显得优势非常大了,拿来即用。

3:Vim本身性能,功能方面也非常完善,确实是一个很好的软件,而且是命令行方式的,很多操作和Shell很相似,比如正则表达式的操作,通过它能够以一种更好的方式掌握编程。

4:不要浅尝辄止,如果觉得Vim有用,那就精益求精,不说掌握100%,也应该掌握50%,系统性的学习能够更深入的理解原理,这样再去学其他的IDE,就会更有心得,也就是说,不管学什么,在内心总要留下一点印记。

接下去步入正题,在Python编码中,很重要的就是代码的样式和语法,写出规范的代码很重要,是否能够找出一些语法和样式错误?如果有插件能解决这二个问题,那是极好的。

在Vim插件中,目前我使用了三个插件,分别是是vim-flake8 【1】,vim-syntastic 【2】,vim-autoformat 【3】,前二个插件功能是相识的,就是告诉你代码样式和语法哪儿有问题,最后那个插件是自动格式化代码样式(不能修复语法错误)。另外需要注意的是,代码缩进不属于样式问题,所以没有办法自动修复。错误语法和样式的概念也比较宽泛,比如 import 一个模块,但这个模块没有用到,也会警告你。

vim-flake8,vim-syntastic这二个插件最后我选择的是vim-syntastic,主要是这个插件能够应用于很多开发语言(比如Java,PHP),而vim-flake8是专用于Python的。

vim-flake8依赖于Flake8工具,Flake8包装了PyFlakes和PEP8,PyFlakes是Python 中的一个静态语法和样式检查工具,PEP8是语法检查工具。

vim-flake8替代了vim-pyflakes,vim-pep8这二个插件。

了解了这些背景后,看看vim-flake8有什么功能,这在上一篇中讲过:

#F2显示语法错误
autocmd FileType python map <buffer> <F2> :call Flake8()<CR>
#保存文件的时候显示错误
autocmd BufWritePost *.py call flake8#Flake8()
#是否显示标记
let g:flake8_show_in_file=1

接下去描述vim-syntastic,这个插件功能比较齐全,通过外部工具,能够检查各种开发语言的语法和样式问题。

这个工具会在屏幕中以各种形式显示错误,如下图:

  • location list(也有叫法 errors list )显示各类错误

  • 如果鼠标悬浮在错误行上,详细的错误信息会在 command window 显示

  • 错误行会打上 Signs 标记

  • statusline flag 会显示从哪行开始有错误,应该有多少个错误。

vim-syntastic官方使用Pathogen插件管理器演示如何安装,在上文中我使用Vundle安装 Pathogen,其实从Vim 7.4以后无需第三方插件管理器就能安装插件了。

vim打开一个Python文件,然后在编辑模式下输入:SyntasticInfo

可以看到目前处理的文件类型是 python,将自动(主动模式)检测语法和样式错误,使用的检测工具是flake8, 支持的检查工具包括flake8,pyflakes等等,上述内容对于理解vim-syntastic很有帮助。

接下去说说vim-syntastic的一些用法,其实我琢磨了很久,可见官方也没有说清楚。

vim-syntastic有两种模式,主动模式和被动模式。所谓主动模式,就是会主动运行 vim-syntastic进行语法和样式检测,比如打开文件,或者:w保存文件的时候会主动检测。

如果不想打开文件的时候就主动进行检测(但也处于主动模式之下),可以编辑 ~/.vimrc:

let g:syntastic_check_on_open = 0

其实如果一个文件错误太多,location list窗口就会很大,看上去很不舒服(至少我是这样的),那么可以通过两种方法关闭它,第一就是编辑 ~/.vimrc:

let g:syntastic_auto_loc_list = 0

或者在Vim编辑模式下输入:lclose关闭它,如果还想打开,可以输入:Error。

接下去说说被动模式,可以编辑~/.vimrc设置快捷键:

map <Leader>s :SyntasticToggleMode<CR>

这样按 +s 键就会在主动和被动模式之间切换(也可以手动输入:SyntasticToggleMode),在 command window上会显示:

Syntastic: passive mode enabled

在被动模式下,你必须手动输入:SyntasticCheck flake8 手动检测语法和格式。

另外vim-syntastic用法非常多,输入:help syntastic 可以查看详细信息(shift + * 可以跳转)。

vim-autoformat插件是最有用的,可以自动格式化代码,它也依赖于第三方格式化工具,比如 autopep8(pip3 install autopep8)。

也可以使用yapf(pip3 install yapf)进行格式化,如果在待检查文件的目录中存在.style.yapf或setup.cfg文件,就会使用 yapf格式化

配置~/.vimrc,选择特定的格式化样式:

let g:formatter_yapf_style = 'pep8' #也可以是google, facebook, chromium

vim-autoformat支持部分代码格式化(但我没试出来,是整个文件格式化),也可以对特定目录的文件进行格式化,比如配置~/.vimrc:

let g:formatterpath = ['folder1', 'folder2']

《将Vim打造成Python IDE(一):解决80%的问题》 这篇文章提到过,如果用vim8格式化代码会保存,为解决这问题,我还专门了提了个issue 【4】,作者认为不是vim-autoformat的问题,而是vim的问题,不过使用vim7.4不会有问题。

考虑到vim7也能运行python3,而且pep8在python2或python3 上也没有太大问题,所以就凑合用吧,遗留的一个问题就是vim8内置的 python3 到底有何用处呢?

  • [1] https://github.com/nvie/vim-flake8

  • [2] https://github.com/vim-syntastic/syntastic

  • [3] https://github.com/Chiel92/vim-autoformat

  • [4] https://github.com/Chiel92/vim-autoformat/issues/266

如果觉得写的还不错,希望大家以 各种形式 多多支持。。。

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章