我想分享一下我的emacs配置和学习思路,并向大家介绍一些我觉得有用的package

修复了 ;; (push '(alpha-background . 80) default-frame-alist) 注释就好了

您好,我刚刚使用emacs不久,目前还停留在缝合别人的包的阶段,没自己写过几行elisp。

我想问一下您图片中的

  1. 光标悬停弹出lsp错误信息(比如19楼光标停留在condition的时候会有提示弹出)
  2. lsp给出的整行错误提示(同样是19楼中图片的8,9行左边会有两个红色的!!)

是怎么实现的呢,由于本人实在能力有限,翻阅您个人配置里的init.org中没找到相关的实现,所以只能过来问一问了,多谢!

1和2没啥问题

3,当我只改了init org 或者 改了某一个包的代码
直接执行make的话 是弹出make help 不想全部重新编译 应该怎么操作 感谢大佬

这个是clangd检测出的错误,然后经 eglot 调用 flymake 显示的错误,所有内容其实是由eglot 整合的,所以你从配置里没有看到显示的代码,这也是emacs 生态的一个特点,不同包之前很容易的做到自然协作。你如果对这个感兴趣可以去看看 eglot 的主页,有更详细的说明

对于使用者而言只需要配置好并正确运行 eglot,就可以使用这个错误检测,还可以使用诸如 consult-flymake等命令来浏览错误

如果只是 init.org 你执行 make init-build 就可以了

如果改了某个包的代码比如一个名为 foo 的 package,可以执行 make lib/foo,就可以做到只重新make这个包

其实这些都是 borg 提供的选项,你可以搜索 emacs borg 来看看他的主页文档,写的不错的,对于 emacs 的机制会有更多了解。

从我的经验来说,除了 native comp 对于提前编译比较以依赖之外,正常使用时是否进行字节码编译对速度影响不大,不过borg做了这个我也就用了,带了了很多方便事情(配置中大部分包都不需要显式管理 require了,同时也能阅读一些包的 texinfo)

收到 感谢大佬

呼叫大佬 我加了这个 然后…consult-line的时候 原本buffer的选中区域不会取消…怎么才能取消呀

我没太理解到问题。如果指的是希望在执行consult-line的同时,移除之前选中的区域,那比较简单的做法就是多按一下ctrl-g,或者加一个advice。

从原理上来说,consult-line本身应该是只做了mark的跳转,因此如果执行consult-line之前你先选中了一片区域,这时执行consult-line跳转到另一个地方,中间这片区域就会被选中,这个机制应该和mcfly无关。

关于mark有一个有趣的命令consult-mark,你可以玩玩看(M-x consult-mark,或者在normal模式下执行"g m"),它能帮助你观察mark的历史记录

让我简单解释一下作用

  1. 当前有选中区域的时候 按下快捷键调用 consult-line 会自动插入选中区域到minibuferr中 并搜索 不需要二次出入 提高效率

  2. 当你不需要的时候 可以直接输入自己想要的内容

上面的代码已经实现了 你可以试一试

美中不足的问题就是 c-n c-p 切换搜索结果的时候 不会取消已经选中的区域

我加了 deactive-mark 也不行 不知道为什么

我大概看了一眼代码,你试试下面这个?加在 save-excursion之前

(defun elemacs-mcfly-time-travel ()
  (when (memq this-command elemacs-mcfly-commands)
    (let ((pre-insert-string (with-minibuffer-selected-window
                               (or (seq-some
                                    (lambda (thing) (thing-at-point thing t))
                                    '(region url symbol))
                                   ;; '(symbol url region sexp))
                                   "No thing at point"))))
      (progn
        (deactivate-mark)
        (save-excursion
          (insert (propertize pre-insert-string 'face 'shadow)))))
    (add-hook 'pre-command-hook 'elemacs-mcfly-back-to-present nil t)))

实测还是不行 不知道为啥… 功能是没啥问题 就是不能退出选中区域

操作就是先选中一个区域 然后 按快捷键 consult-line 这时候会自动填充minibuffer并搜索 然后在候选列表移动 上面的选中区域就会跟着一起移动…很难受

确实不行,原因有可能是和meow的expand弄到一起了+。不过如果是symbol 的话,你试试不选中直接 consult-line,应该会默认选择当前的symbol

我猜也是meow的问题

您好,我尝试了一下您的配置,用起来比我自己在doom上缝合的要流畅很多,感谢您的分享。

我有个疑问,我在用您的配置的时候在执行make bootstrap之后会生成一个init.el文件和init-config.el文件,这两个文件应该是根据init.org文件里的内容生成的,但是我看了看Makefile,没有找到对应的org转el的逻辑,这个init.el文件的生成也是borg的功能吗,还是我错过了哪里呢?

是的,我具体解释一下里面发生了什么:

  1. 调用 make bootstrap 也会自动调用make input-build,这个命令是由 borg 提供的
  2. 内部实际执行的命令都是对init .org这个文件调用 emacs 提供的 org-babel-tangle-file。也就是会选择 init.org 文件并tangle 出对应的 .el 文件
  3. 我在 init.org 里面设置了tangle 的规则,这一个文件会生成三个.el文件:

a. 第一个是early-init.el,这个文件会被非常早就加载,用于设置一些ui方面的东西,你可以在 ui speedup 小节下看到这段文字,指明下面代码的tangle 输出文件:

b. 第二个是你看到的init-config.el,它位于整个init.org的顶部,因此作用于整个文件,所有的未显式指明tangle 文件的elisp都会被tangle 到这个文件中

c. 最后一个是你看到的init.el文件,它的作用主要就是加载上述的init-config.el

之所有额外做了一个init-config.el文件,是因为有些setup 的宏不能被 borg编译不然会无法生效。

背后的逻辑其实比较清晰,是如下的加载顺序:

early-init.el → init.el → init-config.el

分别是用于提前ui 配置和加载剩下的配置

谢谢,我懂了,我在 Borg Manual 这一部分找到了tangle的相关说明,感谢

用了几天 感觉不错 充分做到了 感谢楼主…

  1. 配置扁平化
  2. 通过gitsubmodule管理配置 方便更新回退
  3. 通过tangle init.org 注释文档一体

大佬们的配置太复杂了 hack起来没有很好的elisp功底实在费劲