Compare commits

..

16 Commits

Author SHA1 Message Date
065ef47b2b Change download url to branch 2023-03-06 11:04:28 -05:00
702d3a6889 Add vim-fugitive command to similar section 2023-03-01 00:13:42 -05:00
512df2948e Keep new changes on right
Saves and restores splitright option
2023-03-01 00:05:35 -05:00
Balki
e81277ecb4
Merge pull request #6 from ilyagr/diffonly
Option to skip creating tabs for identical files. Useful outside git.
2023-03-01 05:04:30 +00:00
Ilya Grigoriev
4188c51081 Option to skip creating tabs for identical files 2023-02-28 18:53:16 -08:00
Ilya Grigoriev
5702bf8e27 Unindent help text in README 2023-02-28 18:41:06 -08:00
Balki
732fad0a98
Merge pull request #4 from ilyagr/patch-1
Add more similar plugins to the README
2023-03-01 01:32:29 +00:00
Ilya Grigoriev
c2809e6e0e Add more similar plugins to the README 2023-02-28 16:38:21 -08:00
731553906d update vim tips 2023-01-05 16:04:40 -05:00
c907c006db improve type annotations 2022-12-21 21:29:53 -05:00
fdae5aa6de Fix mypy errors 2022-12-21 20:50:43 -05:00
da5e24260a Use shlex to split custom vim command
This allows to include spaces in vim command
Add example to change default diff algorithm
Move to first line on each file
2022-12-20 13:59:12 -05:00
bb6fa28de0 fix README link 2022-12-10 19:48:02 -05:00
e7744c8e9a update README formatting 2022-12-10 19:43:02 -05:00
da9eb32e36 update README 2022-12-10 19:40:11 -05:00
7c11878345 Add type annotations and use match statement
Now works only in python3.10 and above
2022-12-09 21:58:02 -05:00
2 changed files with 68 additions and 37 deletions

View File

@ -24,7 +24,7 @@ You may need to add `~/bin` to your PATH variable if not already done. See [here
# Usage # Usage
```help ```help
usage: vimtabdiff.py [-h] [--vim VIM] pathA pathB usage: vimtabdiff.py [-h] [--vim VIM] [--onlydiffs] pathA pathB
Show diff of files from two directories in vim tabs Show diff of files from two directories in vim tabs
@ -35,9 +35,23 @@ You may need to add `~/bin` to your PATH variable if not already done. See [here
options: options:
-h, --help show this help message and exit -h, --help show this help message and exit
--vim VIM vim command to run --vim VIM vim command to run
--onlydiffs only open files where there is a diff
``` ```
# Git difftool ## Relevant vim tips
* `gt` → Go to next tab
* `gT` → Go to previous tab
* `:tabr` → Go to first tab
* `:drop filenam<Tab>` → Go to the tab with filename
* `g<Tab>` → Go to last used tab (Works in vim version > 8.2.1401)
* `:set mouse=a` → Now clicking on a tab works
* `]c` → Go to next diff hunk
* `[c` → Go to previous diff hunk
* `do`, `dp` → Diff obtain, Diff put
* `zo`, `zc`, `zi` → Fold open, Fold close, toggle all folds
# See Git diffs
## Setup ## Setup
@ -65,7 +79,7 @@ Using clean vim without reading `vimrc`
Git config file (`~/.gitconfig`) should look like this Git config file (`~/.gitconfig`) should look like this
```toml ```TOML
[alias] [alias]
... ...
dt = difftool --tool vimtabdiff --dir-diff dt = difftool --tool vimtabdiff --dir-diff
@ -83,4 +97,7 @@ Using better diff algorithm
# Similar # Similar
https://gist.github.com/Osse/4709787 * https://gist.github.com/Osse/4709787 is very similar, written as a `zsh` script.
* https://github.com/will133/vim-dirdiff is a Vim plugin that uses an interactive list of files instead of tabs.
* https://github.com/Soares/tabdiff.vim is a Vim plugin takes a list of files as aguments.
* [`:Git difftool -y`](https://github.com/tpope/vim-fugitive/blob/d507d00bd04794119beeb41da118774a96815b65/doc/fugitive.txt#L92) is a command from vim-fugitive which is a vim git plugin.

View File

@ -1,34 +1,45 @@
#!/usr/bin/python3 #!/usr/bin/python3
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import os import os
import argparse import argparse
import pathlib
import itertools import itertools
import tempfile import tempfile
import subprocess import subprocess
import shlex import shlex
from pathlib import Path
from typing import TypeVar
from collections.abc import Iterator, Callable
def star(f): R = TypeVar('R')
def star(f: Callable[..., R]) -> Callable[[tuple], R]:
""" see https://stackoverflow.com/q/21892989 """ """ see https://stackoverflow.com/q/21892989 """
return lambda args: f(*args) return lambda args: f(*args)
def parse_args(): def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Show diff of files from two directories in vim tabs", description="Show diff of files from two directories in vim tabs",
epilog="See https://github.com/balki/vimtabdiff for more info") epilog="See https://github.com/balki/vimtabdiff for more info")
parser.add_argument("pathA") parser.add_argument("pathA", type=Path)
parser.add_argument("pathB") parser.add_argument("pathB", type=Path)
parser.add_argument("--vim", help="vim command to run", default="vim") parser.add_argument("--vim", help="vim command to run", default="vim")
parser.add_argument(
"--onlydiffs", help="only open files where there is a diff", action="store_true"
)
return parser.parse_args() return parser.parse_args()
def get_dir_info(dirname): def get_dir_info(dirpath: Path | None) -> tuple[list[Path], list[Path]]:
if not dirname: if not dirpath:
return [], [] return [], []
dirs, files = [], [] dirs, files = [], []
dirp = pathlib.Path(dirname) for p in dirpath.iterdir():
for p in dirp.iterdir():
if p.is_dir(): if p.is_dir():
dirs.append(p) dirs.append(p)
else: else:
@ -36,27 +47,26 @@ def get_dir_info(dirname):
return dirs, files return dirs, files
def get_pairs(aItems, bItems): def get_pairs(aPaths: list[Path],
aItems = [(item, 'A') for item in aItems] bPaths: list[Path]) -> Iterator[tuple[Path | None, Path | None]]:
bItems = [(item, 'B') for item in bItems] aItems = [(item, 'A') for item in aPaths]
bItems = [(item, 'B') for item in bPaths]
abItems = aItems + bItems abItems = aItems + bItems
abItems.sort(key=star(lambda item, tag: (item.name, tag))) abItems.sort(key=star(lambda item, tag: (item.name, tag)))
for _, items in itertools.groupby(abItems, for _, items in itertools.groupby(abItems,
key=star(lambda item, _: item.name)): key=star(lambda item, _: item.name)):
items = list(items) match list(items):
# NOTE: python 3.10's match expression can make this better case [(aItem, _), (bItem, _)]:
if len(items) == 2:
(aItem, _), (bItem, _) = items
yield aItem, bItem yield aItem, bItem
else: case [(item, 'A'),]:
(item, tag), = items
if tag == 'A':
yield item, None yield item, None
else: case [(item, 'B'),]:
yield None, item yield None, item
def get_file_pairs(a, b): def get_file_pairs(
a: Path | None,
b: Path | None) -> Iterator[tuple[Path | None, Path | None]]:
aDirs, aFiles = get_dir_info(a) aDirs, aFiles = get_dir_info(a)
bDirs, bFiles = get_dir_info(b) bDirs, bFiles = get_dir_info(b)
yield from get_pairs(aFiles, bFiles) yield from get_pairs(aFiles, bFiles)
@ -64,7 +74,7 @@ def get_file_pairs(a, b):
yield from get_file_pairs(aDir, bDir) yield from get_file_pairs(aDir, bDir)
def main(): def main() -> None:
args = parse_args() args = parse_args()
vimCmdFile = tempfile.NamedTemporaryFile(mode='w', delete=False) vimCmdFile = tempfile.NamedTemporaryFile(mode='w', delete=False)
with vimCmdFile: with vimCmdFile:
@ -76,9 +86,13 @@ def main():
for a, b in get_file_pairs(args.pathA, args.pathB): for a, b in get_file_pairs(args.pathA, args.pathB):
aPath = a.resolve() if a else os.devnull aPath = a.resolve() if a else os.devnull
bPath = b.resolve() if b else os.devnull bPath = b.resolve() if b else os.devnull
print( if (
f"tabedit {aPath} | vsp {bPath}", args.onlydiffs
file=vimCmdFile) and a and b
and open(aPath, mode="rb").read() == open(bPath, mode="rb").read()
):
continue
print(f"tabedit {aPath} | vsp {bPath}", file=vimCmdFile)
cmds = f""" cmds = f"""
let &splitright = s:spr let &splitright = s:spr
tabdo windo :1 tabdo windo :1