簡體   English   中英

Emacs遞歸項目搜索

[英]Emacs recursive project search

我正在從TextMate切換到Emacs。 我真正想在Emacs中使用的TextMate的一個功能是使用模糊匹配的“在項目中查找”搜索框。 Emacs有這個與ido ,但ido不會通過子目錄遞歸搜索。 它只在一個目錄中搜索。

有沒有辦法給ido一個根目錄並搜索它下的所有內容?

更新:

以下問題與MichałMarczyk的答案中的find-file-in-project.el有關。

如果此消息中的任何內容聽起來很明顯,那是因為我使用Emacs的時間不到一周。 :-)

據我所知,項目本地變量允許我在.emacs-project文件中定義我保留在項目根目錄中的東西。

如何將find-file-in-project指向我的項目根目錄?

我不熟悉Emacs Lisp中的正則表達式語法。 ffip-regexp的默認值為:

".*\\.\\(rb\\|js\\|css\\|yml\\|yaml\\|rhtml\\|erb\\|html\\|el\\)"

我認為我可以將擴展切換到適合我項目的擴展。

你能解釋一下ffip-find-options嗎? 從文件:

(defvar ffip-find-options“”“使用項目中的find-file時傳遞給`find'的額外選項。

使用它來排除項目​​的部分:\\“ - not -regex \\\\”。 供應商。 \\\\ “\\”“)

這究竟是什么意思,我如何使用它來排除文件/目錄?

你能分享一個例子.emacs-project文件嗎?

我使用Mx rgrep。 它會自動跳過很多你不想要的東西,比如.svn目錄。

(更新主要是為了包括與RINARI發行版中下面提到的find-file-in-project.el一起使用的實際設置說明。原始答案保持不變;新位在第二個水平規則之后。)


看看EmacsWiki的TextMate頁面 他們提到的最有希望的東西可能是這個Emacs Lisp腳本 ,它在一些變量引導的“項目目錄”下提供遞歸搜索。 該文件以描述如何使用它的廣泛注釋部分開頭。

它特別有希望的是以下幾點:

;; If `ido-mode' is enabled, the menu will use `ido-completing-read'
;; instead of `completing-read'.

注意我自己沒有用過它......雖然我已經找到它但我可能會試一試! :-)

HTH。

(順便說一句,該腳本是其中的一部分 - 引用GitHub中的描述 - “Rinari不是Rails IDE(它是Rails的Emacs次要模式)”。如果你正在進行任何Rails開發,你可能想要檢查整個事情。)


在繼續之前,請配置ido.el。 嚴重的是,這是一個必須有它自己的它會改善與查找文件,在項目的經驗。 請參閱Stuart Halloway的這個截屏視頻 (我已經在這個答案的評論中提到過)來了解你需要使用它的原因。 此外,Stu通過以自己的方式模擬TextMate的項目范圍的文件查找工具來演示如何靈活的ido; 如果他的功能符合您的需求,請不要再讀了。

好的,這里是如何設置RINARI的find-file-in-project.el

  1. 從RINARI發行版中獲取find-file-in-project.elproject-local-variables.el並將其放置在Emacs可以找到它們的位置(這意味着在load-path變量的一個目錄中;您可以使用(add-to-list 'load-path "/path/to/some/directory")向其添加新目錄)。

  2. (require 'find-file-in-project)您的.emacs文件中添加(require 'find-file-in-project) 還添加以下內容以使Cx CMf序列顯示項目中的find-file提示: (global-set-key (kbd "Cx CMf") 'find-file-in-project)

  3. 在項目根目錄中創建名為.emacs-project的文件。 它至少應包含以下內容: (setl ffip-regexp ".*\\\\.\\\\(clj\\\\|py\\\\)$") 這樣就可以只搜索其名稱和cljpy文件; 請調整正則表達式以滿足您的需求。 (請注意,這個正則表達式將被傳遞給Unix find實用程序,並且應該使用find的首選正則表達式語法。你仍然必須像正常情況一樣在正則表達式中加倍每個反斜杠 ;你是否還需要在parens之前放入反斜杠/管道( | )如果你想使用他們的'魔術'正則表達式意思取決於你的find的期望。上面給出的例子對我來說在Ubuntu盒子上工作。如果有疑問, 查看有關正則表達式的其他信息。) (注意:在最后一次編輯中修改了這一段,修復了正則表達式語法的一些混淆。)

  4. Cx CMf走了。

有許多可能的定制; 特別是,您可以使用(setl ffip-find-options "...")將其他選項傳遞給Unix find命令,這就是find-file-in-project.el的內容。

如果事情看起來不起作用,請檢查並仔細檢查你的拼寫 - 我做了一次( (setl ffip-regex ...)一次(注意變量名中缺少最后的'p')並且最初很困惑發現沒有找到任何文件。

驚訝沒人提到https://github.com/defunkt/textmate.el (現在要讓它在Windows上工作......)

eprojecteproject-grep ,它完全符合你的要求。

使用正確的項目定義,它只會搜索項目文件; 它將忽略版本控制,構建工件,生成的文件等等。 唯一的缺點是它需要在你的系統上使用grep命令; 這種依賴將很快消除。

對於純粹,純粹的速度,我強烈建議將命令行工具The Silver Searcher (又名'ag')與ag.el結合使用 如果您使用git,hg或svn並搜索整個項目,那么ag-project交互功能將對您的項目根進行有根據的猜測。

您可以使用GNU Global或IDUtils獲得所需的效果。 它們不是特定於Emacs的,但它們具有集成該效果的Emacs腳本。 (我自己也不太了解他們。)

您也可以選擇使用CEDET和EDE項目系統。 EDE可能有點重,但它有一種方法可以標記項目的頂部。 如果您還將GNU Global或IDUtils索引文件保存在您的項目中,EDE可以使用它在任何地方按名稱查找文件,或者您可以使用`semantic-symref'查找源文件中符號的引用。 CEDET位於http://cedet.sf.net

FileCache也可以是一個選項。 但是,您需要使用file-cache-add-directory-recursively手動添加項目目錄。

有關Icicles如何在此處提供幫助的信息,請參閱以下鏈接:

冰柱完成匹配可以是子串,正則表達式,模糊(各種)或這些的組合。 您還可以組合簡單模式,交叉匹配或補充(減去)它們的子集

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM