本文不是介绍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 已经可以进行着色,效果还不错。见上面更新的动图
6 个赞
org
2
你可以看看这个老哥:
他还做了一个no external packages的配置
2 个赞
简单配置一下, 已经用vc替代magit了。
.emacs.d/lisp/mavc.el at main · ltylty/.emacs.d
(use-package vc :defer t
:config
(defun vc-dir-next-and-diff ()
"移动到下一行并显示当前文件的 diff,同时保持光标在列表。"
(interactive)
(vc-dir-next-line 1)
(save-selected-window
(vc-diff)))
(defun vc-dir-prev-and-diff ()
"移动到前一行并显示当前文件的 diff,同时保持光标在列表。"
(interactive)
(vc-dir-previous-line 1)
(save-selected-window
(vc-diff)))
(defun vc-dir-quick-commit-all ()
"标记所有已跟踪且修改过的文件并进入提交界面"
(interactive)
(vc-dir-unmark-all-files 1)
(dolist (state '(edited added removed))
(vc-dir-mark-state-files state))
(let ((files (vc-dir-marked-files)))
(if files
(vc-next-action nil)
(message "No files to commit"))))
(with-eval-after-load 'vc-dir
(define-key vc-dir-mode-map "e" 'vc-ediff)
(define-key vc-dir-mode-map "d" 'vc-diff)
(define-key vc-dir-mode-map "k" 'vc-revert)
(define-key vc-dir-mode-map "c" 'vc-dir-quick-commit-all)
(define-key vc-dir-mode-map (kbd "<tab>") 'vc-dir-next-and-diff)
(define-key vc-dir-mode-map (kbd "<backtab>") 'vc-dir-prev-and-diff)
(define-key vc-dir-mode-map "F" 'vc-pull)))
(use-package consult-vc-modified-files :ensure t :defer t)
1 个赞