Repository files navigation

diffview+

Note: This is an actively maintained fork of sindrets/diffview.nvim with bug fixes and improvements applied. See doc/diffview_changelog.txt (:h diffview.changelog) for breaking changes and notable additions.

Introduction

Single tabpage interface for easily cycling through diffs for all modified files for any git rev. Review all changed files, resolve merge conflicts, and browse file history from a unified view.

preview

Requirements

Supported VCS (at least one required):

  • Git ≥ 2.31.0
  • Mercurial ≥ 5.4.0
  • Sapling (any version; detected automatically via the Mercurial adapter)
  • Jujutsu ≥ 0.38.0
  • Perforce ≥ 2019.1 with the p4 CLI (experimental)

Installation

-- Lazy
{
"dlyongemallo/diffview-plus.nvim",
version="*",
-- optional: lazy-load on command-- cmd = {-- "DiffviewOpen",-- "DiffviewToggle",-- "DiffviewFileHistory",-- "DiffviewDiffFiles",-- "DiffviewLog",-- },
}
" Plug
Plug 'dlyongemallo/diffview-plus.nvim'

Quick Start

:DiffviewOpen" Diff working tree against index
:DiffviewFileHistory %" History for the current file
:DiffviewFileHistory" History for the whole repo
:DiffviewDiffFiles ab" Diff two arbitrary files
:DiffviewClose" Close the current diffview

Press g? in any diffview buffer to see all available keymaps.

See USAGE.md for detailed guides on PR review, stash inspection, and committing workflows.

Features

  • Diff View — Browse all changed files in a single tabpage. Stage individual hunks by editing index buffers directly. preview

  • File History — List all commits affecting a file, directory, or line range. Filter by author, message, date range, and more. file history

  • Merge Tool — 3-way and 4-way diff layouts for resolving conflicts, with mappings for choosing OURS/THEIRS/BASE versions. merge tool

  • Staging — Stage and unstage individual files or all changes from the file panel (- / s / S / U). You can stage individual hunks by editing any buffer that represents the index (after running :DiffviewOpen with no [rev] the entries under "Changes" will have the index buffer on the left side, and the entries under "Staged changes" will have it on the right side). Once you write to an index buffer the index will be updated. (Note: Staging is a Git concept. These actions are no-ops on Jujutsu.)

  • Unified Inline Diffdiff1_inline layout renders adds/deletes in a single window via extmark overlays, with tree-sitter highlights preserved on both added and deleted lines. Configurable via view.inline.style ("unified" / "overleaf").

  • Multi-file Selection — Select multiple files in the file panel (w to toggle, C to clear) for batch stage / unstage / restore. Press H to hide or reveal reviewed (selected) files and focus on the remaining changes. These mappings can be overridden through keymaps.file_panel. When persist_selections is enabled, selections and the hide-reviewed state survive Neovim restarts.

  • Pin Local in File History — Run :DiffviewFileHistory --pin-local to keep the working tree on one side while cycling commits on the other (Git only).

Commands

CommandDescription
:DiffviewOpen [rev] [options] [ -- {paths...}]Open a diff view
:DiffviewFileHistory [paths] [options]Browse file/commit history
:DiffviewDiffFiles {file1} {file2}Diff two arbitrary files
:DiffviewMergeFiles {output} [{base}] {left} {right}3-way / 4-way merge editor (no VCS required)
:DiffviewDiffDirs {left} {right} [{output}]Compare two on-disk directories (no VCS required)
:DiffviewCloseClose the current diffview. You can also use :tabclose.
:DiffviewToggleFilesToggle the file panel
:DiffviewFocusFilesBring focus to the file panel
:DiffviewRefresh[!]Update stats and entries in the file list (with !, also force-reload stage diff buffers)

Examples:

:DiffviewOpen" Working tree changes
:DiffviewOpen HEAD~2" Changes since HEAD~2
:DiffviewOpen origin/main...HEAD" Symmetric diff (PR-style)
:DiffviewOpen --lua/diffview" Limit to specific paths
:DiffviewFileHistory %" Current file history
:'<,'>DiffviewFileHistory" History for selected lines

VCS Adapter Notes

  • Jujutsu supports :DiffviewOpen, :DiffviewFileHistory, and works as jj's external merge tool (:DiffviewMergeFiles) and diff editor (:DiffviewDiffDirs); see :h :DiffviewMergeFiles and :h :DiffviewDiffDirs for ~/.config/jj/config.toml wiring. The options --cached, --staged, --imply-local, the --pin-local flag, and line-range history (:'<,'>DiffviewFileHistory) are not supported; staging actions are no-ops (jj has no staging index). In colocated repos, set preferred_adapter = "jj" to use the Jujutsu adapter.
  • Sapling is detected automatically through the Mercurial adapter. Use hg_cmd to configure the executable (e.g. hg_cmd = { "sl" }).
  • Perforce support is experimental. Requires the p4 CLI ≥ 2019.1 and the environment variables P4PORT, P4USER, P4CLIENT.

For full command documentation, see :h diffview-commands.

Important

Familiarize Yourself With :h diff-mode

This plugin builds on nvim's built-in diff mode. Make sure you're familiar with jumping between hunks (:h jumpto-diffs) and applying diff changes (:h copy-diffs).

Configuration

A minimal configuration showing commonly customised options:

require("diffview").setup({
enhanced_diff_hl=true,
use_icons=true,
view= {
default= { layout="diff2_horizontal" },
merge_tool= { layout="diff3_horizontal" },
},
file_panel= {
listing_style="tree",
win_config= { position="left", width=35 }, -- Use "auto" to fit content
},
hooks= {}, -- See :h diffview-config-hookskeymaps= {}, -- See :h diffview-config-keymaps
})

For the full list of options with defaults, see doc/diffview_defaults.txt or run :h diffview.defaults in Neovim.

See RECIPES.md for ready-to-use configuration snippets covering PR review, merge conflicts, file history, and more.

Companion Plugins

  • diffchar.vim — VSCode-style character/word-level diff highlighting. Works out of the box.
  • Telescope — Select branches or commits interactively. See RECIPES.md for setup.
  • gitsigns.nvim — When installed and watch_index is enabled (the default), the file panel refreshes instantly after staging or unstaging hunks via gitsigns.
  • gitgraph.nvim — Draws a commit graph and can open the commit (or a visual range) under the cursor in diffview+. See RECIPES.md for setup.
  • Neogit — Git porcelain with built-in diffview integration (integrations = { diffview = true }).

See TIPS.md for setup details and known compatibility issues.

Tips and FAQ

See TIPS.md for common usage patterns, revision argument guide, LSP diagnostics in diffs, platform notes, and plugin compatibility.

Further Reading

ResourceDescription
USAGE.mdPR review, stash inspection, committing guides
RECIPES.mdConfiguration snippets and recommended keymaps
TIPS.mdTips, FAQ, and known compatibility issues
:h diffviewFull plugin documentation
:h diffview.defaultsComplete default configuration

About

Single tabpage interface for easily cycling through diffs for all modified files for any git rev (actively maintained fork).

Resources

Contributing

