]> Sergey Matveev's repositories - gerrvim.git/blob - plugin/gerrvim.vim
Fix current buffer address getting
[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     " 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("%")
47         execute cmd
48     endfor
49     " Spawn a new small code commenting window nonbinded to file
50     new GerrvimCommenting
51     resize 16
52     setlocal noswapfile
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
59         let ccprev = []
60         if filereadable(g:gerrvim_file)
61             let ccprev = readfile(g:gerrvim_file)
62         endif
63         " Save all those consolidated data to file
64         let ready = ccprev + getline(0, "$") + [""]
65         call writefile(ready, g:gerrvim_file)
66         setlocal nomodified
67         echohl MoreMsg | echomsg "Commented:" len(ready) "lines" | echohl None
68     endfunction
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>
75     normal zR
76     startinsert
77 endfunction
78
79 function! s:GerrvimClear()
80     call writefile([], g:gerrvim_file)
81     echohl WarningMsg | echomsg "Comments are wiped" | echohl None
82 endfunction
83
84 command! GerrvimClear call <SID>GerrvimClear()
85 command! -range Gerrvim <line1>, <line2> call <SID>Gerrvim()
86 vnoremap <silent><Leader>cc :call <SID>Gerrvim()<CR>