mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
" Vim filetype plugin file
 | 
						|
" Language:             Vim help file
 | 
						|
" Previous Maintainer:  Nikolai Weibull <now@bitwi.se>
 | 
						|
" Latest Revision:      2018-12-29
 | 
						|
 | 
						|
if exists("b:did_ftplugin")
 | 
						|
  finish
 | 
						|
endif
 | 
						|
let b:did_ftplugin = 1
 | 
						|
 | 
						|
let s:cpo_save = &cpo
 | 
						|
set cpo&vim
 | 
						|
 | 
						|
let b:undo_ftplugin = "setl fo< tw< cole< cocu< keywordprg<"
 | 
						|
 | 
						|
setlocal formatoptions+=tcroql textwidth=78
 | 
						|
if has("conceal")
 | 
						|
  setlocal cole=2 cocu=nc
 | 
						|
endif
 | 
						|
 | 
						|
" Prefer Vim help instead of manpages.
 | 
						|
setlocal keywordprg=:help
 | 
						|
 | 
						|
if !exists('g:no_plugin_maps')
 | 
						|
  function! s:show_toc() abort
 | 
						|
    let bufname = bufname('%')
 | 
						|
    let info = getloclist(0, {'winid': 1})
 | 
						|
    if !empty(info) && getwinvar(info.winid, 'qf_toc') ==# bufname
 | 
						|
      lopen
 | 
						|
      return
 | 
						|
    endif
 | 
						|
 | 
						|
    let toc = []
 | 
						|
    let lnum = 2
 | 
						|
    let last_line = line('$') - 1
 | 
						|
    let last_added = 0
 | 
						|
    let has_section = 0
 | 
						|
    let has_sub_section = 0
 | 
						|
 | 
						|
    while lnum && lnum <= last_line
 | 
						|
      let level = 0
 | 
						|
      let add_text = ''
 | 
						|
      let text = getline(lnum)
 | 
						|
 | 
						|
      if text =~# '^=\+$' && lnum + 1 < last_line
 | 
						|
        " A de-facto section heading.  Other headings are inferred.
 | 
						|
        let has_section = 1
 | 
						|
        let has_sub_section = 0
 | 
						|
        let lnum = nextnonblank(lnum + 1)
 | 
						|
        let text = getline(lnum)
 | 
						|
        let add_text = text
 | 
						|
        while add_text =~# '\*[^*]\+\*\s*$'
 | 
						|
          let add_text = matchstr(add_text, '.*\ze\*[^*]\+\*\s*$')
 | 
						|
        endwhile
 | 
						|
      elseif text =~# '^[A-Z0-9][-A-ZA-Z0-9 .][-A-Z0-9 .():]*\%([ \t]\+\*.\+\*\)\?$'
 | 
						|
        " Any line that's yelling is important.
 | 
						|
        let has_sub_section = 1
 | 
						|
        let level = has_section
 | 
						|
        let add_text = matchstr(text, '.\{-}\ze\s*\%([ \t]\+\*.\+\*\)\?$')
 | 
						|
      elseif text =~# '\~$'
 | 
						|
            \ && matchstr(text, '^\s*\zs.\{-}\ze\s*\~$') !~# '\t\|\s\{2,}'
 | 
						|
            \ && getline(lnum - 1) =~# '^\s*<\?$\|^\s*\*.*\*$'
 | 
						|
            \ && getline(lnum + 1) =~# '^\s*>\?$\|^\s*\*.*\*$'
 | 
						|
        " These lines could be headers or code examples.  We only want the
 | 
						|
        " ones that have subsequent lines at the same indent or more.
 | 
						|
        let l = nextnonblank(lnum + 1)
 | 
						|
        if getline(l) =~# '\*[^*]\+\*$'
 | 
						|
          " Ignore tag lines
 | 
						|
          let l = nextnonblank(l + 1)
 | 
						|
        endif
 | 
						|
 | 
						|
        if indent(lnum) <= indent(l)
 | 
						|
          let level = has_section + has_sub_section
 | 
						|
          let add_text = matchstr(text, '\S.*')
 | 
						|
        endif
 | 
						|
      endif
 | 
						|
 | 
						|
      let add_text = substitute(add_text, '\s\+$', '', 'g')
 | 
						|
      if !empty(add_text) && last_added != lnum
 | 
						|
        let last_added = lnum
 | 
						|
        call add(toc, {'bufnr': bufnr('%'), 'lnum': lnum,
 | 
						|
              \ 'text': repeat('  ', level) . add_text})
 | 
						|
      endif
 | 
						|
      let lnum = nextnonblank(lnum + 1)
 | 
						|
    endwhile
 | 
						|
 | 
						|
    call setloclist(0, toc, ' ')
 | 
						|
    call setloclist(0, [], 'a', {'title': 'Help TOC'})
 | 
						|
    lopen
 | 
						|
    let w:qf_toc = bufname
 | 
						|
  endfunction
 | 
						|
 | 
						|
  nnoremap <silent><buffer> gO :call <sid>show_toc()<cr>
 | 
						|
endif
 | 
						|
 | 
						|
let &cpo = s:cpo_save
 | 
						|
unlet s:cpo_save
 |