Stars

316 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

diffview+

Note: This is an actively maintained fork of sindrets/diffview.nvim with bug fixes and improvements applied. See doc/diffview_changelog.txt (:h diffview.changelog) for breaking changes and notable additions.

Introduction

Single tabpage interface for easily cycling through diffs for all modified files for any git rev. Review all changed files, resolve merge conflicts, and browse file history from a unified view.

preview

Requirements

Supported VCS (at least one required):

  • Git ≥ 2.31.0
  • Mercurial ≥ 5.4.0
  • Sapling (any version; detected automatically via the Mercurial adapter)
  • Jujutsu ≥ 0.38.0
  • Perforce ≥ 2019.1 with the p4 CLI (experimental)

Installation

-- Lazy
{
"dlyongemallo/diffview-plus.nvim",
version="*",
-- optional: lazy-load on command-- cmd = {-- "DiffviewOpen",-- "DiffviewToggle",-- "DiffviewFileHistory",-- "DiffviewDiffFiles",-- "DiffviewLog",-- },
}
" Plug
Plug 'dlyongemallo/diffview-plus.nvim'

Quick Start

:DiffviewOpen" Diff working tree against index
:DiffviewFileHistory %" History for the current file
:DiffviewFileHistory" History for the whole repo
:DiffviewDiffFiles ab" Diff two arbitrary files
:DiffviewClose" Close the current diffview

Press g? in any diffview buffer to see all available keymaps.

See USAGE.md for detailed guides on PR review, stash inspection, and committing workflows.

Features

  • Diff View — Browse all changed files in a single tabpage. Stage individual hunks by editing index buffers directly. preview

  • File History — List all commits affecting a file, directory, or line range. Filter by author, message, date range, and more. file history

  • Merge Tool — 3-way and 4-way diff layouts for resolving conflicts, with mappings for choosing OURS/THEIRS/BASE versions. merge tool

  • Staging — Stage and unstage individual files or all changes from the file panel (- / s / S / U). You can stage individual hunks by editing any buffer that represents the index (after running :DiffviewOpen with no [rev] the entries under "Changes" will have the index buffer on the left side, and the entries under "Staged changes" will have it on the right side). Once you write to an index buffer the index will be updated. (Note: Staging is a Git concept. These actions are no-ops on Jujutsu.)

  • Unified Inline Diffdiff1_inline layout renders adds/deletes in a single window via extmark overlays, with tree-sitter highlights preserved on both added and deleted lines. Configurable via view.inline.style ("unified" / "overleaf").

  • Multi-file Selection — Select multiple files in the file panel (w to toggle, C to clear) for batch stage / unstage / restore. Press H to hide or reveal reviewed (selected) files and focus on the remaining changes. These mappings can be overridden through keymaps.file_panel. When persist_selections is enabled, selections and the hide-reviewed state survive Neovim restarts.

  • Pin Local in File History — Run :DiffviewFileHistory --pin-local to keep the working tree on one side while cycling commits on the other (Git only).

Commands

CommandDescription
:DiffviewOpen [rev] [options] [ -- {paths...}]Open a diff view
:DiffviewFileHistory [paths] [options]Browse file/commit history
:DiffviewDiffFiles {file1} {file2}Diff two arbitrary files
:DiffviewMergeFiles {output} [{base}] {left} {right}3-way / 4-way merge editor (no VCS required)
:DiffviewDiffDirs {left} {right} [{output}]Compare two on-disk directories (no VCS required)
:DiffviewCloseClose the current diffview. You can also use :tabclose.
:DiffviewToggleFilesToggle the file panel
:DiffviewFocusFilesBring focus to the file panel
:DiffviewRefresh[!]Update stats and entries in the file list (with !, also force-reload stage diff buffers)

Examples:

:DiffviewOpen" Working tree changes
:DiffviewOpen HEAD~2" Changes since HEAD~2
:DiffviewOpen origin/main...HEAD" Symmetric diff (PR-style)
:DiffviewOpen --lua/diffview" Limit to specific paths
:DiffviewFileHistory %" Current file history
:'<,'>DiffviewFileHistory" History for selected lines

VCS Adapter Notes

  • Jujutsu supports :DiffviewOpen, :DiffviewFileHistory, and works as jj's external merge tool (:DiffviewMergeFiles) and diff editor (:DiffviewDiffDirs); see :h :DiffviewMergeFiles and :h :DiffviewDiffDirs for ~/.config/jj/config.toml wiring. The options --cached, --staged, --imply-local, the --pin-local flag, and line-range history (:'<,'>DiffviewFileHistory) are not supported; staging actions are no-ops (jj has no staging index). In colocated repos, set preferred_adapter = "jj" to use the Jujutsu adapter.
  • Sapling is detected automatically through the Mercurial adapter. Use hg_cmd to configure the executable (e.g. hg_cmd = { "sl" }).
  • Perforce support is experimental. Requires the p4 CLI ≥ 2019.1 and the environment variables P4PORT, P4USER, P4CLIENT.

For full command documentation, see :h diffview-commands.

Important

Familiarize Yourself With :h diff-mode

This plugin builds on nvim's built-in diff mode. Make sure you're familiar with jumping between hunks (:h jumpto-diffs) and applying diff changes (:h copy-diffs).

Configuration

A minimal configuration showing commonly customised options:

require("diffview").setup({
enhanced_diff_hl=true,
use_icons=true,
view= {
default= { layout="diff2_horizontal" },
merge_tool= { layout="diff3_horizontal" },
},
file_panel= {
listing_style="tree",
win_config= { position="left", width=35 }, -- Use "auto" to fit content
},
hooks= {}, -- See :h diffview-config-hookskeymaps= {}, -- See :h diffview-config-keymaps
})

For the full list of options with defaults, see doc/diffview_defaults.txt or run :h diffview.defaults in Neovim.

See RECIPES.md for ready-to-use configuration snippets covering PR review, merge conflicts, file history, and more.

Companion Plugins

  • diffchar.vim — VSCode-style character/word-level diff highlighting. Works out of the box.
  • Telescope — Select branches or commits interactively. See RECIPES.md for setup.
  • gitsigns.nvim — When installed and watch_index is enabled (the default), the file panel refreshes instantly after staging or unstaging hunks via gitsigns.
  • gitgraph.nvim — Draws a commit graph and can open the commit (or a visual range) under the cursor in diffview+. See RECIPES.md for setup.
  • Neogit — Git porcelain with built-in diffview integration (integrations = { diffview = true }).

See TIPS.md for setup details and known compatibility issues.

Tips and FAQ

See TIPS.md for common usage patterns, revision argument guide, LSP diagnostics in diffs, platform notes, and plugin compatibility.

Further Reading

ResourceDescription
USAGE.mdPR review, stash inspection, committing guides
RECIPES.mdConfiguration snippets and recommended keymaps
TIPS.mdTips, FAQ, and known compatibility issues
:h diffviewFull plugin documentation
:h diffview.defaultsComplete default configuration

About

Single tabpage interface for easily cycling through diffs for all modified files for any git rev (actively maintained fork).

Resources

Contributing

Stars

316 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

diffview+

Note: This is an actively maintained fork of sindrets/diffview.nvim with bug fixes and improvements applied. See doc/diffview_changelog.txt (:h diffview.changelog) for breaking changes and notable additions.

Introduction

Single tabpage interface for easily cycling through diffs for all modified files for any git rev. Review all changed files, resolve merge conflicts, and browse file history from a unified view.

preview

Requirements

Supported VCS (at least one required):

  • Git ≥ 2.31.0
  • Mercurial ≥ 5.4.0
  • Sapling (any version; detected automatically via the Mercurial adapter)
  • Jujutsu ≥ 0.38.0
  • Perforce ≥ 2019.1 with the p4 CLI (experimental)

Installation

-- Lazy
{
"dlyongemallo/diffview-plus.nvim",
version="*",
-- optional: lazy-load on command-- cmd = {-- "DiffviewOpen",-- "DiffviewToggle",-- "DiffviewFileHistory",-- "DiffviewDiffFiles",-- "DiffviewLog",-- },
}
" Plug
Plug 'dlyongemallo/diffview-plus.nvim'

Quick Start

:DiffviewOpen" Diff working tree against index
:DiffviewFileHistory %" History for the current file
:DiffviewFileHistory" History for the whole repo
:DiffviewDiffFiles ab" Diff two arbitrary files
:DiffviewClose" Close the current diffview

Press g? in any diffview buffer to see all available keymaps.

See USAGE.md for detailed guides on PR review, stash inspection, and committing workflows.

Features

  • Diff View — Browse all changed files in a single tabpage. Stage individual hunks by editing index buffers directly. preview

  • File History — List all commits affecting a file, directory, or line range. Filter by author, message, date range, and more. file history

  • Merge Tool — 3-way and 4-way diff layouts for resolving conflicts, with mappings for choosing OURS/THEIRS/BASE versions. merge tool

  • Staging — Stage and unstage individual files or all changes from the file panel (- / s / S / U). You can stage individual hunks by editing any buffer that represents the index (after running :DiffviewOpen with no [rev] the entries under "Changes" will have the index buffer on the left side, and the entries under "Staged changes" will have it on the right side). Once you write to an index buffer the index will be updated. (Note: Staging is a Git concept. These actions are no-ops on Jujutsu.)

  • Unified Inline Diffdiff1_inline layout renders adds/deletes in a single window via extmark overlays, with tree-sitter highlights preserved on both added and deleted lines. Configurable via view.inline.style ("unified" / "overleaf").

  • Multi-file Selection — Select multiple files in the file panel (w to toggle, C to clear) for batch stage / unstage / restore. Press H to hide or reveal reviewed (selected) files and focus on the remaining changes. These mappings can be overridden through keymaps.file_panel. When persist_selections is enabled, selections and the hide-reviewed state survive Neovim restarts.

  • Pin Local in File History — Run :DiffviewFileHistory --pin-local to keep the working tree on one side while cycling commits on the other (Git only).

Commands

CommandDescription
:DiffviewOpen [rev] [options] [ -- {paths...}]Open a diff view
:DiffviewFileHistory [paths] [options]Browse file/commit history
:DiffviewDiffFiles {file1} {file2}Diff two arbitrary files
:DiffviewMergeFiles {output} [{base}] {left} {right}3-way / 4-way merge editor (no VCS required)
:DiffviewDiffDirs {left} {right} [{output}]Compare two on-disk directories (no VCS required)
:DiffviewCloseClose the current diffview. You can also use :tabclose.
:DiffviewToggleFilesToggle the file panel
:DiffviewFocusFilesBring focus to the file panel
:DiffviewRefresh[!]Update stats and entries in the file list (with !, also force-reload stage diff buffers)

Examples:

:DiffviewOpen" Working tree changes
:DiffviewOpen HEAD~2" Changes since HEAD~2
:DiffviewOpen origin/main...HEAD" Symmetric diff (PR-style)
:DiffviewOpen --lua/diffview" Limit to specific paths
:DiffviewFileHistory %" Current file history
:'<,'>DiffviewFileHistory" History for selected lines

VCS Adapter Notes

  • Jujutsu supports :DiffviewOpen, :DiffviewFileHistory, and works as jj's external merge tool (:DiffviewMergeFiles) and diff editor (:DiffviewDiffDirs); see :h :DiffviewMergeFiles and :h :DiffviewDiffDirs for ~/.config/jj/config.toml wiring. The options --cached, --staged, --imply-local, the --pin-local flag, and line-range history (:'<,'>DiffviewFileHistory) are not supported; staging actions are no-ops (jj has no staging index). In colocated repos, set preferred_adapter = "jj" to use the Jujutsu adapter.
  • Sapling is detected automatically through the Mercurial adapter. Use hg_cmd to configure the executable (e.g. hg_cmd = { "sl" }).
  • Perforce support is experimental. Requires the p4 CLI ≥ 2019.1 and the environment variables P4PORT, P4USER, P4CLIENT.

For full command documentation, see :h diffview-commands.

Important

Familiarize Yourself With :h diff-mode

This plugin builds on nvim's built-in diff mode. Make sure you're familiar with jumping between hunks (:h jumpto-diffs) and applying diff changes (:h copy-diffs).

Configuration

A minimal configuration showing commonly customised options:

require("diffview").setup({
enhanced_diff_hl=true,
use_icons=true,
view= {
default= { layout="diff2_horizontal" },
merge_tool= { layout="diff3_horizontal" },
},
file_panel= {
listing_style="tree",
win_config= { position="left", width=35 }, -- Use "auto" to fit content
},
hooks= {}, -- See :h diffview-config-hookskeymaps= {}, -- See :h diffview-config-keymaps
})

For the full list of options with defaults, see doc/diffview_defaults.txt or run :h diffview.defaults in Neovim.

See RECIPES.md for ready-to-use configuration snippets covering PR review, merge conflicts, file history, and more.

Companion Plugins

  • diffchar.vim — VSCode-style character/word-level diff highlighting. Works out of the box.
  • Telescope — Select branches or commits interactively. See RECIPES.md for setup.
  • gitsigns.nvim — When installed and watch_index is enabled (the default), the file panel refreshes instantly after staging or unstaging hunks via gitsigns.
  • gitgraph.nvim — Draws a commit graph and can open the commit (or a visual range) under the cursor in diffview+. See RECIPES.md for setup.
  • Neogit — Git porcelain with built-in diffview integration (integrations = { diffview = true }).

See TIPS.md for setup details and known compatibility issues.

Tips and FAQ

See TIPS.md for common usage patterns, revision argument guide, LSP diagnostics in diffs, platform notes, and plugin compatibility.

Further Reading

ResourceDescription
USAGE.mdPR review, stash inspection, committing guides
RECIPES.mdConfiguration snippets and recommended keymaps
TIPS.mdTips, FAQ, and known compatibility issues
:h diffviewFull plugin documentation
:h diffview.defaultsComplete default configuration

About

Single tabpage interface for easily cycling through diffs for all modified files for any git rev (actively maintained fork).

Resources

Contributing

Stars

