有哪些不錯的大型項目代碼瀏覽工具?

有的時候想系統的瀏覽一些開源的庫或者軟體的源代碼,比如google guava,卻發現沒有合適的瀏覽工具。我目前是用IDE(eclipse和IDEA)來瀏覽源碼的,還是感覺太重了,尤其是當我只是想看看,而不是要寫代碼的時候。所以想求教大家,有沒有什麼趁手的工具,至少需要支持以下2點功能:

1. 方便的文件搜索與類搜索。輸入文件名或類名,能夠直接找到相應的文件。

2. 方法跳轉。在方法調用處,可以直接跳轉到方法定義處。除了方法,還應該支持類、枚舉等。

其他要求:

1. 支持java

2. 支持mac OS X


當然有:OpenGrok 好多公司在用,

早年一直在用 Source Insight,是比較好用,但是這商業產品十多年時間既不開源也不增加大的新功能,幾大硬傷更是讓我不得不拋棄它:

不跨平台:在我離開 Windows辦公的時候,一路沒有找到的代碼瀏覽工具,只有在 Wine下運行 Source Insight,結果這傢伙在 Wine下時不時給我來個崩潰。

支持語言少:少的可憐了,C++, Java, C#, 而已,且都是比較早的語言標準了,擴充點新語言擴充的相當彆扭和殘缺。

單線索瀏覽:這個比較噁心,只有一個主窗口,沒有TAB同時打開多個源文件的功能,我追著一條線索看過去,想同時看第二條線索基本上沒辦法,只能第一條看完後,回退,回退,再回退,回到剛才的位置,然後再繼續跟第二條線索。當前惟一的一個代碼窗口,在我全局搜索一個東西時,就會被覆蓋成搜索結果,搜索結果點到其中一項又會覆蓋成對應的源代碼,想要看回剛才的搜索結果就只有回退,回退,無法同時打開多處,對照查看。

多定義不友好:多處定義(比如代碼里其實是多處宏條件,定義同一個介面的不同實現,或者多層定義)的時候預覽窗口傻的要死。

自動預覽問題:自動預覽好用是好用,但有些時候連著跳幾層,把我最想看的一層給跳過去了,這就比較坑爹,還不如我手動預覽。

這些問題在我剛開始的時候都沒什麼感覺,我試了好多代碼瀏覽軟體最終選擇了 OpenGrok的時候,一對比,Source Insight 基本就是渣,人家 OpenGrok還開源。

截圖1:搜索界面和源代碼樹

截圖2:具體代碼

我比較喜歡 OpenGrok的地方有幾個:

使用方便:架設是比較麻煩,特別你想改一下它的很多默認代碼目錄位置,但一旦架設好,基本就很簡單了,在 SRC_ROOT下面 check out 你想要閱讀的代碼,然後 OpenGrok index 一下即可,增量更新索引。

基於 WEB:在服務端運行,基於 Web這樣我多個設備都可以同時瀏覽,以前台式機和筆記本都要安裝 Source Insight才行,現在跑在我自己的 nas上面(vps上面也有一份),你只要打開瀏覽器就行。

支持語言多:使用 Universal CTags 作為後端 parser引擎,支持進百種語言,你想得到的語言都有。

功能強大:web上瀏覽源代碼時,具體點擊函數名就跳轉到定義處,可以方便的按不同項目搜索:定義,引用,文件名。右邊有文檔結構圖,配合 web瀏覽器,還可以添加一些記錄筆記和剪切分享的功能。

多線索瀏覽:這是我最喜歡的功能,選擇一處定義,在瀏覽器上「在新標籤中打開」 即可,原來的位置繼續保留,隨時對照查看,不會象 Source Insight一樣只能同時打開一個文件,因為瀏覽器的多標籤,你想打開多少個文件都可以,想搜索多少次都行,並且保留結果,看到比較會心的地方,使用 Chrome的 Evernote插件,剪切當前代碼到你筆記裡面,或者發送到你的 http://gist.github.com。

支持 iPad:因為是網頁版的,你趟床上拿著 iPad看都沒問題,看到重要的地方,增加一個書籤,第二天在你的 mac上書籤就同步過來了。沒有mac的話,可以iPad在 Safari裡面剪切到 Evernote,第二天 PC上接著整理。

