起步
作为一个后端开发者,用 vim 查看代码总是难以避免的事。打开代码之后,想跳转到某个接口实现的地方,如果该接口在一个文件中还好,可在不同文件中又是难以避免的事。
那么,如果是 python 项目,怎样才能优雅的跳到接口定义的地方去呢?
tags
事实上 vim 支持设置 tags 属性,其对应的值就是 tags 文件的路径。在 normal 模式下执行命令 :set tags=xxx
,xxx 代表的是文件的存放位置,然后你就可以在 vim 中优雅地跳转了。
现在的问题是,tags 文件从哪儿来呢?伟大的 Guido 团队早考虑到了。
在 Python 源码目录下的 Tools/scripts/ 中就存放了 ptags.py 文件。由于安装方式不同,也许你会找不到这个文件在哪儿,但你大可以全路径搜索一下:
$ sudo find / -name "ptags.py"
要是找不到那就只能去官网下载源码包了。
找到之后,你可以把该文件拷贝到自己项目根目录里边(也可以不用,总之放在自己容易找到的地方就好)。ptags.py 的用法:
$ find ./ -name "*.py" | xargs python3 ptags.py
也就是找出所有 .py 文件(文件的全路径),“投喂”给 ptags.py,它会帮我们处理一切。最后在当前目录下生成一个名叫 tags 的文件。
文件的名是无所谓的。假设我把文件重命名为 myproject,那么我的命令就是 :set tags=myproject
。之后就可以 ctrl ]
跳进函数定义,ctrl t
跳还回来。
如果你想配置持久化,就在 ~/.vimrc 文件中添加这一句:
set tags=xxx
ptags.py 的问题
众所周知,python 以第三方包多著称,在一个项目中使用第三方包的接口是寻常事。所以为了享受丝滑的跳转过程,还需要制作一个全局的 tags 文件,用来存放 python 官方包以及第三方包 tag。
一般情况下,应该终端命令如下:
sudo find /usr/local/python3/lib -name "*.py" | xargs python3 ptags.py
(/usr/local/python3 是我 python 的安装路径,当你使用时需要根据实际情况修改)
但受操作系统限制,命令行参数个数是有约束的。在我的机器上,命令行参数最大在 1.5W 个左右。可我第三方包很多的时候,.py 文件完全不止这个数,于是坑爹的事就出现了。假设 find 命令找出了4W 个 .py 文件,那么投喂给 ptags.py 时,会首先给它 1.5W 的文件的路径,处理完之后,再给 1.5 W,这样依次下去...
第二次投喂时,相当于又执行了一次 ptags.py 文件。我的乖乖,第一次生成的 tags 文件就活生生地被覆盖了。第三次投喂又会覆盖第二次投喂生成的 tags。上述命令执行完成之后,在当前目录下的 tags 文件并没有涵盖所有 .py 文件中的类和函数。关键是还不会报错,这个问题让我懵逼了整整一个小时。
第二个问题是编码报错。在一些文件中存在不能转 unicode 的字符串。官方提供的 ptags.py 未对这一问题做处理,导致程序报错,执行不下去了。
为解决以上两个问题,我只好在官方的 ptags.py 基础之上写了一个自己的 ptags.py 脚本,现已经挂在 GitHub 上面,用法也在 readme 中写好。如果你跃跃一试,那就请 enjoy it 吧!
还不快抢沙发