316 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

diffview+

Note: This is an actively maintained fork of sindrets/diffview.nvim with bug fixes and improvements applied. See doc/diffview_changelog.txt (:h diffview.changelog) for breaking changes and notable additions.

Introduction

Single tabpage interface for easily cycling through diffs for all modified files for any git rev. Review all changed files, resolve merge conflicts, and browse file history from a unified view.

preview

Requirements

Supported VCS (at least one required):

  • Git ≥ 2.31.0
  • Mercurial ≥ 5.4.0
  • Sapling (any version; detected automatically via the Mercurial adapter)
  • Jujutsu ≥ 0.38.0
  • Perforce ≥ 2019.1 with the p4 CLI (experimental)

Installation

-- Lazy
{
"dlyongemallo/diffview-plus.nvim",
version="*",
-- optional: lazy-load on command-- cmd = {-- "DiffviewOpen",-- "DiffviewToggle",-- "DiffviewFileHistory",-- "DiffviewDiffFiles",-- "DiffviewLog",-- },
}
" Plug
Plug 'dlyongemallo/diffview-plus.nvim'

Quick Start

:DiffviewOpen" Diff working tree against index
:DiffviewFileHistory %" History for the current file
:DiffviewFileHistory" History for the whole repo
:DiffviewDiffFiles ab" Diff two arbitrary files
:DiffviewClose" Close the current diffview

Press g? in any diffview buffer to see all available keymaps.

See USAGE.md for detailed guides on PR review, stash inspection, and committing workflows.

Features

  • Diff View — Browse all changed files in a single tabpage. Stage individual hunks by editing index buffers directly. preview

  • File History — List all commits affecting a file, directory, or line range. Filter by author, message, date range, and more. file history

  • Merge Tool — 3-way and 4-way diff layouts for resolving conflicts, with mappings for choosing OURS/THEIRS/BASE versions. merge tool

  • Staging — Stage and unstage individual files or all changes from the file panel (- / s / S / U). You can stage individual hunks by editing any buffer that represents the index (after running :DiffviewOpen with no [rev] the entries under "Changes" will have the index buffer on the left side, and the entries under "Staged changes" will have it on the right side). Once you write to an index buffer the index will be updated. (Note: Staging is a Git concept. These actions are no-ops on Jujutsu.)

  • Unified Inline Diffdiff1_inline layout renders adds/deletes in a single window via extmark overlays, with tree-sitter highlights preserved on both added and deleted lines. Configurable via view.inline.style ("unified" / "overleaf").

  • Multi-file Selection — Select multiple files in the file panel (w to toggle, C to clear) for batch stage / unstage / restore. Press H to hide or reveal reviewed (selected) files and focus on the remaining changes. These mappings can be overridden through keymaps.file_panel. When persist_selections is enabled, selections and the hide-reviewed state survive Neovim restarts.

  • Pin Local in File History — Run :DiffviewFileHistory --pin-local to keep the working tree on one side while cycling commits on the other (Git only).

Commands

CommandDescription
:DiffviewOpen [rev] [options] [ -- {paths...}]Open a diff view
:DiffviewFileHistory [paths] [options]Browse file/commit history
:DiffviewDiffFiles {file1} {file2}Diff two arbitrary files
:DiffviewMergeFiles {output} [{base}] {left} {right}3-way / 4-way merge editor (no VCS required)
:DiffviewDiffDirs {left} {right} [{output}]Compare two on-disk directories (no VCS required)
:DiffviewCloseClose the current diffview. You can also use :tabclose.
:DiffviewToggleFilesToggle the file panel
:DiffviewFocusFilesBring focus to the file panel
:DiffviewRefresh[!]Update stats and entries in the file list (with !, also force-reload stage diff buffers)

Examples:

:DiffviewOpen" Working tree changes
:DiffviewOpen HEAD~2" Changes since HEAD~2
:DiffviewOpen origin/main...HEAD" Symmetric diff (PR-style)
:DiffviewOpen --lua/diffview" Limit to specific paths
:DiffviewFileHistory %" Current file history
:'<,'>DiffviewFileHistory" History for selected lines

VCS Adapter Notes

  • Jujutsu supports :DiffviewOpen, :DiffviewFileHistory, and works as jj's external merge tool (:DiffviewMergeFiles) and diff editor (:DiffviewDiffDirs); see :h :DiffviewMergeFiles and :h :DiffviewDiffDirs for ~/.config/jj/config.toml wiring. The options --cached, --staged, --imply-local, the --pin-local flag, and line-range history (:'<,'>DiffviewFileHistory) are not supported; staging actions are no-ops (jj has no staging index). In colocated repos, set preferred_adapter = "jj" to use the Jujutsu adapter.
  • Sapling is detected automatically through the Mercurial adapter. Use hg_cmd to configure the executable (e.g. hg_cmd = { "sl" }).
  • Perforce support is experimental. Requires the p4 CLI ≥ 2019.1 and the environment variables P4PORT, P4USER, P4CLIENT.

For full command documentation, see :h diffview-commands.

Important

Familiarize Yourself With :h diff-mode

This plugin builds on nvim's built-in diff mode. Make sure you're familiar with jumping between hunks (:h jumpto-diffs) and applying diff changes (:h copy-diffs).

Configuration

A minimal configuration showing commonly customised options:

require("diffview").setup({
enhanced_diff_hl=true,
use_icons=true,
view= {
default= { layout="diff2_horizontal" },
merge_tool= { layout="diff3_horizontal" },
},
file_panel= {
listing_style="tree",
win_config= { position="left", width=35 }, -- Use "auto" to fit content
},
hooks= {}, -- See :h diffview-config-hookskeymaps= {}, -- See :h diffview-config-keymaps
})

For the full list of options with defaults, see doc/diffview_defaults.txt or run :h diffview.defaults in Neovim.

See RECIPES.md for ready-to-use configuration snippets covering PR review, merge conflicts, file history, and more.

Companion Plugins

  • diffchar.vim — VSCode-style character/word-level diff highlighting. Works out of the box.
  • Telescope — Select branches or commits interactively. See RECIPES.md for setup.
  • gitsigns.nvim — When installed and watch_index is enabled (the default), the file panel refreshes instantly after staging or unstaging hunks via gitsigns.
  • gitgraph.nvim — Draws a commit graph and can open the commit (or a visual range) under the cursor in diffview+. See RECIPES.md for setup.
  • Neogit — Git porcelain with built-in diffview integration (integrations = { diffview = true }).

See TIPS.md for setup details and known compatibility issues.

Tips and FAQ

See TIPS.md for common usage patterns, revision argument guide, LSP diagnostics in diffs, platform notes, and plugin compatibility.

Further Reading

ResourceDescription
USAGE.mdPR review, stash inspection, committing guides
RECIPES.mdConfiguration snippets and recommended keymaps
TIPS.mdTips, FAQ, and known compatibility issues
:h diffviewFull plugin documentation
:h diffview.defaultsComplete default configuration

About

Single tabpage interface for easily cycling through diffs for all modified files for any git rev (actively maintained fork).

Resources

Contributing

Stars

