Snails 6.0发布,现在支持像VSCode那样按照前缀进行搜索了

@owensys 一样的配置,一样的bug/错误提示

尝试:1、 手动C-x C-e执行了一下 snails-backend-recentf.elsnails-backend-buffer.el 中的 snails-create-sync-backend 函数,或者eval-buffer snails-backend-recentf.elsnails-backend-buffer.el,M-x snails都没有出来BUFFER列表和RECENTF列表。 2、“我删除了elc文件,重启emacs后,可以使用了” 但我没有找到这里说的elc文件。

希望各位大佬帮忙看一下,谢谢!

我也是类似的问题.

No result with: 7e83f38

Good with: 523a49a image

有没有安装 rg

你好。我只按照readme安装了fuz,没装过rg。之前安装snails的时候也是这样简单配置就能用了,没有安装fuz或者rg之类的依赖。可能之前的是snails 5.0,6.0升级了,需要一些依赖?

另外,请教一下,hlem ivy snails smex counsel ido swiper 以及 rg grep等这些与搜索相关的插件大致是如何分类的呢?我想同类功能的插件只安装一种,刚入门,分不清,不知该如何配置起来。前者是搜索框架,后者是搜索后端吗,如同company mode 带有很多后端?谢谢🙏

其他不清楚,snails 有点类似 company-mode。搜索当前buffer内容是其中的一个后端,而搜索当前buffer用的是 rg 这个搜索工具

实测发现是这个提交引起的问题: cee5f08 fix: fix not apply sort

这个提交把最后的 candidates 删掉了,如果安装了 fuz.el 那么 snails-sort-candidates 就会正确的返回数据,但如果没有安装 fuz.el 只会返回 nil

但好像把 candidates 加上的话会导致没有排序,本人的 elisp 也没学好,看有没有人解决了。

不管怎么样,只要把 fuz.el 装好就能正常使用了。

2 个赞

提了一个pr修复这个问题

2 个赞

@xhcoding @aqua0210 @lampze 谢谢各位前辈,已经可以使用了

贪得无厌的问一下,请问可以用alfred替换everything吗?mac用户表示有点羡慕在snails里搜索磁盘文件~

mac 下面本来就支持 mdfind, 也就是 spotlight 的命令行版本。

还真不知道mdfind :rofl:谢谢提醒~

请问有人在Windows 系统上通过snail使用everyting进行搜索吗?
我发现如果没有安装projectile这个包的话,会报以下错误,输入“?”+keyword没有搜索结果。

snails-backend-projectile-project-root: Symbol’s function definition is void: projectile-project-root

