【求助】magit 能不能以文件树和实时diff的形式 stage| magit stage by file tree with diff follow

上面是 lazygit, 他的布局是左边文件树,右边该文件/文件夹 的diff

magit 是否原生支持这样的布局,或者如何实现呢?

magit确实没太用过,以前用ztreediff 还行,估计改改可以接入

我也需要这样的功能,等高手

应该不支持。
magit 这种只有上下一维,再加上左右的话不是很好控制。
如果你想 diff 单个文件可以在 buffer 里使用 magit-diff-buffer-file

巧了,前几天刚刚想到可以用 dirvish 来做这个。 根据题主的描述试着写了一下,发现在 dirvish 的架构下写一个刚刚够用的版本并不难。

Peek 2022-01-18 20-07

解释一下图里的操作 (窗口太小不好意思,太大的话 4m 录不完) :

  • dirvish-diff : 打开一个 diff 模式的 dirvish
  • 光标下文件的diff 会自动展示,如果标记了多个文件,会合并展示。
  • dirvish-magit-[un]stage-files 用来 stage/unstage 当前标记的文件。无标记则默认当前光标下的文件。

有兴趣可以试试。刚刚推送到 feature/menu 这个分支。

https://github.com/alexluigit/dirvish

2 个赞

设计思路完全不同,要magit支持这一的layout有难度。magit本身的使用非常好了,个人觉得没有必要。

1 个赞

感觉有点像ztree-diff

这也是我使用 magit 过程中的痛点之一。magit 的界面大部分时候是高效好用的,就是有时候我想要「鸟瞰」一下整个项目,哪里有修改,哪里有新文件之类的。这个时候就希望能以树状结构扫一眼整个项目。

Peek 2022-03-23 20-47

还是解释一下图里的操作:

我先用 dirvish-side 打开了一个 Dirvish 边栏,这里已经提供了文件的基本 git 信息。 此时我想进一步的浏览文件的 diff, 于是我用 dirvish-toggle-fullscreen 进入全屏, diff 信息会在预览窗口显示,其他操作和我在 5 楼所说的一样。浏览完以后我再次 dirvish-toggle-fullscreen 退出了全屏。我个人觉得这是一个比较好的方案,因为这个过程中除了最大化看 diff 的操作,其他时间里 magit 的 buffer 还是可见的,对 magit 的工作流几乎没有影响。有的朋友会喜欢把这个边栏常驻,那就更没什么影响了,组合起来比 vscode 和 lazygit 之类的好用的多。

dirvish-side 的相关设置如下。

(setq dirvish-side-attributes (append '(vc-state git-msg) dirvish-attributes))
(setq dirvish-side-preview-dispatchers (append '(vc-diff) dirvish-preview-dispatchers))
2 个赞