You can also map them by yourself with `<Plug>` mappings.
+### Enable TOC window auto-fit
+
+Allow for the TOC window to auto-fit when it's possible for it to shrink.
+It never increases its default size (half screen), it only shrinks.
+
+```vim
+let g:vim_markdown_toc_autofit = 1
+```
+
### Syntax extensions
The following options control which syntax extensions will be turned on. They are off by default.
let b:fenced_block = 0
let b:header_list = []
let l:header_max_len = 0
+ let g:vim_markdown_toc_autofit = get(g:, "vim_markdown_toc_autofit", 0)
for i in range(1, line('$'))
let l:lineraw = getline(i)
let l:l1 = getline(i+1)
" append line to location list
let b:item = {'lnum': i, 'text': l:line, 'valid': 1, 'bufnr': b:bufnr, 'col': 1}
let b:header_list = b:header_list + [b:item]
+ " keep track of the longest header size (heading level + title)
+ let b:total_len = stridx(l:line, ' ') + len(l:line)
+ if b:total_len > l:header_max_len
+ let l:header_max_len = b:total_len
+ endif
endif
endfor
if len(b:header_list) == 0
lopen
elseif l:window_type ==# 'vertical'
vertical lopen
- let &winwidth=(&columns/2)
+ " auto-fit toc window when possible to shrink it
+ if (&columns/2) > l:header_max_len && g:vim_markdown_toc_autofit == 1
+ let &winwidth = (l:header_max_len + 1)
+ else
+ let &winwidth = (&columns/2)
+ endif
elseif l:window_type ==# 'tab'
tab lopen
else
--- /dev/null
+" Tests toc window auto-fit to longest header, but without exceeding half screen.
+
+Before:
+ source ../after/ftplugin/markdown.vim
+
+After:
+ setlocal foldexpr=0
+ setlocal foldmethod=manual
+
+Given markdown;
+# chap 1
+
+# chap 2
+
+# chap 3
+
+# chap 4
+
+# chap 5
+
+# chap 6
+
+# chap 7
+
+# chap 8
+
+# chap 9
+
+# chap 10
+
+# chap 11
+
+# chap 12
+
+## chap 12.1
+
+### chap 12.1.1
+
+#### chap 12.1.1.1
+
+##### chap 12.1.1.1.1
+
+###### chap 12.1.1.1.1.1
+
+# chap 13
+
+Execute (toc window autofit width):
+ set number
+ let g:vim_markdown_toc_autofit = 1
+ let line = '###### chap 12.1.1.1.1.1'
+ AssertEqual getline('33'), line
+ :Toc
+ let expected_width = len(line) + 2*5 + 1 + 3 - 7
+ AssertEqual &winwidth, expected_width
+" 2 spaces * 5 additional header levels + 1 space for first header +
+" 3 spaces for line numbers - 7 chars ('###### ') that don't show up on the TOC
+