Single tabpage interface for easily cycling through diffs for all modified files for any git rev.
| Files | Last commit | Last update |
|---|---|---|
| 2 years ago | ||
| 2 years ago | ||
| 2 years ago | ||
| 3 years ago | ||
| 2 years ago | ||
| 2 years ago | ||
| 4 years ago | ||
| 2 years ago | ||
| 5 years ago | ||
| 2 years ago | ||
| 2 years ago | ||
| 2 years ago | ||
| 3 years ago |
Diffview.nvim
单个标签页界面,用于轻松浏览所有修改文件的差异,适用于任何git修订版本。

介绍
Vim的差异模式相当好,但没有方便的方法快速用diffsplit打开所有已修改的文件。这个插件旨在提供一个简单统一的单个标签页界面,让你可以轻松查看任何git修订版本的所有更改文件。
要求
- Git ≥ 2.31.0(针对Git支持)
- Mercurial ≥ 5.4.0(针对Mercurial支持)
- Neovim ≥ 0.7.0(带LuaJIT)
- nvim-web-devicons(可选)用于文件图标
安装
使用你的包管理器安装该插件。
" 插件
Plug 'sindrets/diffview.nvim'
-- Packer
use "sindrets/diffview.nvim"
合并工具

在合并或变基期间打开差异视图,会列出冲突文件的单独部分。当打开一个冲突文件时,它将以三向差异方式打开,允许您在一个包含目标分支版本上下文的环境中解决合并冲突,以及从正在合并的分支中获得的版本。
三向差异仅是默认的合并冲突布局。还有多种此布局的变体,四向差异布局和单窗口布局可供选择。
除了常规的:h copy-diffs映射,还提供了默认的映射,用于在冲突标记之间跳转,直接从任何差异缓冲区获取补丁,并接受由冲突区域给出的文件的任意版本、全部或无版本。
有关合并工具、映射、布局及其配置的更多信息,请参阅:
:h diffview-merge-tool:h diffview-config-view.x.layout
文件历史