如今我基本把 Source Insight之類的只能在本地看代碼的東西都卸載了,公司裡面架設一套,家裡架設一套 OpenGrok,把和項目的相關代碼全部扔上去,一次創建索引,所有人都可以方便查看。

對比 Vim/Emacs + Ctags

我小項目也會用Vim+ctags/cscope 瀏覽代碼,但 ctags只能看定義不能看引用,cscope可以看引用賦值,但只支持c語言(C++支持的都比較殘缺)。雖然 OpenGrok 使用 ctags 做parser,但是僅僅做parser而已,掃描出來的東西會被分成定義,引用,賦值等數據放到 OpenGrok自己的資料庫裡面,下次修改了文件做增量更細會很快,不會有一大堆的tags文件,搜索又慢,又沒有符號引用信息。

再者瀏覽大項目,特別是動腦的項目,我不喜歡兩隻手都放鍵盤上,讀代碼還是右手控制滑鼠就行了,左手有時得喝點飲料抽根煙什麼的,或者乾脆趟沙發上,用 iPad閱讀,思考嘛,首先要足夠放鬆。

對比 Android Studio , VS

沒錯大型 IDE也能瀏覽代碼,也能搜索符號定義,雖然也可以多線索瀏覽,但很多時候還沒有source insight方便,而 source insight上面已經被我們秒了。大型 ide和 source insight 一樣支持語言較少,要安裝一堆東西不說,還得把你co下來的項目弄個工程文件,或者導入到當前 workspace,沒有 OpenGrok那麼方便專註,當你有可能閱讀的代碼涉及的語言比較多的時候,co下來增量index一下即可,不用任何多餘的事情,更重要的是 IDE不能在 iPad 上看代碼。

加個比較圖表:

安裝注意:

1. 默認的數據文件(索引和交叉引用等)在 /var/opengrok 下面,注意 /var 分區的磁碟大小,很多 ubuntu, debian的默認分區,/var空間很小,可以挪到 /home/data/opengrok 下面,保證足夠空間,否則索引生成失敗。

2. 源文件夾內的文件對 tomcat8 用戶(debian下面 apt-get tomcat8後,使用 tomcat8這個用戶來跑tomcat)對源文件有可讀許可權,很多以前的 windows下壓縮出來的 rar文件解開後只有自己有讀取許可權,導致 tomcat8 用戶無法訪問時,opengrok會報一個:「File Not Find"

3. 可以用 java7 + tomcat8跑 stable版本 0.12.1.6,而 0.13的 RC版本卻需要java8,安裝請注意。

----

再放一張具體使用截圖,可以配合 Chrome的各種插件在代碼頁面上標註重點,添加註釋:

搜索頁面,在 linux-2.6.11.12項目中,對 kmem_cache_alloc搜索引用,除此之外還可以全局搜索,正則搜索,按類型搜索,搜索歷史(項目目錄需要是svn或者git本地倉庫)。

--

最後,回答題主問題:

1. 方便的文件搜索與類搜索。輸入文件名或類名,能夠直接找到相應的文件。----- (支持)

2. 方法跳轉。在方法調用處,可以直接跳轉到方法定義處。除了方法還應該支持類枚舉等。(支持)

3. 支持java:支持

4. 支持mac:支持


首先,有一篇有意思的Google的論文總結了程序員搜索代碼的行為模式,可以看看[1]。Google內部的code search據說十分好用,應該可以滿足你的需求,但前提是你得在那上班。

下面講2個我知道的免費的。

Grepcode

http://grepcode.com/

基本滿足問題的需求,一旦我們進入了一個文件,可以比較方便地找到定義。而且頁面跳轉的速度不錯,就像是在看靜態網頁。我比較抱怨的就是搜索功能,不懂應該怎麼用。比如搜string - GrepCode.com, 看不懂是什麼意思。我很少直接用它的搜索,一般放Google搜grepcode的網頁,如果像是我要找的代碼再點進去。

Codatlas

Codatlas | Best Place to Browse Code on the Web