316 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

diffview+

Note: This is an actively maintained fork of sindrets/diffview.nvim with bug fixes and improvements applied. See doc/diffview_changelog.txt (:h diffview.changelog) for breaking changes and notable additions.

Introduction

Single tabpage interface for easily cycling through diffs for all modified files for any git rev. Review all changed files, resolve merge conflicts, and browse file history from a unified view.

preview

Requirements

Supported VCS (at least one required):

  • Git ≥ 2.31.0
  • Mercurial ≥ 5.4.0
  • Sapling (any version; detected automatically via the Mercurial adapter)
  • Jujutsu ≥ 0.38.0
  • Perforce ≥ 2019.1 with the p4 CLI (experimental)

Installation

-- Lazy
{
"dlyongemallo/diffview-plus.nvim",
version="*",
-- optional: lazy-load on command-- cmd = {-- "DiffviewOpen",-- "DiffviewToggle",-- "DiffviewFileHistory",-- "DiffviewDiffFiles",-- "DiffviewLog",-- },
}
" Plug
Plug 'dlyongemallo/diffview-plus.nvim'

Quick Start

:DiffviewOpen" Diff working tree against index
:DiffviewFileHistory %" History for the current file
:DiffviewFileHistory" History for the whole repo
:DiffviewDiffFiles ab" Diff two arbitrary files
:DiffviewClose" Close the current diffview

Press g? in any diffview buffer to see all available keymaps.

See USAGE.md for detailed guides on PR review, stash inspection, and committing workflows.

Features

  • Diff View — Browse all changed files in a single tabpage. Stage individual hunks by editing index buffers directly. preview

  • File History — List all commits affecting a file, directory, or line range. Filter by author, message, date range, and more. file history

  • Merge Tool — 3-way and 4-way diff layouts for resolving conflicts, with mappings for choosing OURS/THEIRS/BASE versions. merge tool

  • Staging — Stage and unstage individual files or all changes from the file panel (- / s / S / U). You can stage individual hunks by editing any buffer that represents the index (after running :DiffviewOpen with no [rev] the entries under "Changes" will have the index buffer on the left side, and the entries under "Staged changes" will have it on the right side). Once you write to an index buffer the index will be updated. (Note: Staging is a Git concept. These actions are no-ops on Jujutsu.)

  • Unified Inline Diffdiff1_inline layout renders adds/deletes in a single window via extmark overlays, with tree-sitter highlights preserved on both added and deleted lines. Configurable via view.inline.style ("unified" / "overleaf").

  • Multi-file Selection — Select multiple files in the file panel (w to toggle, C to clear) for batch stage / unstage / restore. Press H to hide or reveal reviewed (selected) files and focus on the remaining changes. These mappings can be overridden through keymaps.file_panel. When persist_selections is enabled, selections and the hide-reviewed state survive Neovim restarts.

  • Pin Local in File History — Run :DiffviewFileHistory --pin-local to keep the working tree on one side while cycling commits on the other (Git only).

Commands

CommandDescription
:DiffviewOpen [rev] [options] [ -- {paths...}]Open a diff view
:DiffviewFileHistory [paths] [options]Browse file/commit history
:DiffviewDiffFiles {file1} {file2}Diff two arbitrary files
:DiffviewMergeFiles {output} [{base}] {left} {right}3-way / 4-way merge editor (no VCS required)
:DiffviewDiffDirs {left} {right} [{output}]Compare two on-disk directories (no VCS required)
:DiffviewCloseClose the current diffview. You can also use :tabclose.
:DiffviewToggleFilesToggle the file panel
:DiffviewFocusFilesBring focus to the file panel
:DiffviewRefresh[!]Update stats and entries in the file list (with !, also force-reload stage diff buffers)

Examples:

:DiffviewOpen" Working tree changes
:DiffviewOpen HEAD~2" Changes since HEAD~2
:DiffviewOpen origin/main...HEAD" Symmetric diff (PR-style)
:DiffviewOpen --lua/diffview" Limit to specific paths
:DiffviewFileHistory %" Current file history
:'<,'>DiffviewFileHistory" History for selected lines

VCS Adapter Notes

  • Jujutsu supports :DiffviewOpen, :DiffviewFileHistory, and works as jj's external merge tool (:DiffviewMergeFiles) and diff editor (:DiffviewDiffDirs); see :h :DiffviewMergeFiles and :h :DiffviewDiffDirs for ~/.config/jj/config.toml wiring. The options --cached, --staged, --imply-local, the --pin-local flag, and line-range history (:'<,'>DiffviewFileHistory) are not supported; staging actions are no-ops (jj has no staging index). In colocated repos, set preferred_adapter = "jj" to use the Jujutsu adapter.
  • Sapling is detected automatically through the Mercurial adapter. Use hg_cmd to configure the executable (e.g. hg_cmd = { "sl" }).
  • Perforce support is experimental. Requires the p4 CLI ≥ 2019.1 and the environment variables P4PORT, P4USER, P4CLIENT.

For full command documentation, see :h diffview-commands.

Important

Familiarize Yourself With :h diff-mode

This plugin builds on nvim's built-in diff mode. Make sure you're familiar with jumping between hunks (:h jumpto-diffs) and applying diff changes (:h copy-diffs).

Configuration

A minimal configuration showing commonly customised options:

require("diffview").setup({
enhanced_diff_hl=true,
use_icons=true,
view= {
default= { layout="diff2_horizontal" },
merge_tool= { layout="diff3_horizontal" },
},
file_panel= {
listing_style="tree",
win_config= { position="left", width=35 }, -- Use "auto" to fit content
},
hooks= {}, -- See :h diffview-config-hookskeymaps= {}, -- See :h diffview-config-keymaps
})

For the full list of options with defaults, see doc/diffview_defaults.txt or run :h diffview.defaults in Neovim.

See RECIPES.md for ready-to-use configuration snippets covering PR review, merge conflicts, file history, and more.

Companion Plugins

  • diffchar.vim — VSCode-style character/word-level diff highlighting. Works out of the box.
  • Telescope — Select branches or commits interactively. See RECIPES.md for setup.
  • gitsigns.nvim — When installed and watch_index is enabled (the default), the file panel refreshes instantly after staging or unstaging hunks via gitsigns.
  • gitgraph.nvim — Draws a commit graph and can open the commit (or a visual range) under the cursor in diffview+. See RECIPES.md for setup.
  • Neogit — Git porcelain with built-in diffview integration (integrations = { diffview = true }).

See TIPS.md for setup details and known compatibility issues.

Tips and FAQ

See TIPS.md for common usage patterns, revision argument guide, LSP diagnostics in diffs, platform notes, and plugin compatibility.

Further Reading

ResourceDescription
USAGE.mdPR review, stash inspection, committing guides
RECIPES.mdConfiguration snippets and recommended keymaps
TIPS.mdTips, FAQ, and known compatibility issues
:h diffviewFull plugin documentation
:h diffview.defaultsComplete default configuration

About

Single tabpage interface for easily cycling through diffs for all modified files for any git rev (actively maintained fork).

Resources

Contributing

Stars

316 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

diffview+

Note: This is an actively maintained fork of sindrets/diffview.nvim with bug fixes and improvements applied. See doc/diffview_changelog.txt (:h diffview.changelog) for breaking changes and notable additions.

Introduction

Single tabpage interface for easily cycling through diffs for all modified files for any git rev. Review all changed files, resolve merge conflicts, and browse file history from a unified view.

preview

Requirements

Supported VCS (at least one required):

  • Git ≥ 2.31.0
  • Mercurial ≥ 5.4.0
  • Sapling (any version; detected automatically via the Mercurial adapter)
  • Jujutsu ≥ 0.38.0
  • Perforce ≥ 2019.1 with the p4 CLI (experimental)

Installation

-- Lazy
{
"dlyongemallo/diffview-plus.nvim",
version="*",
-- optional: lazy-load on command-- cmd = {-- "DiffviewOpen",-- "DiffviewToggle",-- "DiffviewFileHistory",-- "DiffviewDiffFiles",-- "DiffviewLog",-- },
}
" Plug
Plug 'dlyongemallo/diffview-plus.nvim'

Quick Start

:DiffviewOpen" Diff working tree against index
:DiffviewFileHistory %" History for the current file
:DiffviewFileHistory" History for the whole repo
:DiffviewDiffFiles ab" Diff two arbitrary files
:DiffviewClose" Close the current diffview

Press g? in any diffview buffer to see all available keymaps.

See USAGE.md for detailed guides on PR review, stash inspection, and committing workflows.

Features

  • Diff View — Browse all changed files in a single tabpage. Stage individual hunks by editing index buffers directly. preview

  • File History — List all commits affecting a file, directory, or line range. Filter by author, message, date range, and more. file history

  • Merge Tool — 3-way and 4-way diff layouts for resolving conflicts, with mappings for choosing OURS/THEIRS/BASE versions. merge tool

  • Staging — Stage and unstage individual files or all changes from the file panel (- / s / S / U). You can stage individual hunks by editing any buffer that represents the index (after running :DiffviewOpen with no [rev] the entries under "Changes" will have the index buffer on the left side, and the entries under "Staged changes" will have it on the right side). Once you write to an index buffer the index will be updated. (Note: Staging is a Git concept. These actions are no-ops on Jujutsu.)

  • Unified Inline Diffdiff1_inline layout renders adds/deletes in a single window via extmark overlays, with tree-sitter highlights preserved on both added and deleted lines. Configurable via view.inline.style ("unified" / "overleaf").

  • Multi-file Selection — Select multiple files in the file panel (w to toggle, C to clear) for batch stage / unstage / restore. Press H to hide or reveal reviewed (selected) files and focus on the remaining changes. These mappings can be overridden through keymaps.file_panel. When persist_selections is enabled, selections and the hide-reviewed state survive Neovim restarts.

  • Pin Local in File History — Run :DiffviewFileHistory --pin-local to keep the working tree on one side while cycling commits on the other (Git only).

Commands

CommandDescription
:DiffviewOpen [rev] [options] [ -- {paths...}]Open a diff view
:DiffviewFileHistory [paths] [options]Browse file/commit history
:DiffviewDiffFiles {file1} {file2}Diff two arbitrary files
:DiffviewMergeFiles {output} [{base}] {left} {right}3-way / 4-way merge editor (no VCS required)
:DiffviewDiffDirs {left} {right} [{output}]Compare two on-disk directories (no VCS required)
:DiffviewCloseClose the current diffview. You can also use :tabclose.
:DiffviewToggleFilesToggle the file panel
:DiffviewFocusFilesBring focus to the file panel
:DiffviewRefresh[!]Update stats and entries in the file list (with !, also force-reload stage diff buffers)

Examples:

:DiffviewOpen" Working tree changes
:DiffviewOpen HEAD~2" Changes since HEAD~2
:DiffviewOpen origin/main...HEAD" Symmetric diff (PR-style)
:DiffviewOpen --lua/diffview" Limit to specific paths
:DiffviewFileHistory %" Current file history
:'<,'>DiffviewFileHistory" History for selected lines

VCS Adapter Notes

  • Jujutsu supports :DiffviewOpen, :DiffviewFileHistory, and works as jj's external merge tool (:DiffviewMergeFiles) and diff editor (:DiffviewDiffDirs); see :h :DiffviewMergeFiles and :h :DiffviewDiffDirs for ~/.config/jj/config.toml wiring. The options --cached, --staged, --imply-local, the --pin-local flag, and line-range history (:'<,'>DiffviewFileHistory) are not supported; staging actions are no-ops (jj has no staging index). In colocated repos, set preferred_adapter = "jj" to use the Jujutsu adapter.
  • Sapling is detected automatically through the Mercurial adapter. Use hg_cmd to configure the executable (e.g. hg_cmd = { "sl" }).
  • Perforce support is experimental. Requires the p4 CLI ≥ 2019.1 and the environment variables P4PORT, P4USER, P4CLIENT.

For full command documentation, see :h diffview-commands.

Important

Familiarize Yourself With :h diff-mode

This plugin builds on nvim's built-in diff mode. Make sure you're familiar with jumping between hunks (:h jumpto-diffs) and applying diff changes (:h copy-diffs).

Configuration

A minimal configuration showing commonly customised options:

require("diffview").setup({
enhanced_diff_hl=true,
use_icons=true,
view= {
default= { layout="diff2_horizontal" },
merge_tool= { layout="diff3_horizontal" },
},
file_panel= {
listing_style="tree",
win_config= { position="left", width=35 }, -- Use "auto" to fit content
},
hooks= {}, -- See :h diffview-config-hookskeymaps= {}, -- See :h diffview-config-keymaps
})

For the full list of options with defaults, see doc/diffview_defaults.txt or run :h diffview.defaults in Neovim.

See RECIPES.md for ready-to-use configuration snippets covering PR review, merge conflicts, file history, and more.

Companion Plugins

  • diffchar.vim — VSCode-style character/word-level diff highlighting. Works out of the box.
  • Telescope — Select branches or commits interactively. See RECIPES.md for setup.
  • gitsigns.nvim — When installed and watch_index is enabled (the default), the file panel refreshes instantly after staging or unstaging hunks via gitsigns.
  • gitgraph.nvim — Draws a commit graph and can open the commit (or a visual range) under the cursor in diffview+. See RECIPES.md for setup.
  • Neogit — Git porcelain with built-in diffview integration (integrations = { diffview = true }).

See TIPS.md for setup details and known compatibility issues.

Tips and FAQ

See TIPS.md for common usage patterns, revision argument guide, LSP diagnostics in diffs, platform notes, and plugin compatibility.

Further Reading

ResourceDescription
USAGE.mdPR review, stash inspection, committing guides
RECIPES.mdConfiguration snippets and recommended keymaps
TIPS.mdTips, FAQ, and known compatibility issues
:h diffviewFull plugin documentation
:h diffview.defaultsComplete default configuration

About

Single tabpage interface for easily cycling through diffs for all modified files for any git rev (actively maintained fork).

Resources

Contributing

Stars

316 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