文件历史视图使您可以列出影响给定路径的所有提交,并在一个差异分割中查看所做的更改。这是一个git-log的高级接口,支持其许多选项,例如:
- 搜索提交消息和作者以过滤提交。
- 跟踪多文件中指定行范围的演变。
- 只列出特定提交范围、分支或标签的更改。
- 通过重命名追踪文件变化。
通过以下方式开始文件历史查看:
- 当前分支:
:DiffviewFileHistory - 当前文件:
:DiffviewFileHistory %
要了解更多信息,请参见:h :DiffviewFileHistory。
使用方法
:DiffviewOpen [git rev] [选项] [ -- {paths...}]
不带参数调用:DiffviewOpen将打开一个新的Diffview,与当前索引进行比较。您也可以提供任何有效的git修订号来只查看那个修订号的更改。
示例:
:DiffviewOpen:DiffviewOpen HEAD~2:DiffviewOpen HEAD~4..HEAD~2:DiffviewOpen d4a7b0d:DiffviewOpen d4a7b0d^!:DiffviewOpen d4a7b0d..519b30e:DiffviewOpen origin/main...HEAD
还可以提供额外的路径来缩小显示的文件范围:
:DiffviewOpen HEAD~2 -- lua/diffview plugin
要了解更多附加[options]的信息,请访问文档。
为了方便起见的其他命令:
:DiffviewClose:关闭当前的差异视图。您也可以使用:tabclose。:DiffviewToggleFiles:切换文件面板。:DiffviewFocusFiles:将焦点转移到文件面板。:DiffviewRefresh:更新当前Diffview中的统计信息和文件列表条目。
在打开Diffview并且使用默认按键绑定时,您可以使用<tab>和<s-tab>循环浏览更改的文件(请参阅配置以更改键绑定)。
提交
可以通过编辑代表索引的任何缓冲区(在运行:DiffviewOpen且未提供[git-rev]之后,“更改”下的条目将在左侧显示索引缓冲区,而“已提交更改”的条目将在右侧显示)来逐个提交补丁。一旦写入索引缓冲区,索引就会更新。
:[range]DiffviewFileHistory [paths] [options]
打开一个新的文件历史视图,列出对给定路径产生影响的所有提交。这是git-log的高级接口。[paths]和[options]可以按任意顺序提供,甚至可以交替使用。
如果没有提供[paths],则默认为工作树顶层。尽可能从当前缓冲区推断顶层,否则使用当前工作目录。可以提供多个[paths],并且支持git路径规范。
如果给出了[range],文件历史视图将在当前文件的给定范围内跟踪行的演变(更多信息,请参阅文档中的-L标志)。
示例:
:DiffviewFileHistory:DiffviewFileHistory %:DiffviewFileHistory path/to/some/file.txt:DiffviewFileHistory path/to/some/directory:DiffviewFileHistory include/this and/this :!but/not/this:DiffviewFileHistory --range=origin..HEAD:DiffviewFileHistory --range=feat/example-branch:'<,'>DiffviewFileHistory
[!重要]
熟悉
:h diff-mode此插件假定你已经熟悉了nvim内置的差异模式所提供的所有功能,包括:
- 在补丁之间跳跃(
:h jumpto-diffs)。- 应用来自任何差异缓冲区的补丁的更改(
:h copy-diffs)。- 更多...
阅读帮助页面以了解更多信息。
[!注意] 还请参阅USAGE,其中有一些更具体用途的例子。
配置
带有默认值的示例配置
-- Lua
local actions = require("diffview.actions")
require("diffview").setup({
diff_binaries = false, -- 显示二进制文件的差异
enhanced_diff_hl = false, -- 查看 |diffview-config-enhanced_diff_hl|
git_cmd = { "git" }, -- git可执行文件后面跟着默认参数。
hg_cmd = { "hg" }, -- hg可执行文件后面跟着默认参数。
use_icons = true, -- 需要nvim-web-devicons
show_help_hints = true, -- 显示如何打开帮助面板的提示
watch_index = true, -- 当git索引发生变化时更新视图和索引缓冲区。
icons = { -- 仅当use_icons为真时适用
folder_closed = "",
folder_open = "",
},
signs = {
fold_closed = "",
fold_open = "",
done = "✓",
},
view = {
-- 配置不同类型的视图的布局和行为。
-- 可用布局:
-- 'diff1_plain'
-- |'diff2_horizontal'
-- |'diff2_vertical'
-- |'diff3_horizontal'
-- |'diff3_vertical'
-- |'diff3_mixed'
-- |'diff4_mixed'
-- 有关更多信息,请参阅 |diffview-config-view.x.layout|。
default = {
-- 更改文件和差异视图中的已暂存文件的配置。
layout = "diff2_horizontal",
disable_diagnostics = false, -- 临时禁用差异缓冲区在查看时的诊断。
winbar_info = false, -- 查看 |diffview-config-view.x.winbar_info|
},
merge_tool = {
-- 合并或变基期间差异视图中冲突文件的配置。
layout = "diff3_horizontal",
disable_diagnostics = true, -- 临时禁用差异缓冲区在查看时的诊断。
winbar_info = true, -- 查看 |diffview-config-view.x.winbar_info|
},
file_history = {
-- 文件历史视图中更改文件的配置。
layout = "diff2_horizontal",
disable_diagnostics = false, -- 临时禁用差异缓冲区在查看时的诊断。
winbar_info = false, -- 查看 |diffview-config-view.x.winbar_info|
},
},
file_panel = {
listing_style = "tree", -- 'list' 或 'tree'之一
tree_options = { -- 仅当listing_style为'tree'时适用
flatten_dirs = true, -- 如果仅包含一个单个目录,则展平目录
folder_statuses = "only_folded", -- 'never'、'only_folded' 或 'always'之一。
},
win_config = { -- 查看 |diffview-config-win_config|
position = "left",
width = 35,
win_opts = {},
},
},
file_history_panel = {
log_options = { -- 查看 |diffview-config-log_options|
git = {
single_file = {
diff_merges = "combined",
},
multi_file = {
diff_merges = "first-parent",
},
},
hg = {
single_file = {},
multi_file = {},
},
},
win_config = { -- 查看 |diffview-config-win_config|
position = "bottom",
height = 16,
win_opts = {},
},
},
commit_log_panel = {
win_config = {}, -- 查看 |diffview-config-win_config|
},
default_args = { -- 列出命令的默认参数前缀
DiffviewOpen = {},
DiffviewFileHistory = {},
},
hooks = {}, -- 查看 |diffview-config-hooks|
keymaps = {
disable_defaults = false, -- 禁用默认键映射
view = {
-- `view`绑定在差异缓冲区中有效,仅当前标签页为Diffview时。
{ "n", "<tab>", actions.select_next_entry, { desc = "打开下一个文件的差异" } },
{ "n", "<s-tab>", actions.select_prev_entry, { desc = "打开上一个文件的差异" } },
{ "n", "[F", actions.select_first_entry, { desc = "打开第一个文件的差异" } },
{ "n", "]F", actions.select_last_entry, { desc = "打开最后一个文件的差异" } },
...
键绑定 | 功能描述
---|---
{n, "gf"} | 在前一个标签页中打开文件编辑器
{n, "<C-w><C-f>"} | 在新的分割视图中打开文件
{n, "<C-w>gf"} | 在新标签页中打开文件
{n, "<leader>e"} | 将焦点转移到文件面板
{n, "<leader>b"} | 切换文件面板的显示与隐藏
{n, "g<C-x>"} | 循环切换可用布局
{n, "[x"} | 合并工具中:跳转到上一个冲突
{n, "]x"} | 合并工具中:跳转到下一个冲突
{n, "<leader>co"} | 选择冲突中的“我们的”版本
{n, "<leader>ct"} | 选择冲突中的“他们的”版本
{n, "<leader>cb"} | 选择冲突中的“基础”版本
{n, "<leader>ca"} | 选择冲突的所有版本
{n, "dx"} | 删除冲突区域
{n, "<leader>cO"} | 整个文件选择“我们的”版本
{n, "<leader>cT"} | 整个文件选择“他们的”版本
{n, "<leader>cB"} | 整个文件选择“基础”版本
{n, "<leader>cA"} | 整个文件选择所有版本
{n, "dX"} | 删除整个文件的冲突区域
单窗口差异布局键绑定 | 功能描述
---|---
{n, "g?"} | 打开帮助面板
两方式差异布局键绑定 | 功能描述
---|---
{n, "g?"} | 打开帮助面板
三方式差异布局键绑定 | 功能描述
---|---
{n, "x"} {"2do"} | 获取文件“我们的”版本的差异块
{n, "x"} {"3do"} | 获取文件“他们的”版本的差异块
{n, "g?"} | 打开帮助面板
四方式差异布局键绑定 | 功能描述
---|---
{n, "x"} {"1do"} | 获取文件“基础”版本的差异块
{n, "x"} {"2do"} | 获取文件“我们的”版本的差异块
{n, "x"} {"3do"} | 获取文件“他们的”版本的差异块
{n, "g?"} | 打开帮助面板
文件面板键绑定 | 功能描述
---|---
{n, "j"} | 将光标移动到下一条文件条目
{n, "<down>"} | 将光标移动到下一条文件条目
{n, "k"} | 将光标移动到上一条文件条目
{n, "<up>"} | 将光标移动到上一条文件条目
{n, "<cr>"} | 对选中条目显示差异
{n, "o"} | 对选中条目显示差异
{n, "l"} | 对选中条目显示差异
{n, "<2-LeftMouse>"} | 对选中条目显示差异
{n, "-"} | 切换选中条目的暂存状态(添加/移除)
{n, "s"} | 切换选中条目的暂存状态(添加/移除)
{n, "S"} | 暂存所有条目
{n, "U"} | 取消暂存所有条目
{n, "X"} | 还原条目至左侧状态
{n, "L"} | 打开提交日志面板
{n, "zo"} | 展开折叠
{n, "h"} | 收起折叠
{n, "zc"} | 收起折叠
{n, "za"} | 切换折叠状态
{n, "zR"} | 展开所有折叠
{n, "zM"} | 收起所有折叠
{n, "<c-b>"} | 视图向上滚动
{n, "<c-f>"} | 视图向下滚动
{n, "<tab>"} | 跳转到下一个文件的差异
{n, "<s-tab>"} | 跳转到上一个文件的差异
{n, "[F"} | 打开第一个文件的差异
{n, "]F"} | 打开最后一个文件的差异
{n, "gf"} | 在前一个标签页中打开文件编辑器
{n, "<C-w><C-f>"} | 在新分割视图中打开文件
{n, "<C-w>gf"} | 在新标签页中打开文件
{n, "i"} | 切换列表和树状视图
{n, "f"} | 在树状视图中展平空子目录
{n, "R"} | 更新文件列表的统计信息和条目
{n, "<leader>e"} | 将焦点转移到文件面板
{n, "<leader>b"} | 切换文件面板
{n, "g<C-x>"} | 循环切换可用布局
{n, "[x"} | 前往上一个冲突
{n, "]x"} | 前往下个冲突
{n, "g?"} | 打开帮助面板
{n, "<leader>cO"} | 整个文件选择“我们的”版本
{n, "<leader>cT"} | 整个文件选择“他们的”版本
{n, "<leader>cB"} | 整个文件选择“基础”版本
{n, "<leader>cA"} | 整个文件选择所有版本
{n, "dX"} | 删除整个文件的冲突区域
文件历史面板键绑定 | 功能描述
---|---
{n, "g!"} | 打开选项面板
{n, "<C-A-d>"} | 在差异视图中打开光标下的条目
{n, "y"} | 复制光标下条目的提交哈希
{n, "L"} | 显示提交详情
{n, "X"} | 还原文件至选定条目的状态
{n, "zo"} | 展开折叠
{n, "zc"} | 收起折叠
{n, "h"} | 收起折叠
{n, "za"} | 切换折叠状态
{n, "zR"} | 展开所有折叠
{n, "zM"} | 收起所有折叠
以下是 Diffview 的配置示例:
-- 配置 Diffview
require('diffview').setup({
status = { enabled = false }, -- 是否显示状态栏信息(默认关闭)
integration = {
git_diff = {
enable = true, -- 启用 Git 差异查看
-- 其他 Git 集成相关选项
},
neogit = {
enable = true, -- 启用 Neogit 集成
status_keys = {
committed = 'C', -- 显示已提交的状态键
staged = 'S', -- 显示已暂存的状态键
unstaged = 'U', -- 显示未暂存的状态键
},
-- 其他 Neogit 集成相关选项
},
},
panels = { -- 面板配置
layout = 'right', -- 默认布局:右侧展开
width = 70, -- 面板宽度百分比
height = nil, -- 自适应高度
file_panel = { -- 文件面板配置
sort_by = 'status', -- 排序依据:状态
filter_empty = true, -- 过滤空文件夹
show_icons = true, -- 是否显示图标
show_status = true, -- 显示文件状态
show_line_counts = true, -- 显示行数统计
},
option_panel = { -- 选项面板配置
-- ...
},
help_panel = { -- 帮助面板配置
-- ...
},
},
keymaps = { -- 快捷键映射
global = {
-- 全局快捷键映射
},
view = {
-- 查看模式下的快捷键映射
},
file_panel = {
-- 文件面板的快捷键映射
},
option_panel = {
-- 选项面板的快捷键映射
},
help_panel = {
-- 帮助面板的快捷键映射
},
},
hooks = { -- 挂钩函数
-- 在每次差异缓冲区读取时运行
diff_buf_read = function(bufnr)
-- 示例:在差异缓冲区禁用换行和行号展示
vim.opt_local.wrap = false
vim.opt_local.list = false
end,
-- 当打开新视图时运行
view_opened = function(view)
-- 示例:打印消息
print(("新 %s 在标签页%d上打开!"):format(view.class.name, view.tabpage))
end,
-- 更多可使用的挂钩参见文档::h diffview-config-hooks
},
})
-- 关闭 Diffview 的全局快捷键示例
vim.api.nvim_set_keymap('n', '<Leader>d', '', { noremap = true })
请注意,这个示例中并没有包括所有的 keymaps 和 panels 配置细节。你需要根据实际需求和 Diffview 文档来填充这些部分。更多关于 Diffview 的详细配置和使用方法,建议查阅其内置的帮助文档,通过在 Vim 中执行 :h diffview 来访问。