vibe coding 了一个 blame-reveal 包,Fringe 彩色显示 Git Blame

动机是 Emacs git blame 相关的包,对于某个 commit 的代码范围没有明确的边界,让人看着很不直观,所以才有了这个包。(没有对鼠标做支持,欢迎 pr,不打算支持其他弹出显示方式)

下图是超过范围的旧 commit,只有光标移到代码的时候渲染可见范围内的同个 commit 的代码对应的 fringe。

下图是最近的 commit,距离现在一定范围内的 commit 代码对应的 fringe 常亮。

还有的功能可以看下面的总结,或者直接看源码。

核心功能

  1. Fringe 色块显示:在编辑器边缘用彩色竖条显示每行代码的提交信息
  2. 智能着色
    • 最近的 N 个提交用渐变色高亮(越新越明显)
    • 旧提交默认灰色,光标移上去才显示
    • 支持深色/浅色主题自动适配

交互特性

  1. 悬停显示:光标移到某行时,在上方显示完整的提交信息(作者、日期、消息)
  2. 快捷操作(在 blame-reveal-mode 下):
    • q: 退出模式
    • c: 复制 commit hash
    • d: 查看 commit diff
    • s: 查看完整 commit 详情
    • h: 查看文件历史
    • l: 查看当前行的修改历史

性能优化

  1. 增量加载
    • 优先加载可见区域的提交信息
    • 后台分批加载其余提交
    • 滚动时只渲染可见范围
  2. 防抖处理:滚动和主题切换都有延迟处理,避免卡顿

可定制性

  1. 丰富的自定义选项
    • 颜色方案(色相、饱和度、亮度)
    • 显示布局(简洁/紧凑/完整)
    • 高亮的提交数量和时间范围
    • Magit 集成开关
6 个赞

好像还可以,就是我用不太上。把那些成形的功能单独做成包是个好习惯,之前你做的那个meow的中文移动其实也可以用类似的方式单独拿出来,而不是放在配置文件中。

可以的,等过几天弄一下。

独立了 GitHub - LuciusChen/meow-cjk: CJK word segmentation support for Meow modal editing.

2 个赞

跨平台这个不行吗?

后面看看

请问这个包和diff-hl可以同时使用吗?

可以,diff-hl 有 diff-hl-margin-mode,我就在这么用。至于都用 fringe的话我今天有空测试一下。

1 个赞

增加了未提交代码的处理,也加了一些自定义项。目前即使不开启 diff-hl-margin-mode 也可以共用。

1 个赞

去掉了默认的 hl-line 背景了,希望较为清晰突出的可以设置 blame-reveal-display-styleinverse

相对久远的 commits,颜色也是计算出来的,替代原来的灰色,颜色更加统一但有梯度。

之前不断刷新 overlay 确实晃眼,现在改为移动光标不渲染新的,也不清除 overlay,停下来才渲染当前的,清除旧的。 另外还做了一些性能优化。

2 个赞

Readme 里面安装和配置那里是不是有点混乱啦,我直接使用的quick start的配置,另外加了load path。在buffer 里面执行blame-reveal-mode, 效果挺酷的,快捷键也挺方便的。只是还要花一段时间习惯。

哈哈哈,欢迎使用。

今天又做了大文件(根据 blame-reveal-lazy-load-threshold 区分文件大小)异步加载blame,不卡操作。额外还对 overlay 的渲染做了优化,尽量减轻了更新/删除 overlay 时候的闪烁问题。

使用evil时,h、j、k、l是移动光标的按键,请问怎么办?

可以改按键绑定 blame-reveal-mode-map 这个 map

能像idea这样显示吗?我觉得这样更直观一些。

或者nvim的gitsigns这样:

blame.el 这个有实现类似的叫作 margin-overlay,不过没有 blame-reveal 这个颜色。

我不怎么用这种,有明显的缺点,commit msg 显示不会全。(之前尝试兼容margin,有的问题还没解决)。

你要是觉得overlay在代码中扰动(其实最新的提交已经尽量减少扰动了),可以设置 blame-reveal-display-layout'none,用 blame-reveal-show-commit-details 来查看 commit msg。

1 个赞

blame-reveal-display-layout 设置为 'none了,有时候最上面一行还是会显示commit message。

另外,怎么设置让颜色的区分度高,但是亮一些。颜色太像了,不方便一眼区分。

这个问题已经修复了。至于颜色,我看你截图区分还是很明显的,就两个不同的 commits。

颜色的设置解释起来比较复杂。简单来说就是要减少囊括进来常亮的commits,或者增加颜色的上下阈值。可以先试着用下面的。(再严格的话就很多都是不常亮的了,后面会出个文档解释颜色的计算逻辑。)

(setq blame-reveal-gradient-quality 'strict
         blame-reveal-recent-days-limit 'auto)
1 个赞