本文不是介绍vc 及vc-dir 的用法的,我的想法就是,尝试用自带的包替换部分比较大的外部包, 这次心血来潮,想试着替换掉magit, 目前改造还在进行中,处于边试用边调整的阶段, 主要代码在这3个配置文件中:
支持Unpulled/Unpushed/Recent的主要放在 vcgit.el
中
vcgit.el
vc-dir log-view等的keybinding 配置等在 conf-vc.el
其他一些lazy load 的命令: lazy-vc.el
目前我已实现的功能是:
- 将Unpushed/Unpulled 的commit 插入到vc-dir 中,且能对这些commit 进行diff/rebase/revert等操作
- vc-dir 中借助outline-minor-mode 可以支持tab键折叠,header间 前进后退,可以在文件或commit上 tab键 查看diff( 在diff-mode即可)
- 可以只提交部分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 提交失败。
- 在 log-view-mode 中可以对commit 进行revert/reset/rebase/diff 等操作
- M-n/M-p 遍历当前文件的历史,其实可以用git-timemachine 来替代,但我还是用vc中的代码又实现了一 遍
- 在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等,
通过自来的which-key 也可以实现 magit 的 bb/ff/pp/ll 等keybinding, 唯一少的功能是无法动态调整一些开关但这恰好是我很少用的的
Edit: 目前插入到vc-dir 中的commit 已经可以进行着色,效果还不错。见上面更新的动图