用 Vim 写 Python 的最佳实践

2017-01-27 07:40:23 +08:00
 simple26

先来晒个图:

对于一些 Python 的小项目,使用 vim 是一个不错的选择。下面的整理自在知乎的回答 用 Vim 写 Python 的最佳实践是什么?,比原来的回答多加了一点点内容。

下面的内容是对知乎旧有回答的一个补充,尤其有一些主要针对 vim8. 如果想要查看更多内容,可以查看知乎对于该问题的其它一些回答。

语法检查

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

关于 ale 这部分的个性化配置,其实有点 “吹毛求疵”,一般使用默认的应该就够了,不过我喜欢 fancy 的东西,就折腾了一把。涉及的东西可能比较细枝末节,可以直接看 space-vim: syntax-checking 了解一下大概的配置 。主要是针对 ale 提供的 statusline 内容进行再提取进行展示。如果没有语法错误就不显示在 statusline, 如果有 warning 或 error, 则通过不同颜色就行区分。

而关于侧边的 warning 或 error sign, 我喜欢干净一点,用前景色区分就好,下面这样有时候会像一块块的补丁贴在上面,觉得不太好看。

syntax 增强

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

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

具体可以看这里 space-vim: python layer

在 python-mode 的 syntax/python.vim 里,可以看到比 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 的很多功能,有兴趣的可以尝试靠它 “一招打遍天下”。不过,目前我只是中意这一部分而已。

代码格式化

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

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

自动补全

这一点因为我主要还是使用 vim , 因此用的 YouCompleteMe, 实际后端用的是已经提到的 jedi-vim. 如果不喜欢 ycmd, 使用 neovim 的可以尝试使用 deoplete.nvim .

import 整理

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

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

一键运行

这个可以通过 skywind3000/asyncrun.vim 来增强, 把之前的 ! 换成 AsyncRun! 就好了. 其实还是有些小小的注意点:

很多人的一键运行可能大概长这样:

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

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

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

要用分号链接多条命令( linux )或者 & 链接多条命令( windows ),具体可以看 这里

具体的 vim 配置在这里: space-vim (觉得不错的话可以顺便到 github 点个 star 支持下哈), 启用 ycmd, syntax-checking, programming, python Layer 就能达到上面的效果了。

17305 次点击
所在节点    Vim
62 条回复
rashawn
2017-01-27 08:07:41 +08:00
开 2M 文件需要几秒
simple26
2017-01-27 08:20:23 +08:00
@rashawn 没试过 关于启动优化 你可以请教 @chemzqm 这是他写的 vim 启动优化经验 https://zhuanlan.zhihu.com/p/24484514
rashawn
2017-01-27 08:37:48 +08:00
@simple26 他说的是启动优化 我说的是打开一个新的大文件的时间
simple26
2017-01-27 08:48:37 +08:00
@rashawn 额 我想这两个具有一定的相关性 如果你的启动时间都达到 1 秒的话 打开大文件必然会更久

打开不同的 2 M 文件也会有很多差别 比如是否有 syntax 高亮等等 我刚刚试了一下打开 35 M 的 pdf 不过才 1 秒 要知道有时候针对一些源文件即使 十几 k 可能都快 1 秒了
simple26
2017-01-27 08:56:43 +08:00
@rashawn 如果觉得你的 vim 打开某些大文件有点慢 你应该向他学习具体定位到时什么原因导致的打开如此缓慢 再进一步针对性地调优
wyfyw
2017-01-27 09:00:59 +08:00
你的第一个截图很好看,哈哈。
simple26
2017-01-27 09:09:05 +08:00
@wyfyw 不 是都很好看哈哈哈 (看脸的时代不解释)
congeec
2017-01-27 09:42:05 +08:00
neomake 代替 ale 和 AsyncRun

@rashawn 跟文件类型和与文件类型相关的配置有关,基本上都是秒开
20015jjw
2017-01-27 10:02:35 +08:00
很棒 学习一波
rashawn
2017-01-27 10:11:03 +08:00
我是觉得加了 pythonmode 以后 2M 肯定不能秒开
simple26
2017-01-27 10:32:18 +08:00
@congeec 目前我还是喜欢 ale 和 AsyncRun 😜
simple26
2017-01-27 10:34:35 +08:00
@rashawn 2 M 的 python 文件真的没试过 一般大小的 python 都是秒开

如果它真的会导致缓慢 可以考虑单独把 syntax/python.vim 抽离出来 如果我也只是喜欢这个部分而已
matrix67
2017-01-27 10:45:48 +08:00
matrix67
2017-01-27 10:47:15 +08:00
重构没有好方法啊
simple26
2017-01-27 11:00:05 +08:00
@matrix67 我老实交代:都是写的小东西,还没有大规模的重构过 😀

如果以后真的有重构这个需求,个人觉得我会选择 IDE 而不是 vim 。我是一个没有 “信仰” 的人,针对特定的场景选择自己觉得最合适的工具才是上策。🙃
congeec
2017-01-27 11:22:57 +08:00
@matrix67 pymode 可以重构,这货以来 rope. Jedi 的重构功能连 alpha 都算不上。 so ,重构总的来说不好用, debug 也被 IDE 完爆。这就是只用 vim 的缺陷
ispinfx
2017-01-27 11:44:49 +08:00
字体?
clavichord93
2017-01-27 11:47:12 +08:00
改行号是什么插件?
simple26
2017-01-27 11:49:18 +08:00
@ispinfx Source Code Pro for Powerline
simple26
2017-01-27 11:50:40 +08:00
@clavichord93 哪里有改行号?如果你其实指的是相对行号的话 set relativenumber

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/337102

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX