]> Sergey Matveev's repositories - gerrvim.git/blob - plugin/gerrvim.vim
481adc213cf4ae7ed70039599bb41d7716cce458
[gerrvim.git] / plugin / gerrvim.vim
1 " Gerrit review's comments preparation helper
2 " Maintainer: Sergey Matveev <stargrave@stargrave.org>
3 " License: GNU General Public License version 3 of the License or later
4
5 if exists("g:loaded_gerrvim") | finish | endif
6 let g:loaded_gerrvim = 1
7
8 if !exists("g:gerrvim_file")
9     let g:gerrvim_file = "/tmp/gerrvim.txt"
10 endif
11
12 function! s:Gerrvim() range
13     let SHA1_LENGTH = 40
14     if bufwinnr("GerrvimCommenting") != -1
15         echohl ErrorMsg | echomsg "Close already existing code commenting window first" | echohl None
16         return
17     endif
18     if bufexists("GerrvimCommenting") != 0
19         bdelete! GerrvimCommenting
20     endif
21     " Determine file's path inside repository
22     let path = expand("%:p")
23     let path = substitute(path, fugitive#extract_git_dir(".")[:-5], "", "")
24     let path = substitute(path, "^.*\.git//", "", "")
25     " Header generation
26     let header = []
27     if match(path, "/") ==# SHA1_LENGTH
28         let header = add(header, path[:SHA1_LENGTH-1])
29         let header = add(header, path[SHA1_LENGTH+1:])
30     else
31         let header = add(header, "")
32         let header = add(header, path)
33     endif
34     let header = add(header, string(a:firstline))
35     let header = add(header, string(a:lastline + 1))
36     let ready = ["-----BEGIN " . join(header, " ") . "-----"]
37     " Collect enumerated selected code block's lines
38     for bufline in getline(a:firstline, a:lastline)
39         let ready = add(ready, bufline)
40     endfor
41     let ready = add(ready, "-----END-----")
42     " Spawn a new small code commenting window nonbinded to file
43     new GerrvimCommenting
44     resize 16
45     setlocal noswapfile
46     setlocal buftype=acwrite
47     call append("^", ready)
48     " Separate gerrvim_file consolidating function, called when buffer is saved
49     autocmd! BufWriteCmd GerrvimCommenting
50     function! s:AppendCC()
51         " Collect already written comments from file if it exists
52         let ccprev = []
53         if filereadable(g:gerrvim_file)
54             let ccprev = readfile(g:gerrvim_file)
55         endif
56         " Save all those consolidated data to file
57         let ready = ccprev + getline(0, "$") + [""]
58         call writefile(ready, g:gerrvim_file)
59         setlocal nomodified
60         echohl MoreMsg | echomsg "Commented:" len(ready) "lines" | echohl None
61     endfunction
62     autocmd BufWriteCmd GerrvimCommenting call s:AppendCC()
63     " Simple syntax highlighting for that window
64     syntax region CCBlock start=/^-\{5}BEGIN/ end=/^-\{5}END-\+/
65     highlight link CCBlock Statement
66     " Write buffer and close window after simple <CR>
67     nmap <buffer> <silent> <CR> :wq<CR>
68     normal zR
69     startinsert
70 endfunction
71
72 function! s:GerrvimClear()
73     call writefile([], g:gerrvim_file)
74     echohl WarningMsg | echomsg "Comments are wiped" | echohl None
75 endfunction
76
77 command! GerrvimClear call <SID>GerrvimClear()
78 command! -range Gerrvim <line1>, <line2> call <SID>Gerrvim()
79 vnoremap <silent><Leader>cc :call <SID>Gerrvim()<CR>