【求助】折腾不动了,给snails添加emacs外的检索后端全不能用(已解决)

除了emacs里的imenu recentf等能用,emacs外的rg rga fd fasd mdfind全不能用。哪位大佬帮忙抢救一下 :sob: macos big sur 11.5.1 emacs-mac 27

例如mdfind,shell下面没问题,snails里用不了。其他的rg rga fd fasd全用brew install安装好了。

配置如下:

;; init-interface.el                 	-*- lexical-binding: t -*-

;; Setup environment variables.
(use-package exec-path-from-shell
  :init
  (setq exec-path-from-shell-variables '("PATH" "MANPATH"))
  (setq exec-path-from-shell-arguments '("-l"))
  (exec-path-from-shell-initialize))

;; Add fuzz match algorithm to snails.
(use-package fuz
  :straight (fuz :type git :host github :repo "rustify-emacs/fuz.el" :build nil)
  :load-path (lambda () (expand-file-name "straight/repos/fuz.el" user-emacs-directory))
  ;:hook (after-init . fuz) ;; Use fuz at the first time and later inhibit it.
  :config
  (unless (require 'fuz-core nil t)
    (fuz-build-and-load-dymod)))

;; Setup snails.
(use-package snails
  :straight (snails :type git :host github :repo "manateelazycat/snails" :build (:not compile))
  ;:load-path (lambda () (expand-file-name "straight/repos/snails" user-emacs-directory))
  :if (display-graphic-p)
  :hook (window-setup . snails)
  :bind ("M-SPC" . snails)
  
  :custom-face
  (snails-content-buffer-face ((t (:background "#111" :height 110))))
  (snails-input-buffer-face ((t (:background "#222" :foreground "gold" :height 110))))
  (snails-header-line-face ((t (:inherit font-lock-function-name-face :underline t :height 1.1))))
  
  :config
  (when (version< emacs-version "28.0")
    (with-eval-after-load "snails"                       ;; Fix up "Symbol’s function definition
      (fset 'string-replace 'replace-regexp-in-string))) ;; is void: string-replace"
  ;(setq snails-show-with-frame nil)
  ;(setq snails-default-show-prefix-tips nil))

  (require 'snails-backend-mdfind)
  (setq snails-prefix-backends
        '(
	  ("?" '(snails-backend-mdfind))
          ))
 
 (setq snails-default-backends
       '(
	  snails-backend-rg
	  snails-backend-fd
	  snails-backend-fasd
	  snails-backend-imenu
	  snails-backend-buffer
	  snails-backend-mdfind
	  snails-backend-recentf
	  snails-backend-command
	  snails-backend-bookmark
	  snails-backend-search-pdf
	  snails-backend-current-buffer
         )))

  
(provide 'init-interface)

20210907更新解决方法:

1、确保emacs带有cocoa,emacs安装的时候可选,我装的是emacs-plus 27 默认安装cocoa。

2、设置好环境变量:

(use-package exec-path-from-shell
  :init
  (setq exec-path-from-shell-variables '("PATH" "PYTHONPATH"))
  (setq exec-path-from-shell-arguments '("-l"))
  (exec-path-from-shell-initialize))

2、这里多了单引号,等待作者 @manateelazycat 修复:https://github.com/manateelazycat/snails/blob/f0d3527588f95bfaa87189da08f0ec27444253e4/snails-backend-mdfind.el#L95

跑跑 (executable-find "rg") 这类命令,能找到吗?

我的后端配置就是参考你的 :grin:你的代码很整洁啊,看着舒服。终端里$ XX --version都ok。(executable-find "rg")也都能找到,rg rga fd fasd都在/usr/local/bin/里,mdfind在/usr/bin/里。

有个情况是这样的:(require 'snails-backend-mdfind)没报错,但是M-x找不到snails-backend-mdfind,不知道是不是没有require到这些后端。一定要require这些后端吗?readme里的(snails '(snails-backen-XXX)这么简洁的设置又是什么情况呢?

是不是还要配置一下rg.el呢?我都没安装rg fd等emacs扩展包。

像这样最简单的配置都不能调用mdfind,真的不知道是哪里出问题了。

(defun weiss-test ()
  "DOCSTRING"
  (interactive)
  (snails '(snails-backend-org-roam-all)))

需要用这样的方式才能跑你想要的 backend, 否则普通的 snails 跑的是 snails-default-backends

设置了三个后端mdfind buffer command,然后M-x weiss-test RET弹出的检索框也只有buffer和command的结果,mdfind依旧不用了……

很可能是环境变量的问题了。用了 @seagle0128 的配置的:

(use-package exec-path-from-shell
  :init
  (setq exec-path-from-shell-variables '("PATH" "MANPATH"))
  (setq exec-path-from-shell-arguments '("-l"))
(exec-path-from-shell-initialize))

直接C-x C-e的结果显示:Warning: exec-path-from-shell execution took 6022ms. See the README for tips on reducing this. ((“PATH” . “/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/opt/openjdk/bin:/usr/local/Caskroom/miniconda/base/bin:/usr/local/Caskroom/miniconda/base/condabin”))

不知道这结果是不是成功了。

另外,我shell用的是zsh,还用miniconda设置了虚拟环境,不知道有没有影响。

你测试时候就别开那么多 backends 了啊,一个一个测。

有些 backend 需要输入一定量的字符后才会工作的,你是不是输得太少了。

至于测试外部命令,可以像下面这么测试,snails 就是用这个得到结果的

(make-process
 :name ""
 :buffer (current-buffer)
 :command (list "rg" "--no-heading" "--column" "--color" "never" "--max-columns" "300" "--smart-case" "搜索的字符串" "路径"))

对,应该要控制单一变量,一个一个调试。下图是snails-backend-mdfind.el的代码块,看着是输入3个字符就能工作。我尝试检索的是放在Downloads文件夹里的loki剧集,在终端里是可以用mdfind检索到的。

运行测试代码后得到这样的结果,不知道是不是正常工作了呢?麻烦看看,谢谢! :pray:

我把 :command (list "mdfind" "-name" "loki" "/usr/bin/")里的"路径"去掉就可以检索出结果,开心。我还以为"路径"是指定mdfind的路径(命令(executable-find “mdfind”)得到的路径) :rofl:

至此,至少可以确认exec-path-from-shell顺利设定好环境变量了。M-x weiss-test RET 在snails检索框里还是没有结果,是不是被过滤掉了?

你 build command 里返回的结果就是给 md find 的命令,似乎没有确定路径?不知道有没有影响。

你看下那个 build command 里的 featurep 是不是返回 t

(featurep 'cocoa)直接C-x C-e返回nil,那就是说这条判断不对咯?下图是我的mac信息:

我去查了一下cocoa的wiki,发现还有同类的 CarbonPOSIXX11Java,对它们分别C-x C-e (feature 'carbon) 都是nil。

谷歌百度(featureq 'cocoa) nil 也没什么结果,还是要请教一下你 :pray:

我直接谷歌emacs cocoa记起安装emacs的时候有个这个–with-cocoa选项。我现在安装的是emacs-mac二进制包,用brew --cask install emacs-mac安装的。我试试重装emacs,加上cocoa选项。以防以后折腾又遇到奇奇怪怪的问题,安装时多加了一些option: $ brew install emacs-plus@27 --without-cocoa --with-ctags --with-dbus --with-debug --with-mailutils

这方面我就不熟了……不用 mac

重新装了emacs-plus@27版本,带cocoa的,(featureq 'cocoa) 返回了t,fd可以激活。但是mdfind和rg依旧用不了。先不说rg,mdfind搜索磁盘文件是我最想要的功能 :sob:下一步应该就到排除是不是candidates的过滤和呈现的问题了吧?

你试下调用 build-command 里那个 lambda 函数,看看能不能正常出结果,你 md 里的 candidate-filter 很简单,感觉没啥问题。

snails-backend-mdfind.el后端是snails自带的,我不懂elisp~想问一下怎么调用lambda函数呢? :pray:

抱歉才看到,这样就行了

(let ((f (lambda (input) (message "input: %s" input)))
      (input "asdf"))
  (funcall f input))

辛苦了,谢谢!调试了一下,好像也没啥问题,加(when (featurep 'cocoa)也ok……是我不配用snails吗 :tired_face: