@@ -10,15 +10,15 @@ local lines = {}
1010local jobid = - 1
1111
1212local function close_status_window ()
13- if vim .fn .winnr (' $' ) > 1 then
14- vim .cmd (' close' )
15- else
16- vim .cmd (' bd!' )
17- end
13+ if vim .fn .winnr (' $' ) > 1 then
14+ vim .cmd (' close' )
15+ else
16+ vim .cmd (' bd!' )
17+ end
1818end
1919
2020local function openStatusBuffer ()
21- vim .cmd ([[
21+ vim .cmd ([[
2222 10split git://status
2323 normal! "_dd
2424 setl nobuflisted
@@ -28,69 +28,80 @@ local function openStatusBuffer()
2828 setl bufhidden=wipe
2929 setf git-status
3030 ]] )
31- status_bufnr = vim .fn .bufnr ()
32- -- nnoremap <buffer><silent> q :call <SID>close_status_window()<CR>
33- vim .api .nvim_buf_set_keymap (status_bufnr , ' n' , ' q' , ' ' , {
34- callback = close_status_window ,
35- })
36- return status_bufnr
31+ status_bufnr = vim .fn .bufnr ()
32+ -- nnoremap <buffer><silent> q :call <SID>close_status_window()<CR>
33+ vim .api .nvim_buf_set_keymap (status_bufnr , ' n' , ' q' , ' ' , {
34+ callback = close_status_window ,
35+ })
36+ return status_bufnr
3737end
3838
3939local function on_stdout (id , data )
40- if id ~= jobid then
41- return
42- end
43- for _ , v in ipairs (data ) do
44- log .debug (' git-status stdout:' .. v )
45- table.insert (lines , v )
46- end
40+ if id ~= jobid then
41+ return
42+ end
43+ for _ , v in ipairs (data ) do
44+ log .debug (' git-status stdout:' .. v )
45+ table.insert (lines , v )
46+ end
4747end
4848
4949local function on_stderr (id , data )
50- if id ~= jobid then
51- return
52- end
53- for _ , v in ipairs (data ) do
54- log .debug (' git-status stderr:' .. v )
55- table.insert (lines , v )
56- end
50+ if id ~= jobid then
51+ return
52+ end
53+ for _ , v in ipairs (data ) do
54+ log .debug (' git-status stderr:' .. v )
55+ table.insert (lines , v )
56+ end
5757end
5858
59+ local autocmd
5960local function on_exit (id , code , single )
60- if id ~= jobid then
61- return
62- end
63- log .debug (' git-status exit code:' .. code .. ' single:' .. single )
64- if vim .api .nvim_buf_is_valid (status_bufnr ) then
65- vim .api .nvim_buf_set_option (status_bufnr , ' modifiable' , true )
66- vim .api .nvim_buf_set_lines (status_bufnr , 0 , - 1 , false , lines )
67- vim .api .nvim_buf_set_option (status_bufnr , ' modifiable' , false )
68- end
61+ if id ~= jobid then
62+ return
63+ end
64+ log .debug (' git-status exit code:' .. code .. ' single:' .. single )
65+ if vim .api .nvim_buf_is_valid (status_bufnr ) then
66+ vim .api .nvim_buf_set_option (status_bufnr , ' modifiable' , true )
67+ vim .api .nvim_buf_set_lines (status_bufnr , 0 , - 1 , false , lines )
68+ vim .api .nvim_buf_set_option (status_bufnr , ' modifiable' , false )
69+ pcall (vim .api .nvim_del_autocmd , autocmd )
70+ autocmd = vim .api .nvim_create_autocmd (' BufReadCmd' , {
71+ buffer = status_bufnr ,
72+ callback = function ()
73+ vim .api .nvim_buf_set_option (status_bufnr , ' modifiable' , true )
74+ vim .api .nvim_buf_set_lines (status_bufnr , 0 , - 1 , false , lines )
75+ vim .api .nvim_buf_set_option (status_bufnr , ' modifiable' , false )
76+ vim .api .nvim_set_option_value (' syntax' , ' diff' , { buf = status_bufnr })
77+ end ,
78+ })
79+ end
6980end
7081
7182function M .run (argv )
72- if
73- vim .api .nvim_buf_is_valid (status_bufnr )
74- and vim .fn .index (vim .fn .tabpagebuflist (), status_bufnr ) ~= - 1
75- then
76- local winnr = vim .fn .bufwinnr (status_bufnr )
77- vim .cmd (winnr .. ' wincmd w' )
78- else
79- status_bufnr = openStatusBuffer ()
80- end
81- local cmd = { ' git' , ' status' }
82- if # argv > 0 then
83- for _ , v in ipairs (argv ) do
84- table.insert (cmd , v )
83+ if
84+ vim .api .nvim_buf_is_valid (status_bufnr )
85+ and vim .fn .index (vim .fn .tabpagebuflist (), status_bufnr ) ~= - 1
86+ then
87+ local winnr = vim .fn .bufwinnr (status_bufnr )
88+ vim .cmd (winnr .. ' wincmd w' )
89+ else
90+ status_bufnr = openStatusBuffer ()
91+ end
92+ local cmd = { ' git' , ' status' }
93+ if # argv > 0 then
94+ for _ , v in ipairs (argv ) do
95+ table.insert (cmd , v )
96+ end
8597 end
86- end
87- lines = {}
88- log .debug (' git-status cmd:' .. vim .inspect (cmd ))
89- jobid = job .start (cmd , {
90- on_stdout = on_stdout ,
91- on_stderr = on_stderr ,
92- on_exit = on_exit ,
93- })
98+ lines = {}
99+ log .debug (' git-status cmd:' .. vim .inspect (cmd ))
100+ jobid = job .start (cmd , {
101+ on_stdout = on_stdout ,
102+ on_stderr = on_stderr ,
103+ on_exit = on_exit ,
104+ })
94105end
95106
96107return M
0 commit comments