projectile-find-file该怎么搭配ivy-occur批量修改文件名

我有一个项目,里面有很多aaa.py的文件

dir1
├── aaa.py
dir2
├── aaa.py
dir3
├── aaa.py

现在我想要把aaa.py修改成bbb.py, 直接使用projectile-find-file搜索aaa.py然后C-c C-o打开的不是ivy-occur的buffer(这是不是一个bug)
使用counsel-projectile-find-file可以打开ivy-occur的buffer,但是修改时提示Text is read only

请问一下projectile-find-file该怎么搭配ivy-occur使用呢? 我尝试使用find-name-dired替代ivy-occur

  (defun maple/ivy-dired-occur()
    (interactive)
    (find-name-dired
     (or (projectile-project-root) default-directory) (concat (ivy--input) "*"))
    (ivy-exit-with-action
     (lambda (_)
       (pop-to-buffer (get-buffer "*Find*"))
       (dired-hide-details-mode)
       (wdired-change-to-wdired-mode)
       (when (bound-and-true-p evil-local-mode) (evil-normal-state)))))

但搜索结果会不一样,总感觉不太对

bash:

for fn in `find . -name "aaa.py"`; do
    mv  $fn `echo $fn | sed 's/aaa.py/bbb.py/g'`
done

我知道使用命令行可以做到,但有没有可能让projectile-find-file与ivy-occur搭配使用呢,毕竟我想和平时用counsel-ag修改变量的操作保持一致,另外也有可能会出现某几个aaa.py修改成bbb.py,另几个aaa.py修改成ccc.py的情况

另一种办法,dired中有一个函数

find-lisp-find-dired

这玩意儿能找到指定目录里面,所有文件名匹配正则的文件。比如你的这个如果需要重命名所有py文件,调用后输入 .*.py$

关键是,这些找到的文件,都放到一个dired的buffer中的。

dired中重命名就方便了。我喜欢用 dired-toggle-read-only,默认绑定到 C-x C-q。 执行后,dired的buffer就可以修改了。这个方法就很多啦,query-replace-regexp这些就足够了。

改好之后,直接 C-c C-c (调用函数wdired-finish-edit)提交就好啦。

如果改了后反悔了,就用 C-c C-k(调用 wdired-abort-changes)取消即可。

BTW: find-lisp-find-dired这个函数是内置的,不过它是同步的,也就是说,如果你的目录中的文件比较多,emacs就卡住了。针对这个,懒猫大神搞了一个异步的玩意儿: Emacs: grep-dired 快速文件过滤和重构工具 。推荐试用一下 :slight_smile: