2017-09-13 18 views
2

我使用vim,我希望能夠導航到遍佈多個Elm項目的函數和類型定義。我的理解是,最簡單的方法是使用ctags。如何將ctags用於多個Elm項目?

有一個現有的開放issue從2016年1月有各種建議,其中包括一個鏈接到ctags-elm其中規定:

--langdef=Elm 
--langmap=Elm:.elm 
--regex-Elm=/^ *([[:lower:]][[:alnum:]_]+)[[:blank:]]*:[^:].*->.*/\1/f,function,functions/ 
--regex-Elm=/^ *([[:lower:]][[:alnum:]_]+)[[:blank:]]*:[^:][^-]+$/\1/c,constant,constants/ 
--regex-Elm=/^port +([[:lower:]][[:alnum:]_]+)[[:blank:]]*:[^:]/\1/p,port,ports/ 
--regex-Elm=/^type +([[:upper:]][[:alnum:]_]+)/\1/t,type,types/ 
--regex-Elm=/^type[[:blank:]]+alias[[:blank:]]+([[:upper:]][[:alnum:]_]+)/\1/a,type-alias,type-aliases/ 

如果你安裝了這個在~/.ctags,您可以掃描所有來源:

$ ctags -R --languages=-all,+Elm 

但是這種方法仍存在問題:

  • 它忽略限定名稱,因此導航到List.map定義將嘗試提供的Dict.map所有定義,Set.mapRandom.map
  • 它掃描所有在我所有目錄中的*.elm文件,包括測試和舊的依賴關係。

基本上我想一個解決方案:

  • 可以按照合格names☨自己的定義:導航到List.map應該更喜歡的map定義在名爲List.elm文件。
  • 掃描所有*.elm文件中的每個項目的source-directories
  • 忽略了每個項目的tests目錄一切
  • 忽略所有內置*.js文件
  • 可選掃描的庫源最新版本☨在每個項目的elm-stuff/packages目錄

這可能與ctags,或與cta gs包裝解析每個項目的elm-packages.json文件?


[☨] 關於合格的名稱:我知道,有些人縮寫預選賽,如:

import Math.Vector3 as V3 

,我不會想到一個ctags的正則表達式來尋找V3.addMath/Vector3 。 較長期的解決方案將是一個理解Elm模塊和導入的工具,例如hasktags對Haskell的支持。現在我可以忍受不理解縮寫限定符的ctags。


[☨] 關於最新版本:依賴來源下載到elm-stuff/packages/GITHUB-USERNAME/GITHUB-PROJECTNAME/VERSION-TAG,並且隨着時間的推移,可以積累多個版本,例如:

elm-stuff/packages/kfish/elm-gamepad/3.0.0 
elm-stuff/packages/kfish/elm-gamepad/3.1.0 
elm-stuff/packages/kfish/elm-gamepad/3.2.0 
elm-stuff/packages/kfish/elm-gamepad/3.4.0 

回答

3

我不能回答榆樹特有的點但...

忽略每個項目的所有內容tests目錄

一下添加到~/.ctags

--exclude=tests 

忽略所有內置*.js文件

一下添加到~/.ctags如果他們沒有在一個特定的目錄編譯:

--exclude=\*.js 

或排除編譯它們的目錄/目錄。

可選掃描的庫源最新版本在每個項目的elm-stuff/packages目錄

你如何定義「最新」?

我能想到的唯一的辦法實現這一目標將是預編譯的位置列表中查找,通過-L標誌飼料它ctags

$ ctags -R -L list-of-files.txt . 

其實,寫shell腳本生成一個合適的list-of-files.txt可能可以解決你所有的痛點。也許有人已經想過...

請參閱$ man ctags

+0

謝謝,我已經編輯了這個問題來澄清如何存儲依賴關係的版本。 –

相關問題