在标记的目录中以递归方式打开与regexp匹配的文件


9

一般来说,我希望能够打开文件名与给定regexp相匹配的给定目录集(及其子目录)中的所有文件。

例如

  /home/nispio/project:
  total used in directory 1612 available 1000000000
  drwxrwxr-x 13 nispio group    4096 Sep 19 14:06 .
  drwxrwxr-x  7 nispio group    4096 Sep 22 16:41 ..
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 cfg
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 hlp
* drwxrwxr-x  2 nispio group    4096 Sep 23 16:52 hst
* drwxrwxr-x  2 nispio group    4096 Sep 29 14:52 inc
* drwxrwxr-x  2 nispio group    4096 Oct  1 12:53 lib
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 mcr
  drwxrwxr-x  2 nispio group    4096 Sep 24 10:50 pyl
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 snr
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 unix

我已经标记了目录hstinclib,现在我要访问所有扩展名为.c,的文件.cc,并.h在这三个目录及其子目录中进行访问。

如果在打开之前可以看到我正在打开的所有内容,那就更好了。如果更新了Dired缓冲区以向我显示与搜索匹配的所有文件,并且高亮显示了所有文件,则可以进行完整性检查以确保搜索返回的结果与预期相同。

我愿意接受建议用做同样的事情helmdired+或将让我的任何其他扩展更轻松地浏览我的文件系统。


Mathias或Drew回答了您的问题吗?还是您在寻找不同的东西?
马拉巴巴2014年

Answers:


14

尝试这个:

C-u C-x d

这让您输入Dired如何列出文件的参数。默认情况下,它-al在提示符下显示。加上R,最后以-alR。输入RET

选择/键入目录,然后按RET

这将递归地打开您选择的目录以及下面的所有目录。

在此处,键入% m以标记与某个文件名模式匹配的所有文件。我也经常键入t然后k杀死(隐藏)所有我不感兴趣的t文件。再次键入以标记所有文件。

至于实际打开文件,我认为没有标准的方法可以执行此操作,但是您可以轻松定义一个新命令来执行此操作(将其放置在.emacs文件中):

(defun dired-find-marked-files ()
 (interactive)
 (dolist (f (dired-get-marked-files)) 
  (find-file f)))

很有可能有人已经将它包含在一些不错的Dired增强包中,但是自己动手做也很有趣;)

请享用!


7

您可以使用helm-projectile-find-file轻松地做到这一点。由于Projectile使用其相对路径跟踪每个文件,因此您可以轻松地缩小范围。让我们使用您的示例。在你的情况,你要在打开的文件hstinclib。您可以通过两种方式检索属于该目录的所有文件:

  • 在的Helm提示符下helm-projectile-find-file,输入每个目录,然后将标记的文件缩小到该目录。例如,首先输入^hst/(它会缩小到hst/每个候选项开头包含的所有文件)。用标记所有文件M-a,对其他两个目录中的文件执行类似的操作。

  • 或者,您可以使用以下模式检索所有目录中的文件^hst/\|^inc\|^lib。Helm毕竟接受正则表达式。正则表达式\|表示or。如果要一次性选择所有内容,请执行此操作。

无论使用哪种方法,您都将标记要打开的所有文件。然后只需按一下RET即可将其全部打开。

请注意,如果这些目录中有很多文件,则需要增加helm-candidate-number-limit。否则,一旦候选人数量达到限制,就不会再显示候选人,并且您将无法选择不可见的候选人。将其设置为更大的数字,或者nil如果您不希望使用此限制,则将其设置为。

Helm的优点在于,您可以交互式选择文件。


我认为他想同时打开它们,而不是选择其中之一。
马拉巴巴2014年

1
@Malabarba您可以M-a使用来选择多个文件,helm-projectile-find-file然后按RET键一次使用我列出的方法打开它们。
Tu Do

当然!抱歉,错过了那句话。我进行了编辑,使其对像我这样的白痴更加明显。如果您不喜欢或我做错了,请随时回滚。
马拉巴巴2014年

@Malabarba谢谢。现在更清楚了。
Tu Do

4

这有两种可能性(替代方法):

  1. 在Dired中,可以通过使用ls包含-Ri包含特定子目录的开关来包含所有包含要操作文件的子目录。如果您使用Dired +库,则可以使用* .(绑定到diredp-mark/unmark-extension,标记所有具有给定扩展名的文件(例如.h)。然后,您可以使用F(绑定到dired-do-find-marked-files)打开所有标记的文件。

  2. 使用Dired +库,您可以对所有标记的文件以及标记的子目录中的所有标记的文件进行操作,这些子目录以递归方式定义,IOW,子目录的子目录,它们的子目录等。

    对于任何标记的目录,如果该目录中未标记任何文件(即,在该子目录的Dired列表中标记),则该操作将作用于其所有文件。

    有许多命令以不同方式(打开,搜索等)作用于此类文件。但是要采取行动的文件只有这样确定;也没有可能输入glob模式或正则表达式来过滤集合。

    但是,如果您使用的库冰柱连同Dired +那么你可以使用M-+ C-F,即,M-+ C-S-f(这是必然icicle-visit-marked-file-of-content-recursive),打开任何或所有刚才描述的文件(即,那些标记或标记中的子目录,递归定义)。

    您可以即时使用正则表达式来过滤文件名(和/或文件内容)。例如,您可以根据需要打开所有扩展名为.c,的文件.cc,并.h在带有标记的子目录中(带有标记的子目录以相同的方式递归处理)。


3

eshell处理zsh样式的**/*glob扩展,因此一种方法是在正确的目录中启动eshell并运行for f in **/*cc **/*h { find-file $f}

另外,find-file从elisp调用时,该函数支持通配符。这是文档中的有用片段find-file

(find-file FILENAME &optional WILDCARDS)
Interactively, or if WILDCARDS is non-nil in a call from Lisp, expand wildcards (if any) and visit multiple files.

我不知道如何使它与zsh样式的通配符一起使用,但这可能是一个不错的选择。

如果所有这些文件都在单个源代码控制的项目中,则射弹可能是另一种更好的方法。

PS。如果您使用eshell,建议您绑定eshell-toggle-cd到键,以便您可以轻松地在正在编辑的缓冲区目录中弹出eshell提示。


我认为这find-file不会递归操作,这是我追求的主要功能。打开外壳程序并键入命令似乎太麻烦了,因为(我猜)我的命令必须是类似这样的东西for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }?还是比这更简单?
nispio 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.