SPQR
1
问题的起因似乎是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+)
first
3
我是参考这里的 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
,可以和任何选择框架配合。
xiaoC
5
consult–find-builder 这个符号在consult包里并没有找到呢
SPQR
6
新版本重构了,现在应该用这个
(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+)
xiaoC
7
真的可以,感动哭了。没有这条命令的日子里,我是怎么过的
LSNG
8
今天更新 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+)
SPQR
9
提一下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不出來任何東西。。。
SPQR
11
我这边还能用,你需要安装一个gnu find的可执行文件或者类似的东西,windows自带的那个find命令不行
新版本(0.35以后)的 consult 目前支持 consult-fd
了,可以在 Windows 上安装速度更快的 fd 替换 find
。这样就不用受 Windows 自带的 find 干扰了。
3 个赞