1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
|
" Vim filetype plugin
" Language: Vim
" Maintainer: Doug Kearns <dougkearns@gmail.com>
" Former Maintainer: Bram Moolenaar <Bram@vim.org>
" Contributors: Riley Bruins <ribru17@gmail.com> ('commentstring')
" @Konfekt
" @tpope (s:Help())
" @lacygoill
" Last Change: 2025 Aug 07
" 2025 Aug 06 by Vim Project (add gf maps #17881)
" 2025 Aug 08 by Vim Project (add Vim script complete function #17871)
" 2025 Aug 12 by Vim Project (improve vimgoto script #17970))
" 2025 Aug 16 by Vim Project set com depending on Vim9 or legacy script
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
finish
endif
" Don't load another plugin for this buffer
let b:did_ftplugin = 1
let s:cpo_save = &cpo
set cpo&vim
if !exists('*VimFtpluginUndo')
func VimFtpluginUndo()
setl fo< isk< com< tw< commentstring< include< define< keywordprg< omnifunc<
sil! delc -buffer VimKeywordPrg
if exists('b:did_add_maps')
silent! nunmap <buffer> [[
silent! xunmap <buffer> [[
silent! nunmap <buffer> ]]
silent! xunmap <buffer> ]]
silent! nunmap <buffer> []
silent! xunmap <buffer> []
silent! nunmap <buffer> ][
silent! xunmap <buffer> ][
silent! nunmap <buffer> ]"
silent! xunmap <buffer> ]"
silent! nunmap <buffer> ["
silent! xunmap <buffer> ["
silent! nunmap <buffer> gf
silent! nunmap <buffer> <C-W>f
silent! nunmap <buffer> <C-W>gf
endif
unlet! b:match_ignorecase b:match_words b:match_skip b:did_add_maps
endfunc
endif
let b:undo_ftplugin = "call VimFtpluginUndo()"
" Set 'formatoptions' to break comment lines but not other lines,
" and insert the comment leader when hitting <CR> or using "o".
setlocal fo-=t fo+=croql
" To allow tag lookup via CTRL-] for autoload functions, '#' must be a
" keyword character. E.g., for netrw#Nread().
setlocal isk+=#
" Use :help to lookup the keyword under the cursor with K.
" Distinguish between commands, options and functions.
if !exists("*" .. expand("<SID>") .. "Help")
function s:Help(topic) abort
let topic = a:topic
" keyword is not necessarily under the cursor, see :help K
let line = getline('.')
let i = match(line, '\V' .. escape(topic, '\'), col('.') - len(topic))
let pre = strpart(line, 0, i)
let post = strpart(line, i + len(topic))
" local/global option vars
if topic =~# '[lg]' && pre ==# '&' && post =~# ':\k\+'
let topic = matchstr(post, '\k\+')
endif
if get(g:, 'syntax_on', 0)
let syn = synIDattr(synID(line('.'), col('.'), 1), 'name')
if syn ==# 'vimFuncName'
return topic .. '()'
elseif syn ==# 'vimOption' || syn ==# 'vimOptionVarName'
return "'" .. topic .. "'"
elseif syn ==# 'vimUserCmdAttrKey'
return ':command-' .. topic
elseif syn ==# 'vimCommand'
return ':' .. topic
endif
endif
if pre =~# '^\s*:\=$' || pre =~# '\%(\\\||\)\@<!|\s*:\=$'
return ':' .. topic
elseif pre =~# '\<v:$'
return 'v:' .. topic
elseif pre =~# '<$'
return '<' .. topic .. '>'
elseif pre =~# '\\$'
return '/\' .. topic
elseif topic ==# 'v' && post =~# ':\w\+'
return 'v' .. matchstr(post, ':\w\+')
elseif pre =~# '&\%([lg]:\)\=$'
return "'" .. topic .. "'"
else
return topic
endif
endfunction
endif
command! -buffer -nargs=1 VimKeywordPrg :exe 'help' s:Help(<q-args>)
setlocal keywordprg=:VimKeywordPrg
" Comments starts with # in Vim9 script. We have to guess which one to use.
if "\n" .. getline(1, 32)->join("\n") =~# '\n\s*vim9\%[script]\>'
setlocal commentstring=#\ %s
" Set 'comments' to format dashed lists in comments, for Vim9 script.
setlocal com=sO:#\ -,mO:#\ \ ,eO:##,:#\\\ ,:#
else
setlocal commentstring=\"%s
" Set 'comments' to format dashed lists in comments, for legacy Vim script.
setlocal com=sO:\"\ -,mO:\"\ \ ,eO:\"\",:\"\\\ ,:\"
endif
" set 'include' to recognize import commands
setlocal include=\\v^\\s*import\\s*(autoload)?
" set 'define' to recognize export commands
setlocal define=\\v^\\s*export\\s*(def\|const\|var\|final)
if has("vim9script")
" set omnifunc completion
setlocal omnifunc=vimcomplete#Complete
endif
" Format comments to be up to 78 characters long
if &tw == 0
setlocal tw=78
endif
if !exists("no_plugin_maps") && !exists("no_vim_maps")
let b:did_add_maps = 1
" Move around functions.
nnoremap <silent><buffer> [[ m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
xnoremap <silent><buffer> [[ m':<C-U>exe "normal! gv"<Bar>call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
nnoremap <silent><buffer> ]] m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
xnoremap <silent><buffer> ]] m':<C-U>exe "normal! gv"<Bar>call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
nnoremap <silent><buffer> [] m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
xnoremap <silent><buffer> [] m':<C-U>exe "normal! gv"<Bar>call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
nnoremap <silent><buffer> ][ m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
xnoremap <silent><buffer> ][ m':<C-U>exe "normal! gv"<Bar>call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
" Move around comments
nnoremap <silent><buffer> ]" :call search('\%(^\s*".*\n\)\@<!\%(^\s*"\)', "W")<CR>
xnoremap <silent><buffer> ]" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\@<!\%(^\s*"\)', "W")<CR>
nnoremap <silent><buffer> [" :call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
xnoremap <silent><buffer> [" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
" Purpose: Handle :import, :colorscheme and :packadd lines in a smarter way. {{{
"
" `:import` is followed by a filename or filepath. Find it.
"
" `:packadd` is followed by the name of a package, which we might have
" configured in scripts under `~/.vim/plugin`. Find it.
"
" ---
"
" We can't handle the `:import` lines simply by setting `'includeexpr'`, because
" the option would be ignored if:
"
" - the name of the imported script is the same as the current one
" - `'path'` includes the `.` item
"
" Indeed, in that case, Vim finds the current file, and simply reloads the
" buffer.
" }}}
" We use the `F` variants, instead of the `f` ones, because they're smarter.
" See $VIMRUNTIME/autoload/vimgoto.vim
nnoremap <silent><buffer> gf :<C-U>call vimgoto#Find('gF')<CR>
nnoremap <silent><buffer> <C-W>f :<C-U>call vimgoto#Find("\<lt>C-W>F")<CR>
nnoremap <silent><buffer> <C-W>gf :<C-U>call vimgoto#Find("\<lt>C-W>gF")<CR>
endif
" Let the matchit plugin know what items can be matched.
if exists("loaded_matchit")
let b:match_ignorecase = 0
" "func" can also be used as a type:
" var Ref: func
" or to list functions:
" func name
" require a parenthesis following, then there can be an "endfunc".
let b:match_words =
\ '\<\%(fu\%[nction]\|def\)!\=\s\+\S\+\s*(:\%(\%(^\||\)\s*\)\@<=\<retu\%[rn]\>:\%(\%(^\||\)\s*\)\@<=\<\%(endf\%[unction]\|enddef\)\>,' ..
\ '\<\%(wh\%[ile]\|for\)\>:\%(\%(^\||\)\s*\)\@<=\<brea\%[k]\>:\%(\%(^\||\)\s*\)\@<=\<con\%[tinue]\>:\%(\%(^\||\)\s*\)\@<=\<end\%(w\%[hile]\|fo\%[r]\)\>,' ..
\ '\<if\>:\%(\%(^\||\)\s*\)\@<=\<el\%[seif]\>:\%(\%(^\||\)\s*\)\@<=\<en\%[dif]\>,' ..
\ '{:},' ..
\ '\<try\>:\%(\%(^\||\)\s*\)\@<=\<cat\%[ch]\>:\%(\%(^\||\)\s*\)\@<=\<fina\%[lly]\>:\%(\%(^\||\)\s*\)\@<=\<endt\%[ry]\>,' ..
\ '\<aug\%[roup]\s\+\%(END\>\)\@!\S:\<aug\%[roup]\s\+END\>,' ..
\ '\<class\>:\<endclass\>,' ..
\ '\<interface\>:\<endinterface\>,' ..
\ '\<enum\>:\<endenum\>'
" Ignore syntax region commands and settings, any 'en*' would clobber
" if-endif.
" - set spl=de,en
" - au! FileType javascript syntax region foldBraces start=/{/ end=/}/ …
" Also ignore here-doc and dictionary keys (vimVar).
let b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name")
\ =~? "comment\\|string\\|vimSynReg\\|vimSet\\|vimLetHereDoc\\|vimVar"'
endif
let &cpo = s:cpo_save
unlet s:cpo_save
" removed this, because 'cpoptions' is a global option.
" setlocal cpo+=M " makes \%( match \)
"
" vim: sw=2 et
|