現在看到瀏覽代碼體驗最接近IDE的網站。交叉索引的覆蓋率堪比IDE[其實這些交叉索引直接就是用編譯器生成的]。首頁搜索框的自動補全很好用,大多數時候都不需要搜索,而且提示是基於函數名,類名,以及項目名的。有一個很好用的功能是找到一個函數所有被調用的地方,grepcode只能找到同一個項目內的引用,codatlas能夠找到所有它索引的project中的引用。比如看isEmpty這個函數,grepcode只能找到幾條結果[GC: java.util.List.isEmpty()], codatlas返回的結果就有意思多了[jdk7u-jdk | Codatlas, 點一下isEmpty就能看到所有引用]。它還支持用戶提交repo[Codatlas | Best Place to Browse Code on the Web]給它索引。我最近交了很多java的repo,如果你想看的repo沒有在上面,也可以提交。scala和c++的支持也不錯,可以嘗試一下。

[1] http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf


近期主要用scitools understand(建議地主都給自家的家丁們買一份批量授權吧)

之前用過doxygen,感覺更適合看library代碼一些。


如果代碼託管在github上,可以使用chrome插件 Octotree:https://chrome.google.com/webstore/detail/octotree/bkhaagjahfmjljalopjnoealnfndnagc?utm_source=chrome-app-launcher-info-dialog (溫馨提示:需要梯子),直接在github主頁上查看,效果如下:

也可以使用:Best Place to Browse Code on the Web ,通過關聯github進行查看,效果如下:


個人小折騰一下,最後回到原點:eclipse/CDT挺好的了。


Google的code search是開源的https://github.com/google/codesearch,只是不知道code search的前端是不是開源,或者有其他開源的實現。https://cs.chromium.org 這個應該是基於開源那個開發的。


github,定位和搜索都很快


Scientific Toolworks Understand


grep/find+percol.py from mooz

gnu global


source insight,簡直是神器。可惜只有win版。


只看不寫的話公司很多人用 sourceinsight.


微軟的vs code for mac,你值得擁有,這是我用過的mac下最爽的編輯器,我已經徹底拋棄vim+cscope,誰用誰知道。

understand也不錯,但是太貴,而且實時分析欠缺,代碼修改之後經常要等他重新分析。另外是不支持vim模式,好多快捷鍵我不習慣。


要想寫代碼編譯調試的話,eclipse 真的是很方便。不過要只是想看代碼的話,推薦Sublime Text3和github,sublime text軟體很小,不過對於看代碼已經很方便了,打開整個工程目錄的話結構層次很清晰,搜索也方便,界面看著也不錯。github是一個強大的管理代碼的工具,對於那種很多人一起負責一個大工程的情況,用來共享管理代碼十分好用。


Google code search 是有開源實現的,並且連web前端界面都開源了,除了只支持C++和Java,用起來幾乎和code search 沒啥區別。 搜索Kythe.


要看什麼語言吧

不過最近覺得Atom挺方便挺極客的


emacs+gnu global

以前也折騰過cedet,可以精確的找到結構體成員之類的,不過最後發現gnu global就基本滿足需求了。


kscope 1.6.2

不會裝可以看這裡 teawater/kscope

有點類似SIS 又有KATE的血統 可惜因為各種原因開發轉向最終被開發者放棄了


source insight還是挺好用的,雖然偶爾崩潰。

沒了它要我用eclipse什麼的閱讀代碼簡直是要我命。。。。


gayhub家的atom加插件


taglist + cscope + ctags + vim應該可以滿足,我看Android源碼就用了這套裝。


linux下wine+sourceinsight


Sublime text3

1. Ctrl + shift + F,跨文件搜索

2. Ctrl + R + 函數名或類名,自動跳轉

3. Ctrl + G + 行號,跳轉到該行

4. F12函數定義聲明切換

5. 還支持多行編輯

PS 使用sublime打開工程所在文件夾,層次結構異常清楚。

ATom

與sublime功能類似,也十分優秀,而且它是開源的。


你需要的是養成不關eclipse的習慣,eclipse佔用內存1g多一點,無所謂的


推薦閱讀:

怎樣做到C語言和Python能夠均衡的一起學習?
程序員如何形成自己的編碼風格?
新手請教python問題,就是說像map,zip,filter這些函數都返回單次迭代器。?
像我這種程序員還有必要繼續做下去嗎?
如何看待中國編程/演算法教育總是教一些沒用的、無意義的古老的東西,不涉及語言新標準?

TAG:編程 | 代碼 | Java | 開源 | 開發工具 |