用 Vim 写 Python 的最佳实践是什么?

是否需要自动提示、补全等功能,怎么去添加这些功能。我自己eclipse写java比较多,谢谢!
关注者
3,373
被浏览
754,307
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

先来晒个图:

  1. 语法检查

如果用 vim8, 那么可以用异步检测的 w0rp/ale 代替 syntastic 了,再也不用羡慕 flycheck, 也不用因为语法检查而卡顿了。

关于 ale 这部分的个性化配置,其实有点 “吹毛求疵”,一般使用默认的应该就够了,不过我喜欢 fancy 的东西,就折腾了一把。涉及的东西可能比较细枝末节,可以直接看 liuchengxu/space-vim 了解一下大概的配置 。先挖坑,以后再来补充...

回答太长了会降低人的阅读兴趣的,于是我在另一个回答涉及了这个问题 如何优雅地使用 Vim? - simple 的回答 - 知乎 , 基本就是设置简洁的 warning 与 error sign, 同时对 ale 提供的 statusline 内容进行再提取。如果没有 warning 或 error, 就不显示。否则以不同颜色进行区分。


2. syntax 增强

vim 自带对于 python 的高亮有点弱,连 self 都不给我亮起来, 这一点可以通过 python-mode/python-mode 来进行增强:

hi pythonSelf ctermfg=174 guifg=#6094DB cterm=bold gui=bold

具体可以看这里 liuchengxu/space-vim

在 python-mode 的 syntax/python.vim python-mode/python-mode 里,可以看到比 vim 自带的 syntax/python.vim 更加细致的高亮群组,应该不难看懂各项内容,照着颜色表自行修改高亮风格就可以了。这是 terminal 256 色对照表 256 Terminal colors and their 24bit equivalent (or similar), 这是 GUI 颜色对照表 Complete HTML True Color Chart

这么做的优点自然是想要什么效果完全可自定义,但是也有缺点,因为可能没办法适配所有的 vim 主题。当你切换主题时,这些针对 python 自定义的高亮也许会有些不太契合。就算是只算流行的那些 vim 主题,恐怕也有两位数了,有些是冷色调,有些是暖色调,有些以蓝色为主,有些是红色居多,应该不太容易找一些百搭的配色。不过每个人所中意的主题可能也就是那么几个,所以自行选择吧.....

其实 python-mode 有点集大成的意思,囊括了用 vim 写 python 的很多功能,有兴趣的可以尝试靠它 “一招打遍天下”。不过,目前我只是中意这一部分而已。

3. 代码格式化

这一点可以通过 google/yapf 来完成,安装好 yapf, 像下面这样 <LocalLeader>= 就能对当前文件进行格式化:

autocmd FileType python nnoremap <LocalLeader>= :0,$!yapf<CR>

4. import 整理

各种 import 是不是显得有点乱?使用 timothycrosley/isort 整理一下吧:

autocmd FileType python nnoremap <LocalLeader>i :!isort %<CR><CR>

ALE 现在也支持了代码格式化: Autofix support? (Javascript here, ESLint) · Issue #541 · w0rp/ale!安装好 isort, yapf, 在 .vimrc 中添加

let g:ale_fix_on_save = 1

并在 ftplugin/python.vim 里面加入:

let b:ale_linters = ['flake8']
let b:ale_fixers = [
\   'remove_trailing_lines',
\   'isort',
\   'ale#fixers#generic_python#BreakUpLongLines',
\   'yapf',
\]

就可以实现保存自动格式化,或者也可以直接在 .vimrc 中指定:

let g:ale_fixers = {
\  'python': [
\    'remove_trailing_lines',
\    'isort',
\    'ale#fixers#generic_python#BreakUpLongLines',
\    'yapf'
\   ]
\}

5. Python 文本对象

github.com/jeetsukumara 提供了很多针对 Python 的文本对象,比如类,方法,函数等等。

6. 自动补全

这一点因为我主要还是使用 Vim, 因此用的 YouCompleteMe, 实际后端用的是已经提到的 jedi-vim. 如果不喜欢 YCM, 因为安装过程确实需要费点时间和精力,NeoVim 和 Vim8 也有了新的选择:

NeoVim 可以尝试使用 Shougo/deoplete.nvimroxma/nvim-completion-manager ,个人使用 NCM。因为 deoplete 的配置相对复杂,我喜欢简单的, NCM 不用怎么配置就可以有很好的效果,在并行架构上也有先进之处。 Vim 8 的异步补全插件 maralla/completor.vim ,跟 NCM 一样,配置简单的同时效果很好。现在 space-vim 只需启用 liuchengxu/space-vim auto-completion Layer 就可以满足大部分需求了。对于 YCM,我已经很久没用了:)

关于自动补全,ALE 也有意通过 LSP 支持,有兴趣的可以关注。

7. 一键运行

这个可以通过 skywind3000/asyncrun.vim 来增强, 把之前的 ! 换成 AsyncRun! 就好了 (其实还是有些小小的注意点),具体可以看这里 liuchengxu/space-vim

注意点在这里:

很多人的一键运行可能大概长这样(可以看前面的回答):

...
exec "!g++ % -o %<"
exec "!time ./%<"
...

可以直接把上面的 ! 换成 AsyncRun! 吗?答案是不可以,如果要达到之前的效果,应该要这样:

exec "AsyncRun! g++ -stdc++11 % -o %<; time ./%<"

要用分号链接多条命令(linux)或者 & 链接多条命令(windows),具体可以看这个 issue Automatically manipulate the quickfix window? · Issue #22 · skywind3000/asyncrun.vim , 作者本尊也在知乎(大家肯定是谁),前辈的答疑还是非常耐心细致的~,值得一看。

番外:vim/vim patch 8.1.0877 解决了 quickfix 的 buffer number 会爆炸的问题,推荐升级。之前每次打开 quickfix 窗口都会新开一个 buffer, 使用 asyncrun.vim 你可能会发现 quickfix 的 buffer number (很多插件都有类似问题)会急速飙升, 现在不会了,vim 会对之前的 buffer 进行重用。

8. 照着 emacs-which-key 的风格,我重写了 hecal3/vim-leader-guideliuchengxu/vim-which-key ,再搭配 LSP 体验应该更好了 :)

9. tagbar 替代品,在符号浏览上,不仅可以显示 tags, 还支持显示 LSP symbols。另外还有搜索的功能,支持用 fzf 进行过滤跳转。


10. ctrlp 替代品:

具体的 vim 配置在这里 (注意:这里进入广告时间),liuchengxu/space-vim (如果觉得补充的有用,可以顺便到 github 点个 star 支持下哈), 启用 ycmd, syntax-checking, programming, python Layer 就能达到上面的效果了。有人觉得主题不错,上图中使用的是 liuchengxu/space-vim-dark, 修改自 spacemacs-dark-theme.

Use Vim as a Python IDE 我写了一个英文版本,有些许内容不同,就不同步更新了,有兴趣的可自行查看。