很久以前我就想整理一个教程来分享自己的 Emacs 配置,但由于缺乏时间和精力,一直未能付诸实践。最近在 tg 群讨论时,发现我摸索的一些配置能实实在在地帮助大家。因此,为了避免一直拖延,我希望在这个帖子中不定期更新,分享我的配置中一些有趣的点 ∠( ᐛ 」∠)_
大佬们如果觉得我分享的内容有可以改善的地方,也欢迎提建议
很久以前我就想整理一个教程来分享自己的 Emacs 配置,但由于缺乏时间和精力,一直未能付诸实践。最近在 tg 群讨论时,发现我摸索的一些配置能实实在在地帮助大家。因此,为了避免一直拖延,我希望在这个帖子中不定期更新,分享我的配置中一些有趣的点 ∠( ᐛ 」∠)_
大佬们如果觉得我分享的内容有可以改善的地方,也欢迎提建议
现代编程语言(尤其是 Lisp 系)充斥了大量括号,为了能够阅读这样的代码,一般推荐用彩虹括号之类的高亮插件。Emacs 有一大批和括号相关的插件,它们之间看起来差不多,但是有一些微妙的区别。这里我推荐几个我在用的相关插件,里面的一些效果和样式是我精心调整的🙈。
整体效果:
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
一个高亮延迟,处于快速移动时的性能考虑设置的。可以自由根据自己电脑调整。
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))
这个没啥好说的,开就完事了,大部分编辑器应该标配了。
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
是我摸索得到的最佳高亮延迟,既不会对性能造成影响,又不会让用户感受到明显拖沓。
注意下面红色和橙色这块
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 中都高亮“当前行”。我觉得这个会干扰我定位高标和行,所以将其关闭。
效果展示:
草,这个是真的有用
建议顺便打开 blink-matching-paren-highlight-offscreen
, 因为这个功能是我塞进去的.
建议colorful-mode代替rainbow-mode,colorful-mode不和hl-mode冲突
刚发现一种拿 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"))))))
一般情况下是够用了
这个适合用来编辑 CSS
这个变量 blink-matching-paren-highlight-offscreen
是哪个包里面的?我怎么找不到呀
这个问题我也遇到了,但是可以设置 hl-line
和 symbol-overlay
的优先级(hl-line-overlay-priority
和 symbol-overlay-priority
)来解决,我是让后者的优先级高于前者。
v30.1 引入的,是内置包,具体哪个忘了…
哦哦,感谢!我还在用29,我说怎么没有
Simple.el
这个我倒是第一次知道
prism试了下,太重了,把原本的高亮全部改写。
这是我最喜欢的 emacs 插件之一!具体见 [推销package] symbol-overlay,同时高亮多个symbol
特别是在没有 LSP 支持的情况下,用作文档内的 renaming 非常方便。它和 isearch 的区别有几点:
(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
开启。