- `:Toct`: Same as `:Toc` but in a new tab.
- `:Tocv`: Same as `:Toc` for symmetry with `:Toch` and `Tocv`.
+- `:SetexToAtx`:
+
+ Convert all Setex style headers in buffer to Atx.
+
+ If a range is given, e.g. hit `:` from visual mode, only operate on the range.
+
+- `:HeaderDecrease`:
+
+ Decrease level of all headers in buffer: `h2` to `h1`, `h3` to `h2`, etc.
+
+ If range is given, only operate in the range.
+
+ If an `h1` would be decreased, abort.
+
+ For simplicity of implementation, Setex headers are converted to Atx.
+
+- `:HeaderIncrease`: Analogous to `:HeaderDecrease`, but increase levels instead.
+
## Credits
The main contributors of vim-markdown are:
execute 'vn <buffer><silent> ' . a:rhs . ' <esc>:call <sid>VisMove(''' . a:lhs . ''')<cr>'
endfunction
+" Convert Setex headers in range `line1 .. line2` to Atx.
+" Returns the number of conversions.
+function! s:SetexToAtx(line1, line2)
+ let l:originalNumLines = line('$')
+ execute 'silent! ' . a:line1 . ',' . a:line2 . 'substitute/\v(.*\S.*)\n\=+$/# \1/'
+ execute 'silent! ' . a:line1 . ',' . a:line2 . 'substitute/\v(.*\S.*)\n-+$/## \1/'
+ return l:originalNumLines - line('$')
+endfunction
+
+" If `a:1` is 0, decrease the level of all headers in range `line1 .. line2`.
+" Otherwise, increase the level. `a:1` defaults to `0`.
+function! s:HeaderDecrease(line1, line2, ...)
+ if a:0 > 0
+ let l:increase = a:1
+ else
+ let l:increase = 0
+ endif
+ if l:increase
+ let l:forbiddenLevel = 6
+ let l:replaceLevels = [5, 1]
+ let l:levelDelta = 1
+ else
+ let l:forbiddenLevel = 1
+ let l:replaceLevels = [2, 6]
+ let l:levelDelta = -1
+ endif
+ for l:line in range(a:line1, a:line2)
+ if join(getline(l:line, l:line + 1), "\n") =~ s:levelRegexpDict[l:forbiddenLevel]
+ echomsg 'There is an h' . l:forbiddenLevel . ' at line ' . l:line . '. Aborting.'
+ return
+ endif
+ endfor
+ let l:numSubstitutions = s:SetexToAtx(a:line1, a:line2)
+ for l:level in range(replaceLevels[0], replaceLevels[1], -l:levelDelta)
+ execute 'silent! ' . a:line1 . ',' . (a:line2 - l:numSubstitutions) . 'substitute/' . s:levelRegexpDict[l:level] . '/' . repeat('#', l:level + l:levelDelta) . '\1/g'
+ endfor
+endfunction
call <sid>MapNormVis('<Plug>(Markdown_MoveToNextHeader)', '<sid>Markdown_MoveToNextHeader')
call <sid>MapNormVis('<Plug>(Markdown_MoveToPreviousHeader)', '<sid>Markdown_MoveToPreviousHeader')
command! -buffer Toch call s:Markdown_Toc('horizontal')
command! -buffer Tocv call s:Markdown_Toc('vertical')
command! -buffer Toct call s:Markdown_Toc('tab')
+command! -buffer -range=% SetexToAtx call s:SetexToAtx(<line1>, <line2>)
+command! -buffer -range=% HeaderDecrease call s:HeaderDecrease(<line1>, <line2>)
+command! -buffer -range=% HeaderIncrease call s:HeaderDecrease(<line1>, <line2>, 1)