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 diff
当GNU diff
来用,可利用git的新算法获得更好的diff效果。当然不用magit自己手动调命令行也行。但既然Magit把一些UI的功能都做好了,不用白不用。
还没有尝试过speeding-up-magit
,看起来是个不错的可选方案,回头考虑尝试一下。其实遇到性能问题,主要还是Windows系统的锅,在类Unix系统上速度还是可以接受的。
我这边暂时没遇到有卡顿的情况。今天Purcell 已经正式切换到selectrum,同时看到也有一些配置的问题修复,也许你可以参考一下,说不定有帮助。
之前也用selectrum,以为代码不多用很多都是用的emacs自带的东西会很流畅,直到发现prescient 简直卡炸,issue也有不少报告卡的问题,发现还是功能全面又流畅并且开箱即用的ivy好用,,,暂时观望中
Emacs Lisp性能在各操作系统都很稳定。主要是流行插件都喜欢频繁调用命令行进程来刷新UI。Windows的进程太重且文件IO效率低导致UI刷新特别慢。把插件当API集合来用可以绕过这个问题。我给一些插件作者反映过这个问题,不过他们基本都不用Windows了,所以为Windows优化的意愿很低。
试用了一下 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 的内容进行过滤
- 它的过滤只是将匹配的行隐藏掉,
- 并且可以通过 C-u consult-focus-lines 将隐藏的内容再次恢复
- 如果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: 附动图如下:
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
可否录个视频演示下怎么用,感觉文字说明不是很能看懂。
已更新,附上动图
原来如此,谢谢。 我的话就有可能是录宏改了之后一个一个确认。
一个color-rg.el就搞定这些事情了,哈哈哈哈哈
这有一个视频介绍这些东西怎么组合起来的。
用 selectrum 的话,一般会需要和其他的几个 package 搭配使用。 例如 consult 代替 swiper 和 consul 的一些功能,embark 代替 ivy 在 minibuffer 的 action 等等。实际弄起来会多少有点麻烦。。毕竟没有 ivy 方便。
但是长期看可能看好 selectrum 这样的,据说(我也不懂)代码写的好 api 清晰什么的,所以长期看应该会有更多的能力。
终于知道embark怎么用了
求 doom-emacs selectrum配置……
BSAG » Switching to Selectrum for incremental narrowing in Emacs 這裏有個doom-emacs用戶推薦了 Selectrum,但沒有分享配置……
似乎doom 已经有相关的pr了
Reddit 上有人分享了一个基础的使用视频,介绍的很清楚,从配置到常用的命令。
视频地址: orderless, selectrum, prescient, and consult – basic setup
特别喜欢 consult-outline
这个命令,在浏览 org-heading的时候很方便。