diffview+

Note: This is an actively maintained fork of sindrets/diffview.nvim with bug fixes and improvements applied. See doc/diffview_changelog.txt (:h diffview.changelog) for breaking changes and notable additions.

Introduction

Single tabpage interface for easily cycling through diffs for all modified files for any git rev. Review all changed files, resolve merge conflicts, and browse file history from a unified view.

preview

Requirements

Supported VCS (at least one required):

  • Git ≥ 2.31.0
  • Mercurial ≥ 5.4.0
  • Sapling (any version; detected automatically via the Mercurial adapter)
  • Jujutsu ≥ 0.38.0
  • Perforce ≥ 2019.1 with the p4 CLI (experimental)

Installation

-- Lazy
{
"dlyongemallo/diffview-plus.nvim",
version="*",
-- optional: lazy-load on command-- cmd = {-- "DiffviewOpen",-- "DiffviewToggle",-- "DiffviewFileHistory",-- "DiffviewDiffFiles",-- "DiffviewLog",-- },
}
" Plug
Plug 'dlyongemallo/diffview-plus.nvim'

Quick Start

:DiffviewOpen" Diff working tree against index
:DiffviewFileHistory %" History for the current file
:DiffviewFileHistory" History for the whole repo
:DiffviewDiffFiles ab" Diff two arbitrary files
:DiffviewClose" Close the current diffview

Press g? in any diffview buffer to see all available keymaps.

See USAGE.md for detailed guides on PR review, stash inspection, and committing workflows.

Features

  • Diff View — Browse all changed files in a single tabpage. Stage individual hunks by editing index buffers directly. preview

  • File History — List all commits affecting a file, directory, or line range. Filter by author, message, date range, and more. file history

  • Merge Tool — 3-way and 4-way diff layouts for resolving conflicts, with mappings for choosing OURS/THEIRS/BASE versions. merge tool

  • Staging — Stage and unstage individual files or all changes from the file panel (- / s / S / U). You can stage individual hunks by editing any buffer that represents the index (after running :DiffviewOpen with no [rev] the entries under "Changes" will have the index buffer on the left side, and the entries under "Staged changes" will have it on the right side). Once you write to an index buffer the index will be updated. (Note: Staging is a Git concept. These actions are no-ops on Jujutsu.)

  • Unified Inline Diffdiff1_inline layout renders adds/deletes in a single window via extmark overlays, with tree-sitter highlights preserved on both added and deleted lines. Configurable via view.inline.style ("unified" / "overleaf").

  • Multi-file Selection — Select multiple files in the file panel (w to toggle, C to clear) for batch stage / unstage / restore. Press H to hide or reveal reviewed (selected) files and focus on the remaining changes. These mappings can be overridden through keymaps.file_panel. When persist_selections is enabled, selections and the hide-reviewed state survive Neovim restarts.

  • Pin Local in File History — Run :DiffviewFileHistory --pin-local to keep the working tree on one side while cycling commits on the other (Git only).

Commands

CommandDescription
:DiffviewOpen [rev] [options] [ -- {paths...}]Open a diff view
:DiffviewFileHistory [paths] [options]Browse file/commit history
:DiffviewDiffFiles {file1} {file2}Diff two arbitrary files
:DiffviewMergeFiles {output} [{base}] {left} {right}3-way / 4-way merge editor (no VCS required)
:DiffviewDiffDirs {left} {right} [{output}]Compare two on-disk directories (no VCS required)
:DiffviewCloseClose the current diffview. You can also use :tabclose.
:DiffviewToggleFilesToggle the file panel
:DiffviewFocusFilesBring focus to the file panel
:DiffviewRefresh[!]Update stats and entries in the file list (with !, also force-reload stage diff buffers)

Examples:

:DiffviewOpen" Working tree changes
:DiffviewOpen HEAD~2" Changes since HEAD~2
:DiffviewOpen origin/main...HEAD" Symmetric diff (PR-style)
:DiffviewOpen --lua/diffview" Limit to specific paths
:DiffviewFileHistory %" Current file history
:'<,'>DiffviewFileHistory" History for selected lines

VCS Adapter Notes

  • Jujutsu supports :DiffviewOpen, :DiffviewFileHistory, and works as jj's external merge tool (:DiffviewMergeFiles) and diff editor (:DiffviewDiffDirs); see :h :DiffviewMergeFiles and :h :DiffviewDiffDirs for ~/.config/jj/config.toml wiring. The options --cached, --staged, --imply-local, the --pin-local flag, and line-range history (:'<,'>DiffviewFileHistory) are not supported; staging actions are no-ops (jj has no staging index). In colocated repos, set preferred_adapter = "jj" to use the Jujutsu adapter.
  • Sapling is detected automatically through the Mercurial adapter. Use hg_cmd to configure the executable (e.g. hg_cmd = { "sl" }).
  • Perforce support is experimental. Requires the p4 CLI ≥ 2019.1 and the environment variables P4PORT, P4USER, P4CLIENT.

For full command documentation, see :h diffview-commands.

Important

Familiarize Yourself With :h diff-mode

This plugin builds on nvim's built-in diff mode. Make sure you're familiar with jumping between hunks (:h jumpto-diffs) and applying diff changes (:h copy-diffs).

Configuration

A minimal configuration showing commonly customised options:

require("diffview").setup({
enhanced_diff_hl=true,
use_icons=true,
view= {
default= { layout="diff2_horizontal" },
merge_tool= { layout="diff3_horizontal" },
},
file_panel= {
listing_style="tree",
win_config= { position="left", width=35 }, -- Use "auto" to fit content
},
hooks= {}, -- See :h diffview-config-hookskeymaps= {}, -- See :h diffview-config-keymaps
})

For the full list of options with defaults, see doc/diffview_defaults.txt or run :h diffview.defaults in Neovim.

See RECIPES.md for ready-to-use configuration snippets covering PR review, merge conflicts, file history, and more.

Companion Plugins

  • diffchar.vim — VSCode-style character/word-level diff highlighting. Works out of the box.
  • Telescope — Select branches or commits interactively. See RECIPES.md for setup.
  • gitsigns.nvim — When installed and watch_index is enabled (the default), the file panel refreshes instantly after staging or unstaging hunks via gitsigns.
  • gitgraph.nvim — Draws a commit graph and can open the commit (or a visual range) under the cursor in diffview+. See RECIPES.md for setup.
  • Neogit — Git porcelain with built-in diffview integration (integrations = { diffview = true }).

See TIPS.md for setup details and known compatibility issues.

Tips and FAQ

See TIPS.md for common usage patterns, revision argument guide, LSP diagnostics in diffs, platform notes, and plugin compatibility.

Further Reading

ResourceDescription
USAGE.mdPR review, stash inspection, committing guides
RECIPES.mdConfiguration snippets and recommended keymaps
TIPS.mdTips, FAQ, and known compatibility issues
:h diffviewFull plugin documentation
:h diffview.defaultsComplete default configuration

About

Single tabpage interface for easily cycling through diffs for all modified files for any git rev (actively maintained fork).

Resources

Contributing

Stars

316 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

