From: Konfekt Date: Sun, 23 Feb 2025 15:03:30 +0000 (+0100) Subject: runtime(vim): improve &keywordprg in ftplugin X-Git-Tag: v9.1.1142~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=094494bf2eef8d788944b2b00b3361feb545d3ae;p=thirdparty%2Fvim.git runtime(vim): improve &keywordprg in ftplugin - let keywordprg in vim filetype handle context-sensitive help calls by detecting the syntax group of the word under the cursor - reformat whitespace - add modeline related: #16677 closes: #16680 Co-authored-by: Andrew Radev Co-authored-by: "D. Ben Knoble" Co-authored-by: Gary Johnson Co-authored-by: Tim Pope Co-authored-by: Doug Kearns Co-authored-by: Christian Brabandt Signed-off-by: Konfekt Signed-off-by: Christian Brabandt --- diff --git a/runtime/ftplugin/vim.vim b/runtime/ftplugin/vim.vim index 2c883a537a..c9ea793eed 100644 --- a/runtime/ftplugin/vim.vim +++ b/runtime/ftplugin/vim.vim @@ -1,9 +1,11 @@ " Vim filetype plugin -" Language: Vim -" Maintainer: Doug Kearns -" Last Change: 2025 Jan 06 -" Former Maintainer: Bram Moolenaar -" Contributors: Riley Bruins ('commentstring') +" Language: Vim +" Maintainer: Doug Kearns +" Last Change: 2025 Feb 23 +" Former Maintainer: Bram Moolenaar +" Contributors: Riley Bruins ('commentstring'), +" @Konfekt +" @tpope (s:Help()) " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -18,20 +20,21 @@ set cpo&vim if !exists('*VimFtpluginUndo') func VimFtpluginUndo() - setl fo< isk< com< tw< commentstring< include< define< + setl fo< isk< com< tw< commentstring< include< define< keywordprg< + sil! delc -buffer VimKeywordPrg if exists('b:did_add_maps') silent! nunmap [[ - silent! vunmap [[ + silent! xunmap [[ silent! nunmap ]] - silent! vunmap ]] + silent! xunmap ]] silent! nunmap [] - silent! vunmap [] + silent! xunmap [] silent! nunmap ][ - silent! vunmap ][ + silent! xunmap ][ silent! nunmap ]" - silent! vunmap ]" + silent! xunmap ]" silent! nunmap [" - silent! vunmap [" + silent! xunmap [" endif unlet! b:match_ignorecase b:match_words b:match_skip b:did_add_maps endfunc @@ -48,7 +51,49 @@ setlocal fo-=t fo+=croql setlocal isk+=# " Use :help to lookup the keyword under the cursor with K. -setlocal keywordprg=:help +" Distinguish between commands, options and functions. +if !exists("*" .. expand("") .. "Help") + function s:Help(topic) abort + let topic = a:topic + + if get(g:, 'syntax_on', 0) + let syn = synIDattr(synID(line('.'), col('.'), 1), 'name') + if syn ==# 'vimFuncName' + return topic.'()' + elseif syn ==# 'vimOption' + return "'".topic."'" + elseif syn ==# 'vimUserAttrbKey' + return ':command-'.topic + elseif syn =~# 'vimCommand' + return ':'.topic + endif + endif + + let col = col('.') - 1 + while col && getline('.')[col] =~# '\k' + let col -= 1 + endwhile + let pre = col == 0 ? '' : getline('.')[0 : col] + + let col = col('.') - 1 + while col && getline('.')[col] =~# '\k' + let col += 1 + endwhile + let post = getline('.')[col : -1] + + if pre =~# '^\s*:\=$' + return ':'.topic + elseif pre =~# '\) +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]\>' @@ -77,19 +122,19 @@ if !exists("no_plugin_maps") && !exists("no_vim_maps") " Move around functions. nnoremap [[ m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW") - vnoremap [[ m':exe "normal! gv"call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW") + xnoremap [[ m':exe "normal! gv"call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW") nnoremap ]] m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W") - vnoremap ]] m':exe "normal! gv"call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W") + xnoremap ]] m':exe "normal! gv"call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W") nnoremap [] m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW") - vnoremap [] m':exe "normal! gv"call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW") + xnoremap [] m':exe "normal! gv"call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW") nnoremap ][ m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "W") - vnoremap ][ m':exe "normal! gv"call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "W") + xnoremap ][ m':exe "normal! gv"call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "W") " Move around comments nnoremap ]" :call search('\%(^\s*".*\n\)\@ - vnoremap ]" :exe "normal! gv"call search('\%(^\s*".*\n\)\@ + xnoremap ]" :exe "normal! gv"call search('\%(^\s*".*\n\)\@ nnoremap [" :call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW") - vnoremap [" :exe "normal! gv"call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW") + xnoremap [" :exe "normal! gv"call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW") endif " Let the matchit plugin know what items can be matched. @@ -101,15 +146,15 @@ if exists("loaded_matchit") " func name " require a parenthesis following, then there can be an "endfunc". let b:match_words = - \ '\<\%(fu\%[nction]\|def\)!\=\s\+\S\+\s*(:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\<\%(endf\%[unction]\|enddef\)\>,' .. - \ '\<\%(wh\%[ile]\|for\)\>:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\,' .. - \ '\:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\,' .. - \ '{:},' .. - \ '\:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\,' .. - \ '\\)\@!\S:\,' .. - \ '\:\,' .. - \ '\:\,' .. - \ '\:\' + \ '\<\%(fu\%[nction]\|def\)!\=\s\+\S\+\s*(:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\<\%(endf\%[unction]\|enddef\)\>,' .. + \ '\<\%(wh\%[ile]\|for\)\>:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\,' .. + \ '\:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\,' .. + \ '{:},' .. + \ '\:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\:\%(\%(^\||\)\s*\)\@<=\,' .. + \ '\\)\@!\S:\,' .. + \ '\:\,' .. + \ '\:\,' .. + \ '\:\' " Ignore syntax region commands and settings, any 'en*' would clobber " if-endif. @@ -117,7 +162,7 @@ if exists("loaded_matchit") " - 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"' + \ =~? "comment\\|string\\|vimSynReg\\|vimSet\\|vimLetHereDoc\\|vimVar"' endif let &cpo = s:cpo_save @@ -125,3 +170,5 @@ unlet s:cpo_save " removed this, because 'cpoptions' is a global option. " setlocal cpo+=M " makes \%( match \) +" +" vim: sw=2 et