mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	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 <andrey.radev@gmail.com> Co-authored-by: "D. Ben Knoble" <ben.knoble+github@gmail.com> Co-authored-by: Gary Johnson <garyjohn@spocom.com> Co-authored-by: Tim Pope <code@tpope.net> Co-authored-by: Doug Kearns <dougkearns@gmail.com> Co-authored-by: Christian Brabandt <cb@256bit.org> Signed-off-by: Konfekt <Konfekt@users.noreply.github.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							025dc48e88
						
					
				
				
					commit
					094494bf2e
				
			| @@ -1,9 +1,11 @@ | |||||||
| " Vim filetype plugin | " Vim filetype plugin | ||||||
| " Language:		Vim | " Language:          Vim | ||||||
| " Maintainer:		Doug Kearns <dougkearns@gmail.com> | " Maintainer:        Doug Kearns <dougkearns@gmail.com> | ||||||
| " Last Change:		2025 Jan 06 | " Last Change:       2025 Feb 23 | ||||||
| " Former Maintainer:	Bram Moolenaar <Bram@vim.org> | " Former Maintainer: Bram Moolenaar <Bram@vim.org> | ||||||
| " Contributors:		Riley Bruins <ribru17@gmail.com> ('commentstring') | " Contributors:      Riley Bruins <ribru17@gmail.com> ('commentstring'), | ||||||
|  | "                    @Konfekt | ||||||
|  | "                    @tpope (s:Help()) | ||||||
|  |  | ||||||
| " Only do this when not done yet for this buffer | " Only do this when not done yet for this buffer | ||||||
| if exists("b:did_ftplugin") | if exists("b:did_ftplugin") | ||||||
| @@ -18,20 +20,21 @@ set cpo&vim | |||||||
|  |  | ||||||
| if !exists('*VimFtpluginUndo') | if !exists('*VimFtpluginUndo') | ||||||
|   func 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') |     if exists('b:did_add_maps') | ||||||
|       silent! nunmap <buffer> [[ |       silent! nunmap <buffer> [[ | ||||||
|       silent! vunmap <buffer> [[ |       silent! xunmap <buffer> [[ | ||||||
|       silent! nunmap <buffer> ]] |       silent! nunmap <buffer> ]] | ||||||
|       silent! vunmap <buffer> ]] |       silent! xunmap <buffer> ]] | ||||||
|       silent! nunmap <buffer> [] |       silent! nunmap <buffer> [] | ||||||
|       silent! vunmap <buffer> [] |       silent! xunmap <buffer> [] | ||||||
|       silent! nunmap <buffer> ][ |       silent! nunmap <buffer> ][ | ||||||
|       silent! vunmap <buffer> ][ |       silent! xunmap <buffer> ][ | ||||||
|       silent! nunmap <buffer> ]" |       silent! nunmap <buffer> ]" | ||||||
|       silent! vunmap <buffer> ]" |       silent! xunmap <buffer> ]" | ||||||
|       silent! nunmap <buffer> [" |       silent! nunmap <buffer> [" | ||||||
|       silent! vunmap <buffer> [" |       silent! xunmap <buffer> [" | ||||||
|     endif |     endif | ||||||
|     unlet! b:match_ignorecase b:match_words b:match_skip b:did_add_maps |     unlet! b:match_ignorecase b:match_words b:match_skip b:did_add_maps | ||||||
|   endfunc |   endfunc | ||||||
| @@ -48,7 +51,49 @@ setlocal fo-=t fo+=croql | |||||||
| setlocal isk+=# | setlocal isk+=# | ||||||
|  |  | ||||||
| " Use :help to lookup the keyword under the cursor with K. | " Use :help to lookup the keyword under the cursor with K. | ||||||
| setlocal keywordprg=:help | " Distinguish between commands, options and functions. | ||||||
|  | if !exists("*" .. expand("<SID>") .. "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 =~# '\<v:$' | ||||||
|  |       return 'v:'.topic | ||||||
|  |     elseif topic ==# 'v' && post =~# ':\w\+' | ||||||
|  |       return 'v'.matchstr(post, ':\w\+') | ||||||
|  |     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. | " 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]\>' | 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. |   " Move around functions. | ||||||
|   nnoremap <silent><buffer> [[ m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW")<CR> |   nnoremap <silent><buffer> [[ m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW")<CR> | ||||||
|   vnoremap <silent><buffer> [[ m':<C-U>exe "normal! gv"<Bar>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> |   nnoremap <silent><buffer> ]] m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W")<CR> | ||||||
|   vnoremap <silent><buffer> ]] m':<C-U>exe "normal! gv"<Bar>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> |   nnoremap <silent><buffer> [] m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW")<CR> | ||||||
|   vnoremap <silent><buffer> [] m':<C-U>exe "normal! gv"<Bar>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> |   nnoremap <silent><buffer> ][ m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "W")<CR> | ||||||
|   vnoremap <silent><buffer> ][ m':<C-U>exe "normal! gv"<Bar>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 |   " Move around comments | ||||||
|   nnoremap <silent><buffer> ]" :call search('\%(^\s*".*\n\)\@<!\%(^\s*"\)', "W")<CR> |   nnoremap <silent><buffer> ]" :call search('\%(^\s*".*\n\)\@<!\%(^\s*"\)', "W")<CR> | ||||||
|   vnoremap <silent><buffer> ]" :<C-U>exe "normal! gv"<Bar>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> |   nnoremap <silent><buffer> [" :call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR> | ||||||
|   vnoremap <silent><buffer> [" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR> |   xnoremap <silent><buffer> [" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR> | ||||||
| endif | endif | ||||||
|  |  | ||||||
| " Let the matchit plugin know what items can be matched. | " Let the matchit plugin know what items can be matched. | ||||||
| @@ -101,15 +146,15 @@ if exists("loaded_matchit") | |||||||
|   "   func name |   "   func name | ||||||
|   " require a parenthesis following, then there can be an "endfunc". |   " require a parenthesis following, then there can be an "endfunc". | ||||||
|   let b:match_words = |   let b:match_words = | ||||||
| 	\ '\<\%(fu\%[nction]\|def\)!\=\s\+\S\+\s*(:\%(\%(^\||\)\s*\)\@<=\<retu\%[rn]\>:\%(\%(^\||\)\s*\)\@<=\<\%(endf\%[unction]\|enddef\)\>,' .. |   \ '\<\%(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]\)\>,' .. |   \ '\<\%(wh\%[ile]\|for\)\>:\%(\%(^\||\)\s*\)\@<=\<brea\%[k]\>:\%(\%(^\||\)\s*\)\@<=\<con\%[tinue]\>:\%(\%(^\||\)\s*\)\@<=\<end\%(w\%[hile]\|fo\%[r]\)\>,' .. | ||||||
| 	\ '\<if\>:\%(\%(^\||\)\s*\)\@<=\<el\%[seif]\>:\%(\%(^\||\)\s*\)\@<=\<en\%[dif]\>,' .. |   \ '\<if\>:\%(\%(^\||\)\s*\)\@<=\<el\%[seif]\>:\%(\%(^\||\)\s*\)\@<=\<en\%[dif]\>,' .. | ||||||
| 	\ '{:},' .. |   \ '{:},' .. | ||||||
| 	\ '\<try\>:\%(\%(^\||\)\s*\)\@<=\<cat\%[ch]\>:\%(\%(^\||\)\s*\)\@<=\<fina\%[lly]\>:\%(\%(^\||\)\s*\)\@<=\<endt\%[ry]\>,' .. |   \ '\<try\>:\%(\%(^\||\)\s*\)\@<=\<cat\%[ch]\>:\%(\%(^\||\)\s*\)\@<=\<fina\%[lly]\>:\%(\%(^\||\)\s*\)\@<=\<endt\%[ry]\>,' .. | ||||||
| 	\ '\<aug\%[roup]\s\+\%(END\>\)\@!\S:\<aug\%[roup]\s\+END\>,' .. |   \ '\<aug\%[roup]\s\+\%(END\>\)\@!\S:\<aug\%[roup]\s\+END\>,' .. | ||||||
| 	\ '\<class\>:\<endclass\>,' .. |   \ '\<class\>:\<endclass\>,' .. | ||||||
| 	\ '\<interface\>:\<endinterface\>,' .. |   \ '\<interface\>:\<endinterface\>,' .. | ||||||
| 	\ '\<enum\>:\<endenum\>' |   \ '\<enum\>:\<endenum\>' | ||||||
|  |  | ||||||
|   " Ignore syntax region commands and settings, any 'en*' would clobber |   " Ignore syntax region commands and settings, any 'en*' would clobber | ||||||
|   " if-endif. |   " if-endif. | ||||||
| @@ -117,7 +162,7 @@ if exists("loaded_matchit") | |||||||
|   " - au! FileType javascript syntax region foldBraces start=/{/ end=/}/ … |   " - au! FileType javascript syntax region foldBraces start=/{/ end=/}/ … | ||||||
|   " Also ignore here-doc and dictionary keys (vimVar). |   " Also ignore here-doc and dictionary keys (vimVar). | ||||||
|   let b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name") |   let b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name") | ||||||
| 	\ =~? "comment\\|string\\|vimSynReg\\|vimSet\\|vimLetHereDoc\\|vimVar"' |                     \ =~? "comment\\|string\\|vimSynReg\\|vimSet\\|vimLetHereDoc\\|vimVar"' | ||||||
| endif | endif | ||||||
|  |  | ||||||
| let &cpo = s:cpo_save | let &cpo = s:cpo_save | ||||||
| @@ -125,3 +170,5 @@ unlet s:cpo_save | |||||||
|  |  | ||||||
| " removed this, because 'cpoptions' is a global option. | " removed this, because 'cpoptions' is a global option. | ||||||
| " setlocal cpo+=M		" makes \%( match \) | " setlocal cpo+=M		" makes \%( match \) | ||||||
|  | " | ||||||
|  | " vim: sw=2 et | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user