straight 的作者开发的类 ivy, helm 插件——selectrum

试试这个?Speeding up magit - Jake McCrary

1 个赞

magit的功能不错,就是弄得太复杂了。

头端时间我用EAF尝试实现Git客户端,主要问题是和Emacs看Diff交互那部分感觉不自然。

我的判断,如果基于libgit2库来重新实现轻量级的Git客户端,性能体验都会比Magit好一点。

magit现在发展的和Helm类似,核心功能很好,但是越搞越复杂了。

有试过 Speeding up magit - Jake McCrary 的加速技巧吗?

我把Magit当api集合来用,所以没有碰到太多性能问题. 功能还蛮强大的,例如

(magit-diff-setup nil (list "--no-index" "--indent-heuristic" "--histogram")
                  nil (list (magit-convert-filename-for-git
                             (expand-file-name "file1"))
                            (magit-convert-filename-for-git
                             (expand-file-name "file2"))))

就是把 git diffGNU diff来用,可利用git的新算法获得更好的diff效果。当然不用magit自己手动调命令行也行。但既然Magit把一些UI的功能都做好了,不用白不用。

2 个赞

感觉 selectrum 很不靠谱,有时会特卡。

现在还没有几个功能。。

还没有尝试过speeding-up-magit,看起来是个不错的可选方案,回头考虑尝试一下。其实遇到性能问题,主要还是Windows系统的锅,在类Unix系统上速度还是可以接受的。

我这边暂时没遇到有卡顿的情况。今天Purcell 已经正式切换到selectrum,同时看到也有一些配置的问题修复,也许你可以参考一下,说不定有帮助。

之前也用selectrum,以为代码不多用很多都是用的emacs自带的东西会很流畅,直到发现prescient 简直卡炸,issue也有不少报告卡的问题,发现还是功能全面又流畅并且开箱即用的ivy好用,,,暂时观望中

Emacs Lisp性能在各操作系统都很稳定。主要是流行插件都喜欢频繁调用命令行进程来刷新UI。Windows的进程太重且文件IO效率低导致UI刷新特别慢。把插件当API集合来用可以绕过这个问题。我给一些插件作者反映过这个问题,不过他们基本都不用Windows了,所以为Windows优化的意愿很低。

2 个赞

试用了一下 embark,在 candidates 多的时候执行 embark-act 都会稍微卡一下,看了一下代码发现, embark-act 里有可能会 sort 所有 candidates 来得到候选项的 category, 感觉完全没必要

似乎距离能够代替 ivy 还需要一段时间

我这个图就是出问题的时候 profile 的结果

分享一个 consult-ripgrep + embark-export+ wgrep+ iedit + consult-focus-lines的工作流 基本等价于 consoul-rg+ivy-occur+wgrep+iedit + hide-lines

通过 embark-export 将 consult-ripgrep 搜过的结果导入一个 grep-mode 的buffer 在这个buffer 中可以通过新加的 consult-focus-lines 继续对grep-mode 的内容进行过滤

  1. 它的过滤只是将匹配的行隐藏掉,
  2. 并且可以通过 C-u consult-focus-lines 将隐藏的内容再次恢复
  3. 如果pattern 以! 开头,则将不匹配的行隐藏掉

这样再使用wgrep+iedit 编辑grep-mode 的内容时,可以将不想编辑的内容过滤掉。

我将上述3个功能,拆分绑定到3个key 上,相应配置可参考如下:

