summaryrefslogtreecommitdiff
path: root/runtime/autoload/syntaxcomplete.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/autoload/syntaxcomplete.vim')
-rw-r--r--runtime/autoload/syntaxcomplete.vim148
1 files changed, 99 insertions, 49 deletions
diff --git a/runtime/autoload/syntaxcomplete.vim b/runtime/autoload/syntaxcomplete.vim
index 6ba262b9a..396193d8b 100644
--- a/runtime/autoload/syntaxcomplete.vim
+++ b/runtime/autoload/syntaxcomplete.vim
@@ -1,12 +1,16 @@
" Vim completion script
" Language: All languages, uses existing syntax highlighting rules
" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
-" Version: 14.0
-" Last Change: 2020 Dec 30
+" Version: 15.0
+" Last Change: 2021 Apr 27
" Usage: For detailed help, ":help ft-syntax-omni"
" History
"
+" Version 15.0
+" - SyntaxComplete ignored all buffer specific overrides, always used global
+" https://github.com/vim/vim/issues/8153
+"
" Version 14.0
" - Fixed issue with single quotes and is_keyword
" https://github.com/vim/vim/issues/7463
@@ -42,7 +46,7 @@
" let g:omni_syntax_use_single_byte = 1
" - This by default will only allow single byte ASCII
" characters to be added and an additional check to ensure
-" the charater is printable (see documentation for isprint).
+" the character is printable (see documentation for isprint).
"
" Version 9.0
" - Add the check for cpo.
@@ -90,7 +94,7 @@ endif
if exists('g:loaded_syntax_completion')
finish
endif
-let g:loaded_syntax_completion = 130
+let g:loaded_syntax_completion = 150
" Turn on support for line continuations when creating the script
let s:cpo_save = &cpo
@@ -145,14 +149,10 @@ let s:prepended = ''
" This function is used for the 'omnifunc' option.
function! syntaxcomplete#Complete(findstart, base)
- " Only display items in the completion window that are at least
- " this many characters in length
- if !exists('b:omni_syntax_ignorecase')
- if exists('g:omni_syntax_ignorecase')
- let b:omni_syntax_ignorecase = g:omni_syntax_ignorecase
- else
- let b:omni_syntax_ignorecase = &ignorecase
- endif
+ " Allow user to override ignorecase per buffer
+ let l:omni_syntax_ignorecase = g:omni_syntax_ignorecase
+ if exists('b:omni_syntax_ignorecase')
+ let l:omni_syntax_ignorecase = b:omni_syntax_ignorecase
endif
if a:findstart
@@ -183,7 +183,6 @@ function! syntaxcomplete#Complete(findstart, base)
endif
" let base = s:prepended . a:base
- " let base = s:prepended
let base = substitute(s:prepended, "'", "''", 'g')
let filetype = substitute(&filetype, '\.', '_', 'g')
@@ -200,13 +199,13 @@ function! syntaxcomplete#Complete(findstart, base)
if base != ''
" let compstr = join(compl_list, ' ')
- " let expr = (b:omni_syntax_ignorecase==0?'\C':'').'\<\%('.base.'\)\@!\w\+\s*'
+ " let expr = (l:omni_syntax_ignorecase==0?'\C':'').'\<\%('.base.'\)\@!\w\+\s*'
" let compstr = substitute(compstr, expr, '', 'g')
" let compl_list = split(compstr, '\s\+')
" Filter the list based on the first few characters the user
" entered
- let expr = 'v:val '.(g:omni_syntax_ignorecase==1?'=~?':'=~#')." '^".escape(base, '\\/.*$^~[]').".*'"
+ let expr = 'v:val '.(l:omni_syntax_ignorecase==1?'=~?':'=~#')." '^".escape(base, '\\/.*$^~[]').".*'"
let compl_list = filter(deepcopy(compl_list), expr)
endif
@@ -227,6 +226,26 @@ function! syntaxcomplete#OmniSyntaxList(...)
endif
endfunc
+function! syntaxcomplete#OmniSyntaxClearCache()
+ let s:cache_name = []
+ let s:cache_list = []
+endfunction
+
+" To retrieve all syntax items regardless of syntax group:
+" echo OmniSyntaxList( [] )
+"
+" To retrieve only the syntax items for the sqlOperator syntax group:
+" echo OmniSyntaxList( ['sqlOperator'] )
+"
+" To retrieve all syntax items for both the sqlOperator and sqlType groups:
+" echo OmniSyntaxList( ['sqlOperator', 'sqlType'] )
+"
+" A regular expression can also be used:
+" echo OmniSyntaxList( ['sql\w\+'] )
+"
+" From within a plugin, you would typically assign the output to a List: >
+" let myKeywords = []
+" let myKeywords = OmniSyntaxList( ['sqlKeyword'] )
function! OmniSyntaxList(...)
let list_parms = []
if a:0 > 0
@@ -244,37 +263,25 @@ function! OmniSyntaxList(...)
" let use_dictionary = a:1
" endif
- " Only display items in the completion window that are at least
- " this many characters in length
- if !exists('b:omni_syntax_use_iskeyword')
- if exists('g:omni_syntax_use_iskeyword')
- let b:omni_syntax_use_iskeyword = g:omni_syntax_use_iskeyword
- else
- let b:omni_syntax_use_iskeyword = 1
- endif
- endif
-
- " Only display items in the completion window that are at least
- " this many characters in length
- if !exists('b:omni_syntax_minimum_length')
- if exists('g:omni_syntax_minimum_length')
- let b:omni_syntax_minimum_length = g:omni_syntax_minimum_length
- else
- let b:omni_syntax_minimum_length = 0
- endif
- endif
-
let saveL = @l
let filetype = substitute(&filetype, '\.', '_', 'g')
if empty(list_parms)
+ " Allow user to override per buffer
+ if exists('g:omni_syntax_group_include_'.filetype)
+ let l:omni_syntax_group_include_{filetype} = g:omni_syntax_group_include_{filetype}
+ endif
+ if exists('b:omni_syntax_group_include_'.filetype)
+ let l:omni_syntax_group_include_{filetype} = b:omni_syntax_group_include_{filetype}
+ endif
+
" Default the include group to include the requested syntax group
let syntax_group_include_{filetype} = ''
" Check if there are any overrides specified for this filetype
- if exists('g:omni_syntax_group_include_'.filetype)
+ if exists('l:omni_syntax_group_include_'.filetype)
let syntax_group_include_{filetype} =
- \ substitute( g:omni_syntax_group_include_{filetype},'\s\+','','g')
- let list_parms = split(g:omni_syntax_group_include_{filetype}, ',')
+ \ substitute( l:omni_syntax_group_include_{filetype},'\s\+','','g')
+ let list_parms = split(l:omni_syntax_group_include_{filetype}, ',')
if syntax_group_include_{filetype} =~ '\w'
let syntax_group_include_{filetype} =
\ substitute( syntax_group_include_{filetype},
@@ -329,11 +336,20 @@ function! OmniSyntaxList(...)
else
" Default the exclude group to nothing
let syntax_group_exclude_{filetype} = ''
- " Check if there are any overrides specified for this filetype
+
+ " Allow user to override per buffer
if exists('g:omni_syntax_group_exclude_'.filetype)
+ let l:omni_syntax_group_exclude_{filetype} = g:omni_syntax_group_exclude_{filetype}
+ endif
+ if exists('b:omni_syntax_group_exclude_'.filetype)
+ let l:omni_syntax_group_exclude_{filetype} = b:omni_syntax_group_exclude_{filetype}
+ endif
+
+ " Check if there are any overrides specified for this filetype
+ if exists('l:omni_syntax_group_exclude_'.filetype)
let syntax_group_exclude_{filetype} =
- \ substitute( g:omni_syntax_group_exclude_{filetype},'\s\+','','g')
- let list_exclude_groups = split(g:omni_syntax_group_exclude_{filetype}, ',')
+ \ substitute( l:omni_syntax_group_exclude_{filetype},'\s\+','','g')
+ let list_exclude_groups = split(l:omni_syntax_group_exclude_{filetype}, ',')
if syntax_group_exclude_{filetype} =~ '\w'
let syntax_group_exclude_{filetype} =
\ substitute( syntax_group_exclude_{filetype},
@@ -529,6 +545,30 @@ endfunction
function! s:SyntaxCSyntaxGroupItems( group_name, syntax_full )
+ " Allow user to override iskeyword per buffer
+ let l:omni_syntax_use_iskeyword = g:omni_syntax_use_iskeyword
+ if exists('b:omni_syntax_use_iskeyword')
+ let l:omni_syntax_use_iskeyword = b:omni_syntax_use_iskeyword
+ endif
+
+ " Allow user to override iskeyword_numeric per buffer
+ let l:omni_syntax_use_iskeyword_numeric = g:omni_syntax_use_iskeyword_numeric
+ if exists('b:omni_syntax_use_iskeyword_numeric')
+ let l:omni_syntax_use_iskeyword_numeric = b:omni_syntax_use_iskeyword_numeric
+ endif
+
+ " Allow user to override iskeyword_numeric per buffer
+ let l:omni_syntax_use_single_byte = g:omni_syntax_use_single_byte
+ if exists('b:omni_syntax_use_single_byte')
+ let l:omni_syntax_use_single_byte = b:omni_syntax_use_single_byte
+ endif
+
+ " Allow user to override minimum_length per buffer
+ let l:omni_syntax_minimum_length = g:omni_syntax_minimum_length
+ if exists('b:omni_syntax_minimum_length')
+ let l:omni_syntax_minimum_length = b:omni_syntax_minimum_length
+ endif
+
let syn_list = ""
" From the full syntax listing, strip out the portion for the
@@ -647,14 +687,23 @@ function! s:SyntaxCSyntaxGroupItems( group_name, syntax_full )
\ syn_list, '\%(^\|\n\)\@<=\s*\(@\w\+\)'
\ , "", 'g'
\ )
-
- if b:omni_syntax_use_iskeyword == 0
+
+ if l:omni_syntax_use_iskeyword == 0
" There are a number of items which have non-word characters in
" them, *'T_F1'*. vim.vim is one such file.
" This will replace non-word characters with spaces.
+ " setlocal filetype=forth
+ " let g:omni_syntax_use_iskeyword = 1
+ " let g:omni_syntax_use_iskeyword_numeric = 1
+ " You will see entries like
+ " #>>
+ " (.local)
+ " These were found doing a grep in vim82\syntax
+ " grep iskeyword *
+ " forth.vim:setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
let syn_list = substitute( syn_list, '[^0-9A-Za-z_ ]', ' ', 'g' )
else
- if g:omni_syntax_use_iskeyword_numeric == 1
+ if l:omni_syntax_use_iskeyword_numeric == 1
" iskeyword can contain value like this
" 38,42,43,45,47-58,60-62,64-90,97-122,_,+,-,*,/,%,<,=,>,:,$,?,!,@-@,94
" Numeric values convert to their ASCII equivalent using the
@@ -674,7 +723,7 @@ function! s:SyntaxCSyntaxGroupItems( group_name, syntax_full )
" cycle through each character within the range
let [b:start, b:end] = split(item, '-')
for range_item in range( b:start, b:end )
- if range_item <= 127 || g:omni_syntax_use_single_byte == 0
+ if range_item <= 127 || l:omni_syntax_use_single_byte == 0
if nr2char(range_item) =~ '\p'
let accepted_chars = accepted_chars . nr2char(range_item)
endif
@@ -682,13 +731,13 @@ function! s:SyntaxCSyntaxGroupItems( group_name, syntax_full )
endfor
elseif item =~ '^\d\+$'
" Only numeric, translate to a character
- if item < 127 || g:omni_syntax_use_single_byte == 0
+ if item < 127 || l:omni_syntax_use_single_byte == 0
if nr2char(item) =~ '\p'
let accepted_chars = accepted_chars . nr2char(item)
endif
endif
else
- if char2nr(item) < 127 || g:omni_syntax_use_single_byte == 0
+ if char2nr(item) < 127 || l:omni_syntax_use_single_byte == 0
if item =~ '\p'
let accepted_chars = accepted_chars . item
endif
@@ -724,9 +773,9 @@ function! s:SyntaxCSyntaxGroupItems( group_name, syntax_full )
endif
endif
- if b:omni_syntax_minimum_length > 0
+ if l:omni_syntax_minimum_length > 0
" If the user specified a minimum length, enforce it
- let syn_list = substitute(' '.syn_list.' ', ' \S\{,'.b:omni_syntax_minimum_length.'}\ze ', ' ', 'g')
+ let syn_list = substitute(' '.syn_list.' ', ' \S\{,'.l:omni_syntax_minimum_length.'}\ze ', ' ', 'g')
endif
else
let syn_list = ''
@@ -756,5 +805,6 @@ function! OmniSyntaxShowChars(spec)
endfor
return join(map(result, 'nr2char(v:val)'), ', ')
endfunction
+
let &cpo = s:cpo_save
unlet s:cpo_save