这似乎是一个非常典型的用例,但如果我能弄明白的话,我会被诅咒。必须有一些我缺少的基本知识。
find-dired基本上是find命令的前端,它产生结果的直接缓冲区
find-grep-dired似乎更像是grep的前端而不是find。并产生一个直接缓冲区,但它会搜索目录树中的所有文件。
我想要的是能够从给定路径开始并搜索* .css以获取#some-id并让它为我提供一个直接缓冲区以供进一步处理。
似乎所有的碎片都在那里,但我还没弄明白。所以我认为这可能是我可能错过的基础。答案 0 :(得分:3)
这有点晚了,但这里是我经常使用的emacs-lisp函数:
(defun find-iname-grep-dired (dir pattern regexp)
(interactive
"DFind-name (directory): \nsFind-name (filename wildcard): \nsFind-grep (grep regexp): ")
(find-dired dir (concat "-iname " (shell-quote-argument pattern) " "
"-type f -exec " grep-program " " find-grep-options " -e "
(shell-quote-argument regexp) " "
(shell-quote-argument "{}") " "
(shell-quote-argument ";"))))
它将find-grep-dired
和find-name-dired
与不区分大小写的文件名匹配组合在一起。
答案 1 :(得分:2)
听起来你正在寻找的功能是grep。它将使用您提供的表达式调用grep实用程序,并在交互式缓冲区中收集输出。您可以选择缓冲区中的任何匹配行,以跳转到匹配所在文件中的该行。
例如,如果您运行M-x grep
,您应该在迷你缓冲区中收到以下提示:
Run grep (like this): grep -n
然后添加要传递给grep的正则表达式和glob模式:
Run grep (like this): grep -n #some-id *.css
它应该为您提供当前目录中与#some-id
匹配的所有文件中*.css
的匹配列表。如果你想通过子目录递归,那么你需要使用rgrep而不是grep。这听起来像你正在寻找的,还是我完全误解了你的要求?
答案 2 :(得分:1)
我会给A. Levy信用。但我想我已经明白了。似乎find-dired确实是这项工作的工具,但是在我的Windows机器上它并没有用“-exec grep”预先填充args,而且我没有想到这样做。然而,我的linux机器预先用grep填充它。
...所以
#on Linux
M-x find-dired
Run Find in Directory: <current_path>
Run find(with args): -type f -exec grep -q -e \{\} \;
#on windows
M-x find-dired
Run Find in Directory: <current_path>
Run find(with args):
#Solution
M-x find-dired
Run Find in Directory: <current_path>
Run find(with args): -type f -iname "*.css" -exec grep -q -e #some-id \{\} \;
答案 3 :(得分:1)
你说(在评论中):
唯一缺少的是输出到一个直接缓冲区 所以我可以做一些事情,比如一次选择/移动/复制所有这些文件
对不起,直到现在我还没有看到这个问题。该功能适用于Dired+。命令diredp-grepped-files-other-window
在grep
点击指示的文件上打开Dired。 (它也适用于从compilation-mode
派生的任何其他模式。)