;;;###autoload
(defun consult-hide-lines ()
  (interactive)
  (consult-focus-lines nil (consult--completion-filter 'consult-location nil) "! "))

;;;###autoload
(defun consult-reset-lines ()
  (interactive)
  (consult-focus-lines t))

(defun vmacs-grep-mode-hook ()
  (evil-local-mode)
  (define-key grep-mode-map "g" nil)
  (evil-define-key 'normal 'local "/" #'consult-focus-lines)
  (evil-define-key 'normal 'local "z" #'consult-hide-lines)
  (evil-define-key 'normal 'local "r" #'consult-reset-lines))

(add-hook 'grep-mode-hook 'vmacs-grep-mode-hook)

其中Iedit 跳过隐藏的内容是最近新加的功能,可参见 [feature request] make iedit skip invisible overlays · Issue #121 · victorhge/iedit · GitHub 需要如下设置才生效

  (setq iedit-search-invisible nil)

EDIT: 附动图如下: consult-rg+embark-export+iedit+wgrep+consult-focus-lines

EDIT2: Emacs master 上的xref. 支持在minibuffer里显示候选项 也就是 xref-find-references xref-find-definitions 等跳转到函数定义处时,若有多个侯选项 也支持以上操作,利用embark-export 将其导出到grep-mode ,然后支持wgrep 进行编辑。 而Eglot 的LSP 的实现是兼容xref 的用法的,所以这一套也都能用。

(with-eval-after-load 'xref
  (setq xref-search-program 'ripgrep)     ;project-find-regexp
  (when (functionp 'xref-show-definitions-completing-read)
    (setq xref-show-definitions-function 'xref-show-definitions-completing-read)
    (setq xref-show-xrefs-function 'xref-show-definitions-completing-read)))

EDIT3 consult-focus-lines 这个函数直接就可替代 dired-narrow hide-lines 两个插件,配上orderless 类helm的过滤算法还是很好用的, 另附orderless 的配置

(when (require 'orderless nil t)
  (setq completion-styles (cons 'orderless completion-styles)) ;把orderless放到completion-styles 开头
  ;; 默认按空格开隔的每个关键字支持regexp/literal/initialism 3种算法
  (setq orderless-matching-styles '(orderless-regexp orderless-literal orderless-initialism ))
  (defun without-if-$! (pattern _index _total)
    (when (or (string-prefix-p "$" pattern) ;如果以! 或$ 开头,则表示否定,即不包含此关键字
              (string-prefix-p "!" pattern))
      `(orderless-without-literal . ,(substring pattern 1))))
  (defun flex-if-comma (pattern _index _total) ;如果以逗号结尾,则以flex 算法匹配此组件
    (when (string-suffix-p "," pattern)
      `(orderless-flex . ,(substring pattern 0 -1))))
  (defun literal-if-= (pattern _index _total) ;如果以=结尾,则以literal  算法匹配此关键字
    (when (or (string-suffix-p "=" pattern)
              (string-suffix-p "-" pattern)
              (string-suffix-p ";" pattern))
      `(orderless-literal . ,(substring pattern 0 -1))))
  (setq orderless-style-dispatchers '(literal-if-= flex-if-comma without-if-$!)))

foo bar !far boo, 将匹配foo 和bar ,且不包含far ,且 以flex 算法匹配 foo

9 个赞

可否录个视频演示下怎么用,感觉文字说明不是很能看懂。

已更新,附上动图

原来如此,谢谢。 我的话就有可能是录宏改了之后一个一个确认。 :sweat_smile:

一个color-rg.el就搞定这些事情了,哈哈哈哈哈

这有一个视频介绍这些东西怎么组合起来的。

用 selectrum 的话,一般会需要和其他的几个 package 搭配使用。 例如 consult 代替 swiper 和 consul 的一些功能,embark 代替 ivy 在 minibuffer 的 action 等等。实际弄起来会多少有点麻烦。。毕竟没有 ivy 方便。

但是长期看可能看好 selectrum 这样的,据说(我也不懂)代码写的好 api 清晰什么的,所以长期看应该会有更多的能力。

2 个赞

终于知道embark怎么用了

1 个赞

求 doom-emacs selectrum配置……

BSAG » Switching to Selectrum for incremental narrowing in Emacs 這裏有個doom-emacs用戶推薦了 Selectrum,但沒有分享配置……

1 个赞

似乎doom 已经有相关的pr了

1 个赞

Reddit 上有人分享了一个基础的使用视频,介绍的很清楚,从配置到常用的命令。
视频地址: orderless, selectrum, prescient, and consult – basic setup

特别喜欢 consult-outline 这个命令,在浏览 org-heading的时候很方便。

4 个赞