分享一下我用自带的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 已经可以进行着色,效果还不错。见上面更新的动图

6 个赞

你可以看看这个老哥:

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

2 个赞

支持, magit 太重了

简单配置一下, 已经用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 个赞