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
5 if exists("g:loaded_gerrvim") | finish | endif
6 let g:loaded_gerrvim = 1
8 if !exists("g:gerrvim_file")
9 let g:gerrvim_file = "/tmp/gerrvim.txt"
12 function! s:Gerrvim() range
14 if bufwinnr("GerrvimCommenting") != -1
15 echohl ErrorMsg | echomsg "Close already existing code commenting window first" | echohl None
18 if bufexists("GerrvimCommenting") != 0
19 bdelete! GerrvimCommenting
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//", "", "")
27 if match(path, "/") ==# SHA1_LENGTH
28 let header = add(header, path[:SHA1_LENGTH-1])
29 let header = add(header, path[SHA1_LENGTH+1:])
31 let header = add(header, "")
32 let header = add(header, path)
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)
41 let ready = add(ready, "-----END-----")
42 " Spawn a new small code commenting window nonbinded to file
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
53 if filereadable(g:gerrvim_file)
54 let ccprev = readfile(g:gerrvim_file)
56 " Save all those consolidated data to file
57 let ready = ccprev + getline(0, "$") + [""]
58 call writefile(ready, g:gerrvim_file)
60 echohl MoreMsg | echomsg "Commented:" len(ready) "lines" | echohl None
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>
72 function! s:GerrvimClear()
73 call writefile([], g:gerrvim_file)
74 echohl WarningMsg | echomsg "Comments are wiped" | echohl None
77 command! GerrvimClear call <SID>GerrvimClear()
78 command! -range Gerrvim <line1>, <line2> call <SID>Gerrvim()
79 vnoremap <silent><Leader>cc :call <SID>Gerrvim()<CR>