请问大家是如何在当前目录下快速递归搜索某个文件名的?

helm-ag

@stardiviner 跨平台只是 bonus,主要是用的挺嗨皮。写回答的时候, 突然想有人可能用 Windows?就去主页查了一下。

@wsug 快而且好用,不然不会推荐的。rust 写的 exa,bat 我也常用。

有个参数可以搜索文件名 rg --files,怎么集成到 helm 应该不是难事。

我也正想推荐 fd,很快很好用。

fd 也有和 find-dired, grep-dired 类似的 fd-dired. 测试了下,挺好用的。由 于 fd 的速度比 find 快。亲测确实快不少。尤其是文件很多的时候。

都可以基于fd, 用了一下,都不错

如果用 ag,其实还有 ag-dired

对于递归搜索(文件名或者文件内容)的关键是要像 color-rg.el / grep-dired.el 那样做异步进程, 不管后端搜索工具快还是慢, 先把第一屏的内容展示出来, 这样用户体验就会极佳.

真正做到这一点, 90%的用户都不会说慢.

试了一下 fd-dired 是要快很多, 但是可惜还是同步的, 有1秒顿一下的不爽.

2 个赞

老王的grep-dired也是调用find,可以把你那个调用的方法提取出来换上fd啊 :wink:

刚才使用 grep-dired 发现一个问题,显示中文的结果不能正确显示。不知道是不是由于 我系统设置的缘故。

看了下 grep-dired 的源代码,不能很方便的修改工具。要是能提供 grep-dired-command 选项就好了。仔细看了下,使用了 grep.el 里的变量 find-program.

这是实际运行的代码:

(concat find-program " . "
                       (if (string= args "")
                           ""
                         (concat
                          (shell-quote-argument "(")
                          " " args " "
                          (shell-quote-argument ")")
                          " "))
                       (if (string-match "\\`\\(.*\\) {} \\(\\\\;\\|+\\)\\'"
                                         (car grep-dired-find-ls-option))
                           (format "%s %s %s"
                                   (match-string 1 (car grep-dired-find-ls-option))
                                   (shell-quote-argument "{}")
                                   grep-dired-find-exec-terminator)
                         (car grep-dired-find-ls-option)))

fd 命令的语法不是很好的融合。

然后我看了下 fd-dired 的源代码,竟然和 grep-dired 的几乎一样。

fd-dired 也是异步的,测试,支持中文正确显示。接着我看了下 find-dired 的源代 码,就明白了。惊异了一下。

1 个赞

就是find-dired改了一下啊…

projectile慢我记得是因为它搜到以后还要sort一次.

我以为是从头开始写的。。。。惯性思维。。。

projectile 是确实慢很多。我profile下。

