(闲聊)2024 年,大家删了什么包?加了什么包?哪些包让你印象深刻?

印象比较深的是 dogear 这个包。

1 个赞
  1. 移除 expand-region.el, 因为在org大文件使用非常卡, 基本不可用, 现在使用 expreg.el 替代, 小巧快速但依赖treesit.el(没有也可以使用)
  2. 移除 cape.el 补全, 很多补全都没用过, 唯一使用的就是的就是org中的src的emacs-lisp补全, 其实直接添加: (add-to-list 'completion-at-point-functions #'elisp-completion-at-point) 就可以补全了
  3. 移除 bookmark-in-project.el 基本没有过 bookmark 这个功能
  4. 移除 breadcrumb.el (面包屑), 忘记了有个bug, 直接导致打开某种文件类型无法正常打开
  5. 移除 vundo.el, 用处不大, 直接 C-x u 加 undo-fu 就够用了
  6. 移除 perfect-margin.el 居中窗口, 移除是因为有时切换至 minibuffer 时, 窗口大小随机变换, 移除后居然我也能适应不居中观看
  7. 移除 elfeed, 改用 follow 软件了
  8. 移除 org-journal, 自定义一个 org-capture tempel 就够用了
  9. 添加了自己做的 dict-line.el 自动离线查英语单词, 嘎嘎爽
  10. 添加了 treesit-fold 代码折叠
4 个赞

这是我日常浏览代码过程里最常用的动作了,刚好你问到我就详细描述一下,不知道其他道友是否有更好的推荐,歪楼了😆

1 个赞

从 lsp-mode 换到了 eglot,没了~~

把 copilot.lua 和 codeium.nvim 删掉了,换成了自己写的插件直接用 curl 调用 llm 的 API 负责代码补全,以及 aider.chat 配合 vterm (不用 comint 主要是为了 vterm 的高亮)用作 chat 助手和 ai 帮忙写代码的工具。

闪退可以详细说一下吗? 哈哈哈哈

@manateelazycat 懒猫大大,关于这个问题我已经好好查了下,原来就是开了matlab-language-server的锅;同样的它也会让eglot卡死、让ivy对completion-at-point的托管变的奇奇怪怪。

所以不是您的lsp-bridge的问题哈,纯纯这个ls开发真心是充满了matlab“特色”。我已经放弃这个ls了,用了大半年,matlab-ls基本没啥帮助,跳转、补全多个文件中的变量,都没有基于tags的citre优秀,各种不工作;至于补全matlab库函数基本没啥意义。

这个问题完结撒花~

2 个赞
(after! vertico
  ;; vertico-repeat
  (map! :map vertico-map
        "C-," #'vertico-repeat-previous
        "C-." #'vertico-repeat-next)
  ;; vertico-suspend
  (map! :g "C-'" #'vertico-suspend)

  ;; For Embark user: avoid adding redundant repeat history after `embark-act'.
  (defun vertico-repeat--filter-explicit (session)
    (and (cadr session) (eq this-command real-this-command) session))

  ;; 1. Remove `vertico-repeat--filter-empty' (one could even repeat empty input vertico session).
  ;; 2. Remove `execute-extended-command' (one could even repeat `M-x' vertico session).
  (setq vertico-repeat-transformers '(vertico-repeat--filter-commands vertico-repeat--filter-explicit))
  (setq vertico-repeat-filter '(vertico-repeat vertico-repeat-select))

  ;; To preserve the order of candidate, back up the minibuffer/command history.
  ;; Cause vertico use those history to sort the candidates.
  (defvar minibuffer-history-repeat-backup minibuffer-history)
  (defvar extended-command-history-repeat-backup extended-command-history)
  (add-hook! 'minibuffer-setup-hook
    (setq minibuffer-history-repeat-backup minibuffer-history)
    (setq extended-command-history-repeat-backup extended-command-history)
    (setq face-name-history-backup face-name-history))

  ;; Advice `vertico-repeat' to respect those backed up history,
  ;; so order of candidate is preserved.
  (define-advice vertico-repeat
      (:around (orig &rest arg) history)
    (let ((minibuffer-history minibuffer-history-repeat-backup)
          (extended-command-history extended-command-history-repeat-backup)
          (face-name-history face-name-history-backup)
          (consult-async-split-styles-alist
           (mapcar (lambda (plist) (cons (car plist) (consult--plist-remove '(:initial) (cdr plist))))
                   consult-async-split-styles-alist)))
      (apply orig arg))))

我发现前辈说的有道理,我示范的操作只是一个命令而已(+vertico/embark-preview),而我们希望的是无论执行什么命令,总之在关闭 vertico session 后,万一紧接着又想调回来时,能一模一样(选中候选项,保持顺序)地召唤回来。

我研究了一下,发现 vertico-repeat 的原理,就是:每次退出 minibuffer 时,记录一下执行的命令已键入的内容以及当前选中的候选项

而顺序会变,是因为 vertico 用历史命令来排序,每次使用 vertico 后,刚刚选中的候选项就被压入历史命令了,那么下次再开启 vertico,它自然就在第一个了。

所以可以每次打开 vertico 时,备份一下当前的历史记录,在 vertico-repeat 时,用这个备份的历史记录,那么就不会丢失排位了。

(具体实现过程如上面代码所示)

演示如下(可以暂停来看,右侧为键入的命令记录): output

无论是完成了 vertico session 还是中间 abort 了,都是可以恢复的。

但是这些 vertico session 的招出都是即时的(候选项几乎是瞬间出来),但有些 vertico session 是异步的(比如 consult-ripgrep),这些往往是 vertico session 已经出来了,但是候选项需要等一会才有。

这个时候就有点小问题,因为 vertico-repeat 只能恢复该 session 的命令和已经键入的内容,但是无法自动选中当时的候选项(因为候选区还是空白的,当然无法选中了!)。所以我取了个巧,就是对于这种异步的 vertico session,可以在候选区出现后,再多按一次 vertico-repeat-previous (见代码的键绑定),这样就有可以恢复选中曾经的候选项了,效果见下: output

10 个赞

好厉害,这个看起来简直就和我想要的ivy-resume一模一样!晚点抄过去试试效果😄

哈哈哈, got it, 感谢反馈。 :wink:

超赞的,觉得可以专门另外一贴

M-x consult-buffer 就包括了 buffer 和 recentf 吧,见 consult-buffer-sources

配置启用treesit完毕,不过感觉现在除了语法高亮,基于treesit的生态还没起来,似乎可以基于它的parsing造很多有用的插件。

暂时它对我的作用只有语法高亮,imenu 现在基于它有点用了。它倒是让我修了半天配置兼容bug,还好我只用C++和Python,施工量不大。

各位大大,treesitter还有什么妙用么


自问自答一波:

  1. 用treesit实现expand-region可以更可心 :smiley: (已融入epxand-region包,更新到最新版即可)

(注:从站内这个帖子找过去了,github后面有人提供了个新版本)

2 个赞

meow用户表示,GitHub - skissue/meow-tree-sitter: Tree-sitter powered motions for Meow 🐱 这个和meow结合来用是个用法,其实还有其他的包,但我用不上。

1 个赞

关于第二点弃用 tramp 是有类似的方案了吗?还是干脆 ssh 上去执行 emacs 呢。我现在还是本地 GUI tramp 远程,一般开发还行,主要是 magit 特别慢

我是直接ssh过去,用TUI的emacs。画图什么的用vscode. Tramp我用起来还是有点卡顿,可能也是自己没有配置好tramp。

2 个赞

删除了

  • emms
  • org-noter
  • org-roam

想删但没能完成删除的

  • pdftools

加了一些自制的包

  • orb (org元信息存sqlite,整合了自制的缩水版org-roam, org-noter,支持org-agenda查询用sqlite,只是速度并没有提升 :joy:)
  • ssp (配合orb使用的播放器,方便记笔记)

新加了ellama这个包,以及自己写的几个包。

删除了一些无关紧要的,但是具体也忘了。

常用的还是习惯了的那些:ivy,company,pyim,orgmode等

删除了 evil,很多其他插件并没针对 evil 的优化

没装几个包,但是重用了自带的 viper 和 follow。

viper 主要用来扩展快捷键,以及自带了个 buffer 专用 keymap。

follow 一页看百多行挺爽的,本来是用来 nov 看小说的,后来发现看代码也爽。

写了个小函数用来自动根据 fill-column 裂窗口,或许绑一下 buffer 快捷键。

(defun zr-follow-current-window (&optional arg)
  "Follow the window."
  (interactive "P")
  (pcase arg
    ('(4) (delete-other-windows))
    ((and `(,state . ,keymap)
          (guard (memq state '(vi-state insert-state emacs-state))))
     (viper-add-local-keys state keymap)))
  (let* ((window-width (window-text-width))
         (split-cnt (1- (/ window-width fill-column)))
         (single-width (/ window-width (1+ split-cnt))))
    (dotimes (i split-cnt)
      (split-window nil (* (- split-cnt i) single-width) t))
    (follow-mode 1)))

(with-eval-after-load 'viper
  (bind-keys
   :map zr-global-prefix-map
   ("F" . zr-follow-current-window)))
2 个赞

看起来很不错,后面试试,还是第一次知道这个内置包。