@0x-jerry/x 2.7.5 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-TTBHFDNB.js → chunk-UW6XLRG7.js} +1 -1
- package/dist/{chunk-NZSFHG3Q.js → chunk-V3SRPG2G.js} +1 -1
- package/dist/hooks-FAN2NM5B.js +105 -0
- package/dist/preload.js +3 -0
- package/dist/x.js +5 -5
- package/dist/xn.js +6 -6
- package/dist/xr.js +21 -11
- package/package.json +17 -14
- package/readme.md +94 -94
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// src/hooks/text.ts
|
|
2
|
+
import {
|
|
3
|
+
registerHooks
|
|
4
|
+
} from "module";
|
|
5
|
+
import path from "path";
|
|
6
|
+
|
|
7
|
+
// src/hooks/utils.ts
|
|
8
|
+
function sourceToStr(source) {
|
|
9
|
+
if (!source) return "";
|
|
10
|
+
if (source instanceof ArrayBuffer) {
|
|
11
|
+
return Buffer.from(source).toString("utf-8");
|
|
12
|
+
}
|
|
13
|
+
if (typeof source === "string") {
|
|
14
|
+
return source;
|
|
15
|
+
}
|
|
16
|
+
return Buffer.from(source.buffer).toString("utf-8");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/hooks/text.ts
|
|
20
|
+
var supportedExtensions = [".txt", ".sql", ".md"];
|
|
21
|
+
var FORMAT_TYPE = "text";
|
|
22
|
+
var resolve = (specifier, _ctx, nextResolve) => {
|
|
23
|
+
const nextResult = nextResolve(specifier);
|
|
24
|
+
const ext = path.extname(specifier);
|
|
25
|
+
if (!supportedExtensions.includes(ext)) return nextResult;
|
|
26
|
+
return {
|
|
27
|
+
...nextResult,
|
|
28
|
+
format: FORMAT_TYPE
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
var load = (url, ctx, nextLoad) => {
|
|
32
|
+
const nextResult = nextLoad(url, ctx);
|
|
33
|
+
if (ctx.format !== FORMAT_TYPE) return nextResult;
|
|
34
|
+
const source = `export default ${JSON.stringify(sourceToStr(nextResult.source))};`;
|
|
35
|
+
return {
|
|
36
|
+
format: "module",
|
|
37
|
+
source
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
registerHooks({
|
|
41
|
+
resolve,
|
|
42
|
+
load
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// src/hooks/jsonc.ts
|
|
46
|
+
import {
|
|
47
|
+
registerHooks as registerHooks2
|
|
48
|
+
} from "module";
|
|
49
|
+
import path2 from "path";
|
|
50
|
+
import stripJsonComment from "strip-json-comments";
|
|
51
|
+
var supportedExtensions2 = [".jsonc"];
|
|
52
|
+
var FORMAT_TYPE2 = "jsonc";
|
|
53
|
+
var resolve2 = (specifier, _ctx, nextResolve) => {
|
|
54
|
+
const nextResult = nextResolve(specifier);
|
|
55
|
+
const ext = path2.extname(specifier);
|
|
56
|
+
if (!supportedExtensions2.includes(ext)) return nextResult;
|
|
57
|
+
return {
|
|
58
|
+
...nextResult,
|
|
59
|
+
format: FORMAT_TYPE2
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
var load2 = (url, ctx, nextLoad) => {
|
|
63
|
+
const nextResult = nextLoad(url, ctx);
|
|
64
|
+
if (ctx.format !== FORMAT_TYPE2) return nextResult;
|
|
65
|
+
const source = stripJsonComment(sourceToStr(nextResult.source));
|
|
66
|
+
return {
|
|
67
|
+
format: "json",
|
|
68
|
+
source
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
registerHooks2({
|
|
72
|
+
resolve: resolve2,
|
|
73
|
+
load: load2
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// src/hooks/yaml.ts
|
|
77
|
+
import {
|
|
78
|
+
registerHooks as registerHooks3
|
|
79
|
+
} from "module";
|
|
80
|
+
import path3 from "path";
|
|
81
|
+
import yaml from "yaml";
|
|
82
|
+
var supportedExtensions3 = [".yaml", ".yml"];
|
|
83
|
+
var FORMAT_TYPE3 = "yaml";
|
|
84
|
+
var resolve3 = (specifier, _ctx, nextResolve) => {
|
|
85
|
+
const nextResult = nextResolve(specifier);
|
|
86
|
+
const ext = path3.extname(specifier);
|
|
87
|
+
if (!supportedExtensions3.includes(ext)) return nextResult;
|
|
88
|
+
return {
|
|
89
|
+
...nextResult,
|
|
90
|
+
format: FORMAT_TYPE3
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
var load3 = (url, ctx, nextLoad) => {
|
|
94
|
+
if (ctx.format !== FORMAT_TYPE3) return nextLoad(url, ctx);
|
|
95
|
+
const nextResult = nextLoad(url, { format: "module" });
|
|
96
|
+
const source = yaml.parse(sourceToStr(nextResult.source));
|
|
97
|
+
return {
|
|
98
|
+
format: "json",
|
|
99
|
+
source: JSON.stringify(source)
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
registerHooks3({
|
|
103
|
+
resolve: resolve3,
|
|
104
|
+
load: load3
|
|
105
|
+
});
|
package/dist/preload.js
ADDED
package/dist/x.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
version
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-V3SRPG2G.js";
|
|
5
5
|
|
|
6
6
|
// src/x.ts
|
|
7
7
|
import { sliver } from "@0x-jerry/silver";
|
|
8
8
|
import { bootstrap } from "global-agent";
|
|
9
9
|
|
|
10
10
|
// src/commands/downloadGitRepo.ts
|
|
11
|
-
import { createWriteStream } from "
|
|
12
|
-
import os from "
|
|
13
|
-
import path from "
|
|
14
|
-
import { pipeline } from "
|
|
11
|
+
import { createWriteStream } from "fs";
|
|
12
|
+
import os from "os";
|
|
13
|
+
import path from "path";
|
|
14
|
+
import { pipeline } from "stream/promises";
|
|
15
15
|
import decompress from "decompress";
|
|
16
16
|
import fs from "fs-extra";
|
|
17
17
|
import got from "got";
|
package/dist/xn.js
CHANGED
|
@@ -3,16 +3,16 @@ import {
|
|
|
3
3
|
exec,
|
|
4
4
|
exists,
|
|
5
5
|
flagOptionToStringArray
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-UW6XLRG7.js";
|
|
7
7
|
import {
|
|
8
8
|
version
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-V3SRPG2G.js";
|
|
10
10
|
|
|
11
11
|
// src/xn.ts
|
|
12
12
|
import { sliver } from "@0x-jerry/silver";
|
|
13
13
|
|
|
14
14
|
// src/commands/dep/deno.ts
|
|
15
|
-
import path from "
|
|
15
|
+
import path from "path";
|
|
16
16
|
import { pathExists } from "fs-extra";
|
|
17
17
|
var DenoDependencyManager = class {
|
|
18
18
|
check() {
|
|
@@ -34,8 +34,8 @@ var DenoDependencyManager = class {
|
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
// src/commands/dep/node.ts
|
|
37
|
-
import { readFile } from "
|
|
38
|
-
import path2, { join } from "
|
|
37
|
+
import { readFile } from "fs/promises";
|
|
38
|
+
import path2, { join } from "path";
|
|
39
39
|
import { pathExists as pathExists2 } from "fs-extra";
|
|
40
40
|
import pc from "picocolors";
|
|
41
41
|
var NodeDependencyManager = class {
|
|
@@ -151,7 +151,7 @@ function getTypePackageName(pkg) {
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
// src/commands/dep/rust.ts
|
|
154
|
-
import path3 from "
|
|
154
|
+
import path3 from "path";
|
|
155
155
|
import { pathExists as pathExists3 } from "fs-extra";
|
|
156
156
|
var RustDependencyManager = class {
|
|
157
157
|
check() {
|
package/dist/xr.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
exec
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-UW6XLRG7.js";
|
|
5
5
|
import {
|
|
6
6
|
version
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-V3SRPG2G.js";
|
|
8
8
|
|
|
9
9
|
// src/xr.ts
|
|
10
10
|
import { sliver } from "@0x-jerry/silver";
|
|
11
11
|
|
|
12
12
|
// src/commands/run.ts
|
|
13
|
-
import path4 from "
|
|
13
|
+
import path4 from "path";
|
|
14
14
|
import pc from "picocolors";
|
|
15
15
|
|
|
16
16
|
// src/commands/run/deno.ts
|
|
17
|
-
import { readFile } from "
|
|
18
|
-
import path from "
|
|
17
|
+
import { readFile } from "fs/promises";
|
|
18
|
+
import path from "path";
|
|
19
19
|
import { pathExists } from "fs-extra";
|
|
20
20
|
import { parse } from "jsonc-parser";
|
|
21
21
|
var DenoTaskDetecter = class {
|
|
@@ -41,8 +41,8 @@ var DenoTaskDetecter = class {
|
|
|
41
41
|
};
|
|
42
42
|
|
|
43
43
|
// src/commands/run/node.ts
|
|
44
|
-
import { readFile as readFile2, readdir } from "
|
|
45
|
-
import path2 from "
|
|
44
|
+
import { readFile as readFile2, readdir } from "fs/promises";
|
|
45
|
+
import path2 from "path";
|
|
46
46
|
import { pathExists as pathExists2 } from "fs-extra";
|
|
47
47
|
var NodeTaskDetecter = class {
|
|
48
48
|
async binaryPaths(cwd) {
|
|
@@ -86,7 +86,7 @@ var NodeTaskDetecter = class {
|
|
|
86
86
|
};
|
|
87
87
|
|
|
88
88
|
// src/commands/run/rust.ts
|
|
89
|
-
import path3 from "
|
|
89
|
+
import path3 from "path";
|
|
90
90
|
import { pathExists as pathExists3 } from "fs-extra";
|
|
91
91
|
var RustTaskDetecter = class {
|
|
92
92
|
check(cwd) {
|
|
@@ -144,20 +144,30 @@ async function getAvailableCommands() {
|
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
// src/xr.ts
|
|
147
|
+
import path5 from "path";
|
|
147
148
|
var ins = sliver`
|
|
148
149
|
v${version} @help @autocompletion
|
|
149
150
|
|
|
150
|
-
xr
|
|
151
|
+
xr <@command:command-or-file> #stopEarly, run npm script or ts/js file quickly. ${defaultAction}
|
|
151
152
|
`;
|
|
152
153
|
ins.type("command", async () => {
|
|
153
154
|
const allScripts = await getAvailableCommands();
|
|
154
155
|
return allScripts;
|
|
155
156
|
});
|
|
156
157
|
async function defaultAction(_, arg) {
|
|
157
|
-
const [
|
|
158
|
+
const [commandOrFile, ...params] = arg._;
|
|
159
|
+
if (isJsFile(commandOrFile)) {
|
|
160
|
+
const registerFilePath = path5.join(import.meta.dirname, "./preload.js");
|
|
161
|
+
await exec("node", ["--import", registerFilePath, commandOrFile]);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
158
164
|
try {
|
|
159
|
-
await runScript(
|
|
165
|
+
await runScript(commandOrFile, params);
|
|
160
166
|
} catch (error) {
|
|
161
167
|
process.exit(1);
|
|
162
168
|
}
|
|
163
169
|
}
|
|
170
|
+
var RE_TJS_FILE = /.(t|j)sx?$/;
|
|
171
|
+
function isJsFile(file) {
|
|
172
|
+
return RE_TJS_FILE.test(file);
|
|
173
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0x-jerry/x",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/0x-jerry/x.git"
|
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
"entry": [
|
|
35
35
|
"src/xr.ts",
|
|
36
36
|
"src/xn.ts",
|
|
37
|
-
"src/x.ts"
|
|
37
|
+
"src/x.ts",
|
|
38
|
+
"src/preload.js"
|
|
38
39
|
],
|
|
39
40
|
"format": [
|
|
40
41
|
"esm"
|
|
@@ -43,28 +44,30 @@
|
|
|
43
44
|
},
|
|
44
45
|
"dependencies": {
|
|
45
46
|
"@0x-jerry/silver": "^1.1.1",
|
|
46
|
-
"@0x-jerry/utils": "^
|
|
47
|
+
"@0x-jerry/utils": "^5.0.0",
|
|
47
48
|
"decompress": "^4.2.1",
|
|
48
|
-
"fs-extra": "^11.3.
|
|
49
|
+
"fs-extra": "^11.3.1",
|
|
49
50
|
"global-agent": "^3.0.0",
|
|
50
|
-
"got": "^14.4.
|
|
51
|
+
"got": "^14.4.8",
|
|
51
52
|
"jsonc-parser": "^3.3.1",
|
|
52
53
|
"ora": "^8.2.0",
|
|
53
54
|
"picocolors": "^1.1.1",
|
|
54
|
-
"prompts": "^2.4.2"
|
|
55
|
+
"prompts": "^2.4.2",
|
|
56
|
+
"strip-json-comments": "^5.0.3",
|
|
57
|
+
"tsx": "^4.20.5",
|
|
58
|
+
"yaml": "^2.8.1"
|
|
55
59
|
},
|
|
56
60
|
"devDependencies": {
|
|
57
|
-
"@0x-jerry/x-release": "^2.
|
|
58
|
-
"@biomejs/biome": "^
|
|
61
|
+
"@0x-jerry/x-release": "^2.4.0",
|
|
62
|
+
"@biomejs/biome": "^2.2.2",
|
|
59
63
|
"@types/decompress": "^4.2.7",
|
|
60
64
|
"@types/fs-extra": "^11.0.4",
|
|
61
65
|
"@types/global-agent": "^3.0.0",
|
|
62
|
-
"@types/node": "^
|
|
66
|
+
"@types/node": "^24.3.0",
|
|
63
67
|
"@types/prompts": "^2.4.9",
|
|
64
|
-
"@vitest/coverage-v8": "^3.
|
|
65
|
-
"tsup": "^8.
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"vitest": "^3.0.7"
|
|
68
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
69
|
+
"tsup": "^8.5.0",
|
|
70
|
+
"typescript": "^5.9.2",
|
|
71
|
+
"vitest": "^3.2.4"
|
|
69
72
|
}
|
|
70
73
|
}
|
package/readme.md
CHANGED
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
# X
|
|
2
|
-
|
|
3
|
-
Some useful command for myself.
|
|
4
|
-
|
|
5
|
-
## Install
|
|
6
|
-
|
|
7
|
-
```sh
|
|
8
|
-
pnpm i -g @0x-jerry/x
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Run task `xr`
|
|
12
|
-
|
|
13
|
-
`xr` command can auto detect tasks in `package.json/scripts`, `deno.json/tasks`, and run it. you can also append any parameters.
|
|
14
|
-
|
|
15
|
-
Example: In a node project with `pnpm-lock.yaml`. And `package.json` has a script `"test": "vitest run"`
|
|
16
|
-
|
|
17
|
-
```sh
|
|
18
|
-
xr test test/*.ts
|
|
19
|
-
# equals
|
|
20
|
-
vitest run test/*.ts
|
|
21
|
-
|
|
22
|
-
# you can also execute binary file in `node_modules/.bin` folder.
|
|
23
|
-
xr vite --port 4004
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Example: In a deno project with `deno.json` or `deno.jsonc`. And have a task `"dev": "deno run -A main.ts"`
|
|
27
|
-
|
|
28
|
-
```sh
|
|
29
|
-
xr dev
|
|
30
|
-
# equals
|
|
31
|
-
deno run -A main.ts
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Dependency Manager `xn`
|
|
35
|
-
|
|
36
|
-
`xn` command can install modules by detect the correct tool, it detects lockfile to decide which dependency manager tools should be used.
|
|
37
|
-
|
|
38
|
-
Example: install packages in a node project with `pnpm-lock.yaml`
|
|
39
|
-
|
|
40
|
-
```sh
|
|
41
|
-
xn i lodash-es
|
|
42
|
-
# equals
|
|
43
|
-
pnpm i lodash-es
|
|
44
|
-
|
|
45
|
-
xn i lodash-es -D
|
|
46
|
-
# equals
|
|
47
|
-
pnpm i lodash-es -D
|
|
48
|
-
|
|
49
|
-
# -t/--types option support install @types/xx package in one command.
|
|
50
|
-
xn i lodash-es --types
|
|
51
|
-
# equals
|
|
52
|
-
pnpm i lodash-es && pnpm i @types/lodash-es -D
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Example: remove packages in a node project with `pnpm-lock.yaml`
|
|
56
|
-
|
|
57
|
-
```sh
|
|
58
|
-
xn rm lodash-es
|
|
59
|
-
# equals
|
|
60
|
-
pnpm uninstall lodash-es
|
|
61
|
-
|
|
62
|
-
xn rm lodash-es -D
|
|
63
|
-
# equals
|
|
64
|
-
pnpm uninstall lodash-es -D
|
|
65
|
-
|
|
66
|
-
# -t/--types option support remove @types/xx package in one command.
|
|
67
|
-
xn rm lodash-es --types
|
|
68
|
-
# equals
|
|
69
|
-
pnpm uninstall lodash-es @types/lodash-es
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
`xn` also support rust project.
|
|
73
|
-
|
|
74
|
-
Example: in a rust project with `Cargo.toml`
|
|
75
|
-
|
|
76
|
-
```sh
|
|
77
|
-
xn i log
|
|
78
|
-
# equals
|
|
79
|
-
cargo add log
|
|
80
|
-
|
|
81
|
-
xn rm log
|
|
82
|
-
# equals
|
|
83
|
-
cargo remove log
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## Command Completions
|
|
87
|
-
|
|
88
|
-
Add this code to `~/.zshrc`
|
|
89
|
-
|
|
90
|
-
```zsh
|
|
91
|
-
source <(x completions)
|
|
92
|
-
source <(xr completions)
|
|
93
|
-
source <(xn completions)
|
|
94
|
-
```
|
|
1
|
+
# X
|
|
2
|
+
|
|
3
|
+
Some useful command for myself.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
pnpm i -g @0x-jerry/x
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Run task `xr`
|
|
12
|
+
|
|
13
|
+
`xr` command can auto detect tasks in `package.json/scripts`, `deno.json/tasks`, and run it. you can also append any parameters.
|
|
14
|
+
|
|
15
|
+
Example: In a node project with `pnpm-lock.yaml`. And `package.json` has a script `"test": "vitest run"`
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
xr test test/*.ts
|
|
19
|
+
# equals
|
|
20
|
+
vitest run test/*.ts
|
|
21
|
+
|
|
22
|
+
# you can also execute binary file in `node_modules/.bin` folder.
|
|
23
|
+
xr vite --port 4004
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Example: In a deno project with `deno.json` or `deno.jsonc`. And have a task `"dev": "deno run -A main.ts"`
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
xr dev
|
|
30
|
+
# equals
|
|
31
|
+
deno run -A main.ts
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Dependency Manager `xn`
|
|
35
|
+
|
|
36
|
+
`xn` command can install modules by detect the correct tool, it detects lockfile to decide which dependency manager tools should be used.
|
|
37
|
+
|
|
38
|
+
Example: install packages in a node project with `pnpm-lock.yaml`
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
xn i lodash-es
|
|
42
|
+
# equals
|
|
43
|
+
pnpm i lodash-es
|
|
44
|
+
|
|
45
|
+
xn i lodash-es -D
|
|
46
|
+
# equals
|
|
47
|
+
pnpm i lodash-es -D
|
|
48
|
+
|
|
49
|
+
# -t/--types option support install @types/xx package in one command.
|
|
50
|
+
xn i lodash-es --types
|
|
51
|
+
# equals
|
|
52
|
+
pnpm i lodash-es && pnpm i @types/lodash-es -D
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Example: remove packages in a node project with `pnpm-lock.yaml`
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
xn rm lodash-es
|
|
59
|
+
# equals
|
|
60
|
+
pnpm uninstall lodash-es
|
|
61
|
+
|
|
62
|
+
xn rm lodash-es -D
|
|
63
|
+
# equals
|
|
64
|
+
pnpm uninstall lodash-es -D
|
|
65
|
+
|
|
66
|
+
# -t/--types option support remove @types/xx package in one command.
|
|
67
|
+
xn rm lodash-es --types
|
|
68
|
+
# equals
|
|
69
|
+
pnpm uninstall lodash-es @types/lodash-es
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`xn` also support rust project.
|
|
73
|
+
|
|
74
|
+
Example: in a rust project with `Cargo.toml`
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
xn i log
|
|
78
|
+
# equals
|
|
79
|
+
cargo add log
|
|
80
|
+
|
|
81
|
+
xn rm log
|
|
82
|
+
# equals
|
|
83
|
+
cargo remove log
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Command Completions
|
|
87
|
+
|
|
88
|
+
Add this code to `~/.zshrc`
|
|
89
|
+
|
|
90
|
+
```zsh
|
|
91
|
+
source <(x completions)
|
|
92
|
+
source <(xr completions)
|
|
93
|
+
source <(xn completions)
|
|
94
|
+
```
|