diffview.nvim:Git/Mercurial diff管理工具,支持多文件对比、合并冲突解决与文件历史追踪

Single tabpage interface for easily cycling through diffs for all modified files for any git rev.

Branch5Tags0
FilesLast commitLast 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 })

请注意,这个示例中并没有包括所有的 keymapspanels 配置细节。你需要根据实际需求和 Diffview 文档来填充这些部分。更多关于 Diffview 的详细配置和使用方法,建议查阅其内置的帮助文档,通过在 Vim 中执行 :h diffview 来访问。

Introduction

单个标签页界面,轻松遍历任意git修订版本中所有修改文件的差异。【此简介由AI生成】

Customize your domain
155.81 K217Visit GitHub