diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2020-06-25 13:38:07 +0200 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2020-06-25 13:38:15 +0200 |
commit | abca7c20144a1aa0c0197e17cacd892e3ff99ff2 (patch) | |
tree | 571bb7b6905b1d42e8a269c2cb643535904b8ec7 /ftplugin | |
parent | 8b6c06e7239eb46d5b5096fd7fe9507aca88b091 (diff) | |
download | vim-polyglot-abca7c20144a1aa0c0197e17cacd892e3ff99ff2.tar.gz vim-polyglot-abca7c20144a1aa0c0197e17cacd892e3ff99ff2.zip |
Update
Diffstat (limited to 'ftplugin')
-rw-r--r-- | ftplugin/mail_vifm.vim | 6 | ||||
-rw-r--r-- | ftplugin/markdown.vim | 220 | ||||
-rw-r--r-- | ftplugin/racket.vim | 23 | ||||
-rw-r--r-- | ftplugin/zig.vim | 5 |
4 files changed, 181 insertions, 73 deletions
diff --git a/ftplugin/mail_vifm.vim b/ftplugin/mail_vifm.vim index c9849fbc..4896b892 100644 --- a/ftplugin/mail_vifm.vim +++ b/ftplugin/mail_vifm.vim @@ -2,7 +2,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vifm') == -1 " Mail file type extension to pick files for attachments via vifm " Maintainer: xaizek <xaizek@posteo.net> -" Last Change: January 02, 2018 +" Last Change: June 22, 2020 " Insert attachment picked via vifm after 'Subject' header function! s:AddMailAttachments() @@ -43,9 +43,7 @@ endfunction function! s:HandleRunResults(exitcode, listf) if a:exitcode != 0 - echohl WarningMsg - echo 'Got non-zero code from vifm: ' . a:exitcode - echohl None + echoerr 'Got non-zero code from vifm: ' . a:exitcode call delete(a:listf) return endif diff --git a/ftplugin/markdown.vim b/ftplugin/markdown.vim index 43c9773a..1c4268be 100644 --- a/ftplugin/markdown.vim +++ b/ftplugin/markdown.vim @@ -156,6 +156,58 @@ function! s:GetHeaderLevel(...) endif endfunction +" Return list of headers and their levels. +" +function! s:GetHeaderList() + let l:bufnr = bufnr('%') + let l:fenced_block = 0 + let l:front_matter = 0 + let l:header_list = [] + let l:vim_markdown_frontmatter = get(g:, "vim_markdown_frontmatter", 0) + for i in range(1, line('$')) + let l:lineraw = getline(i) + let l:l1 = getline(i+1) + let l:line = substitute(l:lineraw, "#", "\\\#", "g") + " exclude lines in fenced code blocks + if l:line =~ '````*' || l:line =~ '\~\~\~\~*' + if l:fenced_block == 0 + let l:fenced_block = 1 + elseif l:fenced_block == 1 + let l:fenced_block = 0 + endif + " exclude lines in frontmatters + elseif l:vim_markdown_frontmatter == 1 + if l:front_matter == 1 + if l:line == '---' + let l:front_matter = 0 + endif + elseif i == 1 + if l:line == '---' + let l:front_matter = 1 + endif + endif + endif + " match line against header regex + if join(getline(i, i + 1), "\n") =~ s:headersRegexp && l:line =~ '^\S' + let l:is_header = 1 + else + let l:is_header = 0 + endif + if l:is_header == 1 && l:fenced_block == 0 && l:front_matter == 0 + " remove hashes from atx headers + if match(l:line, "^#") > -1 + let l:line = substitute(l:line, '\v^#*[ ]*', '', '') + let l:line = substitute(l:line, '\v[ ]*#*$', '', '') + endif + " append line to list + let l:level = s:GetHeaderLevel(i) + let l:item = {'level': l:level, 'text': l:line, 'lnum': i, 'bufnr': bufnr} + let l:header_list = l:header_list + [l:item] + endif + endfor + return l:header_list +endfunction + " Returns the level of the header at the given line. " " If there is no header at the given line, returns `0`. @@ -177,6 +229,7 @@ endfunction function! s:MoveToParentHeader() let l:linenum = s:GetParentHeaderLineNumber() if l:linenum != 0 + call setpos("''", getpos('.')) call cursor(l:linenum, 1) else echo 'no parent header' @@ -305,65 +358,38 @@ function! s:Toc(...) endif - let l:bufnr = bufnr('%') let l:cursor_line = line('.') let l:cursor_header = 0 - let l:fenced_block = 0 - let l:front_matter = 0 - let l:header_list = [] + let l:header_list = s:GetHeaderList() + let l:indented_header_list = [] + if len(l:header_list) == 0 + echom "Toc: No headers." + return + endif let l:header_max_len = 0 let l:vim_markdown_toc_autofit = get(g:, "vim_markdown_toc_autofit", 0) - let l:vim_markdown_frontmatter = get(g:, "vim_markdown_frontmatter", 0) - for i in range(1, line('$')) - let l:lineraw = getline(i) - let l:l1 = getline(i+1) - let l:line = substitute(l:lineraw, "#", "\\\#", "g") - if l:line =~ '````*' || l:line =~ '\~\~\~\~*' - if l:fenced_block == 0 - let l:fenced_block = 1 - elseif l:fenced_block == 1 - let l:fenced_block = 0 - endif - elseif l:vim_markdown_frontmatter == 1 - if l:front_matter == 1 - if l:line == '---' - let l:front_matter = 0 - endif - elseif i == 1 - if l:line == '---' - let l:front_matter = 1 - endif + for h in l:header_list + " set header number of the cursor position + if l:cursor_header == 0 + let l:header_line = h.lnum + if l:header_line == l:cursor_line + let l:cursor_header = index(l:header_list, h) + 1 + elseif l:header_line > l:cursor_line + let l:cursor_header = index(l:header_list, h) endif endif - if l:line =~ '^#\+' || (l:l1 =~ '^=\+\s*$' || l:l1 =~ '^-\+\s*$') && l:line =~ '^\S' - let l:is_header = 1 - else - let l:is_header = 0 - endif - if l:is_header == 1 && l:fenced_block == 0 && l:front_matter == 0 - " append line to location list - let l:item = {'lnum': i, 'text': l:line, 'valid': 1, 'bufnr': l:bufnr, 'col': 1} - let l:header_list = l:header_list + [l:item] - " set header number of the cursor position - if l:cursor_header == 0 - if i == l:cursor_line - let l:cursor_header = len(l:header_list) - elseif i > l:cursor_line - let l:cursor_header = len(l:header_list) - 1 - endif - endif - " keep track of the longest header size (heading level + title) - let l:total_len = stridx(l:line, ' ') + strdisplaywidth(l:line) - if l:total_len > l:header_max_len - let l:header_max_len = l:total_len - endif + " indent header based on level + let l:text = repeat(' ', h.level-1) . h.text + " keep track of the longest header size (heading level + title) + let l:total_len = strdisplaywidth(l:text) + if l:total_len > l:header_max_len + let l:header_max_len = l:total_len endif + " append indented line to list + let l:item = {'lnum': h.lnum, 'text': l:text, 'valid': 1, 'bufnr': h.bufnr, 'col': 1} + let l:indented_header_list = l:indented_header_list + [l:item] endfor - call setloclist(0, l:header_list) - if len(l:header_list) == 0 - echom "Toc: No headers." - return - endif + call setloclist(0, l:indented_header_list) if l:window_type ==# 'horizontal' lopen @@ -371,7 +397,8 @@ function! s:Toc(...) vertical lopen " auto-fit toc window when possible to shrink it if (&columns/2) > l:header_max_len && l:vim_markdown_toc_autofit == 1 - execute 'vertical resize ' . (l:header_max_len + 1) + " header_max_len + 1 space for first header + 3 spaces for line numbers + execute 'vertical resize ' . (l:header_max_len + 1 + 3) else execute 'vertical resize ' . (&columns/2) endif @@ -384,27 +411,84 @@ function! s:Toc(...) for i in range(1, line('$')) " this is the location-list data for the current item let d = getloclist(0)[i-1] - " atx headers - if match(d.text, "^#") > -1 - let l:level = len(matchstr(d.text, '#*', 'g'))-1 - let d.text = substitute(d.text, '\v^#*[ ]*', '', '') - let d.text = substitute(d.text, '\v[ ]*#*$', '', '') - " setex headers - else - let l:next_line = getbufline(d.bufnr, d.lnum+1) - if match(l:next_line, "=") > -1 - let l:level = 0 - elseif match(l:next_line, "-") > -1 - let l:level = 1 - endif - endif - call setline(i, repeat(' ', l:level). d.text) + call setline(i, d.text) endfor setlocal nomodified setlocal nomodifiable execute 'normal! ' . l:cursor_header . 'G' endfunction +function! s:InsertToc(format, ...) + if a:0 > 0 + if type(a:1) != type(0) + echohl WarningMsg + echomsg '[vim-markdown] Invalid argument, must be an integer >= 2.' + echohl None + return + endif + let l:max_level = a:1 + if l:max_level < 2 + echohl WarningMsg + echomsg '[vim-markdown] Maximum level cannot be smaller than 2.' + echohl None + return + endif + else + let l:max_level = 0 + endif + + let l:toc = [] + let l:header_list = s:GetHeaderList() + if len(l:header_list) == 0 + echom "InsertToc: No headers." + return + endif + + if a:format ==# 'numbers' + let l:h2_count = 0 + for header in l:header_list + if header.level == 2 + let l:h2_count += 1 + endif + endfor + let l:max_h2_number_len = strlen(string(l:h2_count)) + else + let l:max_h2_number_len = 0 + endif + + let l:h2_count = 0 + for header in l:header_list + let l:level = header.level + if l:level == 1 + " skip level-1 headers + continue + elseif l:max_level != 0 && l:level > l:max_level + " skip unwanted levels + continue + elseif l:level == 2 + " list of level-2 headers can be bullets or numbers + if a:format ==# 'bullets' + let l:indent = '' + let l:marker = '* ' + else + let l:h2_count += 1 + let l:number_len = strlen(string(l:h2_count)) + let l:indent = repeat(' ', l:max_h2_number_len - l:number_len) + let l:marker = l:h2_count . '. ' + endif + else + let l:indent = repeat(' ', l:max_h2_number_len + 2 * (l:level - 2)) + let l:marker = '* ' + endif + let l:text = '[' . header.text . ']' + let l:link = '(#' . substitute(tolower(header.text), '\v[ ]+', '-', 'g') . ')' + let l:line = l:indent . l:marker . l:text . l:link + let l:toc = l:toc + [l:line] + endfor + + call append(line('.'), l:toc) +endfunction + " Convert Setex headers in range `line1 .. line2` to Atx. " " Return the number of conversions. @@ -681,6 +765,8 @@ command! -buffer Toc call s:Toc() command! -buffer Toch call s:Toc('horizontal') command! -buffer Tocv call s:Toc('vertical') command! -buffer Toct call s:Toc('tab') +command! -buffer -nargs=? InsertToc call s:InsertToc('bullets', <args>) +command! -buffer -nargs=? InsertNToc call s:InsertToc('numbers', <args>) " Heavily based on vim-notes - http://peterodding.com/code/vim/notes/ if exists('g:vim_markdown_fenced_languages') diff --git a/ftplugin/racket.vim b/ftplugin/racket.vim index 89990061..1a3ba189 100644 --- a/ftplugin/racket.vim +++ b/ftplugin/racket.vim @@ -4,6 +4,11 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'racket') == -1 " Maintainer: Will Langstroth <will@langstroth.com> " URL: http://github.com/wlangstroth/vim-racket +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + setl iskeyword+=#,%,^ setl lispwords+=module,module*,module+,parameterize,let-values,let*-values,letrec-values,local setl lispwords+=define-values,opt-lambda,case-lambda,syntax-rules,with-syntax,syntax-case,syntax-parse @@ -37,7 +42,10 @@ setl makeprg=raco\ make\ --\ % " but then vim says: " "press ENTER or type a command to continue" " We avoid the annoyance of having to hit enter by remapping K directly. -nnoremap <buffer> K :silent !raco docs <cword><cr>:redraw!<cr> +nnoremap <buffer> <Plug>RacketDoc :silent !raco docs <cword><cr>:redraw!<cr> +if maparg("K", "n") == "" + nmap <buffer> K <Plug>RacketDoc +endif " For the visual mode K mapping, it's slightly more convoluted to get the " selected text: @@ -53,9 +61,20 @@ function! s:Racket_visual_doc() endtry endfunction -vnoremap <buffer> K :call <SID>Racket_visual_doc()<cr> +vnoremap <buffer> <Plug>RacketDoc :call <SID>Racket_visual_doc()<cr> +if maparg("K", "v") == "" + vmap <buffer> K <Plug>RacketDoc +endif "setl commentstring=;;%s setl commentstring=#\|\ %s\ \|# +" Undo our settings when the filetype changes away from Racket +" (this should be amended if settings/mappings are added above!) +let b:undo_ftplugin = + \ "setl iskeyword< lispwords< lisp< comments< formatoptions<" + \. "| setl makeprg< commentstring<" + \. "| nunmap <buffer> K" + \. "| vunmap <buffer> K" + endif diff --git a/ftplugin/zig.vim b/ftplugin/zig.vim index 8e43f4fb..663ec875 100644 --- a/ftplugin/zig.vim +++ b/ftplugin/zig.vim @@ -16,4 +16,9 @@ setlocal suffixesadd=.zir setlocal commentstring=//\ %s setlocal makeprg=zig\ build +if (has("comments")) + set comments=:///,://,:\\\\ + set formatoptions=tcqor +endif + endif |