Emacs查看代码diff时如何开启对应语言的语法高亮?
默认Diff模式下仅展示行级状态配色、隐藏代码本身语法高亮的问题,可通过以下几种配置实现类似GitHub的「diff状态背景+原生语法高亮」共存效果:
方案1:使用Emacs原生支持(推荐,Emacs 27及以上版本可用)
Emacs 27版本后已内置diff区域内嵌代码的语法高亮能力,无需安装第三方包,直接在Emacs配置文件(~/.emacs或~/.emacs.d/init.el)中添加如下配置即可:
;; 开启diff hunk区域内的代码语法高亮 (setq diff-font-lock-syntax 'hunk-also) ;; 将Ruby模式加入diff语法高亮支持的语言列表 (add-to-list 'diff-font-lock-syntax-modes 'ruby-mode)
添加后可直接选中配置代码执行M-x eval-region即时生效,或重启Emacs。后续打开Ruby代码的diff时,新增行绿底、删除行红底的标识会保留,同时Ruby的关键字、字符串、方法名等语法元素会自动加载ruby-mode对应的专属配色。
方案2:Magit用户直接开启内置配置
如果日常使用Magit做Git操作,不需要额外安装其他包,直接添加一行配置即可在Magit的所有diff视图中启用语法高亮:
;; 开启Magit diff视图的代码语法高亮 (setq magit-diff-highlight-syntax t)
该配置对Magit的暂存区diff、提交记录diff、文件对比diff全场景生效,高亮匹配逻辑和GitHub展示逻辑完全一致。
方案3:低版本Emacs兼容方案
如果使用Emacs 27以下版本,可安装第三方扩展diff-syntax,安装完成后添加如下配置全局开启即可:
(global-diff-syntax-mode 1)
该扩展会自动根据diff块对应的文件后缀匹配对应语言的编辑模式,加载对应语法高亮规则,不会覆盖diff本身的行级状态背景标记。
排错提示:如果配置完成后diff区域文字还是全浅灰色,检查当前使用的主题是否强制覆盖了diff区域的文字颜色属性。部分老旧主题会给
diff-added、diff-removed、diff-context这几个face设置固定的浅灰色前景色,这种情况可以自定义这几个face,将:foreground属性设为unspecified,就能让语法高亮的文字颜色正常显示。
内容的提问来源于stack exchange,提问作者Scott Jacobsen

