2010-03-03 142 views
19

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

有沒有辦法給ido一個根目錄並搜索它下面的所有東西?

更新:下面

的問題,涉及到找到文件功能於project.el從米哈爾Marczyk的答案。

如果此消息中的任何內容聽起來很明顯,這是因爲我已經使用了Emacs不到一個星期。 :-)

據我所知,項目本地變量讓我定義一個.emacs項目文件中的東西,我保留在我的項目根目錄。

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

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

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

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

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

(defvar ffip找到的選項使用發現,文件中項目時 「」 「額外選項傳遞到'發現」

使用此排除項目的部分。 :\「 - not -regex \\」。vendor。 \\「\」「)

這意味着什麼,以及如何使用它來排除文件/目錄?

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

+0

約textmate.el什麼: https://github.com/defunkt/textmate.el – 2015-05-01 19:56:56

回答

11

(更新主要是爲了包括實際的設置說明,用於RINARI發行版中下面提到的find-file-in-project.el中,原始答案保持不變;新的位在第二條水平線之後。 )


看一看在EmacsWiki的TextMate page。他們提到的最有希望的事情可能是this Emacs Lisp script,它在由某些變量引導的「項目目錄」下提供遞歸搜索。該文件以描述如何使用它的廣泛評論部分開始。

是什麼使得它特別有前途的是以下位:

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

注意我沒有用它自己......雖然我很可能給它一個嘗試,現在,我已經找到了! :-)

HTH。如果你正在做任何Rails開發,那麼這個腳本就是Rails的一部分,你可能想看看整個事情。)


在進行下一步之前,配置ido.el。認真的說,這是一個必須擁有的自己的它將改善您的find-file-in-project體驗。請參閱Stuart Halloway的this screencast(我已經在對此答案的評論中提到過),以瞭解您需要使用它的原因。此外,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文件中。還要添加以下內容以使C-x C-M-f序列顯示項目查找文件提示符:(global-set-key (kbd "C-x C-M-f") 'find-file-in-project)

  3. 在您的項目根目錄中創建一個名爲.emacs-project的文件。至少它應該包含這樣的東西:(setl ffip-regexp ".*\\.\\(clj\\|py\\)$")。這將使得僅搜索其名稱和將在cljpy中搜索的文件;請調整正則表達式以符合您的需求。 (請注意,這個正則表達式將被傳遞給Unix find實用程序,並且應該使用find的首選正則表達式語法,您仍然必須在正則表達式中使用正則表達式中的每個反斜槓;正如在Emacs中通常那樣;您是否也必須在之前放置反斜槓如果你想使用他們的'魔術'正則表達式的含義取決於你的find的期望值。上面給出的例子適用於我在Ubuntu的盒子上,如果有疑問,請查看正則表達式的其他信息。)(注意:本段已在最後一次修改中修正,以修正某些與正則表達式語法有關的混淆。)

  4. C-x C-M-f遠。

有一些可能的自定義;特別是,您可以使用(setl ffip-find-options "...")將其他選項傳遞給Unix find命令,這是find-file-in-project.el呼叫的底線。

如果事情看起來不起作用,請檢查並仔細檢查您的拼寫 - 我做了一次像(setl ffip-regex ...)一次(注意變量名稱中缺少最後的'p'),最初很難發現沒有文件正在被發現。

+0

貌似該模式只找到文件,如生成的所有文件的列表,並允許您打開一個編輯。 – jrockway 2010-03-04 22:56:52

+0

你實際上錯了。它不是「所有文件」的列表 - 它使用用戶可配置的正則表達式來確定要搜索的內容。此外,它還提供了一個「項目根」的概念,以便在與ido結合使用時進行搜索,並得到模糊完成。順便說一句,順便說一句,看起來正是OP所要求的,以及你的個人項目聲稱做了什麼。 – 2010-03-04 23:33:49

+0

謝謝你的答案Michał。我還有幾個關於如何使用find-file-in-project的問題。我把它們寫入原來的問題。 – hekevintran 2010-03-07 03:26:28

2

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

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

15

我使用M-x rgrep來做到這一點。它會自動跳過許多你不想要的東西,比如.svn目錄。

+2

差不多...但您仍然必須手動指定搜索的開始位置。 – jrockway 2010-03-04 22:58:44

+2

'rgrep'很棒,但是像jrockaway說的那樣,能夠完全繞過一些交互提示將會很棒 – 2013-01-07 22:51:38

0

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

3

eprojecteproject-grep,這正是你想要的。

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

+0

你剛剛下了幾個其他的答案,其中沒有一個是真的錯,包括一個應該提供*與您鏈接到的您的這個項目功能相同* ...?我想知道你爲什麼這樣做? – 2010-03-04 23:41:25

+0

安裝最近的Emacs。 – jrockway 2010-03-05 01:05:12

+0

已安裝23.1(需要進行項目)。 eproject工程!注意你必須配置你想要eproject搜索的每個語言/項目文件。最後,在搜索它認爲在你的項目中的所有文件後,eproject運行grep註釋。 – 2010-03-05 02:01:52

0

查看關於如何Icicles能在這裏幫助這些鏈接信息:

  • find files anywhere,匹配他們的名字的任何部分(包括目錄部分)
  • projects:創建,組織,管理,搜索他們

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

4

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

+0

這就是ssooooo與CtrlP的功能非常接近......我一直在尋找類似這樣的東西...永遠:D ... (現在,只是isntead 「Ctrl + P」我正在使用「Alt + T」:) ...) – 2015-05-01 19:28:26

2

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