执行(featurep 'projectile)的结果明明是nil,按理说不应该执行projectile的后端。
如果修改源代码把Everyting 这个后端单独给一个前缀,比如“&”,能搜索,但是经常会卡死。
es(everthing的命令行版本)在命令窗口还是很流畅,虽然没有gui的流畅。

友情提醒:
一直以来,在Windows上使用snails总是感觉卡顿明显,忍了很久。
今天通过排查,发现是因为默认的后端设置比较多,而当前系统有没有相应功能造成。
建议使用snails的用户,根据自己使用使用的后端进行配置。
我在Windows上只使用以下后端,这样设置:

(setq snails-default-backends
  '(snails-backend-awesome-tab-group snails-backend-buffer snails-backend-recentf snails-backend-directory-files))

@manateelazycat 今天在Emacs28上使用snails发现这个错误:

Debugger entered--Lisp error: (error "Window #<window 27 on  *snails content*> too small...")
  signal(error ("Window #<window 27 on  *snails content*> too small..."))
  error("Window %s too small for splitting" #<window 27 on  *snails content*>)
  split-window(#<window 27 on  *snails content*> 32 below t)
  (progn (select-frame snails-frame 'norecord) (delete-other-windows) (set-frame-parameter snails-frame 'menu-bar-lines 0) (set-frame-position snails-frame frame-x frame-y) (set-frame-size snails-frame frame-width frame-height t) (switch-to-buffer snails-input-buffer) (set-window-margins (selected-window) 1 1) (split-window (selected-window) (line-pixel-height) nil t) (other-window 1) (switch-to-buffer snails-content-buffer) (set-window-margins (selected-window) 1 1) (other-window 1) (setq snails-frame-window-conf (current-window-configuration)) (other-window 1) (split-window (selected-window) (* 2 (line-pixel-height)) 'below t) (switch-to-buffer snails-tips-buffer) (set-window-margins (selected-window) 1 1) (other-window 2) (add-hook 'after-change-functions 'snails-monitor-input nil t) (if snails-default-show-prefix-tips nil (snails-toggle-prefix-tips-buffer)) (if (featurep 'cocoa) (progn (add-hook 'focus-out-hook 'snails-quit))))
  (unwind-protect (progn (select-frame snails-frame 'norecord) (delete-other-windows) (set-frame-parameter snails-frame 'menu-bar-lines 0) (set-frame-position snails-frame frame-x frame-y) (set-frame-size snails-frame frame-width frame-height t) (switch-to-buffer snails-input-buffer) (set-window-margins (selected-window) 1 1) (split-window (selected-window) (line-pixel-height) nil t) (other-window 1) (switch-to-buffer snails-content-buffer) (set-window-margins (selected-window) 1 1) (other-window 1) (setq snails-frame-window-conf (current-window-configuration)) (other-window 1) (split-window (selected-window) (* 2 (line-pixel-height)) 'below t) (switch-to-buffer snails-tips-buffer) (set-window-margins (selected-window) 1 1) (other-window 2) (add-hook 'after-change-functions 'snails-monitor-input nil t) (if snails-default-show-prefix-tips nil (snails-toggle-prefix-tips-buffer)) (if (featurep 'cocoa) (progn (add-hook 'focus-out-hook 'snails-quit)))) (if (frame-live-p old-frame) (progn (select-frame old-frame 'norecord))) (if (buffer-live-p old-buffer) (progn (set-buffer old-buffer))))
  (let ((old-frame (selected-frame)) (old-buffer (current-buffer))) (unwind-protect (progn (select-frame snails-frame 'norecord) (delete-other-windows) (set-frame-parameter snails-frame 'menu-bar-lines 0) (set-frame-position snails-frame frame-x frame-y) (set-frame-size snails-frame frame-width frame-height t) (switch-to-buffer snails-input-buffer) (set-window-margins (selected-window) 1 1) (split-window (selected-window) (line-pixel-height) nil t) (other-window 1) (switch-to-buffer snails-content-buffer) (set-window-margins (selected-window) 1 1) (other-window 1) (setq snails-frame-window-conf (current-window-configuration)) (other-window 1) (split-window (selected-window) (* 2 (line-pixel-height)) 'below t) (switch-to-buffer snails-tips-buffer) (set-window-margins (selected-window) 1 1) (other-window 2) (add-hook 'after-change-functions 'snails-monitor-input nil t) (if snails-default-show-prefix-tips nil (snails-toggle-prefix-tips-buffer)) (if (featurep 'cocoa) (progn (add-hook 'focus-out-hook 'snails-quit)))) (if (frame-live-p old-frame) (progn (select-frame old-frame 'norecord))) (if (buffer-live-p old-buffer) (progn (set-buffer old-buffer)))))
  (let* ((edges (frame-edges)) (x (nth 0 edges)) (y (nth 1 edges)) (width (- (nth 2 edges) x)) (height (nth 3 edges)) (frame-width (truncate (* snails-fame-width-proportion width))) (frame-height (truncate (* snails-fame-height-proportion height))) (frame-x (+ x (/ (- width frame-width) 2))) (frame-y (+ y (/ (- height frame-height) 3)))) (setq snails-project-root-dir (let ((project (project-current))) (if project (progn (expand-file-name (cdr project)))))) (if (and snails-frame (frame-visible-p snails-frame)) nil (setq snails-frame (make-frame '((parent-frame window-frame) (skip-taskbar . t) (minibuffer) (visibility) (internal-border-width . 0) (left-fringe . 0) (right-fringe . 0) (vertical-scroll-bars) (horizontal-scroll-bars) (undecorated . t) (unsplittable . t) (tool-bar-lines . 0) (menu-bar-lines . 0))))) (let ((old-frame (selected-frame)) (old-buffer (current-buffer))) (unwind-protect (progn (select-frame snails-frame 'norecord) (delete-other-windows) (set-frame-parameter snails-frame 'menu-bar-lines 0) (set-frame-position snails-frame frame-x frame-y) (set-frame-size snails-frame frame-width frame-height t) (switch-to-buffer snails-input-buffer) (set-window-margins (selected-window) 1 1) (split-window (selected-window) (line-pixel-height) nil t) (other-window 1) (switch-to-buffer snails-content-buffer) (set-window-margins (selected-window) 1 1) (other-window 1) (setq snails-frame-window-conf (current-window-configuration)) (other-window 1) (split-window (selected-window) (* 2 (line-pixel-height)) 'below t) (switch-to-buffer snails-tips-buffer) (set-window-margins (selected-window) 1 1) (other-window 2) (add-hook 'after-change-functions 'snails-monitor-input nil t) (if snails-default-show-prefix-tips nil (snails-toggle-prefix-tips-buffer)) (if (featurep 'cocoa) (progn (add-hook 'focus-out-hook 'snails-quit)))) (if (frame-live-p old-frame) (progn (select-frame old-frame 'norecord))) (if (buffer-live-p old-buffer) (progn (set-buffer old-buffer))))) (make-frame-visible snails-frame) (select-frame-set-input-focus snails-frame))
  snails-create-frame()
  (if (snails-frame-is-visible-p) (snails-quit) (if (and (listp backends) (> (length backends) 0)) (progn (setq snails-search-backends backends))) (setq snails-start-buffer (current-buffer)) (setq snails-start-buffer-dir-path default-directory) (setq snails-start-buffer-lines (line-number-at-pos (point-max))) (snails-init-face-with-theme) (snails-create-input-buffer) (snails-create-tips-buffer) (snails-create-content-buffer) (snails-create-frame) (cond ((and (stringp search-object) (not (string-empty-p search-object))) (save-current-buffer (set-buffer snails-input-buffer) (insert search-object)) (snails-search search-object)) (search-object (run-with-timer 0.05 nil #'(lambda nil (let (...) (save-current-buffer ... ...) (snails-search search-string))))) (t (snails-search ""))))
  (if (display-graphic-p) (if (snails-frame-is-visible-p) (snails-quit) (if (and (listp backends) (> (length backends) 0)) (progn (setq snails-search-backends backends))) (setq snails-start-buffer (current-buffer)) (setq snails-start-buffer-dir-path default-directory) (setq snails-start-buffer-lines (line-number-at-pos (point-max))) (snails-init-face-with-theme) (snails-create-input-buffer) (snails-create-tips-buffer) (snails-create-content-buffer) (snails-create-frame) (cond ((and (stringp search-object) (not (string-empty-p search-object))) (save-current-buffer (set-buffer snails-input-buffer) (insert search-object)) (snails-search search-object)) (search-object (run-with-timer 0.05 nil #'(lambda nil (let ... ... ...)))) (t (snails-search "")))) (message "Snails render candidates in new frame that only ca..."))
  snails()
  funcall-interactively(snails)
  call-interactively(snails record nil)
  #f(compiled-function (cmd &optional record-flag keys special) "Execute CMD as an editor command.\nCMD must be a symbol that satisfies the `commandp' predicate.\n\nOptional second arg RECORD-FLAG non-nil means unconditionally put\nthis command in the variable `command-history'.  Otherwise, that\nis done only if an arg is read using the minibuffer.\n\nThe argument KEYS specifies the value to use instead of the\nreturn value of the `this-command-keys' function when reading the\narguments; if it is nil, `this-command-keys' is used.\n\nThe argument SPECIAL, if non-nil, means that this command is\nexecuting a special event, so ignore the prefix argument and\ndon't clear it." #<bytecode 0x1afd3f3bd61607c3>)(snails record nil nil)
  ad-Advice-command-execute(#f(compiled-function (cmd &optional record-flag keys special) "Execute CMD as an editor command.\nCMD must be a symbol that satisfies the `commandp' predicate.\n\nOptional second arg RECORD-FLAG non-nil means unconditionally put\nthis command in the variable `command-history'.  Otherwise, that\nis done only if an arg is read using the minibuffer.\n\nThe argument KEYS specifies the value to use instead of the\nreturn value of the `this-command-keys' function when reading the\narguments; if it is nil, `this-command-keys' is used.\n\nThe argument SPECIAL, if non-nil, means that this command is\nexecuting a special event, so ignore the prefix argument and\ndon't clear it." #<bytecode 0x1afd3f3bd61607c3>) snails record)
  apply(ad-Advice-command-execute #f(compiled-function (cmd &optional record-flag keys special) "Execute CMD as an editor command.\nCMD must be a symbol that satisfies the `commandp' predicate.\n\nOptional second arg RECORD-FLAG non-nil means unconditionally put\nthis command in the variable `command-history'.  Otherwise, that\nis done only if an arg is read using the minibuffer.\n\nThe argument KEYS specifies the value to use instead of the\nreturn value of the `this-command-keys' function when reading the\narguments; if it is nil, `this-command-keys' is used.\n\nThe argument SPECIAL, if non-nil, means that this command is\nexecuting a special event, so ignore the prefix argument and\ndon't clear it." #<bytecode 0x1afd3f3bd61607c3>) (snails record))
  command-execute(snails record)
  counsel-M-x-action("snails")
  #f(compiled-function (x) #<bytecode 0x1dc09c490a120044>)("snails")
  ivy-call()
  #f(compiled-function (arg1 arg2 &rest rest) "Read a string in the minibuffer, with completion.\n\nPROMPT is a string, normally ending in a colon and a space.\n`ivy-count-format' is prepended to PROMPT during completion.\n\nCOLLECTION is either a list of strings, a function, an alist, or\na hash table, supplied for `minibuffer-completion-table'.\n\nPREDICATE is applied to filter out the COLLECTION immediately.\nThis argument is for compatibility with `completing-read'.\n\nWhen REQUIRE-MATCH is non-nil, only members of COLLECTION can be\nselected.\n\nIf INITIAL-INPUT is non-nil, then insert that input in the\nminibuffer initially.\n\nHISTORY is a name of a variable to hold the completion session\nhistory.\n\nKEYMAP is composed with `ivy-minibuffer-map'.\n\nPRESELECT, when non-nil, determines which one of the candidates\nmatching INITIAL-INPUT to select initially.  An integer stands\nfor the position of the desired candidate in the collection,\ncounting from zero.  Otherwise, use the first occurrence of\nPRESELECT in the collection.  Comparison is first done with\n`equal'.  If that fails, and when applicable, match PRESELECT as\na regular expression.\n\nDEF is for compatibility with `completing-read'.\n\nUPDATE-FN is called each time the candidate list is re-displayed.\n\nWhen SORT is non-nil, `ivy-sort-functions-alist' determines how\nto sort candidates before displaying them.\n\nACTION is a function to call after selecting a candidate.\nIt takes one argument, the selected candidate. If COLLECTION is\nan alist, the argument is a cons cell, otherwise it's a string.\n\nMULTI-ACTION, when non-nil, is called instead of ACTION when\nthere are marked candidates. It takes the list of candidates as\nits only argument. When it's nil, ACTION is called on each marked\ncandidate.\n\nUNWIND is a function of no arguments to call before exiting.\n\nRE-BUILDER is a function transforming input text into a regex\npattern.\n\nMATCHER is a function which can override how candidates are\nfiltered based on user input.  It takes a regex pattern and a\nlist of candidates, and returns the list of matching candidates.\n\nDYNAMIC-COLLECTION is a boolean specifying whether the list of\ncandidates is updated after each input by calling COLLECTION.\n\nEXTRA-PROPS is a plist that can be used to store\ncollection-specific session-specific data.\n\nCALLER is a symbol to uniquely identify the caller to `ivy-read'.\nIt is used, along with COLLECTION, to determine which\ncustomizations apply to the current completion session." #<bytecode 0x1b9d2243fe6c543>)("M-x " ("snails" "toggle-debug-on-error" "snails-quit" "package-refresh-contents" "centaur-update-packages" "package-reinstall" "global-hl-line-mode" "hl-line-mode" "hi-lock-line-face-buffer" "markdown-toggle-inline-images" "markdown-toggle-fontify-code-blocks-natively" "all-the-icons-ibuffer-mode" "centaur-update" "flycheck-posframe-mode" "package-autoremove" "markdown-toggle-url-hiding" "xwidget-webkit-browse-url" "centaur-webkit-browse-url" "tooltip-mode" "dap-tooltip-mode" "list-processes" "counsel-company" "company-box-mode" "all-the-icons-ivy-rich-mode" "org-tree-slide-mode" "ivy-rich-mode" "org-roam-server-mode" "lsp-pyright-format-buffer" "all-the-icons-ivy-rich-kill-buffer" "list-packages" "doom-modeline-mode" "checkdoc" "lsp-mode" "lsp-update-server" "lsp-organize-imports" "lsp-install-server" "all-the-icons-insert" "package-install" "treemacs-load-theme" "grip-mode" "persp-mode" "describe-char" "org-toggle-link-display" "display-time" "tab-bar-mode" "tab-bar-switch-to-next-tab" "package-lint-current-buffer" "rainbow-mode" "customize-group" "isearch-forward" ...) :predicate #f(compiled-function (x) #<bytecode 0x1fc8c94baa108f>) :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel--info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x :sort t)
  apply(#f(compiled-function (arg1 arg2 &rest rest) "Read a string in the minibuffer, with completion.\n\nPROMPT is a string, normally ending in a colon and a space.\n`ivy-count-format' is prepended to PROMPT during completion.\n\nCOLLECTION is either a list of strings, a function, an alist, or\na hash table, supplied for `minibuffer-completion-table'.\n\nPREDICATE is applied to filter out the COLLECTION immediately.\nThis argument is for compatibility with `completing-read'.\n\nWhen REQUIRE-MATCH is non-nil, only members of COLLECTION can be\nselected.\n\nIf INITIAL-INPUT is non-nil, then insert that input in the\nminibuffer initially.\n\nHISTORY is a name of a variable to hold the completion session\nhistory.\n\nKEYMAP is composed with `ivy-minibuffer-map'.\n\nPRESELECT, when non-nil, determines which one of the candidates\nmatching INITIAL-INPUT to select initially.  An integer stands\nfor the position of the desired candidate in the collection,\ncounting from zero.  Otherwise, use the first occurrence of\nPRESELECT in the collection.  Comparison is first done with\n`equal'.  If that fails, and when applicable, match PRESELECT as\na regular expression.\n\nDEF is for compatibility with `completing-read'.\n\nUPDATE-FN is called each time the candidate list is re-displayed.\n\nWhen SORT is non-nil, `ivy-sort-functions-alist' determines how\nto sort candidates before displaying them.\n\nACTION is a function to call after selecting a candidate.\nIt takes one argument, the selected candidate. If COLLECTION is\nan alist, the argument is a cons cell, otherwise it's a string.\n\nMULTI-ACTION, when non-nil, is called instead of ACTION when\nthere are marked candidates. It takes the list of candidates as\nits only argument. When it's nil, ACTION is called on each marked\ncandidate.\n\nUNWIND is a function of no arguments to call before exiting.\n\nRE-BUILDER is a function transforming input text into a regex\npattern.\n\nMATCHER is a function which can override how candidates are\nfiltered based on user input.  It takes a regex pattern and a\nlist of candidates, and returns the list of matching candidates.\n\nDYNAMIC-COLLECTION is a boolean specifying whether the list of\ncandidates is updated after each input by calling COLLECTION.\n\nEXTRA-PROPS is a plist that can be used to store\ncollection-specific session-specific data.\n\nCALLER is a symbol to uniquely identify the caller to `ivy-read'.\nIt is used, along with COLLECTION, to determine which\ncustomizations apply to the current completion session." #<bytecode 0x1b9d2243fe6c543>) ("M-x " ("snails" "toggle-debug-on-error" "snails-quit" "package-refresh-contents" "centaur-update-packages" "package-reinstall" "global-hl-line-mode" "hl-line-mode" "hi-lock-line-face-buffer" "markdown-toggle-inline-images" "markdown-toggle-fontify-code-blocks-natively" "all-the-icons-ibuffer-mode" "centaur-update" "flycheck-posframe-mode" "package-autoremove" "markdown-toggle-url-hiding" "xwidget-webkit-browse-url" "centaur-webkit-browse-url" "tooltip-mode" "dap-tooltip-mode" "list-processes" "counsel-company" "company-box-mode" "all-the-icons-ivy-rich-mode" "org-tree-slide-mode" "ivy-rich-mode" "org-roam-server-mode" "lsp-pyright-format-buffer" "all-the-icons-ivy-rich-kill-buffer" "list-packages" "doom-modeline-mode" "checkdoc" "lsp-mode" "lsp-update-server" "lsp-organize-imports" "lsp-install-server" "all-the-icons-insert" "package-install" "treemacs-load-theme" "grip-mode" "persp-mode" "describe-char" "org-toggle-link-display" "display-time" "tab-bar-mode" "tab-bar-switch-to-next-tab" "package-lint-current-buffer" "rainbow-mode" "customize-group" "isearch-forward" ...) :predicate #f(compiled-function (x) #<bytecode 0x1fc8c94baa108f>) :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel--info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x :sort t))
  ivy-read("M-x " ("snails" "toggle-debug-on-error" "snails-quit" "package-refresh-contents" "centaur-update-packages" "package-reinstall" "global-hl-line-mode" "hl-line-mode" "hi-lock-line-face-buffer" "markdown-toggle-inline-images" "markdown-toggle-fontify-code-blocks-natively" "all-the-icons-ibuffer-mode" "centaur-update" "flycheck-posframe-mode" "package-autoremove" "markdown-toggle-url-hiding" "xwidget-webkit-browse-url" "centaur-webkit-browse-url" "tooltip-mode" "dap-tooltip-mode" "list-processes" "counsel-company" "company-box-mode" "all-the-icons-ivy-rich-mode" "org-tree-slide-mode" "ivy-rich-mode" "org-roam-server-mode" "lsp-pyright-format-buffer" "all-the-icons-ivy-rich-kill-buffer" "list-packages" "doom-modeline-mode" "checkdoc" "lsp-mode" "lsp-update-server" "lsp-organize-imports" "lsp-install-server" "all-the-icons-insert" "package-install" "treemacs-load-theme" "grip-mode" "persp-mode" "describe-char" "org-toggle-link-display" "display-time" "tab-bar-mode" "tab-bar-switch-to-next-tab" "package-lint-current-buffer" "rainbow-mode" "customize-group" "isearch-forward" ...) :predicate #f(compiled-function (x) #<bytecode 0x1fc8c94baa108f>) :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel--info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x)
  counsel-M-x()
  funcall-interactively(counsel-M-x)
  call-interactively(counsel-M-x nil nil)
  #f(compiled-function (cmd &optional record-flag keys special) "Execute CMD as an editor command.\nCMD must be a symbol that satisfies the `commandp' predicate.\n\nOptional second arg RECORD-FLAG non-nil means unconditionally put\nthis command in the variable `command-history'.  Otherwise, that\nis done only if an arg is read using the minibuffer.\n\nThe argument KEYS specifies the value to use instead of the\nreturn value of the `this-command-keys' function when reading the\narguments; if it is nil, `this-command-keys' is used.\n\nThe argument SPECIAL, if non-nil, means that this command is\nexecuting a special event, so ignore the prefix argument and\ndon't clear it." #<bytecode 0x1afd3f3bd61607c3>)(counsel-M-x nil nil nil)
  ad-Advice-command-execute(#f(compiled-function (cmd &optional record-flag keys special) "Execute CMD as an editor command.\nCMD must be a symbol that satisfies the `commandp' predicate.\n\nOptional second arg RECORD-FLAG non-nil means unconditionally put\nthis command in the variable `command-history'.  Otherwise, that\nis done only if an arg is read using the minibuffer.\n\nThe argument KEYS specifies the value to use instead of the\nreturn value of the `this-command-keys' function when reading the\narguments; if it is nil, `this-command-keys' is used.\n\nThe argument SPECIAL, if non-nil, means that this command is\nexecuting a special event, so ignore the prefix argument and\ndon't clear it." #<bytecode 0x1afd3f3bd61607c3>) counsel-M-x)
  apply(ad-Advice-command-execute #f(compiled-function (cmd &optional record-flag keys special) "Execute CMD as an editor command.\nCMD must be a symbol that satisfies the `commandp' predicate.\n\nOptional second arg RECORD-FLAG non-nil means unconditionally put\nthis command in the variable `command-history'.  Otherwise, that\nis done only if an arg is read using the minibuffer.\n\nThe argument KEYS specifies the value to use instead of the\nreturn value of the `this-command-keys' function when reading the\narguments; if it is nil, `this-command-keys' is used.\n\nThe argument SPECIAL, if non-nil, means that this command is\nexecuting a special event, so ignore the prefix argument and\ndon't clear it." #<bytecode 0x1afd3f3bd61607c3>) counsel-M-x)
  command-execute(counsel-M-x)

重现步骤?我也是Emacs28

我是在macOS上,没有任何配置,直接(require 'snails),然后 M-x snails`. 就看到这个了

从错误看,感觉像 split-window 函数遇到分屏太小的问题,emacs -Q 有问题吗? 是不是你默认Emacs的窗口就很小导致Snails的窗口更小呢?

截图如下,窗口肯定是足够大的。不知道跟什么插件有冲突。

emacs -Q 可以显示,但使用仍然有问题。比如用了display-line-number 会显示行号,在snails窗口中C-x C-b直接显示ibuffer了。。。

行号的样子发给我看一下?