分享一下我用自带的vc mode 替代magit 的内容

本文不是介绍vc 及vc-dir 的用法的,我的想法就是,尝试用自带的包替换部分比较大的外部包, 这次心血来潮,想试着替换掉magit, 目前改造还在进行中,处于边试用边调整的阶段, 主要代码在这3个配置文件中:

支持Unpulled/Unpushed/Recent的主要放在 vcgit.elvcgit.el

vc-dir log-view等的keybinding 配置等在 conf-vc.el

其他一些lazy load 的命令: lazy-vc.el

目前我已实现的功能是:

  1. 将Unpushed/Unpulled 的commit 插入到vc-dir 中,且能对这些commit 进行diff/rebase/revert等操作
  2. vc-dir 中借助outline-minor-mode 可以支持tab键折叠,header间 前进后退,可以在文件或commit上 tab键 查看diff( 在diff-mode即可)
  3. 可以只提交部分hunk, (这是vc已经支持的功能) vc 也可以实现类似的功能,先产生一个diff-mode 的buffer ,然后通过编辑diff-mode 如通过M-k 删除一个hunk ,C-cC-s 分隔一个hunk 从而更精细的只提交某一部分hunk 然后在这个diff-mode 中进行C-xvv 即可只提交diff-mode 中的变更 这部分需要注意对 vc-git-diff-switches 的修改有可能导致C-xvv 提交失败。
  4. 在 log-view-mode 中可以对commit 进行revert/reset/rebase/diff 等操作
  5. M-n/M-p 遍历当前文件的历史,其实可以用git-timemachine 来替代,但我还是用vc中的代码又实现了一 遍
  6. 在diff-mode 中 可以tab折叠hunk/file 等(diff-mode配合outline-minor-mode)就可实现

目前实现的效果如下图:

已经能将 Unpulled/Unpushed 的log 放进vc-dir 中了,且可以使用log-view-mode 中的keybinding 对这部分 commit 进行操作,如rebase/reset/revert/rebase -i/diff等, record_2025-04-05-22-32-25

通过自来的which-key 也可以实现 magit 的 bb/ff/pp/ll 等keybinding, 唯一少的功能是无法动态调整一些开关但这恰好是我很少用的的

Edit: 目前插入到vc-dir 中的commit 已经可以进行着色,效果还不错。见上面更新的动图

4 个赞

你可以看看这个老哥:

他还做了一个no external packages的配置

2 个赞

支持, magit 太重了