--- /dev/null
+vim9script
+
+const SHA1Len = 40
+const Separator = "---------------------------------- >8 ----------------------------------"
+
+export def Do(firstline: number, lastline: number, gitDir: string)
+ if bufwinnr("CodeCommCommenting") != -1
+ echohl ErrorMsg | echomsg "Close already existing code commenting window first" | echohl None
+ return
+ endif
+ if bufexists("CodeCommCommenting") != 0
+ bdelete! CodeCommCommenting
+ endif
+ g:codecomm_count += 1
+
+ # Determine file's path inside repository
+ var path = expand("%:p")
+ path = substitute(path, gitDir[: -5], "", "")
+ path = substitute(path, "^.*\.git//", "", "")
+
+ # Header generation
+ var header: list<string>
+ if match(path, "/") ==# SHA1Len
+ header = add(header, path[: 8])
+ header = add(header, "|")
+ header = add(header, path[SHA1Len + 1 :])
+ else
+ header = add(header, path)
+ endif
+ var ready = [printf("-----#%2d [ %54S ]-----", g:codecomm_count, join(header, " "))]
+
+ # Collect enumerated selected code block's lines
+ var fmted: string
+ var line: string
+ for n in range(firstline, lastline)
+ fmted = printf("%4d", n)
+ line = getline(n)
+ if len(line) > 0 | fmted = fmted .. " " .. line | endif
+ ready = add(ready, fmted)
+ endfor
+ ready = add(ready, Separator)
+
+ # Place commented signs
+ sign define commented text=C texthl=Search
+ var cmd: string
+ for n in range(firstline, lastline)
+ cmd = ":sign place " .. n .. " line=" .. n
+ cmd ..= " name=commented buffer=" .. bufnr("%")
+ execute cmd
+ endfor
+
+ # Spawn a new small code commenting window nonbinded to file
+ new CodeCommCommenting
+ setlocal noreadonly noswapfile buftype=acwrite filetype=codecomm
+ append(0, ready)
+
+ # Separate codecomm_file consolidating function, called when buffer is saved
+ # autocmd! BufWriteCmd CodeCommCommenting
+ autocmd! BufWriteCmd CodeCommCommenting {
+ var ccprev = [" vim: filetype=codecomm", ""]
+ if filereadable(g:codecomm_file) | ccprev = readfile(g:codecomm_file) | endif
+ var ready = ccprev + getline(0, "$") + [""]
+ writefile(ready, g:codecomm_file)
+ setlocal nomodified
+ echohl MoreMsg | echomsg "Commented:" len(ready) "lines" | echohl None
+ }
+ normal zR
+ startinsert
+enddef
+
+export def Clear()
+ writefile([], g:codecomm_file)
+ g:codecomm_count = 0
+ execute "sign unplace * buffer=" .. bufnr("%")
+ echohl WarningMsg | echomsg "Comments are wiped" | echohl None
+enddef
-" Code comments preparation helper
-" Maintainer: Sergey Matveev <stargrave@stargrave.org>
-" License: GNU General Public License version 3 of the License or later
+vim9script
-if exists("g:loaded_codecomm") | finish | endif
-let g:loaded_codecomm = 1
+# Code comments preparation helper
+# Maintainer: Sergey Matveev <stargrave@stargrave.org>
+# License: GNU General Public License version 3 of the License or later
+
+if exists("*codecomm#Do") | finish | endif
if !exists("g:codecomm_file")
- let tmpdir = getenv("TMPDIR")
- if tmpdir == v:null | let tmpdir = "/tmp" | endif
- let g:codecomm_file = tmpdir . "/" . "codecomm.txt"
+ g:codecomm_file = ((getenv("TMPDIR") == null) ? "/tmp" : getenv("TMPDIR")) ..
+ "/" .. "codecomm.txt"
endif
-if !exists("g:codecomm_count") | let g:codecomm_count = 0 | endif
-
-function! s:CodeComm() range
- let SHA1_LENGTH = 40
- if bufwinnr("CodeCommCommenting") != -1
- echohl ErrorMsg | echomsg "Close already existing code commenting window first" | echohl None
- return
- endif
- if bufexists("CodeCommCommenting") != 0
- bdelete! CodeCommCommenting
- endif
- let g:codecomm_count += 1
- " Determine file's path inside repository
- let path = expand("%:p")
- let path = substitute(path, FugitiveExtractGitDir(getcwd())[:-5], "", "")
- let path = substitute(path, "^.*\.git//", "", "")
- " Header generation
- let header = []
- if match(path, "/") ==# SHA1_LENGTH
- let header = add(header, path[:8])
- let header = add(header, "|")
- let header = add(header, path[SHA1_LENGTH+1:])
- else
- let header = add(header, path)
- endif
- let ready = [printf("-----#%2d [ %54S ]-----", g:codecomm_count, join(header, " "))]
- " Collect enumerated selected code block's lines
- for bufline_n in range(a:firstline, a:lastline)
- let fmted = printf("%4d", bufline_n)
- let line = getline(bufline_n)
- if len(line) > 0 | let fmted = fmted . " " . line | endif
- let ready = add(ready, fmted)
- endfor
- let ready = add(ready, "---------------------------------- >8 ----------------------------------")
- " Place commented signs
- sign define commented text=C texthl=Search
- for linen in range(a:firstline, a:lastline)
- let cmd = ":sign place " . linen . " line=" . linen
- let cmd .= " name=commented buffer=" . bufnr("%")
- execute cmd
- endfor
- " Spawn a new small code commenting window nonbinded to file
- new CodeCommCommenting
- setlocal noreadonly noswapfile buftype=acwrite filetype=codecomm
- call append("^", ready)
- " Separate codecomm_file consolidating function, called when buffer is saved
- autocmd! BufWriteCmd CodeCommCommenting
- function! s:AppendCC()
- " Collect already written comments from file if it exists
- let ccprev = [" vim: filetype=codecomm", ""]
- if filereadable(g:codecomm_file)
- let ccprev = readfile(g:codecomm_file)
- endif
- " Save all those consolidated data to file
- let ready = ccprev + getline(0, "$") + [""]
- call writefile(ready, g:codecomm_file)
- setlocal nomodified
- echohl MoreMsg | echomsg "Commented:" len(ready) "lines" | echohl None
- endfunction
- autocmd BufWriteCmd CodeCommCommenting call s:AppendCC()
- normal zR
- startinsert
-endfunction
+if !exists("g:codecomm_count") | g:codecomm_count = 0 | endif
-function! s:CodeCommClear()
- call writefile([], g:codecomm_file)
- let g:codecomm_count = 0
- echohl WarningMsg | echomsg "Comments are wiped" | echohl None
+function CCRangeWrapper() range
+ call codecomm#Do(a:firstline, a:lastline, FugitiveExtractGitDir(getcwd()))
endfunction
-command! CodeCommClear call <SID>CodeCommClear()
-command! CodeCommEdit :execute "edit " . g:codecomm_file
-command! -range CodeComm <line1>, <line2> call <SID>CodeComm()
-vnoremap <silent><Leader>cc :call <SID>CodeComm()<CR>
+command! CodeCommClear codecomm#Clear()
+command! CodeCommEdit :execute "edit " .. g:codecomm_file
+command! -range CodeComm <line1>, <line2> call <SID>CCRangeWrapper()
+vnoremap <silent><Leader>cc :call <SID>CCRangeWrapper()<CR>