- command-execute                                       4,201,100,161  99%
 - apply                                                4,201,100,161  99%
  - ad-Advice-command-execute                           4,201,100,161  99%
   - #<compiled 0x1fe9b8f916af>                         4,201,100,161  99%
    - call-interactively                                4,201,100,161  99%
     - funcall-interactively                            4,201,100,161  99%
      - projectile-find-file                            4,172,020,246  99%
       - projectile--find-file                          4,172,020,246  99%
        - projectile-project-files                      4,059,587,649  96%
         - projectile-dir-files-alien                   4,059,587,649  96%
          - projectile-files-via-ext-command            4,059,554,651  96%
           - shell-command-to-string                    3,980,701,443  94%
            - shell-command                             3,905,556,140  92%
             - apply                                    3,905,556,140  92%
              - shell-command--shell-command-with-editor-mode 3,905,556,140  92%
               - #<compiled 0x1fe9b8fae1e1>             3,905,556,140  92%
                  call-process-shell-command            3,905,555,084  92%
                - push-mark                                     1,056   0%
                   apply                                        1,056   0%
            - buffer-string                                59,637,136   1%
             - apply                                       59,637,136   1%
                ad-Advice-buffer-string                    59,637,136   1%
            - #<compiled 0x1fe9b8fbef21>                       14,748   0%
             - kill-buffer                                     10,272   0%
              - run-hooks                                       8,188   0%
               - company-box--handle-window-changes             8,188   0%
                  company-box--get-frame                        8,188   0%
                tramp-flush-file-function                       2,084   0%
            - get-buffer-create                                 2,112   0%
             - run-hooks                                        2,112   0%
              - company-box--handle-window-changes              2,112   0%
                 company-box--get-frame                         2,112   0%
           - split-string                                  78,853,208   1%
              #<compiled 0x1fe9b8f62c19>                   78,842,236   1%
              string-match                                      8,924   0%
          - projectile-project-vcs                             32,998   0%
           - projectile-locate-dominating-file                 23,902   0%
              abbreviate-file-name                              5,666   0%
              projectile-file-exists-p                          1,704   0%
             projectile-file-exists-p                           9,096   0%
        - projectile-completing-read                      112,406,193   2%
         - ivy-read                                       112,397,011   2%
          - read-from-minibuffer                           91,724,935   2%
           - ivy--queue-exhibit                            86,763,528   2%
            - ivy--exhibit                                 86,763,528   2%
             - ivy--filter                                 82,418,637   1%
              - cl-remove-if-not                           50,593,141   1%
               - apply                                     50,593,141   1%
                - cl-remove                                50,593,141   1%
                   #<compiled 0x15813d6dfec5>                  13,378   0%
                   apply                                        4,589   0%
              + ivy--re-filter                             31,732,596   0%
              + ivy--regex-plus                                70,280   0%
                ivy--recompute-index                            2,112   0%
              + cl-search                                       1,056   0%
             + ivy--insert-minibuffer                       2,674,379   0%
             + ivy--format                                  1,666,312   0%
             + ivy--input                                       4,200   0%
           + timer-event-handler                            3,377,346   0%
           + redisplay_internal (C function)                  375,772   0%
           + eaf-monitor-key-event                             74,272   0%
           + #<compiled 0x15813a105501>                        22,958   0%
           + command-execute                                   20,344   0%
           + which-key--hide-popup                             14,784   0%
           + minibuffer-inactive-mode                          14,256   0%
           + minibuf-eldef-setup-minibuffer                     6,516   0%
           + run-hooks                                          2,112   0%
          + ivy--reset-state                                  110,094   0%
          + #<compiled 0x15813a143bcd>                          1,056   0%
         + projectile-prepend-project-name                      9,182   0%
        + projectile-project-root                              17,124   0%
        + projectile-maybe-invalidate-cache                     9,280   0%
      + counsel-M-x                                        20,577,334   0%
      + ivy-switch-buffer                                   8,502,581   0%

挖个坟

在Windows原生环境使用fd-dired,grep-dired和fzf不成功,前两者需要的xargs运行没有用,但是都调用了这个命令

我在网络上搜索到了两个链接

http://www.pirosa.co.uk/demo/wxargs/wxargs.html

尝试了,前者可以在命令行正常使用,后者根本没有反应

故来求教,各位大神指点一下windows在非cygwin这些环境下怎么使用模糊搜索来实现题主的要求,虽然我不抱太大希望,但是万一有惊喜呢

1 个赞

GitHub - redguardtoo/find-file-in-project: Quick access to project files in Emacsffip-lisp-find-file-in-project只用了Lisp和Emacs的API,在Windows下无需第三方命令行,而且没有编码问题。原生支持中文文件名。缺点就是比较慢。

默认是自动从项目根目录搜索。不过可以拓展为当前目录搜索。

(defun my-find-file-in-current-directory (&optional directory-p)
  (interactive "P")
  (let* ((ffip-project-root default-directory))
    (ffip-lisp-find-file-in-project directory-p)))

Grep 不知道。

windows下搜索用everything很快,可以和counsel-locate配合。

windows下我安装了个gow,linux的基本命令都有了