diffview+

Note: This is an actively maintained fork of sindrets/diffview.nvim with bug fixes and improvements applied. See doc/diffview_changelog.txt (:h diffview.changelog) for breaking changes and notable additions.

Introduction

Single tabpage interface for easily cycling through diffs for all modified files for any git rev. Review all changed files, resolve merge conflicts, and browse file history from a unified view.

preview

Requirements

Supported VCS (at least one required):

  • Git ≥ 2.31.0
  • Mercurial ≥ 5.4.0
  • Sapling (any version; detected automatically via the Mercurial adapter)
  • Jujutsu ≥ 0.38.0
  • Perforce ≥ 2019.1 with the p4 CLI (experimental)

Installation

-- Lazy
{
"dlyongemallo/diffview-plus.nvim",
version="*",
-- optional: lazy-load on command-- cmd = {-- "DiffviewOpen",-- "DiffviewToggle",-- "DiffviewFileHistory",-- "DiffviewDiffFiles",-- "DiffviewLog",-- },
}
" Plug
Plug 'dlyongemallo/diffview-plus.nvim'

Quick Start

:DiffviewOpen" Diff working tree against index
:DiffviewFileHistory %" History for the current file
:DiffviewFileHistory" History for the whole repo
:DiffviewDiffFiles ab" Diff two arbitrary files
:DiffviewClose" Close the current diffview

Press g? in any diffview buffer to see all available keymaps.

See USAGE.md for detailed guides on PR review, stash inspection, and committing workflows.

Features

  • Diff View — Browse all changed files in a single tabpage. Stage individual hunks by editing index buffers directly. preview

  • File History — List all commits affecting a file, directory, or line range. Filter by author, message, date range, and more. file history

  • Merge Tool — 3-way and 4-way diff layouts for resolving conflicts, with mappings for choosing OURS/THEIRS/BASE versions. merge tool

  • Staging — Stage and unstage individual files or all changes from the file panel (- / s / S / U). You can stage individual hunks by editing any buffer that represents the index (after running :DiffviewOpen with no [rev] the entries under "Changes" will have the index buffer on the left side, and the entries under "Staged changes" will have it on the right side). Once you write to an index buffer the index will be updated. (Note: Staging is a Git concept. These actions are no-ops on Jujutsu.)

  • Unified Inline Diffdiff1_inline layout renders adds/deletes in a single window via extmark overlays, with tree-sitter highlights preserved on both added and deleted lines. Configurable via view.inline.style ("unified" / "overleaf").

  • Multi-file Selection — Select multiple files in the file panel (w to toggle, C to clear) for batch stage / unstage / restore. Press H to hide or reveal reviewed (selected) files and focus on the remaining changes. These mappings can be overridden through keymaps.file_panel. When persist_selections is enabled, selections and the hide-reviewed state survive Neovim restarts.

  • Pin Local in File History — Run :DiffviewFileHistory --pin-local to keep the working tree on one side while cycling commits on the other (Git only).

Commands

CommandDescription
:DiffviewOpen [rev] [options] [ -- {paths...}]Open a diff view
:DiffviewFileHistory [paths] [options]Browse file/commit history
:DiffviewDiffFiles {file1} {file2}Diff two arbitrary files
:DiffviewMergeFiles {output} [{base}] {left} {right}3-way / 4-way merge editor (no VCS required)
:DiffviewDiffDirs {left} {right} [{output}]Compare two on-disk directories (no VCS required)
:DiffviewCloseClose the current diffview. You can also use :tabclose.
:DiffviewToggleFilesToggle the file panel
:DiffviewFocusFilesBring focus to the file panel
:DiffviewRefresh[!]Update stats and entries in the file list (with !, also force-reload stage diff buffers)

Examples:

:DiffviewOpen" Working tree changes
:DiffviewOpen HEAD~2" Changes since HEAD~2
:DiffviewOpen origin/main...HEAD" Symmetric diff (PR-style)
:DiffviewOpen --lua/diffview" Limit to specific paths
:DiffviewFileHistory %" Current file history
:'<,'>DiffviewFileHistory" History for selected lines

VCS Adapter Notes

  • Jujutsu supports :DiffviewOpen, :DiffviewFileHistory, and works as jj's external merge tool (:DiffviewMergeFiles) and diff editor (:DiffviewDiffDirs); see :h :DiffviewMergeFiles and :h :DiffviewDiffDirs for ~/.config/jj/config.toml wiring. The options --cached, --staged, --imply-local, the --pin-local flag, and line-range history (:'<,'>DiffviewFileHistory) are not supported; staging actions are no-ops (jj has no staging index). In colocated repos, set preferred_adapter = "jj" to use the Jujutsu adapter.
  • Sapling is detected automatically through the Mercurial adapter. Use hg_cmd to configure the executable (e.g. hg_cmd = { "sl" }).
  • Perforce support is experimental. Requires the p4 CLI ≥ 2019.1 and the environment variables P4PORT, P4USER, P4CLIENT.

For full command documentation, see :h diffview-commands.

Important

Familiarize Yourself With :h diff-mode

This plugin builds on nvim's built-in diff mode. Make sure you're familiar with jumping between hunks (:h jumpto-diffs) and applying diff changes (:h copy-diffs).

Configuration

A minimal configuration showing commonly customised options:

require("diffview").setup({
enhanced_diff_hl=true,
use_icons=true,
view= {
default= { layout="diff2_horizontal" },
merge_tool= { layout="diff3_horizontal" },
},
file_panel= {
listing_style="tree",
win_config= { position="left", width=35 }, -- Use "auto" to fit content
},
hooks= {}, -- See :h diffview-config-hookskeymaps= {}, -- See :h diffview-config-keymaps
})

For the full list of options with defaults, see doc/diffview_defaults.txt or run :h diffview.defaults in Neovim.

See RECIPES.md for ready-to-use configuration snippets covering PR review, merge conflicts, file history, and more.

Companion Plugins

  • diffchar.vim — VSCode-style character/word-level diff highlighting. Works out of the box.
  • Telescope — Select branches or commits interactively. See RECIPES.md for setup.
  • gitsigns.nvim — When installed and watch_index is enabled (the default), the file panel refreshes instantly after staging or unstaging hunks via gitsigns.
  • gitgraph.nvim — Draws a commit graph and can open the commit (or a visual range) under the cursor in diffview+. See RECIPES.md for setup.
  • Neogit — Git porcelain with built-in diffview integration (integrations = { diffview = true }).

See TIPS.md for setup details and known compatibility issues.

Tips and FAQ

See TIPS.md for common usage patterns, revision argument guide, LSP diagnostics in diffs, platform notes, and plugin compatibility.

Further Reading

ResourceDescription
USAGE.mdPR review, stash inspection, committing guides
RECIPES.mdConfiguration snippets and recommended keymaps
TIPS.mdTips, FAQ, and known compatibility issues
:h diffviewFull plugin documentation
:h diffview.defaultsComplete default configuration

About

Single tabpage interface for easily cycling through diffs for all modified files for any git rev (actively maintained fork).

Resources

Contributing

Stars

316 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages