1
0
Fork 0
mirror of https://github.com/vim/vim synced 2025-03-16 06:47:52 +01:00
vim/runtime/indent/tcl.vim

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

104 lines
2.5 KiB
VimL
Raw Normal View History

2004-06-13 20:20:40 +00:00
" Vim indent file
2021-10-04 21:32:54 +01:00
" Language: Tcl
" Maintainer: Chris Heithoff <chrisheithoff@gmail.com>
2019-09-07 16:24:12 +02:00
" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
2021-10-04 21:32:54 +01:00
" Last Change: 24 Sep 2021
2004-06-13 20:20:40 +00:00
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal indentexpr=GetTclIndent()
2005-06-29 22:40:58 +00:00
setlocal indentkeys=0{,0},!^F,o,O,0]
2007-05-10 18:19:11 +00:00
setlocal nosmartindent
2004-06-13 20:20:40 +00:00
2021-10-04 21:32:54 +01:00
let b:undo_indent = "setl inde< indk< si<"
2004-06-13 20:20:40 +00:00
if exists("*GetTclIndent")
finish
endif
2005-06-29 22:40:58 +00:00
function s:prevnonblanknoncomment(lnum)
2004-06-13 20:20:40 +00:00
let lnum = prevnonblank(a:lnum)
while lnum > 0
let line = getline(lnum)
if line !~ '^\s*\(#\|$\)'
break
endif
let lnum = prevnonblank(lnum - 1)
endwhile
return lnum
endfunction
2018-12-09 20:43:55 +01:00
function s:ends_with_backslash(lnum)
let line = getline(a:lnum)
if line =~ '\\\s*$'
return 1
else
return 0
endif
endfunction
2005-06-29 22:40:58 +00:00
function s:count_braces(lnum, count_open)
let n_open = 0
let n_close = 0
let line = getline(a:lnum)
2005-07-04 22:49:24 +00:00
let pattern = '[{}]'
2005-06-29 22:40:58 +00:00
let i = match(line, pattern)
while i != -1
2005-07-04 22:49:24 +00:00
if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'tcl\%(Comment\|String\)'
2005-06-29 22:40:58 +00:00
if line[i] == '{'
2007-05-10 18:19:11 +00:00
let n_open += 1
2005-06-29 22:40:58 +00:00
elseif line[i] == '}'
2007-05-10 18:19:11 +00:00
if n_open > 0
let n_open -= 1
else
let n_close += 1
endif
2004-06-13 20:20:40 +00:00
endif
endif
2005-06-29 22:40:58 +00:00
let i = match(line, pattern, i + 1)
2004-06-13 20:20:40 +00:00
endwhile
2005-06-29 22:40:58 +00:00
return a:count_open ? n_open : n_close
endfunction
2004-06-13 20:20:40 +00:00
2005-06-29 22:40:58 +00:00
function GetTclIndent()
2005-07-04 22:49:24 +00:00
let line = getline(v:lnum)
2018-12-09 20:43:55 +01:00
" Get the line number of the previous non-blank or non-comment line.
2005-06-29 22:40:58 +00:00
let pnum = s:prevnonblanknoncomment(v:lnum - 1)
if pnum == 0
return 0
endif
2004-06-13 20:20:40 +00:00
2018-12-09 20:43:55 +01:00
" ..and the previous line before the previous line.
let pnum2 = s:prevnonblanknoncomment(pnum-1)
2004-06-13 20:20:40 +00:00
2018-12-09 20:43:55 +01:00
" Default indentation is to preserve the previous indentation.
let ind = indent(pnum)
" ...but if previous line introduces an open brace, then increase current line's indentation
if s:count_braces(pnum, 1) > 0
let ind += shiftwidth()
else
" Look for backslash line continuation on the previous two lines.
let slash1 = s:ends_with_backslash(pnum)
let slash2 = s:ends_with_backslash(pnum2)
if slash1 && !slash2
" If the previous line begins a line continuation.
let ind += shiftwidth()
elseif !slash1 && slash2
" If two lines ago was the end of a line continuation group of lines.
let ind -= shiftwidth()
endif
2005-06-29 22:40:58 +00:00
endif
2004-06-13 20:20:40 +00:00
2018-12-09 20:43:55 +01:00
" If the current line begins with a closed brace, then decrease the indentation by one.
if line =~ '^\s*}'
let ind -= shiftwidth()
endif
2005-07-04 22:49:24 +00:00
return ind
2004-06-13 20:20:40 +00:00
endfunction