# HG changeset patch # User Bram Moolenaar # Date 1619969405 -7200 # Node ID e3ec2ec8841aaa4b122f597925f90104f26754d4 # Parent 3671ff322103406d1ab756c418cfccf04e5a73ce Update runtime files Commit: https://github.com/vim/vim/commit/4c295027a426986566cd7a76c47a6d3a529727e7 Author: Bram Moolenaar Date: Sun May 2 17:19:11 2021 +0200 Update runtime files diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -78,6 +78,7 @@ runtime/ftplugin/css.vim @dkearns runtime/ftplugin/cucumber.vim @tpope runtime/ftplugin/eiffel.vim @dkearns runtime/ftplugin/eruby.vim @tpope @dkearns +runtime/ftplugin/fpcmake.vim @dkearns runtime/ftplugin/freebasic.vim @dkearns runtime/ftplugin/git.vim @tpope runtime/ftplugin/gitcommit.vim @tpope @@ -98,6 +99,7 @@ runtime/ftplugin/matlab.vim @cecamp runtime/ftplugin/modula3.vim @dkearns runtime/ftplugin/nroff.vim @a-vrma runtime/ftplugin/nsis.vim @k-takata +runtime/ftplugin/pascal.vim @dkearns runtime/ftplugin/pdf.vim @tpope runtime/ftplugin/ps1.vim @heaths runtime/ftplugin/ps1xml.vim @heaths @@ -157,6 +159,7 @@ runtime/syntax/dtd.vim @chrisbra runtime/syntax/elmfilt.vim @cecamp runtime/syntax/eruby.vim @tpope @dkearns runtime/syntax/exports.vim @cecamp +runtime/syntax/fpcmake.vim @dkearns runtime/syntax/git.vim @tpope runtime/syntax/gitcommit.vim @tpope runtime/syntax/gitconfig.vim @tpope @@ -181,6 +184,7 @@ runtime/syntax/modula3.vim @dkearns runtime/syntax/netrw.vim @cecamp runtime/syntax/nroff.vim @jmarshall runtime/syntax/nsis.vim @k-takata +runtime/syntax/pascal.vim @dkearns runtime/syntax/pdf.vim @tpope runtime/syntax/php.vim @TysonAndre runtime/syntax/privoxy.vim @dkearns diff --git a/nsis/lang/english.nsi b/nsis/lang/english.nsi --- a/nsis/lang/english.nsi +++ b/nsis/lang/english.nsi @@ -24,7 +24,7 @@ LangString ^UninstallCaption ${LANG_ENGL # "Destination Folder (Must end with $\"vim$\")" LangString str_show_readme ${LANG_ENGLISH} \ - "Show README after installation finish" + "Show README after installation finished" # Install types: LangString str_type_typical ${LANG_ENGLISH} \ diff --git a/runtime/autoload/syntaxcomplete.vim b/runtime/autoload/syntaxcomplete.vim --- 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 -" 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(findst 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(findst 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} = '' + + " 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('g:omni_syntax_group_exclude_'.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( gro \ 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( gro " 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( gro 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( gro 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 diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -1,4 +1,4 @@ -*autocmd.txt* For Vim version 8.2. Last change: 2021 Mar 13 +*autocmd.txt* For Vim version 8.2. Last change: 2021 Apr 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1522,7 +1522,14 @@ option will not cause any commands to be loaded buffer. The current buffer is done last. Note that [fname] is used to select the autocommands, - not the buffers to which they are applied. + not the buffers to which they are applied. Example: > + augroup mine + autocmd! + autocmd FileType * echo expand('') + augroup END + doautoall mine FileType Loaded-Buffer +< Sourcing this script, you'll see as many + "Loaded-Buffer" echoed as there are loaded buffers. Careful: Don't use this for autocommands that delete a buffer, change to another buffer or change the diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 8.2. Last change: 2021 Apr 07 +*eval.txt* For Vim version 8.2. Last change: 2021 Apr 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1962,6 +1962,9 @@ v:fcs_choice What should happen after a The default is empty. If another (invalid) value is used then Vim behaves like it is empty, there is no warning message. + *v:fname* *fname-variable* +v:fname The file name set by 'includeexpr'. Empty otherwise. + *v:fname_in* *fname_in-variable* v:fname_in The name of the input file. Valid while evaluating: option used for ~ @@ -5775,7 +5778,6 @@ getmousepos() *getmousepos()* If the mouse is over a popup window then that window is used. - When using |getchar()| the Vim variables |v:mouse_lnum|, |v:mouse_col| and |v:mouse_winid| also provide these values. @@ -6721,6 +6723,7 @@ islocked({expr}) *islocked()* *E786* < When {expr} is a variable that does not exist you get an error message. Use |exists()| to check for existence. + In Vim9 script it does not work for local variables. Can also be used as a |method|: > GetName()->islocked() diff --git a/runtime/doc/gui.txt b/runtime/doc/gui.txt --- a/runtime/doc/gui.txt +++ b/runtime/doc/gui.txt @@ -1,4 +1,4 @@ -*gui.txt* For Vim version 8.2. Last change: 2020 Sep 28 +*gui.txt* For Vim version 8.2. Last change: 2021 May 01 VIM REFERENCE MANUAL by Bram Moolenaar @@ -620,6 +620,11 @@ expression register: > :amenu Insert.foobar "='foobar'P +The special text begins a "command menu", it executes the command +directly without changing modes. Where you might use ":..." you can +instead use "...". See || for more info. Example: > + anoremenu File.Next next + Note that the '<' and 'k' flags in 'cpoptions' also apply here (when included they make the <> form and raw key codes not being recognized). diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt --- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1,4 +1,4 @@ -*index.txt* For Vim version 8.2. Last change: 2021 Mar 22 +*index.txt* For Vim version 8.2. Last change: 2021 Apr 24 VIM REFERENCE MANUAL by Bram Moolenaar diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -1,4 +1,4 @@ -*map.txt* For Vim version 8.2. Last change: 2021 Mar 17 +*map.txt* For Vim version 8.2. Last change: 2021 Apr 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -244,9 +244,12 @@ have a look at |maparg()|. If the first argument to one of these commands is "" and it is used to define a new mapping or abbreviation, the argument is an expression. The expression is evaluated to obtain the {rhs} that is used. Example: > - :inoremap . InsertDot() -The result of the InsertDot() function will be inserted. It could check the + :inoremap . InsertDot() +The result of the s:InsertDot() function will be inserted. It could check the text before the cursor and start omni completion when some condition is met. +Using a script-local function is preferred, to avoid polluting the global +namespace. Use in the RHS so that the script that the mapping was +defined in can be found. For abbreviations |v:char| is set to the character that was typed to trigger the abbreviation. You can use this to decide how to expand the {lhs}. You @@ -261,7 +264,7 @@ input. Example: > call popup_create(... arguments ...) return "\" endfunc - nnoremap OpenPopup() + nnoremap OpenPopup() Also, keep in mind that the expression may be evaluated when looking for typeahead, before the previous command has been executed. For example: > diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 8.2. Last change: 2021 Apr 17 +*options.txt* For Vim version 8.2. Last change: 2021 Apr 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -4564,7 +4564,8 @@ A jump table for the options with a shor Keywords are used in searching and recognizing with many commands: "w", "*", "[i", etc. It is also used for "\k" in a |pattern|. See 'isfname' for a description of the format of this option. For '@' - characters above 255 check the "word" character class. + characters above 255 check the "word" character class (any character + that is not white space or punctuation). For C programs you could use "a-z,A-Z,48-57,_,.,-,>". For a help file it is set to all non-blank printable characters except '*', '"' and '|' (so that CTRL-] on a command finds the help for that diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt --- a/runtime/doc/quickfix.txt +++ b/runtime/doc/quickfix.txt @@ -1,4 +1,4 @@ -*quickfix.txt* For Vim version 8.2. Last change: 2021 Feb 05 +*quickfix.txt* For Vim version 8.2. Last change: 2021 Apr 30 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1013,8 +1013,6 @@ 5.1 using Vim's internal grep the error list to the matches. Files matching 'wildignore' are ignored; files in 'suffixes' are searched last. - Without the 'g' flag each line is added only once. - With 'g' every match is added. {pattern} is a Vim search pattern. Instead of enclosing it in / any non-ID character (see @@ -1026,6 +1024,22 @@ 5.1 using Vim's internal grep If {pattern} is empty (e.g. // is specified), the last used search pattern is used. |last-pattern| + Flags: + 'g' Without the 'g' flag each line is added only + once. With 'g' every match is added. + + 'j' Without the 'j' flag Vim jumps to the first + match. With 'j' only the quickfix list is + updated. With the [!] any changes in the current + buffer are abandoned. + + 'f' When the 'f' flag is specified, fuzzy string + matching is used to find matching lines. In this + case, {pattern} is treated as a literal string + instead of a regular expression. See + |matchfuzzy()| for more info about fuzzy + matching. + |QuickFixCmdPre| and |QuickFixCmdPost| are triggered. A file that is opened for matching may use a buffer number, but it is reused if possible to avoid @@ -1038,11 +1052,6 @@ 5.1 using Vim's internal grep Useful if you only want to check if there is a match and quit quickly when it's found. - Without the 'j' flag Vim jumps to the first match. - With 'j' only the quickfix list is updated. - With the [!] any changes in the current buffer are - abandoned. - Every second or so the searched file name is displayed to give you an idea of the progress made. Examples: > diff --git a/runtime/doc/tags b/runtime/doc/tags --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -2630,6 +2630,8 @@ 90.5 usr_90.txt /*90.5* :left change.txt /*:left* :lefta windows.txt /*:lefta* :leftabove windows.txt /*:leftabove* +:leg vim9.txt /*:leg* +:legacy vim9.txt /*:legacy* :let eval.txt /*:let* :let%= eval.txt /*:let%=* :let+= eval.txt /*:let+=* @@ -6439,6 +6441,7 @@ floating-point-format eval.txt /*floatin floating-point-precision eval.txt /*floating-point-precision* floor() eval.txt /*floor()* fmod() eval.txt /*fmod()* +fname-variable eval.txt /*fname-variable* fname_diff-variable eval.txt /*fname_diff-variable* fname_in-variable eval.txt /*fname_in-variable* fname_new-variable eval.txt /*fname_new-variable* @@ -9875,6 +9878,7 @@ v:exiting eval.txt /*v:exiting* v:false eval.txt /*v:false* v:fcs_choice eval.txt /*v:fcs_choice* v:fcs_reason eval.txt /*v:fcs_reason* +v:fname eval.txt /*v:fname* v:fname_diff eval.txt /*v:fname_diff* v:fname_in eval.txt /*v:fname_in* v:fname_new eval.txt /*v:fname_new* diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 8.2. Last change: 2021 Apr 21 +*todo.txt* For Vim version 8.2. Last change: 2021 Apr 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -39,13 +39,6 @@ browser use: https://github.com/vim/vim/ -------------------- Known bugs and current work ----------------------- Vim9 - Make everything work: -- Compile builtin functions that access local variables: - islocked() -- When evaluating constants for script variables, some functions could work: - has('asdf'), len('string') - eval_variable(). Should pass the ".xxx" that follows and return that. -- Make "++nr" work. "++g:count" doesn't work, thinks it is a range. -- Reload: How to make sure type of script function hasn't changed? - expandcmd() with `=expr` in filename uses legacy expression. - eval_expr() in ex_cexpr() - eval_expr() call in dbg_parsearg() and debuggy_find() @@ -64,6 +57,17 @@ Vim9 - Make everything work: the type of the list or dict member. (#8092) - Allow for using an autoload function name without quotes. It is then loaded (and compiled) right away. #8124 +- Test more expressions in legacy and Vim9 script, using + CheckLegacyAndVim9Success() +- Test try/catch and throw better, also nested. + Test that return inside try/finally jumps to finally and then returns. +- Test that a function defined inside a :def function is local to that + function, g: functions can be defined and script-local functions cannot be + defined. +- Make debugging work - at least per function. Need to recompile a function + to step through it line-by-line? Evaluate the stack and variables on the + stack? +- Reserve command for future use: :type, :class, :enum Once Vim9 is stable: - Change the help to prefer Vim9 syntax where appropriate @@ -73,34 +77,17 @@ Once Vim9 is stable: - Use Vim9 for runtime files. PR #7497 for autoload/ccomplete.vim -Also for Vim9: +Further Vim9 improvements, possibly after launch: - better implementation for partial and tests for that. -- Make "g:imported = Export.exported" work in Vim9 script. -- Make Foo.Bar() work to call the dict function. (#5676) -- Error in any command in "vim9script" aborts sourcing. -- Find a way to test expressions in legacy and Vim9 script without duplication -- Test try/catch and throw better, also nested. - Test that return inside try/finally jumps to finally and then returns. -- Test that a function defined inside a :def function is local to that - function, g: functions can be defined and script-local functions cannot be - defined. -- compile options that are an expression, e.g. "expr:" in 'spellsuggest', +- Compile options that are an expression, e.g. "expr:" in 'spellsuggest', 'foldexpr', 'foldtext', 'printexpr', 'diffexpr', 'patchexpr', 'charconvert', 'balloonexpr', 'includeexpr', 'indentexpr', 'formatexpr'. Give an error if compilation fails. (#7625) Use the location where the option was set for deciding whether it's to be evaluated in Vim9 script context. -- implement :type; import type declaration. -- implement enum; import enum. +- implement :type, import type declaration. +- implement enum, import enum. - Future work: See |vim9-classes| - Define the keywords and commands to make sure it will be backwards - compatible. -- Make debugging work - at least per function. Need to recompile a function - to step through it line-by-line? Evaluate the stack and variables on the - stack? -- List commands when 'verbose' is set or :verbose is used. - -Further Vim9 improvements, possibly after launch: - For range: make table of first ASCII character with flag to quickly check if it can be a Vim9 command. E.g. "+" can, but "." can't. - compile get_lambda_tv() in popup_add_timeout() @@ -108,6 +95,9 @@ Further Vim9 improvements, possibly afte - Make accessing varargs faster: arg[expr] EVAL expr LOADVARARG (varargs idx) +- When evaluating constants for script variables, some functions could work: + has(featureName), len(someString) +- Implement as part of an expression: ++expr, --expr, expr++, expr--. Popup windows: @@ -1404,9 +1394,6 @@ Patch to make tests pass with EBCDIC. (O Add ":read :command", to insert the output of an Ex command? Can already do it with ":$put =execute('command')". -When repeating the 'confirm' dialog one needs to press Enter. (ds26gte, 2016 -Apr 17) #762 - exists(":tearoff") does not tell you if the command is implemented. (Tony Mechelynck) Perhaps use exists("::tearoff") to check? diff --git a/runtime/doc/usr_02.txt b/runtime/doc/usr_02.txt --- a/runtime/doc/usr_02.txt +++ b/runtime/doc/usr_02.txt @@ -1,4 +1,4 @@ -*usr_02.txt* For Vim version 8.2. Last change: 2019 Nov 21 +*usr_02.txt* For Vim version 8.2. Last change: 2021 Apr 24 VIM USER MANUAL - by Bram Moolenaar @@ -532,7 +532,7 @@ 3) Options are enclosed in single apostr < for the corresponding flag of the 'cpoptions' settings, substitute by a specific flag, e.g.: > :help cpo-; -< And for the guioption flags: > +< And for the 'guioptions' flags: > :help go- 4) Normal mode commands do not have a prefix. To go to the help page for the diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -1,4 +1,4 @@ -*vim9.txt* For Vim version 8.2. Last change: 2021 Apr 11 +*vim9.txt* For Vim version 8.2. Last change: 2021 Apr 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -157,6 +157,11 @@ Compilation is done when any of these is *E1091* If compilation fails it is not tried again on the next call, instead this error is given: "E1091: Function is not compiled: {name}". +Compilation will fail when encountering a user command that has not been +created yet. In this case you can call `execute()` to invoke it at runtime. > + def MyFunc() + execute('DefinedLater') + enddef `:def` has no options like `:function` does: "range", "abort", "dict" or "closure". A `:def` function always aborts on an error (unless `:silent!` was @@ -605,6 +610,44 @@ Notes: echo [1, 2] [3, 4] + +White space ~ + +Vim9 script enforces proper use of white space. This is no longer allowed: > + var name=234 # Error! + var name= 234 # Error! + var name =234 # Error! +There must be white space before and after the "=": > + var name = 234 # OK +White space must also be put before the # that starts a comment after a +command: > + var name = 234# Error! + var name = 234 # OK + +White space is required around most operators. + +White space is required in a sublist (list slice) around the ":", except at +the start and end: > + otherlist = mylist[v : count] # v:count has a different meaning + otherlist = mylist[:] # make a copy of the List + otherlist = mylist[v :] + otherlist = mylist[: v] + +White space is not allowed: +- Between a function name and the "(": > + Func (arg) # Error! + Func + \ (arg) # Error! + Func + (arg) # Error! + Func(arg) # OK + Func( + arg) # OK + Func( + arg # OK + ) + + No curly braces expansion ~ |curly-braces-names| cannot be used. @@ -656,6 +699,17 @@ Comparators ~ The 'ignorecase' option is not used for comparators that use strings. +Abort after error ~ + +In legacy script, when an error is encountered, Vim continues to execute +following lines. This can lead to a long sequence of errors and need to type +CTRL-C to stop it. In Vim9 script execution of commands stops at the first +error. Example: > + vim9script + var x = does-not-exist + echo 'not executed' + + For loop ~ Legacy Vim script has some tricks to make a for loop over a list handle @@ -679,43 +733,6 @@ Generally, you should not change the lis first if needed. -White space ~ - -Vim9 script enforces proper use of white space. This is no longer allowed: > - var name=234 # Error! - var name= 234 # Error! - var name =234 # Error! -There must be white space before and after the "=": > - var name = 234 # OK -White space must also be put before the # that starts a comment after a -command: > - var name = 234# Error! - var name = 234 # OK - -White space is required around most operators. - -White space is required in a sublist (list slice) around the ":", except at -the start and end: > - otherlist = mylist[v : count] # v:count has a different meaning - otherlist = mylist[:] # make a copy of the List - otherlist = mylist[v :] - otherlist = mylist[: v] - -White space is not allowed: -- Between a function name and the "(": > - Func (arg) # Error! - Func - \ (arg) # Error! - Func - (arg) # Error! - Func(arg) # OK - Func( - arg) # OK - Func( - arg # OK - ) - - Conditions and expressions ~ Conditions and expressions are mostly working like they do in other languages. diff --git a/runtime/ftplugin/fpcmake.vim b/runtime/ftplugin/fpcmake.vim new file mode 100644 --- /dev/null +++ b/runtime/ftplugin/fpcmake.vim @@ -0,0 +1,25 @@ +" Vim filetype plugin file +" Language: Free Pascal Makefile Generator +" Maintainer: Doug Kearns +" Last Change: 2021 Apr 23 + +if exists("b:did_ftplugin") + finish +endif + +let s:cpo_save = &cpo +set cpo&vim + +runtime! ftplugin/make.vim + +if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") + let b:browsefilter = "Free Pascal Makefile Definition Files (*.fpc)\t*.fpc\n" .. + \ "All Files (*.*)\t*.*\n" +endif + +let b:undo_ftplugin = b:undo_ftplugin .. " | unlet! b:browsefilter" + +let &cpo = s:cpo_save +unlet s:cpo_save + +" vim: nowrap sw=2 sts=2 ts=8 noet: diff --git a/runtime/ftplugin/pascal.vim b/runtime/ftplugin/pascal.vim --- a/runtime/ftplugin/pascal.vim +++ b/runtime/ftplugin/pascal.vim @@ -1,20 +1,50 @@ " Vim filetype plugin file -" Language: pascal -" Maintainer: Dan Sharp -" Last Changed: 11 Apr 2011 -" URL: http://dwsharp.users.sourceforge.net/vim/ftplugin +" Language: Pascal +" Maintainer: Doug Kearns +" Previous Maintainer: Dan Sharp +" Last Change: 2021 Apr 23 if exists("b:did_ftplugin") | finish | endif let b:did_ftplugin = 1 -if exists("loaded_matchit") - let b:match_ignorecase = 1 " (pascal is case-insensitive) +let s:cpo_save = &cpo +set cpo&vim + +set comments=s:(*,m:\ ,e:*),s:{,m:\ ,e:} +set commentstring={%s} - let b:match_words = '\<\%(begin\|case\|record\|object\|try\)\>' - let b:match_words .= ':\<^\s*\%(except\|finally\)\>:\' - let b:match_words .= ',\:\' - let b:match_words .= ',\:\' +if exists("pascal_delphi") + set comments+=:/// +endif + +if !exists("pascal_traditional") + set commentstring=//\ %s + set comments+=:// endif -" Undo the stuff we changed. -let b:undo_ftplugin = "unlet! b:match_words" +setlocal formatoptions-=t formatoptions+=croql + +if exists("loaded_matchit") + let b:match_ignorecase = 1 " (Pascal is case-insensitive) + + let b:match_words = '\<\%(asm\|begin\|case\|\%(\%(=\|packed\)\s*\)\@<=\%(class\|object\)\|\%(=\s*\)\@<=interface\|record\|try\)\>' + let b:match_words .= ':\%(^\s*\)\@<=\%(except\|finally\|else\|otherwise\)\>' + let b:match_words .= ':\\.\@!' + + let b:match_words .= ',\:\' + " let b:match_words .= ',\:\' " FIXME - else clashing with middle else. It seems like a debatable use anyway. + let b:match_words .= ',\:\<\%(\%(^\s*\)\@<=interface\|implementation\|initialization\|finalization\)\>:\ -" Last Change: 2005 Jun 20 +" Last Change: 2021 May 01 " Quit when a (custom) syntax file was already loaded if exists("b:current_syntax") @@ -10,8 +10,8 @@ endif syn keyword confTodo contained TODO FIXME XXX " Avoid matching "text#text", used in /etc/disktab and /etc/gettytab -syn match confComment "^#.*" contains=confTodo -syn match confComment "\s#.*"ms=s+1 contains=confTodo +syn match confComment "^#.*" contains=confTodo,@Spell +syn match confComment "\s#.*"ms=s+1 contains=confTodo,@Spell syn region confString start=+"+ skip=+\\\\\|\\"+ end=+"+ oneline syn region confString start=+'+ skip=+\\\\\|\\'+ end=+'+ oneline diff --git a/runtime/syntax/fpcmake.vim b/runtime/syntax/fpcmake.vim new file mode 100644 --- /dev/null +++ b/runtime/syntax/fpcmake.vim @@ -0,0 +1,58 @@ +" Vim syntax file +" Language: Free Pascal Makefile Definition Files +" Maintainer: Doug Kearns +" Last Change: 2021 Apr 23 + +if exists("b:current_syntax") + finish +endif + +runtime! syntax/make.vim + +" NOTE: using start-of-line anchored syn-match groups is simpler than other +" alternatives when interacting with the sourced make.vim syntax groups + +" Sections +syn region fpcmakeSection matchgroup=fpcmakeSectionDelimiter start="^\s*\[" end="]" contains=fpcmakeSectionName + +syn keyword fpcmakeSectionName contained clean compiler default dist install +syn keyword fpcmakeSectionName contained lib package prerules require rules +syn keyword fpcmakeSectionName contained shared target + +" [clean] +syn match fpcmakeRule "^\s*\(units\|files\)\>" +" [compiler] +syn match fpcmakeRule "^\s*\(options\|version\|unitdir\|librarydir\|objectdir\)\>" +syn match fpcmakeRule "^\s*\(targetdir\|sourcedir\|unittargetdir\|includedir\)\>" +" [default] +syn match fpcmakeRule "^\s*\(cpu\|dir\|fpcdir\|rule\|target\)\>" +" [dist] +syn match fpcmakeRule "^\s*\(destdir\|zipname\|ziptarget\)\>" +" [install] +syn match fpcmakeRule "^\s*\(basedir\|datadir\|fpcpackage\|files\|prefix\)\>" +syn match fpcmakeRule "^\s*\(units\)\>" +" [package] +syn match fpcmakeRule "^\s*\(name\|version\|main\)\>" +" [requires] +syn match fpcmakeRule "^\s*\(fpcmake\|packages\|libc\|nortl\|unitdir\)\>" +syn match fpcmakeRule "^\s*\(packagedir\|tools\)\>" +" [shared] +syn match fpcmakeRule "^\s*\(build\|libname\|libversion\|libunits\)\>" +" [target] +syn match fpcmakeRule "^\s*\(dirs\|exampledirs\|examples\|loaders\|programs\)\>" +syn match fpcmakeRule "^\s*\(rsts\|units\)\>" + +" Comments +syn keyword fpcmakeTodo TODO FIXME XXX contained +syn match fpcmakeComment "#.*" contains=fpcmakeTodo,@Spell + +" Default highlighting +hi def link fpcmakeSectionDelimiter Delimiter +hi def link fpcmakeSectionName Type +hi def link fpcmakeComment Comment +hi def link fpcmakeTodo Todo +hi def link fpcmakeRule Identifier + +let b:current_syntax = "fpcmake" + +" vim: nowrap sw=2 sts=2 ts=8 noet: diff --git a/runtime/syntax/pascal.vim b/runtime/syntax/pascal.vim --- a/runtime/syntax/pascal.vim +++ b/runtime/syntax/pascal.vim @@ -1,16 +1,16 @@ " Vim syntax file -" Language: Pascal -" Version: 2.8 -" Last Change: 2004/10/17 17:47:30 -" Maintainer: Xavier Crégut -" Previous Maintainer: Mario Eusebio +" Language: Pascal +" Maintainer: Doug Kearns +" Previous Maintainers: Xavier Crégut +" Mario Eusebio +" Last Change: 2021 Apr 23 " Contributors: Tim Chase , -" Stas Grabois , -" Mazen NEIFER , -" Klaus Hast , -" Austin Ziegler , -" Markus Koenig +" Stas Grabois , +" Mazen NEIFER , +" Klaus Hast , +" Austin Ziegler , +" Markus Koenig " quit when a syntax file was already loaded if exists("b:current_syntax") @@ -25,10 +25,10 @@ syn keyword pascalBoolean true false syn keyword pascalConditional if else then syn keyword pascalConstant nil maxint syn keyword pascalLabel case goto label -syn keyword pascalOperator and div downto in mod not of or packed with +syn keyword pascalOperator and div downto in mod not of or packed syn keyword pascalRepeat do for do repeat while to until syn keyword pascalStatement procedure function -syn keyword pascalStatement program begin end const var type +syn keyword pascalStatement program begin end const var type with syn keyword pascalStruct record syn keyword pascalType array boolean char integer file pointer real set syn keyword pascalType string text variant @@ -40,12 +40,12 @@ syn keyword pascalTodo contained TODO FI " 20010723az: When wanted, highlight the trailing whitespace -- this is " based on c_space_errors; to enable, use "pascal_space_errors". if exists("pascal_space_errors") - if !exists("pascal_no_trail_space_error") - syn match pascalSpaceError "\s\+$" - endif - if !exists("pascal_no_tab_space_error") - syn match pascalSpaceError " \+\t"me=e-1 - endif + if !exists("pascal_no_trail_space_error") + syn match pascalSpaceError "\s\+$" + endif + if !exists("pascal_no_tab_space_error") + syn match pascalSpaceError " \+\t"me=e-1 + endif endif @@ -98,9 +98,24 @@ if exists("pascal_symbol_operator") endif syn match pascalNumber "-\=\<\d\+\>" +if !exists("pascal_traditional") + syn match pascalHexNumber "\$\x\+\>" +endif +if exists("pascal_fpc") + syn match pascalOctNumber "&\o\+\>" + syn match pascalBinNumber "%[01]\+\>" +endif +if exists("pascal_gpc") + syn match pascalExtendedNumber "\%([2-9]\|[12]\d\|3[0-6]\)#[[:alnum:]]\+\>" +endif + syn match pascalFloat "-\=\<\d\+\.\d\+\>" syn match pascalFloat "-\=\<\d\+\.\d\+[eE]-\=\d\+\>" -syn match pascalHexNumber "\$[0-9a-fA-F]\+\>" + +if !exists("pascal_traditional") + " allow leading zeros + syn match pascalControlCharacter "#\%([01]\=\d\=\d\|2[0-4]\d\|25[0-5]\)\>" +endif if exists("pascal_no_tabs") syn match pascalShowTab "\t" @@ -142,7 +157,7 @@ if !exists("pascal_traditional") syn keyword pascalStatement interface unit uses syn keyword pascalModifier absolute assembler external far forward inline syn keyword pascalModifier interrupt near virtual - syn keyword pascalAcces private public + syn keyword pascalAccess private public strict syn keyword pascalStruct object syn keyword pascalOperator shl shr xor @@ -157,6 +172,7 @@ if !exists("pascal_traditional") syn keyword pascalType Single Double Extended Comp syn keyword pascalType PChar + syn keyword pascalPredefined self if !exists ("pascal_fpc") syn keyword pascalPredefined Result @@ -166,11 +182,11 @@ if !exists("pascal_traditional") syn region pascalComment start="//" end="$" contains=pascalTodo,pascalSpaceError syn keyword pascalStatement fail otherwise operator syn keyword pascalDirective popstack - syn keyword pascalPredefined self syn keyword pascalType ShortString AnsiString WideString endif if exists("pascal_gpc") + syn region pascalComment start="//" end="$" contains=pascalTodo,pascalSpaceError syn keyword pascalType SmallInt syn keyword pascalType AnsiChar syn keyword pascalType PAnsiChar @@ -178,6 +194,8 @@ if !exists("pascal_traditional") if exists("pascal_delphi") syn region pascalComment start="//" end="$" contains=pascalTodo,pascalSpaceError + syn region pascalDocumentation start="///" end="$" contains=pascalTodo,pascalSpaceError + syn region pascalDocumentation start="{!" end="}" contains=pascalTodo,pascalSpaceError syn keyword pascalType SmallInt Int64 syn keyword pascalType Real48 Currency syn keyword pascalType AnsiChar WideChar @@ -192,11 +210,11 @@ if !exists("pascal_traditional") syn keyword pascalStatement initialization finalization uses exports syn keyword pascalStatement property out resourcestring threadvar syn keyword pascalModifier contains - syn keyword pascalModifier overridden reintroduce abstract + syn keyword pascalModifier overridden reintroduce abstract sealed syn keyword pascalModifier override export dynamic name message syn keyword pascalModifier dispid index stored default nodefault readonly syn keyword pascalModifier writeonly implements overload requires resident - syn keyword pascalAcces protected published automated + syn keyword pascalAccess protected published automated syn keyword pascalDirective register pascal cvar cdecl stdcall safecall syn keyword pascalOperator as is endif @@ -319,37 +337,43 @@ endif " Define the default highlighting. " Only when an item doesn't have highlighting yet -hi def link pascalAcces pascalStatement +hi def link pascalAccess pascalStatement hi def link pascalBoolean Boolean hi def link pascalComment Comment -hi def link pascalConditional Conditional +hi def link pascalDocumentation Comment +hi def link pascalConditional Conditional hi def link pascalConstant Constant -hi def link pascalDelimiter Identifier -hi def link pascalDirective pascalStatement -hi def link pascalException Exception -hi def link pascalFloat Float +hi def link pascalControlCharacter Character +hi def link pascalDelimiter Identifier +hi def link pascalDirective pascalStatement +hi def link pascalException Exception +hi def link pascalFloat Float hi def link pascalFunction Function -hi def link pascalLabel Label +hi def link pascalLabel Label hi def link pascalMatrixDelimiter Identifier hi def link pascalModifier Type hi def link pascalNumber Number +hi def link pascalExtendedNumber Number +hi def link pascalBinNumber pascalNumber +hi def link pascalHexNumber pascalNumber +hi def link pascalOctNumber pascalNumber hi def link pascalOperator Operator -hi def link pascalPredefined pascalStatement +hi def link pascalPredefined pascalStatement hi def link pascalPreProc PreProc hi def link pascalRepeat Repeat -hi def link pascalSpaceError Error -hi def link pascalStatement Statement +hi def link pascalSpaceError Error +hi def link pascalStatement Statement hi def link pascalString String -hi def link pascalStringEscape Special +hi def link pascalStringEscape Special hi def link pascalStringEscapeGPC Special -hi def link pascalStringError Error +hi def link pascalStringError Error hi def link pascalStruct pascalStatement hi def link pascalSymbolOperator pascalOperator -hi def link pascalTodo Todo -hi def link pascalType Type -hi def link pascalUnclassified pascalStatement +hi def link pascalTodo Todo +hi def link pascalType Type +hi def link pascalUnclassified pascalStatement " hi def link pascalAsm Assembler -hi def link pascalError Error +hi def link pascalError Error hi def link pascalAsmKey pascalStatement hi def link pascalShowTab Error @@ -357,4 +381,4 @@ hi def link pascalShowTab Error let b:current_syntax = "pascal" -" vim: ts=8 sw=2 +" vim: nowrap sw=2 sts=2 ts=8 noet: