1
- import type { Denops } from "https://deno.land/x/denops_std@v3.3 .0/mod.ts" ;
2
- import * as autocmd from "https://deno.land/x/denops_std@v3.3 .0/autocmd/mod.ts" ;
3
- import * as batch from "https://deno.land/x/denops_std@v3.3 .0/batch/mod.ts" ;
4
- import * as fn from "https://deno.land/x/denops_std@v3.3 .0/function/mod.ts" ;
5
- import * as helper from "https://deno.land/x/denops_std@v3.3 .0/helper/mod.ts" ;
6
- import * as option from "https://deno.land/x/denops_std@v3.3 .0/option/mod.ts" ;
1
+ import type { Denops } from "https://deno.land/x/denops_std@v3.6 .0/mod.ts" ;
2
+ import * as autocmd from "https://deno.land/x/denops_std@v3.6 .0/autocmd/mod.ts" ;
3
+ import * as batch from "https://deno.land/x/denops_std@v3.6 .0/batch/mod.ts" ;
4
+ import * as fn from "https://deno.land/x/denops_std@v3.6 .0/function/mod.ts" ;
5
+ import * as helper from "https://deno.land/x/denops_std@v3.6 .0/helper/mod.ts" ;
6
+ import * as option from "https://deno.land/x/denops_std@v3.6 .0/option/mod.ts" ;
7
7
import * as unknownutil from "https://deno.land/x/[email protected] /mod.ts" ;
8
8
import {
9
- builtinOpts ,
10
9
parseOpts ,
11
10
validateOpts ,
12
- } from "https://deno.land/x/denops_std@v3.3 .0/argument/mod.ts" ;
13
- import { normCmdArgs } from "../../util/cmd.ts" ;
14
- import * as buffer from "https://deno.land/x/denops_std@v3.3 .0/buffer/mod.ts" ;
11
+ } from "https://deno.land/x/denops_std@v3.6 .0/argument/mod.ts" ;
12
+ import { expand , normCmdArgs } from "../../util/cmd.ts" ;
13
+ import * as buffer from "https://deno.land/x/denops_std@v3.6 .0/buffer/mod.ts" ;
15
14
import {
16
15
buildDecorationsFromAnsiEscapeCode ,
17
16
removeAnsiEscapeCode ,
18
17
} from "../../util/ansi_escape_code.ts" ;
19
- import { getWorktreeFromOpts } from "../../util/worktree.ts" ;
18
+ import {
19
+ findWorktreeFromSuspects ,
20
+ listWorktreeSuspectsFromDenops ,
21
+ } from "../../util/worktree.ts" ;
20
22
import { decodeUtf8 } from "../../util/text.ts" ;
21
23
import { run } from "../../git/process.ts" ;
22
24
25
+ export type Options = {
26
+ worktree ?: string ;
27
+ buffer ?: boolean | string ;
28
+ monochrome ?: boolean ;
29
+ fileformat ?: string ;
30
+ encoding ?: string ;
31
+ } ;
32
+
23
33
export async function command (
24
34
denops : Denops ,
25
35
args : string [ ] ,
26
36
) : Promise < void > {
27
- const [ env , verbose , eventignore ] = await batch . gather (
37
+ const [ opts , residue ] = parseOpts ( await normCmdArgs ( denops , args ) ) ;
38
+ validateOpts ( opts , [
39
+ "worktree" ,
40
+ "buffer" ,
41
+ "monochrome" ,
42
+ "ff" ,
43
+ "fileformat" ,
44
+ "enc" ,
45
+ "encoding" ,
46
+ ] ) ;
47
+ const buffer = opts [ "buffer" ] === "" ? true : opts [ "buffer" ] ;
48
+ const options = {
49
+ worktree : opts [ "worktree" ] ,
50
+ buffer,
51
+ monochrome : "monochrome" in opts ,
52
+ fileformat : opts [ "ff" ] ?? opts [ "fileformat" ] ,
53
+ encoding : opts [ "enc" ] ?? opts [ "encoding" ] ,
54
+ } ;
55
+ await exec ( denops , residue , options ) ;
56
+ }
57
+
58
+ export async function exec (
59
+ denops : Denops ,
60
+ args : string [ ] ,
61
+ options : Options = { } ,
62
+ ) : Promise < void > {
63
+ const [ verbose , env , eventignore ] = await batch . gather (
28
64
denops ,
29
65
async ( denops ) => {
30
- await fn . environ ( denops ) ;
31
66
await option . verbose . get ( denops ) ;
67
+ await fn . environ ( denops ) ;
32
68
await option . eventignore . get ( denops ) ;
33
69
} ,
34
70
) ;
35
- unknownutil . assertObject ( env , unknownutil . isString ) ;
36
71
unknownutil . assertNumber ( verbose ) ;
72
+ unknownutil . assertObject ( env , unknownutil . isString ) ;
37
73
unknownutil . assertString ( eventignore ) ;
38
- const [ opts , residue ] = parseOpts ( await normCmdArgs ( denops , args ) ) ;
39
- validateOpts ( opts , [
40
- "worktree" ,
41
- "buffer" ,
42
- "monochrome" ,
43
- ...builtinOpts ,
44
- ] ) ;
45
- const enableColor = "buffer" in opts && ! ( "monochrome" in opts ) ;
74
+
75
+ const enableColor = options . buffer && ! options . monochrome ;
46
76
const cmd = [
47
77
...( enableColor ? [ "-c" , "color.ui=always" ] : [ ] ) ,
48
- ...residue ,
78
+ ...args ,
49
79
] ;
50
- const worktree = await getWorktreeFromOpts ( denops , opts ) ;
80
+ const worktree = await findWorktreeFromSuspects (
81
+ options . worktree
82
+ ? [ await expand ( denops , options . worktree ) ]
83
+ : await listWorktreeSuspectsFromDenops ( denops , ! ! verbose ) ,
84
+ ! ! verbose ,
85
+ ) ;
51
86
const proc = run ( cmd , {
52
87
printCommand : ! ! verbose ,
53
88
stdin : "null" ,
@@ -63,27 +98,34 @@ export async function command(
63
98
proc . stderrOutput ( ) ,
64
99
] ) ;
65
100
proc . close ( ) ;
66
- if ( " buffer" in opts ) {
101
+ if ( options . buffer ) {
67
102
let decorations : buffer . Decoration [ ] = [ ] ;
68
103
const preprocessor = ( content : string [ ] ) => {
69
104
const [ trimmed , decos ] = buildDecorationsFromAnsiEscapeCode ( content ) ;
70
105
decorations = decos ;
71
106
return trimmed ;
72
107
} ;
73
- await denops . cmd ( "noswapfile enew" ) ;
74
- const bufnr = await fn . bufnr ( denops ) ;
75
- await buffer . ensure ( denops , bufnr , async ( ) => {
76
- await batch . batch ( denops , async ( denops ) => {
77
- await option . modifiable . setLocal ( denops , false ) ;
78
- } ) ;
108
+ let bufnr : number ;
109
+ if ( typeof options . buffer === "string" ) {
110
+ bufnr = await fn . bufnr ( denops , options . buffer ) ;
111
+ if ( bufnr === - 1 ) {
112
+ bufnr = await fn . bufnr ( denops , Number ( options . buffer ) ) ;
113
+ }
114
+ await fn . bufload ( denops , bufnr ) ;
115
+ } else {
116
+ await denops . cmd ( "noswapfile enew" ) ;
117
+ bufnr = await fn . bufnr ( denops ) ;
118
+ }
119
+ await batch . batch ( denops , async ( denops ) => {
120
+ await fn . setbufvar ( denops , bufnr , "&modifiable" , 0 ) ;
79
121
} ) ;
80
122
await buffer . assign (
81
123
denops ,
82
124
bufnr ,
83
125
new Uint8Array ( [ ...stdout , ...stderr ] ) ,
84
126
{
85
- fileformat : ( opts [ "ff" ] ?? opts [ " fileformat" ] ) ,
86
- fileencoding : opts [ "enc" ] ?? opts [ "fileencoding" ] ,
127
+ fileformat : options . fileformat ,
128
+ fileencoding : options . encoding ,
87
129
preprocessor,
88
130
} ,
89
131
) ;
0 commit comments