在 vim 中跳轉到 py 源碼

起步

作爲一個後端開發者,用 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 吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章