解决windows下consult-find无效的问题

问题的起因似乎是MSYS2和CYGWIN里面星号*需要转义,consult-find没有考虑这一情况,需要设置 "MSYS=noglob" "CYGWIN=noglob" 这两个环境变量关掉转义。

另外由于windows命令行自带了一个同名的find.exe,需要修改consult-find-args,将find加上绝对路径

(defun consult-find+ (&optional dir initial)
    "Same as `consult-find', and bind noglob environment variable for Cygwin and MSYS."
    (interactive "P")
    (let ((process-environment (cons "MSYS=noglob" (cons "CYGWIN=noglob" process-environment))))
      (let* ((prompt-dir (consult--directory-prompt "Find" dir))
             (default-directory (cdr prompt-dir)))
        (find-file (consult--find (car prompt-dir) #'consult--find-builder initial)))))

(advice-add 'consult-find :override #'consult-find+)

consult-ripgrep

我是参考这里的 Windows: Process arguments must be manually escaped and encoded · Issue #317 · minad/consult · GitHub

(let ((w32-quote-process-args ?\\) ;; or (w32-quote-process-args ?*)
                                           )
                                       (call-interactively 'consult-find))

没有用msys2和cygwin环境,用的是git里的find。

1 个赞

可以使用find-file-in-project,提供了更多的功能,会自动找cygwin或者msys2下的find,不需要额外设置。 基于emacs api completing-read,可以和任何选择框架配合。

consult–find-builder 这个符号在consult包里并没有找到呢

新版本重构了,现在应该用这个

(defun consult-find+ (&optional dir initial)
    "Same as `consult-find', and bind noglob environment variable for Cygwin and MSYS."
    (interactive "P")
    (let ((process-environment (cons "MSYS=noglob" (cons "CYGWIN=noglob" process-environment))))
      (let* ((prompt-dir (consult--directory-prompt "Find" dir))
             (default-directory (cdr prompt-dir)))
        (find-file (consult--find (car prompt-dir) (consult--find-make-builder) initial)))))
  (advice-add #'consult-find :override #'consult-find+)

真的可以,感动哭了。没有这条命令的日子里,我是怎么过的

今天更新 consult 发现又失效了,按照楼主的方式改了一下

(defun consult-find+ (&optional dir initial)
  "Same as `consult-find', and bind noglob environment variable for Cygwin and MSYS."
  (interactive "P")
  (let ((process-environment (cons "MSYS=noglob" (cons "CYGWIN=noglob" process-environment))))
  (pcase-let* ((`(,prompt ,paths ,dir) (consult--directory-prompt "Find" dir))
               (default-directory dir)
               (builder (consult--find-make-builder paths)))
    (find-file (consult--find prompt builder initial)))))
(advice-add #'consult-find :override #'consult-find+)

提一下pcase-let*包含let*的功能,所以那个let可以不要,直接写在pcase-let*里面就行了

(defun consult-find+ (&optional dir initial)
    "Same as `consult-find', and bind noglob environment variable for Cygwin and MSYS."
    (interactive "P")
    (pcase-let* ((process-environment (cons "MSYS=noglob" (cons "CYGWIN=noglob" process-environment)))
                 (`(,prompt ,paths ,dir) (consult--directory-prompt "Find" dir))
                 (default-directory dir)
                 (builder (consult--find-make-builder paths)))
      (find-file (consult--find prompt builder initial))))

救命啊,在2023年還是發現了這個問題,按照你們的方式貌似還是find不出來任何東西。。。

我这边还能用,你需要安装一个gnu find的可执行文件或者类似的东西,windows自带的那个find命令不行

新版本(0.35以后)的 consult 目前支持 consult-fd 了,可以在 Windows 上安装速度更快的 fd 替换 find。这样就不用受 Windows 自带的 find 干扰了。

3 个赞

wsl 下基本啥问题都没有 :new_moon_with_face::new_moon_with_face::new_moon_with_face::new_moon_with_face: