Skip to content

Commit 6a1841f

Browse files
authored
Merge pull request #166 from lambdalisue/global-diff-jump
feat: Add diffjump and difffold features
2 parents 4033d58 + 2e75c2a commit 6a1841f

File tree

21 files changed

+898
-295
lines changed

21 files changed

+898
-295
lines changed

denops/gin/action/show.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ async function doShow(
6060
await denops.dispatch("gin", "buffer:command", "", "", [
6161
`++opener=${opener}`,
6262
...(emojify ? [`++emojify`] : []),
63+
`++diffjump=${x.commit}`,
64+
`++difffold`,
6365
"show",
6466
x.commit,
6567
]);

denops/gin/command/buffer/command.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ export type ExecOptions = {
1111
monochrome?: boolean;
1212
opener?: string;
1313
emojify?: boolean;
14+
diffjump?: string;
15+
difffold?: boolean;
16+
filetype?: string;
1417
cmdarg?: string;
1518
mods?: string;
1619
bang?: boolean;
@@ -33,6 +36,9 @@ export async function exec(
3336
processor: unnullish(options.processor, (v) => v.join(" ")),
3437
monochrome: unnullish(options.monochrome, (v) => v ? "" : undefined),
3538
emojify: unnullish(options.emojify, (v) => v ? "" : undefined),
39+
diffjump: options.diffjump,
40+
difffold: unnullish(options.difffold, (v) => v ? "" : undefined),
41+
filetype: options.filetype ?? "gin-buffer",
3642
},
3743
fragment: `${args.join(" ")}$`,
3844
});

denops/gin/command/buffer/edit.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import {
1616
buildDecorationsFromAnsiEscapeCode,
1717
} from "../../util/ansi_escape_code.ts";
1818
import { execute } from "../../git/executor.ts";
19+
import { init as initDiffJump } from "../../feat/diffjump/jump.ts";
20+
import { init as initDiffFold } from "../../feat/difffold/fold.ts";
1921

2022
export async function edit(
2123
denops: Denops,
@@ -42,8 +44,23 @@ export async function edit(
4244
monochrome: "monochrome" in (params ?? {}),
4345
encoding: opts.enc ?? opts.encoding,
4446
fileformat: opts.ff ?? opts.fileformat,
47+
filetype: unnullish(
48+
params?.filetype,
49+
(v) => ensure(v, is.String, { message: "filetype must be string" }),
50+
),
4551
emojify: "emojify" in (params ?? {}),
4652
});
53+
54+
// Initialize diff jump functionality if ++diffjump option is present
55+
const jumpCommitish = params?.diffjump;
56+
if (jumpCommitish !== undefined) {
57+
await initDiffJump(denops, bufnr, "buffer");
58+
}
59+
60+
// Initialize diff fold functionality if ++difffold option is present
61+
if ("difffold" in (params ?? {})) {
62+
await initDiffFold(denops, bufnr);
63+
}
4764
}
4865

4966
export type ExecOptions = {
@@ -52,6 +69,7 @@ export type ExecOptions = {
5269
monochrome?: boolean;
5370
encoding?: string;
5471
fileformat?: string;
72+
filetype?: string;
5573
emojify?: boolean;
5674
stdoutIndicator?: string;
5775
stderrIndicator?: string;
@@ -110,7 +128,9 @@ export async function exec(
110128
await buffer.concrete(denops, bufnr);
111129
await buffer.ensure(denops, bufnr, async () => {
112130
await batch.batch(denops, async (denops) => {
113-
await option.filetype.setLocal(denops, "gin");
131+
if (options.filetype !== undefined) {
132+
await option.filetype.setLocal(denops, options.filetype);
133+
}
114134
await option.bufhidden.setLocal(denops, "unload");
115135
await option.buftype.setLocal(denops, "nofile");
116136
await option.swapfile.setLocal(denops, false);

denops/gin/command/buffer/main.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import type { Denops } from "jsr:@denops/std@^7.0.0";
22
import { unnullish } from "jsr:@lambdalisue/unnullish@^1.0.0";
3-
import { assert, is } from "jsr:@core/unknownutil@^4.0.0";
3+
import { assert, ensure, is } from "jsr:@core/unknownutil@^4.0.0";
44
import * as helper from "jsr:@denops/std@^7.0.0/helper";
55
import * as buffer from "jsr:@denops/std@^7.0.0/buffer";
6+
import * as fn from "jsr:@denops/std@^7.0.0/function";
7+
import { parse as parseBufname } from "jsr:@denops/std@^7.0.0/bufname";
68
import {
79
builtinOpts,
810
formatOpts,
@@ -14,6 +16,7 @@ import { normCmdArgs, parseSilent } from "../../util/cmd.ts";
1416
import { exec } from "./command.ts";
1517
import { edit } from "./edit.ts";
1618
import { read } from "./read.ts";
19+
import { main as mainDiffJump } from "../../feat/diffjump/main.ts";
1720

1821
export function main(denops: Denops): void {
1922
denops.dispatcher = {
@@ -47,6 +50,38 @@ export function main(denops: Denops): void {
4750
);
4851
},
4952
};
53+
mainDiffJump(denops, "buffer", {
54+
commitishMap: {
55+
old: async ({ bufnr }) => {
56+
const bufname = await fn.bufname(denops, bufnr);
57+
const { params } = parseBufname(bufname);
58+
const jumpCommitish = params?.diffjump;
59+
if (jumpCommitish === undefined) {
60+
return "HEAD^";
61+
}
62+
const commitish = ensure(
63+
jumpCommitish || "HEAD",
64+
is.String,
65+
{ message: "jump must be string" },
66+
);
67+
return `${commitish}^`;
68+
},
69+
new: async ({ bufnr }) => {
70+
const bufname = await fn.bufname(denops, bufnr);
71+
const { params } = parseBufname(bufname);
72+
const jumpCommitish = params?.diffjump;
73+
if (jumpCommitish === undefined) {
74+
return "HEAD";
75+
}
76+
const commitish = ensure(
77+
jumpCommitish || "HEAD",
78+
is.String,
79+
{ message: "jump must be string" },
80+
);
81+
return commitish;
82+
},
83+
},
84+
});
5085
}
5186

5287
async function command(
@@ -62,6 +97,9 @@ async function command(
6297
"monochrome",
6398
"opener",
6499
"emojify",
100+
"diffjump",
101+
"difffold",
102+
"filetype",
65103
...builtinOpts,
66104
]);
67105
return exec(denops, residue, {
@@ -70,6 +108,9 @@ async function command(
70108
monochrome: unnullish(opts.monochrome, () => true),
71109
opener: opts.opener,
72110
emojify: unnullish(opts.emojify, () => true),
111+
diffjump: opts.diffjump,
112+
difffold: unnullish(opts.difffold, () => true),
113+
filetype: opts.filetype,
73114
cmdarg: formatOpts(opts, builtinOpts).join(" "),
74115
mods,
75116
bang: bang === "!",

denops/gin/command/diff/commitish.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
export const INDEX = Symbol("INDEX");
2-
export const WORKTREE = Symbol("WORKTREE");
3-
4-
export type Commitish = string | typeof INDEX | typeof WORKTREE;
1+
import { type Commitish, INDEX, WORKTREE } from "../../feat/diffjump/jump.ts";
52

63
// git diff
74
// INDEX -> WORKTREE

denops/gin/command/diff/commitish_test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { assertEquals } from "jsr:@std/assert@^1.0.0";
2-
import { Commitish, INDEX, parseCommitish, WORKTREE } from "./commitish.ts";
2+
import { type Commitish, INDEX, WORKTREE } from "../../feat/diffjump/jump.ts";
3+
import { parseCommitish } from "./commitish.ts";
34

45
Deno.test("parseCommitish", () => {
56
const testcases: [[string, boolean], [Commitish, Commitish]][] = [

denops/gin/command/diff/edit.ts

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import type { Denops } from "jsr:@denops/std@^7.0.0";
22
import { unnullish } from "jsr:@lambdalisue/unnullish@^1.0.0";
33
import { ensure, is } from "jsr:@core/unknownutil@^4.0.0";
44
import * as batch from "jsr:@denops/std@^7.0.0/batch";
5-
import * as mapping from "jsr:@denops/std@^7.0.0/mapping";
65
import * as option from "jsr:@denops/std@^7.0.0/option";
76
import * as vars from "jsr:@denops/std@^7.0.0/variable";
87
import { parse as parseBufname } from "jsr:@denops/std@^7.0.0/bufname";
@@ -15,6 +14,8 @@ import {
1514
} from "jsr:@denops/std@^7.0.0/argument";
1615
import * as buffer from "jsr:@denops/std@^7.0.0/buffer";
1716
import { exec as execBuffer } from "../../command/buffer/edit.ts";
17+
import { init as initDiffJump } from "../../feat/diffjump/jump.ts";
18+
import { init as initDiffFold } from "../../feat/difffold/fold.ts";
1819

1920
export async function edit(
2021
denops: Denops,
@@ -85,33 +86,12 @@ export async function exec(
8586
await option.buftype.setLocal(denops, "nofile");
8687
await option.swapfile.setLocal(denops, false);
8788
await option.modifiable.setLocal(denops, false);
88-
await mapping.map(
89-
denops,
90-
"<Plug>(gin-diffjump-old)",
91-
`<Cmd>call denops#request('gin', 'diff:jump:old', [])<CR>`,
92-
{
93-
buffer: true,
94-
noremap: true,
95-
},
96-
);
97-
await mapping.map(
98-
denops,
99-
"<Plug>(gin-diffjump-new)",
100-
`<Cmd>call denops#request('gin', 'diff:jump:new', [])<CR>`,
101-
{
102-
buffer: true,
103-
noremap: true,
104-
},
105-
);
106-
await mapping.map(
107-
denops,
108-
"<Plug>(gin-diffjump-smart)",
109-
`<Cmd>call denops#request('gin', 'diff:jump:smart', [])<CR>`,
110-
{
111-
buffer: true,
112-
noremap: true,
113-
},
114-
);
11589
});
11690
});
91+
92+
// Initialize diff jump functionality
93+
await initDiffJump(denops, bufnr, "diff");
94+
95+
// Initialize diff fold functionality
96+
await initDiffFold(denops, bufnr);
11797
}

0 commit comments

Comments
 (0)