aboutsummaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorChristian Clason <c.clason@uni-graz.at>2022-12-08 16:33:38 +0100
committerGitHub <noreply@github.com>2022-12-08 16:33:38 +0100
commit35767769036671d5ce562f53cae574f9c66e4bb2 (patch)
tree5c2b943ea25ece5b25fd862f1daed4e125197ee3 /runtime
parent7b9ad45178fc2f53c4824ad42213c340bdd66ebf (diff)
downloadrneovim-35767769036671d5ce562f53cae574f9c66e4bb2.tar.gz
rneovim-35767769036671d5ce562f53cae574f9c66e4bb2.tar.bz2
rneovim-35767769036671d5ce562f53cae574f9c66e4bb2.zip
vim-patch:86b4816766d9 (#21314)
Update runtime files https://github.com/vim/vim/commit/86b4816766d976a7ecd4403eca1f8bf6b4105800 vim-patch:9.0.1029: autoload directory missing from distribution Problem: Autoload directory missing from distribution. Solution: Add the autoload/zig directory to the list of distributed files. https://github.com/vim/vim/commit/84dbf855fb2d883481f74ad0ccf3df3f8837e6bf Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat (limited to 'runtime')
-rw-r--r--runtime/autoload/zig/fmt.vim100
-rw-r--r--runtime/compiler/dotnet.vim39
-rw-r--r--runtime/compiler/zig.vim28
-rw-r--r--runtime/compiler/zig_build.vim29
-rw-r--r--runtime/compiler/zig_build_exe.vim27
-rw-r--r--runtime/compiler/zig_test.vim27
-rw-r--r--runtime/doc/fold.txt5
-rw-r--r--runtime/doc/map.txt4
-rw-r--r--runtime/doc/syntax.txt8
-rw-r--r--runtime/doc/windows.txt2
-rw-r--r--runtime/ftplugin/cs.vim5
-rw-r--r--runtime/ftplugin/vim.vim4
-rw-r--r--runtime/ftplugin/zig.vim66
-rw-r--r--runtime/indent/zig.vim80
-rw-r--r--runtime/menu.vim2
-rw-r--r--runtime/plugin/matchparen.vim2
-rw-r--r--runtime/syntax/cs.vim19
-rw-r--r--runtime/syntax/nix.vim210
-rw-r--r--runtime/syntax/rego.vim63
-rw-r--r--runtime/syntax/sh.vim51
-rw-r--r--runtime/syntax/wdl.vim41
-rw-r--r--runtime/syntax/zig.vim292
-rw-r--r--runtime/syntax/zir.vim49
23 files changed, 1096 insertions, 57 deletions
diff --git a/runtime/autoload/zig/fmt.vim b/runtime/autoload/zig/fmt.vim
new file mode 100644
index 0000000000..b78c1994dd
--- /dev/null
+++ b/runtime/autoload/zig/fmt.vim
@@ -0,0 +1,100 @@
+" Adapted from fatih/vim-go: autoload/go/fmt.vim
+"
+" Copyright 2011 The Go Authors. All rights reserved.
+" Use of this source code is governed by a BSD-style
+" license that can be found in the LICENSE file.
+"
+" Upstream: https://github.com/ziglang/zig.vim
+
+function! zig#fmt#Format() abort
+ " Save cursor position and many other things.
+ let view = winsaveview()
+
+ if !executable('zig')
+ echohl Error | echomsg "no zig binary found in PATH" | echohl None
+ return
+ endif
+
+ let cmdline = 'zig fmt --stdin --ast-check'
+ let current_buf = bufnr('')
+
+ " The formatted code is output on stdout, the errors go on stderr.
+ if exists('*systemlist')
+ silent let out = systemlist(cmdline, current_buf)
+ else
+ silent let out = split(system(cmdline, current_buf))
+ endif
+ if len(out) == 1
+ if out[0] == "error: unrecognized parameter: '--ast-check'"
+ let cmdline = 'zig fmt --stdin'
+ if exists('*systemlist')
+ silent let out = systemlist(cmdline, current_buf)
+ else
+ silent let out = split(system(cmdline, current_buf))
+ endif
+ endif
+ endif
+ let err = v:shell_error
+
+
+ if err == 0
+ " remove undo point caused via BufWritePre.
+ try | silent undojoin | catch | endtry
+
+ " Replace the file content with the formatted version.
+ if exists('*deletebufline')
+ call deletebufline(current_buf, len(out), line('$'))
+ else
+ silent execute ':' . len(out) . ',' . line('$') . ' delete _'
+ endif
+ call setline(1, out)
+
+ " No errors detected, close the loclist.
+ call setloclist(0, [], 'r')
+ lclose
+ elseif get(g:, 'zig_fmt_parse_errors', 1)
+ let errors = s:parse_errors(expand('%'), out)
+
+ call setloclist(0, [], 'r', {
+ \ 'title': 'Errors',
+ \ 'items': errors,
+ \ })
+
+ let max_win_height = get(g:, 'zig_fmt_max_window_height', 5)
+ " Prevent the loclist from becoming too long.
+ let win_height = min([max_win_height, len(errors)])
+ " Open the loclist, but only if there's at least one error to show.
+ execute 'silent! lwindow ' . win_height
+ endif
+
+ call winrestview(view)
+
+ if err != 0
+ echohl Error | echomsg "zig fmt returned error" | echohl None
+ return
+ endif
+
+ " Run the syntax highlighter on the updated content and recompute the folds if
+ " needed.
+ syntax sync fromstart
+endfunction
+
+" parse_errors parses the given errors and returns a list of parsed errors
+function! s:parse_errors(filename, lines) abort
+ " list of errors to be put into location list
+ let errors = []
+ for line in a:lines
+ let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)')
+ if !empty(tokens)
+ call add(errors,{
+ \"filename": a:filename,
+ \"lnum": tokens[2],
+ \"col": tokens[3],
+ \"text": tokens[4],
+ \ })
+ endif
+ endfor
+
+ return errors
+endfunction
+" vim: sw=2 ts=2 et
diff --git a/runtime/compiler/dotnet.vim b/runtime/compiler/dotnet.vim
new file mode 100644
index 0000000000..ac64084663
--- /dev/null
+++ b/runtime/compiler/dotnet.vim
@@ -0,0 +1,39 @@
+" Vim compiler file
+" Compiler: dotnet build (.NET CLI)
+" Maintainer: Nick Jensen <nickspoon@gmail.com>
+" Last Change: 2022-12-06
+" License: Vim (see :h license)
+" Repository: https://github.com/nickspoons/vim-cs
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dotnet"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if get(g:, "dotnet_errors_only", v:false)
+ CompilerSet makeprg=dotnet\ build\ -nologo
+ \\ -consoleloggerparameters:NoSummary
+ \\ -consoleloggerparameters:ErrorsOnly
+else
+ CompilerSet makeprg=dotnet\ build\ -nologo\ -consoleloggerparameters:NoSummary
+endif
+
+if get(g:, "dotnet_show_project_file", v:true)
+ CompilerSet errorformat=%E%f(%l\\,%c):\ %trror\ %m,
+ \%W%f(%l\\,%c):\ %tarning\ %m,
+ \%-G%.%#
+else
+ CompilerSet errorformat=%E%f(%l\\,%c):\ %trror\ %m\ [%.%#],
+ \%W%f(%l\\,%c):\ %tarning\ %m\ [%.%#],
+ \%-G%.%#
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/zig.vim b/runtime/compiler/zig.vim
new file mode 100644
index 0000000000..2cc6831329
--- /dev/null
+++ b/runtime/compiler/zig.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: Zig Compiler
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "zig"
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+" a subcommand must be provided for the this compiler (test, build-exe, etc)
+if has('patch-7.4.191')
+ CompilerSet makeprg=zig\ \$*\ \%:S
+else
+ CompilerSet makeprg=zig\ \$*\ \"%\"
+endif
+
+" TODO: improve errorformat as needed.
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/compiler/zig_build.vim b/runtime/compiler/zig_build.vim
new file mode 100644
index 0000000000..0441267b64
--- /dev/null
+++ b/runtime/compiler/zig_build.vim
@@ -0,0 +1,29 @@
+" Vim compiler file
+" Compiler: Zig Compiler (zig build)
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists('current_compiler')
+ finish
+endif
+runtime compiler/zig.vim
+let current_compiler = 'zig_build'
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+if exists('g:zig_build_makeprg_params')
+ execute 'CompilerSet makeprg=zig\ build\ '.escape(g:zig_build_makeprg_params, ' \|"').'\ $*'
+else
+ CompilerSet makeprg=zig\ build\ $*
+endif
+
+" TODO: anything to add to errorformat for zig build specifically?
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/compiler/zig_build_exe.vim b/runtime/compiler/zig_build_exe.vim
new file mode 100644
index 0000000000..20f0bb3366
--- /dev/null
+++ b/runtime/compiler/zig_build_exe.vim
@@ -0,0 +1,27 @@
+" Vim compiler file
+" Compiler: Zig Compiler (zig build-exe)
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists('current_compiler')
+ finish
+endif
+runtime compiler/zig.vim
+let current_compiler = 'zig_build_exe'
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+if has('patch-7.4.191')
+ CompilerSet makeprg=zig\ build-exe\ \%:S\ \$*
+else
+ CompilerSet makeprg=zig\ build-exe\ \"%\"\ \$*
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/compiler/zig_test.vim b/runtime/compiler/zig_test.vim
new file mode 100644
index 0000000000..a82d2a6378
--- /dev/null
+++ b/runtime/compiler/zig_test.vim
@@ -0,0 +1,27 @@
+" Vim compiler file
+" Compiler: Zig Compiler (zig test)
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists('current_compiler')
+ finish
+endif
+runtime compiler/zig.vim
+let current_compiler = 'zig_test'
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+if has('patch-7.4.191')
+ CompilerSet makeprg=zig\ test\ \%:S\ \$*
+else
+ CompilerSet makeprg=zig\ test\ \"%\"\ \$*
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/doc/fold.txt b/runtime/doc/fold.txt
index fa823608df..35a3be35fb 100644
--- a/runtime/doc/fold.txt
+++ b/runtime/doc/fold.txt
@@ -586,6 +586,11 @@ line is folded, it cannot be displayed there.
Many movement commands handle a sequence of folded lines like an empty line.
For example, the "w" command stops once in the first column.
+When starting a search in a closed fold it will not find a match in the
+current fold. It's like a forward search always starts from the end of the
+closed fold, while a backwards search starts from the start of the closed
+fold.
+
When in Insert mode, the cursor line is never folded. That allows you to see
what you type!
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index b51268eebf..b7656211c6 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -1471,7 +1471,7 @@ Possible attributes are:
number.
-count=N A count (default N) which is specified either in the line
number position, or as an initial argument (like |:Next|).
- -count acts like -count=0
+ -count Acts like -count=0
Note that -range=N and -count=N are mutually exclusive - only one should be
specified.
@@ -1489,7 +1489,7 @@ Possible values are (second column is the short name used in listing):
-addr=windows win Range for windows
-addr=tabs tab Range for tab pages
-addr=quickfix qf Range for quickfix entries
- -addr=other ? other kind of range; can use ".", "$" and "%"
+ -addr=other ? Other kind of range; can use ".", "$" and "%"
as with "lines" (this is the default for
-count)
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index f74a046ee6..3cd36f7652 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -3571,6 +3571,14 @@ highlighting is to put the following line in your |vimrc|: >
<
+WDL *wdl.vim* *wdl-syntax*
+
+The Workflow Description Language is a way to specify data processing workflows
+with a human-readable and writeable syntax. This is used a lot in
+bioinformatics. More info on the spec can be found here:
+https://github.com/openwdl/wdl
+
+
XF86CONFIG *xf86conf.vim* *ft-xf86conf-syntax*
The syntax of XF86Config file differs in XFree86 v3.x and v4.x. Both
diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt
index 1e96d00291..e7c58b00a0 100644
--- a/runtime/doc/windows.txt
+++ b/runtime/doc/windows.txt
@@ -615,6 +615,8 @@ autocommand event can be used.
If you want to get notified of text in windows scrolling vertically or
horizontally, the |WinScrolled| autocommand event can be used. This will also
trigger in window size changes.
+Exception: the events will not be triggered when the text scrolls for
+'incsearch'.
*WinResized-event*
The |WinResized| event is triggered after updating the display, several
windows may have changed size then. A list of the IDs of windows that changed
diff --git a/runtime/ftplugin/cs.vim b/runtime/ftplugin/cs.vim
index f53ffcbc8e..0734d11d22 100644
--- a/runtime/ftplugin/cs.vim
+++ b/runtime/ftplugin/cs.vim
@@ -2,7 +2,7 @@
" Language: C#
" Maintainer: Nick Jensen <nickspoon@gmail.com>
" Former Maintainer: Johannes Zellner <johannes@zellner.org>
-" Last Change: 2021-12-07
+" Last Change: 2022-11-16
" License: Vim (see :h license)
" Repository: https://github.com/nickspoons/vim-cs
@@ -25,8 +25,9 @@ let b:undo_ftplugin = 'setl com< fo<'
if exists('loaded_matchit') && !exists('b:match_words')
" #if/#endif support included by default
+ let b:match_ignorecase = 0
let b:match_words = '\%(^\s*\)\@<=#\s*region\>:\%(^\s*\)\@<=#\s*endregion\>,'
- let b:undo_ftplugin .= ' | unlet! b:match_words'
+ let b:undo_ftplugin .= ' | unlet! b:match_ignorecase b:match_words'
endif
if (has('gui_win32') || has('gui_gtk')) && !exists('b:browsefilter')
diff --git a/runtime/ftplugin/vim.vim b/runtime/ftplugin/vim.vim
index 82a4b13f9f..b64bb55d68 100644
--- a/runtime/ftplugin/vim.vim
+++ b/runtime/ftplugin/vim.vim
@@ -1,7 +1,7 @@
" Vim filetype plugin
" Language: Vim
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2022 Sep 09
+" Last Change: 2022 Nov 27
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
@@ -98,7 +98,7 @@ 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*\)\@<=\<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]\)\>,' .
\ '\<if\>:\%(\%(^\||\)\s*\)\@<=\<el\%[seif]\>:\%(\%(^\||\)\s*\)\@<=\<en\%[dif]\>,' .
\ '{:},' .
diff --git a/runtime/ftplugin/zig.vim b/runtime/ftplugin/zig.vim
new file mode 100644
index 0000000000..e740a52849
--- /dev/null
+++ b/runtime/ftplugin/zig.vim
@@ -0,0 +1,66 @@
+" Vim filetype plugin file
+" Language: Zig
+" Upstream: https://github.com/ziglang/zig.vim
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+let s:cpo_orig = &cpo
+set cpo&vim
+
+compiler zig_build
+
+" Match Zig builtin fns
+setlocal iskeyword+=@-@
+
+" Recomended code style, no tabs and 4-space indentation
+setlocal expandtab
+setlocal tabstop=8
+setlocal softtabstop=4
+setlocal shiftwidth=4
+
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal suffixesadd=.zig,.zir
+
+if has('comments')
+ setlocal comments=:///,://!,://,:\\\\
+ setlocal commentstring=//\ %s
+endif
+
+if has('find_in_path')
+ let &l:includeexpr='substitute(v:fname, "^([^.])$", "\1.zig", "")'
+ let &l:include='\v(\@import>|\@cInclude>|^\s*\#\s*include)'
+endif
+
+let &l:define='\v(<fn>|<const>|<var>|^\s*\#\s*define)'
+
+if !exists('g:zig_std_dir') && exists('*json_decode') && executable('zig')
+ silent let s:env = system('zig env')
+ if v:shell_error == 0
+ let g:zig_std_dir = json_decode(s:env)['std_dir']
+ endif
+ unlet! s:env
+endif
+
+if exists('g:zig_std_dir')
+ let &l:path = &l:path . ',' . g:zig_std_dir
+endif
+
+let b:undo_ftplugin =
+ \ 'setl isk< et< ts< sts< sw< fo< sua< mp< com< cms< inex< inc< pa<'
+
+augroup vim-zig
+ autocmd! * <buffer>
+ autocmd BufWritePre <buffer> if get(g:, 'zig_fmt_autosave', 1) | call zig#fmt#Format() | endif
+augroup END
+
+let b:undo_ftplugin .= '|au! vim-zig * <buffer>'
+
+let &cpo = s:cpo_orig
+unlet s:cpo_orig
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/indent/zig.vim b/runtime/indent/zig.vim
new file mode 100644
index 0000000000..e3ce8aa410
--- /dev/null
+++ b/runtime/indent/zig.vim
@@ -0,0 +1,80 @@
+" Vim filetype indent file
+" Language: Zig
+" Upstream: https://github.com/ziglang/zig.vim
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+if (!has("cindent") || !has("eval"))
+ finish
+endif
+
+setlocal cindent
+
+" L0 -> 0 indent for jump labels (i.e. case statement in c).
+" j1 -> indenting for "javascript object declarations"
+" J1 -> see j1
+" w1 -> starting a new line with `(` at the same indent as `(`
+" m1 -> if `)` starts a line, match its indent with the first char of its
+" matching `(` line
+" (s -> use one indent, when starting a new line after a trailing `(`
+setlocal cinoptions=L0,m1,(s,j1,J1,l1
+
+" cinkeys: controls what keys trigger indent formatting
+" 0{ -> {
+" 0} -> }
+" 0) -> )
+" 0] -> ]
+" !^F -> make CTRL-F (^F) reindent the current line when typed
+" o -> when <CR> or `o` is used
+" O -> when the `O` command is used
+setlocal cinkeys=0{,0},0),0],!^F,o,O
+
+setlocal indentexpr=GetZigIndent(v:lnum)
+
+let b:undo_indent = "setlocal cindent< cinkeys< cinoptions< indentexpr<"
+
+function! GetZigIndent(lnum)
+ let curretLineNum = a:lnum
+ let currentLine = getline(a:lnum)
+
+ " cindent doesn't handle multi-line strings properly, so force no indent
+ if currentLine =~ '^\s*\\\\.*'
+ return -1
+ endif
+
+ let prevLineNum = prevnonblank(a:lnum-1)
+ let prevLine = getline(prevLineNum)
+
+ " for lines that look like
+ " },
+ " };
+ " try treating them the same as a }
+ if prevLine =~ '\v^\s*},$'
+ if currentLine =~ '\v^\s*};$' || currentLine =~ '\v^\s*}$'
+ return indent(prevLineNum) - 4
+ endif
+ return indent(prevLineNum-1) - 4
+ endif
+ if currentLine =~ '\v^\s*},$'
+ return indent(prevLineNum) - 4
+ endif
+ if currentLine =~ '\v^\s*};$'
+ return indent(prevLineNum) - 4
+ endif
+
+
+ " cindent doesn't handle this case correctly:
+ " switch (1): {
+ " 1 => true,
+ " ~
+ " ^---- indents to here
+ if prevLine =~ '.*=>.*,$' && currentLine !~ '.*}$'
+ return indent(prevLineNum)
+ endif
+
+ return cindent(a:lnum)
+endfunction
diff --git a/runtime/menu.vim b/runtime/menu.vim
index 1c48d617eb..87155248f1 100644
--- a/runtime/menu.vim
+++ b/runtime/menu.vim
@@ -2,7 +2,7 @@
" You can also use this as a start for your own set of menus.
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2021 Dec 22
+" Last Change: 2022 Nov 27
" Note that ":an" (short for ":anoremenu") is often used to make a menu work
" in all modes and avoid side effects from mappings defined by the user.
diff --git a/runtime/plugin/matchparen.vim b/runtime/plugin/matchparen.vim
index eb4a9ecf7c..3982489b92 100644
--- a/runtime/plugin/matchparen.vim
+++ b/runtime/plugin/matchparen.vim
@@ -1,6 +1,6 @@
" Vim plugin for showing matching parens
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2022 Nov 28
+" Last Change: 2022 Dec 01
" Exit quickly when:
" - this plugin was already loaded (or disabled)
diff --git a/runtime/syntax/cs.vim b/runtime/syntax/cs.vim
index 722ddbedf6..104470ac4b 100644
--- a/runtime/syntax/cs.vim
+++ b/runtime/syntax/cs.vim
@@ -3,7 +3,7 @@
" Maintainer: Nick Jensen <nickspoon@gmail.com>
" Former Maintainers: Anduin Withers <awithers@anduin.com>
" Johannes Zellner <johannes@zellner.org>
-" Last Change: 2022-03-01
+" Last Change: 2022-11-16
" Filenames: *.cs
" License: Vim (see :h license)
" Repository: https://github.com/nickspoons/vim-cs
@@ -25,6 +25,9 @@ syn keyword csType bool byte char decimal double float int long object sbyte sho
syn keyword csType nint nuint " contextual
syn keyword csStorage enum interface namespace struct
+syn match csStorage "\<record\ze\_s\+@\=\h\w*\_s*[<(:{;]"
+syn match csStorage "\%(\<\%(partial\|new\|public\|protected\|internal\|private\|abstract\|sealed\|static\|unsafe\|readonly\)\)\@9<=\_s\+record\>"
+syn match csStorage "\<record\ze\_s\+\%(class\|struct\)"
syn match csStorage "\<delegate\>"
syn keyword csRepeat break continue do for foreach goto return while
syn keyword csConditional else if switch
@@ -44,6 +47,9 @@ syn keyword csManagedModifier managed unmanaged contained
" Modifiers
syn match csUsingModifier "\<global\ze\_s\+using\>"
syn keyword csAccessModifier internal private protected public
+syn keyword csModifier operator nextgroup=csCheckedModifier skipwhite skipempty
+syn keyword csCheckedModifier checked contained
+
" TODO: in new out
syn keyword csModifier abstract const event override readonly sealed static virtual volatile
syn match csModifier "\<\%(extern\|fixed\|unsafe\)\>"
@@ -76,7 +82,7 @@ syn match csAccess "\<this\>"
" Extension method parameter modifier
syn match csModifier "\<this\ze\_s\+@\=\h"
-syn keyword csUnspecifiedStatement as in is nameof operator out params ref sizeof stackalloc using
+syn keyword csUnspecifiedStatement as in is nameof out params ref sizeof stackalloc using
syn keyword csUnsupportedStatement value
syn keyword csUnspecifiedKeyword explicit implicit
@@ -183,7 +189,7 @@ syn match csUnicodeNumber +\\u\x\{4}+ contained contains=csUnicodeSpecifier disp
syn match csUnicodeNumber +\\U00\x\{6}+ contained contains=csUnicodeSpecifier display
syn match csUnicodeSpecifier +\\[uUx]+ contained display
-syn region csString matchgroup=csQuote start=+"+ end=+"+ end=+$+ extend contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
+syn region csString matchgroup=csQuote start=+"+ end=+"\%(u8\)\=+ end=+$+ extend contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
syn match csCharacter "'[^']*'" contains=csSpecialChar,csSpecialCharError,csUnicodeNumber display
syn match csCharacter "'\\''" contains=csSpecialChar display
syn match csCharacter "'[^\\]'" display
@@ -200,7 +206,7 @@ syn match csReal "\<\d\+\%(_\+\d\+\)*[fdm]\>" display
syn case match
syn cluster csNumber contains=csInteger,csReal
-syn region csInterpolatedString matchgroup=csQuote start=+\$"+ end=+"+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
+syn region csInterpolatedString matchgroup=csQuote start=+\$"+ end=+"\%(u8\)\=+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
syn region csInterpolation matchgroup=csInterpolationDelimiter start=+{+ end=+}+ keepend contained contains=@csAll,csBraced,csBracketed,csInterpolationAlign,csInterpolationFormat
syn match csEscapedInterpolation "{{" transparent contains=NONE display
@@ -210,10 +216,10 @@ syn match csInterpolationFormat +:[^}]\+}+ contained contains=csInterpolationFor
syn match csInterpolationAlignDel +,+ contained display
syn match csInterpolationFormatDel +:+ contained display
-syn region csVerbatimString matchgroup=csQuote start=+@"+ end=+"+ skip=+""+ extend contains=csVerbatimQuote,@Spell
+syn region csVerbatimString matchgroup=csQuote start=+@"+ end=+"\%(u8\)\=+ skip=+""+ extend contains=csVerbatimQuote,@Spell
syn match csVerbatimQuote +""+ contained
-syn region csInterVerbString matchgroup=csQuote start=+$@"+ start=+@$"+ end=+"+ skip=+""+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,csVerbatimQuote,@Spell
+syn region csInterVerbString matchgroup=csQuote start=+$@"+ start=+@$"+ end=+"\%(u8\)\=+ skip=+""+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,csVerbatimQuote,@Spell
syn cluster csString contains=csString,csInterpolatedString,csVerbatimString,csInterVerbString
@@ -256,6 +262,7 @@ hi def link csException Exception
hi def link csModifier StorageClass
hi def link csAccessModifier csModifier
hi def link csAsyncModifier csModifier
+hi def link csCheckedModifier csModifier
hi def link csManagedModifier csModifier
hi def link csUsingModifier csModifier
diff --git a/runtime/syntax/nix.vim b/runtime/syntax/nix.vim
new file mode 100644
index 0000000000..c07676a4a8
--- /dev/null
+++ b/runtime/syntax/nix.vim
@@ -0,0 +1,210 @@
+" Vim syntax file
+" Language: Nix
+" Maintainer: James Fleming <james@electronic-quill.net>
+" Original Author: Daiderd Jordan <daiderd@gmail.com>
+" Acknowledgement: Based on vim-nix maintained by Daiderd Jordan <daiderd@gmail.com>
+" https://github.com/LnL7/vim-nix
+" License: MIT
+" Last Change: 2022 Dec 06
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword nixBoolean true false
+syn keyword nixNull null
+syn keyword nixRecKeyword rec
+
+syn keyword nixOperator or
+syn match nixOperator '!=\|!'
+syn match nixOperator '<=\?'
+syn match nixOperator '>=\?'
+syn match nixOperator '&&'
+syn match nixOperator '//\='
+syn match nixOperator '=='
+syn match nixOperator '?'
+syn match nixOperator '||'
+syn match nixOperator '++\='
+syn match nixOperator '-'
+syn match nixOperator '\*'
+syn match nixOperator '->'
+
+syn match nixParen '[()]'
+syn match nixInteger '\d\+'
+
+syn keyword nixTodo FIXME NOTE TODO OPTIMIZE XXX HACK contained
+syn match nixComment '#.*' contains=nixTodo,@Spell
+syn region nixComment start=+/\*+ end=+\*/+ contains=nixTodo,@Spell
+
+syn region nixInterpolation matchgroup=nixInterpolationDelimiter start="\${" end="}" contained contains=@nixExpr,nixInterpolationParam
+
+syn match nixSimpleStringSpecial /\\\%([nrt"\\$]\|$\)/ contained
+syn match nixStringSpecial /''['$]/ contained
+syn match nixStringSpecial /\$\$/ contained
+syn match nixStringSpecial /''\\[nrt]/ contained
+
+syn match nixSimpleStringSpecial /\$\$/ contained
+
+syn match nixInvalidSimpleStringEscape /\\[^nrt"\\$]/ contained
+syn match nixInvalidStringEscape /''\\[^nrt]/ contained
+
+syn region nixSimpleString matchgroup=nixStringDelimiter start=+"+ skip=+\\"+ end=+"+ contains=nixInterpolation,nixSimpleStringSpecial,nixInvalidSimpleStringEscape
+syn region nixString matchgroup=nixStringDelimiter start=+''+ skip=+''['$\\]+ end=+''+ contains=nixInterpolation,nixStringSpecial,nixInvalidStringEscape
+
+syn match nixFunctionCall "[a-zA-Z_][a-zA-Z0-9_'-]*"
+
+syn match nixPath "[a-zA-Z0-9._+-]*\%(/[a-zA-Z0-9._+-]\+\)\+"
+syn match nixHomePath "\~\%(/[a-zA-Z0-9._+-]\+\)\+"
+syn match nixSearchPath "[a-zA-Z0-9._+-]\+\%(\/[a-zA-Z0-9._+-]\+\)*" contained
+syn match nixPathDelimiter "[<>]" contained
+syn match nixSearchPathRef "<[a-zA-Z0-9._+-]\+\%(\/[a-zA-Z0-9._+-]\+\)*>" contains=nixSearchPath,nixPathDelimiter
+syn match nixURI "[a-zA-Z][a-zA-Z0-9.+-]*:[a-zA-Z0-9%/?:@&=$,_.!~*'+-]\+"
+
+syn match nixAttributeDot "\." contained
+syn match nixAttribute "[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%([^a-zA-Z0-9_'.-]\|$\)" contained
+syn region nixAttributeAssignment start="=" end="\ze;" contained contains=@nixExpr
+syn region nixAttributeDefinition start=/\ze[a-zA-Z_"$]/ end=";" contained contains=nixComment,nixAttribute,nixInterpolation,nixSimpleString,nixAttributeDot,nixAttributeAssignment
+
+syn region nixInheritAttributeScope start="(" end="\ze)" contained contains=@nixExpr
+syn region nixAttributeDefinition matchgroup=nixInherit start="\<inherit\>" end=";" contained contains=nixComment,nixInheritAttributeScope,nixAttribute
+
+syn region nixAttributeSet start="{" end="}" contains=nixComment,nixAttributeDefinition
+
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn region nixArgumentDefinitionWithDefault matchgroup=nixArgumentDefinition start="[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*?\@=" matchgroup=NONE end="[,}]\@=" transparent contained contains=@nixExpr
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn match nixArgumentDefinition "[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[,}]\@=" contained
+syn match nixArgumentEllipsis "\.\.\." contained
+syn match nixArgumentSeparator "," contained
+
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn match nixArgOperator '@\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[a-zA-Z_][a-zA-Z0-9_'-]*\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*:'he=s+1 contained contains=nixAttribute
+
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn match nixArgOperator '[a-zA-Z_][a-zA-Z0-9_'-]*\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*@'hs=e-1 contains=nixAttribute nextgroup=nixFunctionArgument
+
+" This is a bit more complicated, because function arguments can be passed in a
+" very similar form on how attribute sets are defined and two regions with the
+" same start patterns will shadow each other. Instead of a region we could use a
+" match on {\_.\{-\}}, which unfortunately doesn't take nesting into account.
+"
+" So what we do instead is that we look forward until we are sure that it's a
+" function argument. Unfortunately, we need to catch comments and both vertical
+" and horizontal white space, which the following regex should hopefully do:
+"
+" "\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*"
+"
+" It is also used throught the whole file and is marked with 'v's as well.
+"
+" Fortunately the matching rules for function arguments are much simpler than
+" for real attribute sets, because we can stop when we hit the first ellipsis or
+" default value operator, but we also need to paste the "whitespace & comments
+" eating" regex all over the place (marked with 'v's):
+"
+" Region match 1: { foo ? ... } or { foo, ... } or { ... } (ellipsis)
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv {----- identifier -----}vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn region nixFunctionArgument start="{\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*\%([a-zA-Z_][a-zA-Z0-9_'-]*\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[,?}]\|\.\.\.\)" end="}" contains=nixComment,nixArgumentDefinitionWithDefault,nixArgumentDefinition,nixArgumentEllipsis,nixArgumentSeparator nextgroup=nixArgOperator
+
+" Now it gets more tricky, because we need to look forward for the colon,