Skip to content

Commit

Permalink
💥 Change behavior of default arguments of commands
Browse files Browse the repository at this point in the history
Now default arguments are used only when no arguments are given and [&]
(ampersand) feature is removed.

We are planning to add a "persistent arguments" feature as an
alternative.
  • Loading branch information
lambdalisue committed Sep 24, 2023
1 parent a946599 commit 67021af
Show file tree
Hide file tree
Showing 10 changed files with 147 additions and 212 deletions.
40 changes: 15 additions & 25 deletions denops/gin/command/branch/main.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import type { Denops } from "https://deno.land/x/denops_std@v5.0.1/mod.ts";
import * as helper from "https://deno.land/x/denops_std@v5.0.1/helper/mod.ts";
import { assert, is } from "https://deno.land/x/unknownutil@v3.9.0/mod.ts#^";
import {
assert,
ensure,
is,
} from "https://deno.land/x/unknownutil@v3.9.0/mod.ts#^";
import * as vars from "https://deno.land/x/denops_std@v5.0.1/variable/mod.ts";
import {
builtinOpts,
Expand All @@ -10,11 +14,7 @@ import {
validateOpts,
} from "https://deno.land/x/denops_std@v5.0.1/argument/mod.ts";

import {
normCmdArgs,
parseDisableDefaultArgs,
parseSilent,
} from "../../util/cmd.ts";
import { normCmdArgs, parseSilent } from "../../util/cmd.ts";
import { exec } from "./command.ts";
import { edit } from "./edit.ts";

Expand All @@ -26,14 +26,10 @@ export function main(denops: Denops): void {
assert(mods, is.String, { name: "mods" });
assert(args, is.ArrayOf(is.String), { name: "args" });
const silent = parseSilent(mods);
const [disableDefaultArgs, realArgs] = parseDisableDefaultArgs(args);
return helper.ensureSilent(denops, silent, () => {
return helper.friendlyCall(
denops,
() =>
command(denops, bang, mods, realArgs, {
disableDefaultArgs,
}),
() => command(denops, bang, mods, args),
);
});
},
Expand All @@ -56,28 +52,22 @@ const allowedFlags = [
"no-abbrev",
];

type CommandOptions = {
disableDefaultArgs?: boolean;
};

async function command(
denops: Denops,
bang: string,
mods: string,
args: string[],
options: CommandOptions = {},
): Promise<void> {
if (!options.disableDefaultArgs) {
const defaultArgs = await vars.g.get(
denops,
"gin_branch_default_args",
[],
if (args.length === 0) {
args = ensure(
await vars.g.get(denops, "gin_branch_default_args", []),
is.ArrayOf(is.String),
{
name: "g:gin_branch_default_args",
},
);
assert(defaultArgs, is.ArrayOf(is.String), {
name: "g:gin_branch_default_args",
});
args = [...defaultArgs, ...args];
}

const [opts, flags, residue] = parse(await normCmdArgs(denops, args));
validateOpts(opts, [
"worktree",
Expand Down
24 changes: 10 additions & 14 deletions denops/gin/command/browse/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
validateFlags,
validateOpts,
} from "https://deno.land/x/denops_std@v5.0.1/argument/mod.ts";
import { normCmdArgs, parseDisableDefaultArgs } from "../../util/cmd.ts";
import { normCmdArgs } from "../../util/cmd.ts";
import { exec } from "./command.ts";

type Range = readonly [number, number];
Expand All @@ -27,12 +27,10 @@ export function main(denops: Denops): void {
"browse:command": (args, range) => {
assert(args, is.ArrayOf(is.String), { name: "args" });
assert(range, is.OneOf([is.Undefined, isRange]), { name: "range" });
const [disableDefaultArgs, realArgs] = parseDisableDefaultArgs(args);
return helper.friendlyCall(
denops,
() =>
command(denops, realArgs, {
disableDefaultArgs,
command(denops, args, {
range,
}),
);
Expand All @@ -41,7 +39,6 @@ export function main(denops: Denops): void {
}

type CommandOptions = {
disableDefaultArgs?: boolean;
range?: Range;
};

Expand All @@ -50,17 +47,16 @@ async function command(
args: string[],
options: CommandOptions = {},
): Promise<void> {
if (!options.disableDefaultArgs) {
const defaultArgs = await vars.g.get(
denops,
"gin_browse_default_args",
[],
if (args.length === 0) {
args = ensure(
await vars.g.get(denops, "gin_browse_default_args", []),
is.ArrayOf(is.String),
{
name: "g:gin_browse_default_args",
},
);
assert(defaultArgs, is.ArrayOf(is.String), {
name: "g:gin_browse_default_args",
});
args = [...defaultArgs, ...args];
}

const [opts, flags, residue] = parse(await normCmdArgs(denops, args));
validateFlags(flags, [
"remote",
Expand Down
40 changes: 15 additions & 25 deletions denops/gin/command/chaperon/main.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import type { Denops } from "https://deno.land/x/denops_std@v5.0.1/mod.ts";
import * as vars from "https://deno.land/x/denops_std@v5.0.1/variable/mod.ts";
import * as helper from "https://deno.land/x/denops_std@v5.0.1/helper/mod.ts";
import { assert, is } from "https://deno.land/x/unknownutil@v3.9.0/mod.ts#^";
import {
assert,
ensure,
is,
} from "https://deno.land/x/unknownutil@v3.9.0/mod.ts#^";
import {
builtinOpts,
formatOpts,
parse,
validateOpts,
} from "https://deno.land/x/denops_std@v5.0.1/argument/mod.ts";
import {
normCmdArgs,
parseDisableDefaultArgs,
parseSilent,
} from "../../util/cmd.ts";
import { normCmdArgs, parseSilent } from "../../util/cmd.ts";
import { exec } from "./command.ts";

export function main(denops: Denops): void {
Expand All @@ -22,43 +22,33 @@ export function main(denops: Denops): void {
assert(bang, is.String, { name: "bang" });
assert(mods, is.String, { name: "mods" });
assert(args, is.ArrayOf(is.String), { name: "args" });
const [disableDefaultArgs, realArgs] = parseDisableDefaultArgs(args);
const silent = parseSilent(mods);
return helper.ensureSilent(denops, silent, () => {
return helper.friendlyCall(
denops,
() =>
command(denops, bang, mods, realArgs, {
disableDefaultArgs,
}),
() => command(denops, bang, mods, args),
);
});
},
};
}

type CommandOptions = {
disableDefaultArgs?: boolean;
};

async function command(
denops: Denops,
bang: string,
mods: string,
args: string[],
options: CommandOptions = {},
): Promise<void> {
if (!options.disableDefaultArgs) {
const defaultArgs = await vars.g.get(
denops,
"gin_chaperon_default_args",
[],
if (args.length === 0) {
args = ensure(
await vars.g.get(denops, "gin_chaperon_default_args", []),
is.ArrayOf(is.String),
{
name: "g:gin_chaperon_default_args",
},
);
assert(defaultArgs, is.ArrayOf(is.String), {
name: "g:gin_chaperon_default_args",
});
args = [...defaultArgs, ...args];
}

const [opts, _, residue] = parse(await normCmdArgs(denops, args));
validateOpts(opts, [
"worktree",
Expand Down
40 changes: 15 additions & 25 deletions denops/gin/command/diff/main.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import type { Denops } from "https://deno.land/x/denops_std@v5.0.1/mod.ts";
import { assert, is } from "https://deno.land/x/unknownutil@v3.9.0/mod.ts#^";
import {
assert,
ensure,
is,
} from "https://deno.land/x/unknownutil@v3.9.0/mod.ts#^";
import * as helper from "https://deno.land/x/denops_std@v5.0.1/helper/mod.ts";
import * as vars from "https://deno.land/x/denops_std@v5.0.1/variable/mod.ts";
import {
Expand All @@ -9,11 +13,7 @@ import {
validateFlags,
validateOpts,
} from "https://deno.land/x/denops_std@v5.0.1/argument/mod.ts";
import {
normCmdArgs,
parseDisableDefaultArgs,
parseSilent,
} from "../../util/cmd.ts";
import { normCmdArgs, parseSilent } from "../../util/cmd.ts";
import { exec } from "./command.ts";
import { edit } from "./edit.ts";
import { read } from "./read.ts";
Expand All @@ -26,15 +26,11 @@ export function main(denops: Denops): void {
assert(bang, is.String, { name: "bang" });
assert(mods, is.String, { name: "mods" });
assert(args, is.ArrayOf(is.String), { name: "args" });
const [disableDefaultArgs, realArgs] = parseDisableDefaultArgs(args);
const silent = parseSilent(mods);
return helper.ensureSilent(denops, silent, () => {
return helper.friendlyCall(
denops,
() =>
command(denops, bang, mods, realArgs, {
disableDefaultArgs,
}),
() => command(denops, bang, mods, args),
);
});
},
Expand Down Expand Up @@ -81,28 +77,22 @@ const allowedFlags = [
"ignore-submodules",
];

type CommandOptions = {
disableDefaultArgs?: boolean;
};

async function command(
denops: Denops,
bang: string,
mods: string,
args: string[],
options: CommandOptions = {},
): Promise<void> {
if (!options.disableDefaultArgs) {
const defaultArgs = await vars.g.get(
denops,
"gin_diff_default_args",
[],
if (args.length === 0) {
args = ensure(
await vars.g.get(denops, "gin_diff_default_args", []),
is.ArrayOf(is.String),
{
name: "g:gin_diff_default_args",
},
);
assert(defaultArgs, is.ArrayOf(is.String), {
name: "g:gin_diff_default_args",
});
args = [...defaultArgs, ...args];
}

const [opts, flags, residue] = parse(await normCmdArgs(denops, args));
validateOpts(opts, [
"processor",
Expand Down
40 changes: 15 additions & 25 deletions denops/gin/command/edit/main.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import type { Denops } from "https://deno.land/x/denops_std@v5.0.1/mod.ts";
import { assert, is } from "https://deno.land/x/unknownutil@v3.9.0/mod.ts#^";
import {
assert,
ensure,
is,
} from "https://deno.land/x/unknownutil@v3.9.0/mod.ts#^";
import * as vars from "https://deno.land/x/denops_std@v5.0.1/variable/mod.ts";
import * as helper from "https://deno.land/x/denops_std@v5.0.1/helper/mod.ts";
import {
Expand All @@ -8,11 +12,7 @@ import {
parseOpts,
validateOpts,
} from "https://deno.land/x/denops_std@v5.0.1/argument/mod.ts";
import {
normCmdArgs,
parseDisableDefaultArgs,
parseSilent,
} from "../../util/cmd.ts";
import { normCmdArgs, parseSilent } from "../../util/cmd.ts";
import { exec } from "./command.ts";
import { edit } from "./edit.ts";
import { read } from "./read.ts";
Expand All @@ -25,15 +25,11 @@ export function main(denops: Denops): void {
assert(bang, is.String, { name: "bang" });
assert(mods, is.String, { name: "mods" });
assert(args, is.ArrayOf(is.String), { name: "args" });
const [disableDefaultArgs, realArgs] = parseDisableDefaultArgs(args);
const silent = parseSilent(mods);
return helper.ensureSilent(denops, silent, () => {
return helper.friendlyCall(
denops,
() =>
command(denops, bang, mods, realArgs, {
disableDefaultArgs,
}),
() => command(denops, bang, mods, args),
);
});
},
Expand All @@ -55,28 +51,22 @@ export function main(denops: Denops): void {
};
}

type CommandOptions = {
disableDefaultArgs?: boolean;
};

async function command(
denops: Denops,
bang: string,
mods: string,
args: string[],
options: CommandOptions = {},
): Promise<void> {
if (!options.disableDefaultArgs) {
const defaultArgs = await vars.g.get(
denops,
"gin_edit_default_args",
[],
if (args.length === 0) {
args = ensure(
await vars.g.get(denops, "gin_edit_default_args", []),
is.ArrayOf(is.String),
{
name: "g:gin_edit_default_args",
},
);
assert(defaultArgs, is.ArrayOf(is.String), {
name: "g:gin_edit_default_args",
});
args = [...defaultArgs, ...args];
}

const [opts, residue] = parseOpts(await normCmdArgs(denops, args));
validateOpts(opts, [
"worktree",
Expand Down
Loading

0 comments on commit 67021af

Please sign in to comment.