|
|
|
|
@@ -114,7 +114,6 @@ let s:delimiterMap = {
|
|
|
|
|
\ 'exports': { 'left': '#' },
|
|
|
|
|
\ 'factor': { 'left': '! ', 'leftAlt': '!# ' },
|
|
|
|
|
\ 'fancy': { 'left': '#' },
|
|
|
|
|
\ 'fasm': { 'left': ';' },
|
|
|
|
|
\ 'faust': { 'left': '//' },
|
|
|
|
|
\ 'fgl': { 'left': '#' },
|
|
|
|
|
\ 'fluent': { 'left': '#', 'leftAlt': '##' },
|
|
|
|
|
@@ -188,7 +187,6 @@ let s:delimiterMap = {
|
|
|
|
|
\ 'jgraph': { 'left': '(*', 'right': '*)' },
|
|
|
|
|
\ 'jinja': { 'left': '{#', 'right': '#}', 'leftAlt': '<!--', 'rightAlt': '-->' },
|
|
|
|
|
\ 'jproperties': { 'left': '#' },
|
|
|
|
|
\ 'json5': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
|
|
|
|
|
\ 'jsonc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
|
|
|
|
|
\ 'jsonnet': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
|
|
|
|
|
\ 'jsp': { 'left': '<%--', 'right': '--%>' },
|
|
|
|
|
@@ -508,8 +506,8 @@ function! s:CreateDelimMapFromCms() abort
|
|
|
|
|
return delims
|
|
|
|
|
endif
|
|
|
|
|
return {
|
|
|
|
|
\ 'left': matchstr(&commentstring, '^\S*\ze\s*%s'),
|
|
|
|
|
\ 'right': matchstr(&commentstring, '%s\s*\zs.*$'),
|
|
|
|
|
\ 'left': substitute(&commentstring, '\([^ \t]*\)\s*%s.*', '\1', ''),
|
|
|
|
|
\ 'right': substitute(&commentstring, '.*%s\s*\(.*\)', '\1', 'g'),
|
|
|
|
|
\ 'nested': 0,
|
|
|
|
|
\ 'leftAlt': '',
|
|
|
|
|
\ 'rightAlt': '',
|
|
|
|
|
@@ -653,7 +651,7 @@ function! s:CommentBlock(top, bottom, lSide, rSide, forceNested) abort
|
|
|
|
|
"alternative delimiters (if THEY are) as the comment will be better and more
|
|
|
|
|
"accurate with multipart delimiters
|
|
|
|
|
let switchedDelims = 0
|
|
|
|
|
if !s:Multipart() && g:NERDAllowAnyVisualDelims && s:AltMultipart()
|
|
|
|
|
if !s:Multipart() && !g:NERDAllowAnyVisualDelims && s:AltMultipart()
|
|
|
|
|
let switchedDelims = 1
|
|
|
|
|
call nerdcommenter#SwitchToAlternativeDelimiters(0)
|
|
|
|
|
endif
|
|
|
|
|
@@ -1070,7 +1068,7 @@ function! s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested) a
|
|
|
|
|
|
|
|
|
|
"switch delimiters (if we can) if the current set isn't multipart
|
|
|
|
|
let switchedDelims = 0
|
|
|
|
|
if !s:Multipart() && s:AltMultipart() && g:NERDAllowAnyVisualDelims
|
|
|
|
|
if !s:Multipart() && s:AltMultipart() && !g:NERDAllowAnyVisualDelims
|
|
|
|
|
let switchedDelims = 1
|
|
|
|
|
call nerdcommenter#SwitchToAlternativeDelimiters(0)
|
|
|
|
|
endif
|
|
|
|
|
@@ -1093,7 +1091,7 @@ function! s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested) a
|
|
|
|
|
|
|
|
|
|
"comment the bottom line
|
|
|
|
|
let bottom = getline(a:bottomLine)
|
|
|
|
|
let numLeadingSpacesTabs = strlen(matchstr(bottom, '^\s*'))
|
|
|
|
|
let numLeadingSpacesTabs = strlen(substitute(bottom, '^\([ \t]*\).*$', '\1', ''))
|
|
|
|
|
call s:CommentBlock(a:bottomLine, a:bottomLine, numLeadingSpacesTabs+1, a:bottomCol, a:forceNested)
|
|
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
@@ -1238,7 +1236,7 @@ function! nerdcommenter#Comment(mode, type) range abort
|
|
|
|
|
for i in range(firstLine, lastLine)
|
|
|
|
|
let theLine = getline(i)
|
|
|
|
|
" if have one line no comment(not include blank/whitespace-only lines), then comment all lines
|
|
|
|
|
if theLine =~# '\S\+' && !s:IsInSexyComment(firstLine) && !s:IsCommentedFromStartOfLine(s:Left(), theLine) && !s:IsCommentedFromStartOfLine(s:Left({'alt': 1}), theLine)
|
|
|
|
|
if theLine =~# '[^ \t]\+' && !s:IsInSexyComment(firstLine) && !s:IsCommentedFromStartOfLine(s:Left(), theLine) && !s:IsCommentedFromStartOfLine(s:Left({'alt': 1}), theLine)
|
|
|
|
|
let l:commentAllLines = 1
|
|
|
|
|
break
|
|
|
|
|
else
|
|
|
|
|
@@ -1261,9 +1259,9 @@ function! nerdcommenter#Comment(mode, type) range abort
|
|
|
|
|
endtry
|
|
|
|
|
|
|
|
|
|
elseif a:type ==? 'ToEOL'
|
|
|
|
|
let view = winsaveview()
|
|
|
|
|
call s:SaveScreenState()
|
|
|
|
|
call s:CommentBlock(firstLine, firstLine, col('.'), col('$')-1, 1)
|
|
|
|
|
call winrestview(view)
|
|
|
|
|
call s:RestoreScreenState()
|
|
|
|
|
|
|
|
|
|
elseif a:type ==? 'Append'
|
|
|
|
|
call s:AppendCommentToLine()
|
|
|
|
|
@@ -1300,7 +1298,7 @@ function! nerdcommenter#Comment(mode, type) range abort
|
|
|
|
|
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
" Function: nerdcommenter#IsCharCommented(line, col) abort
|
|
|
|
|
" Function: NERDCommentIsCharCommented(line, col) abort
|
|
|
|
|
" Check if the character at [line, col] is inside a comment
|
|
|
|
|
" Note the Comment delimeter it self is considered as part of the comment
|
|
|
|
|
"
|
|
|
|
|
@@ -1308,7 +1306,7 @@ endfunction
|
|
|
|
|
" -line the line number of the character
|
|
|
|
|
" -col the column number of the character
|
|
|
|
|
" Return: Number, 1 if the character is inside a comment, 0 if is not
|
|
|
|
|
function! nerdcommenter#IsCharCommented(line, col) abort
|
|
|
|
|
function! NERDCommentIsCharCommented(line, col) abort
|
|
|
|
|
" Function: s:searchfor(str, line, col, direction, [maxline])
|
|
|
|
|
" search str in the buffer, including the character at [line, col]
|
|
|
|
|
" Args:
|
|
|
|
|
@@ -1673,7 +1671,7 @@ function! s:UncommentLinesSexy(topline, bottomline) abort
|
|
|
|
|
let theLine = getline(a:topline)
|
|
|
|
|
|
|
|
|
|
" if the first line contains only the left delimiter then just delete it
|
|
|
|
|
if theLine =~# '^\s*' . left . '\s*$' && !g:NERDCompactSexyComs
|
|
|
|
|
if theLine =~# '^[ \t]*' . left . '[ \t]*$' && !g:NERDCompactSexyComs
|
|
|
|
|
call cursor(a:topline, 1)
|
|
|
|
|
normal! dd
|
|
|
|
|
let bottomline = bottomline - 1
|
|
|
|
|
@@ -1697,7 +1695,7 @@ function! s:UncommentLinesSexy(topline, bottomline) abort
|
|
|
|
|
let theLine = getline(bottomline)
|
|
|
|
|
|
|
|
|
|
" if the bottomline contains only the right delimiter then just delete it
|
|
|
|
|
if theLine =~# '^\s*' . right . '\s*$'
|
|
|
|
|
if theLine =~# '^[ \t]*' . right . '[ \t]*$'
|
|
|
|
|
call cursor(bottomline, 1)
|
|
|
|
|
normal! dd
|
|
|
|
|
|
|
|
|
|
@@ -1714,7 +1712,7 @@ function! s:UncommentLinesSexy(topline, bottomline) abort
|
|
|
|
|
|
|
|
|
|
" if the last line also starts with a sexy comment marker then we
|
|
|
|
|
" remove this as well
|
|
|
|
|
if theLine =~# '^\s*' . sexyComMarker
|
|
|
|
|
if theLine =~# '^[ \t]*' . sexyComMarker
|
|
|
|
|
|
|
|
|
|
" remove the sexyComMarker. If there is a space after it then
|
|
|
|
|
" remove that too
|
|
|
|
|
@@ -1838,7 +1836,7 @@ endfunction
|
|
|
|
|
" Function: s:AddLeftDelim(delim, theLine)
|
|
|
|
|
" Args:
|
|
|
|
|
function! s:AddLeftDelim(delim, theLine) abort
|
|
|
|
|
return substitute(a:theLine, '^\(\s*\)', '\1' . a:delim, '')
|
|
|
|
|
return substitute(a:theLine, '^\([ \t]*\)', '\1' . a:delim, '')
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
" Function: s:AddLeftDelimAligned(delim, theLine)
|
|
|
|
|
@@ -1908,7 +1906,7 @@ function! s:CanCommentLine(forceNested, lineNum) abort
|
|
|
|
|
|
|
|
|
|
" make sure we don't comment lines that are just spaces or tabs or empty,
|
|
|
|
|
" unless configured otherwise
|
|
|
|
|
if g:NERDCommentEmptyLines ==# 0 && theLine =~# '^\s*$'
|
|
|
|
|
if g:NERDCommentEmptyLines ==# 0 && theLine =~# "^[ \t]*$"
|
|
|
|
|
return 0
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
@@ -1975,7 +1973,7 @@ function! s:CanToggleCommentLine(forceNested, lineNum) abort
|
|
|
|
|
|
|
|
|
|
" make sure we don't comment lines that are just spaces or tabs or empty,
|
|
|
|
|
" unless configured otherwise
|
|
|
|
|
if g:NERDCommentEmptyLines ==# 0 && theLine =~# '^\s*$'
|
|
|
|
|
if g:NERDCommentEmptyLines ==# 0 && theLine =~# "^[ \t]*$"
|
|
|
|
|
return 0
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
@@ -2196,16 +2194,16 @@ function! s:FindBoundingLinesOfSexyCom(lineNum) abort
|
|
|
|
|
let theLine = getline(currentLine)
|
|
|
|
|
|
|
|
|
|
"check if the current line is the top of the sexy comment
|
|
|
|
|
if currentLine <= a:lineNum && theLine =~# '^\s*' . left && theLine !~# '.*' . right && currentLine < s:NumLinesInBuf()
|
|
|
|
|
if currentLine <= a:lineNum && theLine =~# '^[ \t]*' . left && theLine !~# '.*' . right && currentLine < s:NumLinesInBuf()
|
|
|
|
|
let top = currentLine
|
|
|
|
|
let currentLine = a:lineNum
|
|
|
|
|
|
|
|
|
|
"check if the current line is the bottom of the sexy comment
|
|
|
|
|
elseif theLine =~# '^\s*' . right && theLine !~# '.*' . left && currentLine > 1
|
|
|
|
|
elseif theLine =~# '^[ \t]*' . right && theLine !~# '.*' . left && currentLine > 1
|
|
|
|
|
let bottom = currentLine
|
|
|
|
|
|
|
|
|
|
"the right delimiter is on the same line as the last sexyComMarker
|
|
|
|
|
elseif theLine =~# '^\s*' . sexyComMarker . '.*' . right
|
|
|
|
|
elseif theLine =~# '^[ \t]*' . sexyComMarker . '.*' . right
|
|
|
|
|
let bottom = currentLine
|
|
|
|
|
|
|
|
|
|
"we have not found the top or bottom line so we assume currentLine is an
|
|
|
|
|
@@ -2214,7 +2212,7 @@ function! s:FindBoundingLinesOfSexyCom(lineNum) abort
|
|
|
|
|
|
|
|
|
|
"if the line doesn't start with a sexyComMarker then it is not a sexy
|
|
|
|
|
"comment
|
|
|
|
|
if theLine !~# '^\s*' . sexyComMarker
|
|
|
|
|
if theLine !~# '^[ \t]*' . sexyComMarker
|
|
|
|
|
return []
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
@@ -2452,7 +2450,7 @@ endfunction
|
|
|
|
|
" -left: the left delimiter to check for
|
|
|
|
|
function! s:IsCommentedFromStartOfLine(left, line) abort
|
|
|
|
|
let theLine = s:ConvertLeadingTabsToSpaces(a:line)
|
|
|
|
|
let numSpaces = strlen(matchstr(theLine, '^ *'))
|
|
|
|
|
let numSpaces = strlen(substitute(theLine, '^\( *\).*$', '\1', ''))
|
|
|
|
|
let delimIndx = s:FindDelimiterIndex(a:left, theLine)
|
|
|
|
|
return delimIndx ==# numSpaces
|
|
|
|
|
endfunction
|
|
|
|
|
@@ -2554,7 +2552,7 @@ function! s:IsDelimValid(delimiter, delIndx, line) abort
|
|
|
|
|
|
|
|
|
|
"if the delimiter is on the very first char of the line or is the
|
|
|
|
|
"first non-tab/space char on the line then it is a valid comment delimiter
|
|
|
|
|
if a:delIndx ==# 0 || a:line =~# "^\s\\{" . a:delIndx . "\\}\".*$"
|
|
|
|
|
if a:delIndx ==# 0 || a:line =~# "^[ \t]\\{" . a:delIndx . "\\}\".*$"
|
|
|
|
|
return 1
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
@@ -2655,7 +2653,7 @@ function! s:IsSexyComment(topline, bottomline) abort
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
"if the top line doesn't begin with a left delimiter then the comment isn't sexy
|
|
|
|
|
if getline(a:topline) !~# '^\s*' . left
|
|
|
|
|
if getline(a:topline) !~# '^[ \t]*' . left
|
|
|
|
|
return 0
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
@@ -2683,7 +2681,7 @@ function! s:IsSexyComment(topline, bottomline) abort
|
|
|
|
|
while currentLine < a:bottomline
|
|
|
|
|
let theLine = getline(currentLine)
|
|
|
|
|
|
|
|
|
|
if theLine !~# '^\s*' . sexyComMarker
|
|
|
|
|
if theLine !~# '^[ \t]*' . sexyComMarker
|
|
|
|
|
return 0
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
@@ -2782,12 +2780,12 @@ function! s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomli
|
|
|
|
|
" get the next line and if it is allowed to be commented, or is not
|
|
|
|
|
" commented, check it
|
|
|
|
|
let theLine = getline(currentLine)
|
|
|
|
|
if a:countEmptyLines || theLine !~# '^\s*$'
|
|
|
|
|
if a:countEmptyLines || theLine !~# '^[ \t]*$'
|
|
|
|
|
if a:countCommentedLines || (!s:IsCommented(s:Left(), s:Right(), theLine) && !s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine))
|
|
|
|
|
" convert spaces to tabs and get the number of leading spaces for
|
|
|
|
|
" this line and update leftMostIndx if need be
|
|
|
|
|
let theLine = s:ConvertLeadingTabsToSpaces(theLine)
|
|
|
|
|
let leadSpaceOfLine = strlen(matchstr(theLine, '^\s*'))
|
|
|
|
|
let leadSpaceOfLine = strlen( substitute(theLine, '\(^[ \t]*\).*$','\1','') )
|
|
|
|
|
if leadSpaceOfLine < leftMostIndx
|
|
|
|
|
let leftMostIndx = leadSpaceOfLine
|
|
|
|
|
endif
|
|
|
|
|
@@ -2835,7 +2833,7 @@ endfunction
|
|
|
|
|
" Function: s:NumberOfLeadingTabs(s)
|
|
|
|
|
" returns the number of leading tabs in the given string
|
|
|
|
|
function! s:NumberOfLeadingTabs(s) abort
|
|
|
|
|
return strlen(matchstr(a:s, '^\t*'))
|
|
|
|
|
return strlen(substitute(a:s, '^\(\t*\).*$', '\1', ''))
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
" Function: s:NumLinesInBuf()
|
|
|
|
|
@@ -2909,6 +2907,21 @@ function! s:ReplaceRightMostDelim(toReplace, replacor, str) abort
|
|
|
|
|
return line
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
"FUNCTION: s:RestoreScreenState()
|
|
|
|
|
"
|
|
|
|
|
"Sets the screen state back to what it was when s:SaveScreenState was last
|
|
|
|
|
"called.
|
|
|
|
|
"
|
|
|
|
|
function! s:RestoreScreenState() abort
|
|
|
|
|
if !exists('t:NERDComOldTopLine') || !exists('t:NERDComOldPos')
|
|
|
|
|
throw 'NERDCommenter exception: cannot restore screen'
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
call cursor(t:NERDComOldTopLine, 0)
|
|
|
|
|
normal! zt
|
|
|
|
|
call setpos('.', t:NERDComOldPos)
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
" Function: s:Right(...)
|
|
|
|
|
" returns right delimiter data
|
|
|
|
|
function! s:Right(...) abort
|
|
|
|
|
@@ -2950,7 +2963,7 @@ function! s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottoml
|
|
|
|
|
" get the next line and see if it is commentable, otherwise it doesn't
|
|
|
|
|
" count
|
|
|
|
|
let theLine = getline(currentLine)
|
|
|
|
|
if a:countEmptyLines || theLine !~# '^\s*$'
|
|
|
|
|
if a:countEmptyLines || theLine !~# '^[ \t]*$'
|
|
|
|
|
|
|
|
|
|
if a:countCommentedLines || (!s:IsCommented(s:Left(), s:Right(), theLine) && !s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine))
|
|
|
|
|
|
|
|
|
|
@@ -2970,6 +2983,14 @@ function! s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottoml
|
|
|
|
|
return rightMostIndx
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
"FUNCTION: s:SaveScreenState()
|
|
|
|
|
"Saves the current cursor position in the current buffer and the window
|
|
|
|
|
"scroll position
|
|
|
|
|
function! s:SaveScreenState() abort
|
|
|
|
|
let t:NERDComOldPos = getpos('.')
|
|
|
|
|
let t:NERDComOldTopLine = line('w0')
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
" Function: s:SwapOuterMultiPartDelimsForPlaceHolders(line)
|
|
|
|
|
" This function takes a line and swaps the outer most multi-part delimiters for
|
|
|
|
|
" place holders
|
|
|
|
|
|