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 " Place commented signs
43 sign define commented text=C texthl=Search
44 for linen in range(a:firstline, a:lastline)
45 let cmd = ":sign place " . linen . " line=" . linen
46 let cmd .= " name=commented buffer=" . bufnr("%")
49 " Spawn a new small code commenting window nonbinded to file
53 setlocal buftype=acwrite
54 call append("^", ready)
55 " Separate gerrvim_file consolidating function, called when buffer is saved
56 autocmd! BufWriteCmd GerrvimCommenting
57 function! s:AppendCC()
58 " Collect already written comments from file if it exists
60 if filereadable(g:gerrvim_file)
61 let ccprev = readfile(g:gerrvim_file)
63 " Save all those consolidated data to file
64 let ready = ccprev + getline(0, "$") + [""]
65 call writefile(ready, g:gerrvim_file)
67 echohl MoreMsg | echomsg "Commented:" len(ready) "lines" | echohl None
69 autocmd BufWriteCmd GerrvimCommenting call s:AppendCC()
70 " Simple syntax highlighting for that window
71 syntax region CCBlock start=/^-\{5}BEGIN/ end=/^-\{5}END-\+/
72 highlight link CCBlock Statement
73 " Write buffer and close window after simple <CR>
74 nmap <buffer> <silent> <CR> :wq<CR>
79 function! s:GerrvimClear()
80 call writefile([], g:gerrvim_file)
81 echohl WarningMsg | echomsg "Comments are wiped" | echohl None
84 command! GerrvimClear call <SID>GerrvimClear()
85 command! -range Gerrvim <line1>, <line2> call <SID>Gerrvim()
86 vnoremap <silent><Leader>cc :call <SID>Gerrvim()<CR>