(不定期更新)个人配置分享

很久以前我就想整理一个教程来分享自己的 Emacs 配置,但由于缺乏时间和精力,一直未能付诸实践。最近在 tg 群讨论时,发现我摸索的一些配置能实实在在地帮助大家。因此,为了避免一直拖延,我希望在这个帖子中不定期更新,分享我的配置中一些有趣的点 ∠( ᐛ 」∠)_

大佬们如果觉得我分享的内容有可以改善的地方,也欢迎提建议

18 个赞

1 括号高亮 / 当前行高亮

现代编程语言(尤其是 Lisp 系)充斥了大量括号,为了能够阅读这样的代码,一般推荐用彩虹括号之类的高亮插件。Emacs 有一大批和括号相关的插件,它们之间看起来差不多,但是有一些微妙的区别。这里我推荐几个我在用的相关插件,里面的一些效果和样式是我精心调整的🙈。

整体效果:

1.1 show-paren-mode

show-paren-mode 是 emacs 自带的一个括号高亮包,它的作用是「高亮光标所在处的括号」 。下面是我的配置。

(use-package paren
  :custom-face (show-paren-match ((t (:foreground "SpringGreen3" :underline t :weight bold))))
  :config
  (setq show-paren-when-point-inside-paren t
        show-paren-when-point-in-periphery t
        show-paren-context-when-offscreen t
        show-paren-delay 0.2)
  )

这里我用 custom-face 更改了高亮的样式,将它显示为(高亮绿,下划线,加粗),这样能够凸显它的高亮和后面几个插件明显区分开来。

此处我还配置了几个选项:

show-paren-when-point-inside-paren

插件默认会高亮 (xxx)|后面 | 都表示光标)的括号,这个选项会允许在 (xxx|) 的情况下,也高亮这个括号。

show-paren-context-when-offscreen

当括号体太长,以至于无法显示在一页屏幕上时。如果高亮括号,则同时在 echo area 打印这个括号匹配的那一行内容(注意下面的 matches ...,它是这个括号所匹配的那一行的内容)

show-paren-delay

一个高亮延迟,处于快速移动时的性能考虑设置的。可以自由根据自己电脑调整。

效果展示:

6 个赞

1.2 彩虹括号 rainbow-delimiters

;; [rainbow-delimiters] Highlight brackets according to their depth
(use-package rainbow-delimiters
  :straight t
  :hook ((prog-mode conf-mode yaml-mode) . rainbow-delimiters-mode)
  :config
  (setq rainbow-delimiters-max-face-count 5))

这个没啥好说的,开就完事了,大部分编辑器应该标配了。

1.3 highlight-parentheses

这个插件看上去会很像 show-paren-mode,它们俩的区别在于 show-paren-mode 要求光标紧挨着括号,highlight-parentheses 没这个要求。

(use-package highlight-parentheses
  :straight t
  :hook ((minibuffer-setup . highlight-parentheses-minibuffer-setup)
         (prog-mode . highlight-parentheses-mode))
  :config
  (setq highlight-parentheses-colors '("firebrick1" "firebrick3" "orange1" "orange3")
        highlight-parentheses-attributes '((:underline t) (:underline t) (:underline t))
        highlight-parentheses-delay 0.2)
  )

在配置上,为了区分 show-paren-mode,我给 highlight-parentheses 安排了鲜艳且温暖的配色(highlight-parentheses-colors),同时给它们都加上了下划线的效果(highlight-parentheses-attributes)。

同样出于性能考虑,这里设置了 0.2s 的延迟(highlight-parentheses-delay)。0.2 是我摸索得到的最佳高亮延迟,既不会对性能造成影响,又不会让用户感受到明显拖沓。

效果展示

注意下面红色和橙色这块

1 个赞

1.4 高亮当前行 hl-line

hl-line 也是一个自带的高亮插件,作用是高亮当前行,应该大部分人都开了。这里主要是分享我在长期使用过程中发现 hl-line 的一些问题,以及解决方案。

默认配置下的 hl-line 会直接改变背景色,但是这会和 rainbow-mode 之类的插件冲突:hl-line 会覆盖 rainbow-mode 修改的背景颜色。colors - Combine highlight-symbol-mode and hl-line-mode - Emacs Stack Exchange 上也提出了这个问题。这个问题的回答提出了使用 overlay 代替“直接修改背景色”,规避冲突的问题。

但是方法这个又带来的新的冲突问题,即 hl-line 的 overlay 和 symbol-overlay 之类的插件冲突,覆盖当前行的 overlay。至此,这似乎陷入了一个两害相权取其轻的情况😂,那有没有更好的方案呢?

首先考虑我们为什么需要 hl-line,答案是用来突出显示光标所在行。只要能达成这个目标,就无所谓高亮的效果了。因此我采用的折中方案是【只高亮当前行末尾的空白区域】,这样就避免了 hl-line 和有内容的部分的冲突

(use-package hl-line
  :hook (after-init . global-hl-line-mode)
  :config
  (setq hl-line-sticky-flag nil)
  ;; Highlight starts from EOL, to avoid conflicts with other overlays
  (setq hl-line-range-function (lambda () (cons (line-end-position)
                                           (line-beginning-position 2)))))

这里我还将 hl-line-sticky-flag 设置为 nil。当窗口中有“多个 window”显示“同一 buffer”的“同一区域” 时,这个选项会在所有 window 中都高亮“当前行”。我觉得这个会干扰我定位高标和行,所以将其关闭。

效果展示:

10 个赞

草,这个是真的有用

2 个赞

建议顺便打开 blink-matching-paren-highlight-offscreen, 因为这个功能是我塞进去的.

2 个赞

建议colorful-mode代替rainbow-mode,colorful-mode不和hl-mode冲突

1 个赞

彩虹括号 rainbow-delimiters 性能好像是不佳,有一个替代品可以试试
https://github.com/alphapapa/prism.el

1 个赞

刚发现一种拿 org 的 tangle/noweb/变量 来管理一些 json,conf 这种配置文件的简单方法:

(with-eval-after-load 'ob-org
    (dolist (l '("conf" "json" "text" "yml"))
      (dolist (f '("org-babel-expand-body"
                   "org-babel-execute"))
        (defalias (intern (format "%s:%s" f l))
          (intern (concat f ":org"))))))

一般情况下是够用了

image

1 个赞

@SPQR 感谢,colorful-mode 太帅了!

@jacksoncy 这个包也很有趣,不过它和 rainbow-delimiters 目标似乎不太一样,我先花点时间探索一下

1 个赞

这个适合用来编辑 CSS

这个变量 blink-matching-paren-highlight-offscreen 是哪个包里面的?我怎么找不到呀

这个问题我也遇到了,但是可以设置 hl-linesymbol-overlay 的优先级(hl-line-overlay-prioritysymbol-overlay-priority)来解决,我是让后者的优先级高于前者。

2 个赞

v30.1 引入的,是内置包,具体哪个忘了…

哦哦,感谢!我还在用29,我说怎么没有 :rofl:

Simple.el

1 个赞

这个我倒是第一次知道

prism试了下,太重了,把原本的高亮全部改写。

试了一下 prism.el,感觉还可以,我先试用一段时间

2 符号高亮 symbol-overlay

这是我最喜欢的 emacs 插件之一!具体见 [推销package] symbol-overlay,同时高亮多个symbol

特别是在没有 LSP 支持的情况下,用作文档内的 renaming 非常方便。它和 isearch 的区别有几点:

  • 可以同时高亮多个 symbol
  • 能在多个 symbol 之间快速跳转
  • 它的高亮是 persistent 的
  • 支持临时高亮,即 cursor 放在 symbol 上可以直接高亮它
(use-package symbol-overlay
  :straight (:host github :repo "roife/symbol-overlay" :branch "master")
  :bind (("C-c s i" . symbol-overlay-put)
         ("C-c s n" . symbol-overlay-switch-forward)
         ("C-c s p" . symbol-overlay-switch-backward)
         ("C-c s c" . symbol-overlay-remove-all)
         :map symbol-overlay-map
         ;; `meow`
         ("h" . nil)
         ("q" . nil)
         ("i" . nil)
         ("R" . symbol-overlay-query-replace)
         ("?" . symbol-overlay-map-help)
         ("c" . symbol-overlay-put)
         ("C" . symbol-overlay-remove-all))
  :hook (((prog-mode yaml-mode) . symbol-overlay-mode))
  :config
  (setq symbol-overlay-temp-highlight-on-region t)
  )

这里我将它的快捷键都放在 C-c s 的命名空间下。C-c 是 Emacs 留给用户自定义的命名空间,s 表示 symbol,方便记忆。同时为了能够和 meow / evil 之类的模式编辑插件一起用,这里我把模式编辑下常用的快捷键(h 等)给 unbind 了。

另外我这里使用的 symbol overlay 是一个自己魔改的、支持「选中区域临时高亮」的版本。目前 symbol-overlay 的临时高亮只支持 symbol,我为它添加了类似 VS Code 等编辑器中「高亮选中区域内容」。我觉得这是个很好用的特性,但是 maintainer 觉得它和项目发展理念不符就 close 掉了🤣 所以我自己维护了一个仓库 roife/symbol-overlay,可以用 symbol-overlay-temp-highlight-on-region 开启。

效果预览

6 个赞