summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.yml10
-rw-r--r--runtime/autoload/dist/vimindent.vim20
-rw-r--r--runtime/doc/undo.txt28
-rw-r--r--runtime/filetype.vim8
-rw-r--r--runtime/indent/rapid.vim255
-rw-r--r--runtime/indent/testdir/rapid.in266
-rw-r--r--runtime/indent/testdir/rapid.ok266
-rw-r--r--runtime/indent/testdir/vim.in7
-rw-r--r--runtime/indent/testdir/vim.ok7
-rw-r--r--src/testdir/test_filetype.vim3
-rw-r--r--src/testdir/test_lua.vim6
-rw-r--r--src/testdir/test_mapping.vim4
-rw-r--r--src/testdir/test_signs.vim4
-rw-r--r--src/version.c2
14 files changed, 860 insertions, 26 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 47c68ea7d7..104476b454 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -38,6 +38,7 @@ jobs:
features: [tiny, normal, huge]
compiler: [clang, gcc]
extra: [none]
+ luaver: [lua5.4]
include:
- features: tiny
compiler: clang
@@ -54,13 +55,18 @@ jobs:
coverage: true
extra: testgui
uchar: true
+ luaver: lua5.4
- features: huge
compiler: clang
extra: asan
+ # Lua5.1 is the most widely used version (since it's what LuaJIT is
+ # compatible with), so ensure it works
+ luaver: lua5.1
- features: huge
compiler: gcc
coverage: true
extra: unittests
+ luaver: lua5.4
- features: normal
compiler: gcc
extra: vimtags
@@ -85,8 +91,8 @@ jobs:
libperl-dev \
python2-dev \
python3-dev \
- liblua5.4-dev \
- lua5.4 \
+ lib${{ matrix.luaver }}-dev \
+ ${{ matrix.luaver }} \
ruby-dev \
tcl-dev \
cscope \
diff --git a/runtime/autoload/dist/vimindent.vim b/runtime/autoload/dist/vimindent.vim
index 1306d1e361..a5e04a5391 100644
--- a/runtime/autoload/dist/vimindent.vim
+++ b/runtime/autoload/dist/vimindent.vim
@@ -2,7 +2,7 @@ vim9script
# Language: Vim script
# Maintainer: github user lacygoill
-# Last Change: 2023 Feb 01
+# Last Change: 2023 Jun 29
# NOTE: Whenever you change the code, make sure the tests are still passing:
#
@@ -112,10 +112,6 @@ const DICT_KEY: string = '^\s*\%('
.. '\)'
.. ':\%(\s\|$\)'
-# NOT_A_DICT_KEY {{{3
-
-const NOT_A_DICT_KEY: string = ':\@!'
-
# END_OF_COMMAND {{{3
const END_OF_COMMAND: string = $'\s*\%($\|||\@!\|{INLINE_COMMENT}\)'
@@ -197,13 +193,13 @@ patterns =<< trim eval END
ldo\=\>!\=
tabdo\=\>
windo\>
- au\%[tocmd]\>.*
- com\%[mand]\>.*
+ au\%[tocmd]\>!\=.*
+ com\%[mand]\>!\=.*
g\%[lobal]!\={PATTERN_DELIMITER}.*
v\%[global]!\={PATTERN_DELIMITER}.*
END
-const HIGHER_ORDER_COMMAND: string = $'\%(^\|{BAR_SEPARATION}\)\s*\<\%({patterns->join('\|')}\){NOT_A_DICT_KEY}'
+const HIGHER_ORDER_COMMAND: string = $'\%(^\|{BAR_SEPARATION}\)\s*\<\%({patterns->join('\|')}\)\%(\s\|$\)\@='
# START_MIDDLE_END {{{3
@@ -254,7 +250,7 @@ START_MIDDLE_END = START_MIDDLE_END
kwds->map((_, kwd: string) => kwd == ''
? ''
: $'\%(^\|{BAR_SEPARATION}\|\<sil\%[ent]\|{HIGHER_ORDER_COMMAND}\)\s*'
- .. $'\<\%({kwd}\)\>\%(\s*{OPERATOR}\)\@!'))
+ .. $'\<\%({kwd}\)\>\%(\s\|$\|!\)\@=\%(\s*{OPERATOR}\)\@!'))
lockvar! START_MIDDLE_END
@@ -279,7 +275,7 @@ patterns = BLOCKS
const ENDS_BLOCK_OR_CLAUSE: string = '^\s*\%(' .. patterns->join('\|') .. $'\){END_OF_COMMAND}'
.. $'\|^\s*cat\%[ch]\%(\s\+\({PATTERN_DELIMITER}\).*\1\)\={END_OF_COMMAND}'
- .. $'\|^\s*elseif\=\>\%({OPERATOR}\)\@!'
+ .. $'\|^\s*elseif\=\>\%(\s\|$\)\@=\%(\s*{OPERATOR}\)\@!'
# STARTS_NAMED_BLOCK {{{3
@@ -296,7 +292,7 @@ patterns = []
endfor
}
-const STARTS_NAMED_BLOCK: string = $'^\s*\%(sil\%[ent]\s\+\)\=\%({patterns->join('\|')}\)\>{NOT_A_DICT_KEY}'
+const STARTS_NAMED_BLOCK: string = $'^\s*\%(sil\%[ent]\s\+\)\=\%({patterns->join('\|')}\)\>\%(\s\|$\|!\)\@='
# STARTS_CURLY_BLOCK {{{3
@@ -312,7 +308,7 @@ const STARTS_CURLY_BLOCK: string = '\%('
# STARTS_FUNCTION {{{3
-const STARTS_FUNCTION: string = $'^\s*\%({MODIFIERS.def}\)\=def\>{NOT_A_DICT_KEY}'
+const STARTS_FUNCTION: string = $'^\s*\%({MODIFIERS.def}\)\=def\>!\=\s\@='
# ENDS_FUNCTION {{{3
diff --git a/runtime/doc/undo.txt b/runtime/doc/undo.txt
index cc33482473..dc2274c14c 100644
--- a/runtime/doc/undo.txt
+++ b/runtime/doc/undo.txt
@@ -111,9 +111,19 @@ use CTRL-G u. This is useful if you want an insert command to be undoable in
parts. E.g., for each sentence. |i_CTRL-G_u|
Setting the value of 'undolevels' also closes the undo block. Even when the
-new value is equal to the old value. In |Vim9| script: >
- &undolevels = &undolevels
+new value is equal to the old value. Use `g:undolevels` to explicitly read
+and write only the global value of 'undolevels'. In |Vim9| script: >
+ &g:undolevels = &g:undolevels
In legacy script: >
+ let &g:undolevels = &g:undolevels
+
+Note that the similar-looking assignment `let &undolevels=&undolevels` does not
+preserve the global option value of 'undolevels' in the event that the local
+option has been set to a different value. For example: >
+ " Start with different global and local values for 'undolevels'.
+ let &g:undolevels = 1000
+ let &l:undolevels = 2000
+ " This assignment changes the global option to 2000:
let &undolevels = &undolevels
==============================================================================
@@ -366,12 +376,20 @@ undo is possible. Use this if you are running out of memory.
When you set 'undolevels' to -1 the undo information is not immediately
cleared, this happens at the next change. To force clearing the undo
information you can use these commands: >
- :let old_undolevels = &undolevels
- :set undolevels=-1
+ :let old_undolevels = &l:undolevels
+ :setlocal undolevels=-1
:exe "normal a \<BS>\<Esc>"
- :let &undolevels = old_undolevels
+ :let &l:undolevels = old_undolevels
:unlet old_undolevels
+Note use of `&l:undolevels` to explicitly read the local value of 'undolevels'
+and the use of `:setlocal` to change only the local option (which takes
+precedence over the corresponding global option value). Saving the option value
+via the use of `&undolevels` is unpredictable; it reads either the local value
+(if one has been set) or the global value (otherwise). Also, if a local value
+has been set, changing the option via `:set undolevels` will change both the
+global and local values, requiring extra work to save and restore both values.
+
Marks for the buffer ('a to 'z) are also saved and restored, together with the
text.
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index 49e602fab1..eea55f8b99 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -894,6 +894,7 @@ if exists('$XDG_CONFIG_HOME')
endif
au BufNewFile,BufRead $HOME/.config/cabal/config setf cabalconfig
au BufNewFile,BufRead cabal.config setf cabalconfig
+au BufNewFile,BufRead *.persistentmodels setf haskellpersistent
" Haste
au BufNewFile,BufRead *.ht setf haste
@@ -948,6 +949,9 @@ au BufNewFile,BufRead */etc/host.conf setf hostconf
" Hosts access
au BufNewFile,BufRead */etc/hosts.allow,*/etc/hosts.deny setf hostsaccess
+" Hurl
+au BufRead,BufNewFile *.hurl setf hurl
+
" Hyper Builder
au BufNewFile,BufRead *.hb setf hb
@@ -1564,6 +1568,10 @@ au BufNewFile,BufRead *.rcp setf pilrc
" Pine config
au BufNewFile,BufRead .pinerc,pinerc,.pinercex,pinercex setf pine
+" Pip requirements
+au BufNewFile,BufRead *.pip setf requirements
+au BufNewFile,BufRead requirements.txt setf requirements
+
" Pipenv Pipfiles
au BufNewFile,BufRead Pipfile setf toml
au BufNewFile,BufRead Pipfile.lock setf json
diff --git a/runtime/indent/rapid.vim b/runtime/indent/rapid.vim
new file mode 100644
index 0000000000..f97ebf84db
--- /dev/null
+++ b/runtime/indent/rapid.vim
@@ -0,0 +1,255 @@
+" ABB Rapid Command indent file for Vim
+" Language: ABB Rapid Command
+" Maintainer: Patrick Meiser-Knosowski <knosowski@graeffrobotics.de>
+" Version: 2.2.7
+" Last Change: 12. May 2023
+" Credits: Based on indent/vim.vim
+"
+" Suggestions of improvement are very welcome. Please email me!
+"
+" Known bugs: ../doc/rapid.txt
+"
+" TODO
+" * indent wrapped lines which do not end with an ; or special key word,
+" maybe this is a better idea, but then () and [] has to be changed as
+" well
+"
+
+if exists("g:rapidNoSpaceIndent")
+ if !exists("g:rapidSpaceIndent")
+ let g:rapidSpaceIndent = !g:rapidNoSpaceIndent
+ endif
+ unlet g:rapidNoSpaceIndent
+endif
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent") || get(g:,'rapidNoIndent',0)
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nolisp
+setlocal nosmartindent
+setlocal autoindent
+setlocal indentexpr=GetRapidIndent()
+if get(g:,'rapidNewStyleIndent',0)
+ setlocal indentkeys=!^F,o,O,0=~endmodule,0=~error,0=~undo,0=~backward,0=~endproc,0=~endrecord,0=~endtrap,0=~endfunc,0=~else,0=~endif,0=~endtest,0=~endfor,0=~endwhile,:,<[>,<]>,<(>,<)>
+else
+ setlocal indentkeys=!^F,o,O,0=~endmodule,0=~error,0=~undo,0=~backward,0=~endproc,0=~endrecord,0=~endtrap,0=~endfunc,0=~else,0=~endif,0=~endtest,0=~endfor,0=~endwhile,:
+endif
+let b:undo_indent="setlocal lisp< si< ai< inde< indk<"
+
+if get(g:,'rapidSpaceIndent',1)
+ " Use spaces for indention, 2 is enough.
+ " More or even tabs wastes space on the teach pendant.
+ setlocal softtabstop=2
+ setlocal shiftwidth=2
+ setlocal expandtab
+ setlocal shiftround
+ let b:undo_indent = b:undo_indent." sts< sw< et< sr<"
+endif
+
+" Only define the function once.
+if exists("*GetRapidIndent")
+ finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+function GetRapidIndent()
+ let ignorecase_save = &ignorecase
+ try
+ let &ignorecase = 0
+ return s:GetRapidIndentIntern()
+ finally
+ let &ignorecase = ignorecase_save
+ endtry
+endfunction
+
+function s:GetRapidIndentIntern() abort
+
+ let l:currentLineNum = v:lnum
+ let l:currentLine = getline(l:currentLineNum)
+
+ if l:currentLine =~ '^!' && !get(g:,'rapidCommentIndent',0)
+ " If current line is ! line comment, do not change indent
+ " This may be usefull if code is commented out at the first column.
+ return 0
+ endif
+
+ " Find a non-blank line above the current line.
+ let l:preNoneBlankLineNum = s:RapidPreNoneBlank(v:lnum - 1)
+ if l:preNoneBlankLineNum == 0
+ " At the start of the file use zero indent.
+ return 0
+ endif
+
+ let l:preNoneBlankLine = getline(l:preNoneBlankLineNum)
+ let l:ind = indent(l:preNoneBlankLineNum)
+
+ " Define add a 'shiftwidth' pattern
+ let l:addShiftwidthPattern = '\c\v^\s*('
+ let l:addShiftwidthPattern .= '((local|task)\s+)?(module|record|proc|func|trap)\s+\k'
+ let l:addShiftwidthPattern .= '|(backward|error|undo)>'
+ let l:addShiftwidthPattern .= ')'
+ "
+ " Define Subtract 'shiftwidth' pattern
+ let l:subtractShiftwidthPattern = '\c\v^\s*('
+ let l:subtractShiftwidthPattern .= 'end(module|record|proc|func|trap)>'
+ let l:subtractShiftwidthPattern .= '|(backward|error|undo)>'
+ let l:subtractShiftwidthPattern .= ')'
+
+ " Add shiftwidth
+ if l:preNoneBlankLine =~ l:addShiftwidthPattern
+ \|| s:RapidLenTilStr(l:preNoneBlankLineNum, "then", 0)>=0
+ \|| s:RapidLenTilStr(l:preNoneBlankLineNum, "else", 0)>=0
+ \|| s:RapidLenTilStr(l:preNoneBlankLineNum, "do", 0)>=0
+ \|| s:RapidLenTilStr(l:preNoneBlankLineNum, "case", 0)>=0
+ \|| s:RapidLenTilStr(l:preNoneBlankLineNum, "default", 0)>=0
+ let l:ind += &sw
+ endif
+
+ " Subtract shiftwidth
+ if l:currentLine =~ l:subtractShiftwidthPattern
+ \|| s:RapidLenTilStr(l:currentLineNum, "endif", 0)>=0
+ \|| s:RapidLenTilStr(l:currentLineNum, "endfor", 0)>=0
+ \|| s:RapidLenTilStr(l:currentLineNum, "endwhile", 0)>=0
+ \|| s:RapidLenTilStr(l:currentLineNum, "endtest", 0)>=0
+ \|| s:RapidLenTilStr(l:currentLineNum, "else", 0)>=0
+ \|| s:RapidLenTilStr(l:currentLineNum, "elseif", 0)>=0
+ \|| s:RapidLenTilStr(l:currentLineNum, "case", 0)>=0
+ \|| s:RapidLenTilStr(l:currentLineNum, "default", 0)>=0
+ let l:ind = l:ind - &sw
+ endif
+
+ " First case (or default) after a test gets the indent of the test.
+ if (s:RapidLenTilStr(l:currentLineNum, "case", 0)>=0 || s:RapidLenTilStr(l:currentLineNum, "default", 0)>=0) && s:RapidLenTilStr(l:preNoneBlankLineNum, "test", 0)>=0
+ let l:ind += &sw
+ endif
+
+ " continued lines with () or []
+ let l:OpenSum = s:RapidLoneParen(l:preNoneBlankLineNum,"(") + s:RapidLoneParen(l:preNoneBlankLineNum,"[")
+ if get(g:,'rapidNewStyleIndent',0)
+ let l:CloseSum = s:RapidLoneParen(l:preNoneBlankLineNum,")") + s:RapidLoneParen(l:currentLineNum,"]")
+ else
+ let l:CloseSum = s:RapidLoneParen(l:preNoneBlankLineNum,")") + s:RapidLoneParen(l:preNoneBlankLineNum,"]")
+ endif
+ if l:OpenSum > l:CloseSum
+ let l:ind += (l:OpenSum * 4 * &sw)
+ elseif l:OpenSum < l:CloseSum
+ let l:ind -= (l:CloseSum * 4 * &sw)
+ endif
+
+ return l:ind
+endfunction
+
+" Returns the length of the line until a:str occur outside a string or
+" comment. Search starts at string index a:startIdx.
+" If a:str is a word also add word bounderies and case insesitivity.
+" Note: rapidTodoComment and rapidDebugComment are not taken into account.
+function s:RapidLenTilStr(lnum, str, startIdx) abort
+
+ let l:line = getline(a:lnum)
+ let l:len = strlen(l:line)
+ let l:idx = a:startIdx
+ let l:str = a:str
+ if l:str =~ '^\k\+$'
+ let l:str = '\c\<' . l:str . '\>'
+ endif
+
+ while l:len > l:idx
+ let l:idx = match(l:line, l:str, l:idx)
+ if l:idx < 0
+ " a:str not found
+ return -1
+ endif
+ let l:synName = synIDattr(synID(a:lnum,l:idx+1,0),"name")
+ if l:synName != "rapidString"
+ \&& l:synName != "rapidConcealableString"
+ \&& (l:synName != "rapidComment" || l:str =~ '^!')
+ " a:str found outside string or line comment
+ return l:idx
+ endif
+ " a:str is part of string or line comment
+ let l:idx += 1 " continue search for a:str
+ endwhile
+
+ " a:str not found or l:len <= a:startIdx
+ return -1
+endfunction
+
+" a:lchar shoud be one of (, ), [, ], { or }
+" returns the number of opening/closing parenthesise which have no
+" closing/opening match in getline(a:lnum)
+function s:RapidLoneParen(lnum,lchar) abort
+ if a:lchar == "(" || a:lchar == ")"
+ let l:opnParChar = "("
+ let l:clsParChar = ")"
+ elseif a:lchar == "[" || a:lchar == "]"
+ let l:opnParChar = "["
+ let l:clsParChar = "]"
+ elseif a:lchar == "{" || a:lchar == "}"
+ let l:opnParChar = "{"
+ let l:clsParChar = "}"
+ else
+ return 0
+ endif
+
+ let l:line = getline(a:lnum)
+
+ " look for the first ! which is not part of a string
+ let l:len = s:RapidLenTilStr(a:lnum,"!",0)
+ if l:len == 0
+ return 0 " first char is !; ignored
+ endif
+
+ let l:opnParen = 0
+ " count opening brakets
+ let l:i = 0
+ while l:i >= 0
+ let l:i = s:RapidLenTilStr(a:lnum, l:opnParChar, l:i)
+ if l:i >= 0
+ let l:opnParen += 1
+ let l:i += 1
+ endif
+ endwhile
+
+ let l:clsParen = 0
+ " count closing brakets
+ let l:i = 0
+ while l:i >= 0
+ let l:i = s:RapidLenTilStr(a:lnum, l:clsParChar, l:i)
+ if l:i >= 0
+ let l:clsParen += 1
+ let l:i += 1
+ endif
+ endwhile
+
+ if (a:lchar == "(" || a:lchar == "[" || a:lchar == "{") && l:opnParen>l:clsParen
+ return (l:opnParen-l:clsParen)
+ elseif (a:lchar == ")" || a:lchar == "]" || a:lchar == "}") && l:clsParen>l:opnParen
+ return (l:clsParen-l:opnParen)
+ endif
+
+ return 0
+endfunction
+
+" This function works almost like prevnonblank() but handles %%%-headers and
+" comments like blank lines
+function s:RapidPreNoneBlank(lnum) abort
+
+ let nPreNoneBlank = prevnonblank(a:lnum)
+
+ while nPreNoneBlank>0 && getline(nPreNoneBlank) =~ '\v\c^\s*(\%\%\%|!)'
+ " Previouse none blank line irrelevant. Look further aback.
+ let nPreNoneBlank = prevnonblank(nPreNoneBlank - 1)
+ endwhile
+
+ return nPreNoneBlank
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:sw=2 sts=2 et
diff --git a/runtime/indent/testdir/rapid.in b/runtime/indent/testdir/rapid.in
new file mode 100644
index 0000000000..515912ed89
--- /dev/null
+++ b/runtime/indent/testdir/rapid.in
@@ -0,0 +1,266 @@
+! vim: set ft=rapid :
+
+! START_INDENT
+
+%%%
+ VERSION:1
+ LANGUAGE:ENGLISH
+%%%
+
+module LowerCaseModule
+
+task pers num n1 := 0;
+local pers num n2 := 1;
+var bool b1 := false;
+var intnum i1;
+
+! put some stuff in those strings that may confuse indentation
+const string st1 := "endmodule (";
+pers string st_Appl_Info{3,3}:=[
+[
+"["
+,
+"default"
+,
+"case"
+],
+[
+"else"
+,
+"then"
+,
+"endif"
+],
+[
+"do"
+,
+"}"
+,
+")"
+],
+];
+
+pers tooldata tTool1:=[TRUE,
+[
+[97.4, 0, 223.1],
+[0.924, 0, 0.383 ,0]
+],
+[5,
+[23, 0, 75],
+[1, 0, 0, 0], 0, 0, 0
+]
+];
+const robtarget p1:=[
+[600, 500, 225.3],
+[1, 0, 0, 0],
+[1, 1, 0, 0],
+[ 11, 12.3, 9E9, 9E9, 9E9, 9E9]
+];
+
+record myRec
+num nRecNum1
+bool bRecBool1
+endrecord
+
+proc proc1(num n1,
+num n2)
+var string st1;
+n1 := n1+1;
+MoveJSync p1, vmax, z30, tool1, "proc2";
+backward
+MoveJSync p1, v100, fine, tool1, "proc2";
+undo
+n1 := n1-1;
+error
+trynext;
+endproc
+
+func num nFunc1(
+switch s1
+|switch s2
+,num n1
+,bool b1)
+var num nVar;
+if not Present(s1) return;
+if Present(s1) then
+Incr n1;'
+elseif Present(s2) then
+b1:=false;
+else
+while n1>0 do
+Decr n1;
+test n1
+
+case 1:
+test1;
+case 2:
+test2;
+default:
+WaitUntil false;
+endtest
+endwhile
+endif
+for i from 1 to 10 step 2 do
+for j from 1 to 10 do
+st_Appl_Info{i,j} := "";
+endfor
+endfor
+! return 1;
+return 0;
+error
+return -1;
+endfunc
+
+trap Trap1
+Reset do1;
+endtrap
+
+endmodule
+
+MODULE UpperCaseModule(SYSMODULE,NOSTEPIN)
+TASK pers num n1 := 0;
+LOCAL pers num n2 := 1;
+VAR bool b1 := false;
+VAR intnum i1;
+
+LOCAL FUNC num nFunc1(
+switch s1
+|switch s2
+,num n1
+,bool b1)
+VAR num nVar;
+IF NOT PRESENT(s1) RETURN;
+IF PRESENT(s1) THEN
+INCR n1;'
+ELSEIF PRESENT(s2) THEN
+b1:=FALSE;
+ELSE
+WHILE n1>0 DO
+DECR n1;
+TEST n1
+
+CASE 1:
+test1;
+CASE 2:
+test2;
+DEFAULT:
+WAITUNTIL FALSE;
+ENDTEST
+ENDWHILE
+ENDIF
+FOR i FROM 1 TO 10 STEP 2 DO
+FOR j FROM 1 TO 10 DO
+st_Appl_Info{i,j} := "";
+ENDFOR
+ENDFOR
+! RETURN 1;
+RETURN 0;
+ERROR
+RETURN -1;
+ENDFUNC
+
+TRAP Trap1
+Reset do1;
+ENDTRAP
+
+ENDMODULE
+
+Module MixedCaseModule(SysModule)
+Task pers num n1 := 0;
+Local pers num n2 := 1;
+Var bool b1 := false;
+Var intnum i1;
+
+Task Func num nFunc1(
+switch s1
+|switch s2
+,num n1
+,bool b1)
+Var num nVar;
+If Not Present(s1) Return;
+If Present(s1) Then
+Incr n1;'
+ElseIf Present(s2) Then
+b1:=false;
+Else
+While n1>0 Do
+Decr n1;
+Test n1
+
+Case 1:
+test1;
+Case 2:
+test2;
+Default:
+WaitUntil false;
+EndTest
+EndWhile
+EndIf
+For i From 1 To 10 Step 2 Do
+For j From 1 To 10 Do
+st_Appl_Info{i,j} := "";
+EndFor
+EndFor
+! Return 1;
+Return 0;
+Error
+Return -1;
+EndFunc
+
+Trap Trap1
+Reset do1;
+EndTrap
+
+EndModule
+
+! END_INDENT
+
+! START_INDENT
+! INDENT_EXE let g:rapidSpaceIndent = 0
+! INDENT_EXE set shiftwidth=4
+
+proc bla()
+var num i;
+Incr i;
+endproc
+
+! END_INDENT
+
+! START_INDENT
+! INDENT_EXE let g:rapidCommentIndent = 1
+!
+proc bla()
+! indent this first column comment because of g:rapidCommentIndent=1
+endproc
+! END_INDENT
+
+! START_INDENT
+! INDENT_EXE let g:rapidNewStyleIndent = 1
+pers string st_Appl_Info{3,3}:=
+[
+[
+"["
+,
+"default"
+,
+"case"
+]
+,
+[
+"else"
+,
+"then"
+,
+"endif"
+]
+,
+[
+"do"
+,
+"}"
+,
+")"
+]
+,
+];
+! END_INDENT
diff --git a/runtime/indent/testdir/rapid.ok b/runtime/indent/testdir/rapid.ok
new file mode 100644
index 0000000000..ce336821c4
--- /dev/null
+++ b/runtime/indent/testdir/rapid.ok
@@ -0,0 +1,266 @@
+! vim: set ft=rapid :
+
+! START_INDENT
+
+%%%
+VERSION:1
+LANGUAGE:ENGLISH
+%%%
+
+module LowerCaseModule
+
+ task pers num n1 := 0;
+ local pers num n2 := 1;
+ var bool b1 := false;
+ var intnum i1;
+
+! put some stuff in those strings that may confuse indentation
+ const string st1 := "endmodule (";
+ pers string st_Appl_Info{3,3}:=[
+ [
+ "["
+ ,
+ "default"
+ ,
+ "case"
+ ],
+ [
+ "else"
+ ,
+ "then"
+ ,
+ "endif"
+ ],
+ [
+ "do"
+ ,
+ "}"
+ ,
+ ")"
+ ],
+ ];
+
+ pers tooldata tTool1:=[TRUE,
+ [
+ [97.4, 0, 223.1],
+ [0.924, 0, 0.383 ,0]
+ ],
+ [5,
+ [23, 0, 75],
+ [1, 0, 0, 0], 0, 0, 0
+ ]
+ ];
+ const robtarget p1:=[
+ [600, 500, 225.3],
+ [1, 0, 0, 0],
+ [1, 1, 0, 0],
+ [ 11, 12.3, 9E9, 9E9, 9E9, 9E9]
+ ];
+
+ record myRec
+ num nRecNum1
+ bool bRecBool1
+ endrecord
+
+ proc proc1(num n1,
+ num n2)
+ var string st1;
+ n1 := n1+1;
+ MoveJSync p1, vmax, z30, tool1, "proc2";
+ backward
+ MoveJSync p1, v100, fine, tool1, "proc2";
+ undo
+ n1 := n1-1;
+ error
+ trynext;
+ endproc
+
+ func num nFunc1(
+ switch s1
+ |switch s2
+ ,num n1
+ ,bool b1)
+ var num nVar;
+ if not Present(s1) return;
+ if Present(s1) then
+ Incr n1;'
+ elseif Present(s2) then
+ b1:=false;
+ else
+ while n1>0 do
+ Decr n1;
+ test n1
+
+ case 1:
+ test1;
+ case 2:
+ test2;
+ default:
+ WaitUntil false;
+ endtest
+ endwhile
+ endif
+ for i from 1 to 10 step 2 do
+ for j from 1 to 10 do
+ st_Appl_Info{i,j} := "";
+ endfor
+ endfor
+! return 1;
+ return 0;
+ error
+ return -1;
+ endfunc
+
+ trap Trap1
+ Reset do1;
+ endtrap
+
+endmodule
+
+MODULE UpperCaseModule(SYSMODULE,NOSTEPIN)
+ TASK pers num n1 := 0;
+ LOCAL pers num n2 := 1;
+ VAR bool b1 := false;
+ VAR intnum i1;
+
+ LOCAL FUNC num nFunc1(
+ switch s1
+ |switch s2
+ ,num n1
+ ,bool b1)
+ VAR num nVar;
+ IF NOT PRESENT(s1) RETURN;
+ IF PRESENT(s1) THEN
+ INCR n1;'
+ ELSEIF PRESENT(s2) THEN
+ b1:=FALSE;
+ ELSE
+ WHILE n1>0 DO
+ DECR n1;
+ TEST n1
+
+ CASE 1:
+ test1;
+ CASE 2:
+ test2;
+ DEFAULT:
+ WAITUNTIL FALSE;
+ ENDTEST
+ ENDWHILE
+ ENDIF
+ FOR i FROM 1 TO 10 STEP 2 DO
+ FOR j FROM 1 TO 10 DO
+ st_Appl_Info{i,j} := "";
+ ENDFOR
+ ENDFOR
+! RETURN 1;
+ RETURN 0;
+ ERROR
+ RETURN -1;
+ ENDFUNC
+
+ TRAP Trap1
+ Reset do1;
+ ENDTRAP
+
+ENDMODULE
+
+Module MixedCaseModule(SysModule)
+ Task pers num n1 := 0;
+ Local pers num n2 := 1;
+ Var bool b1 := false;
+ Var intnum i1;
+
+ Task Func num nFunc1(
+ switch s1
+ |switch s2
+ ,num n1
+ ,bool b1)
+ Var num nVar;
+ If Not Present(s1) Return;
+ If Present(s1) Then
+ Incr n1;'
+ ElseIf Present(s2) Then
+ b1:=false;
+ Else
+ While n1>0 Do
+ Decr n1;
+ Test n1
+
+ Case 1:
+ test1;
+ Case 2:
+ test2;
+ Default:
+ WaitUntil false;
+ EndTest
+ EndWhile
+ EndIf
+ For i From 1 To 10 Step 2 Do
+ For j From 1 To 10 Do
+ st_Appl_Info{i,j} := "";
+ EndFor
+ EndFor
+! Return 1;
+ Return 0;
+ Error
+ Return -1;
+ EndFunc
+
+ Trap Trap1
+ Reset do1;
+ EndTrap
+
+EndModule
+
+! END_INDENT
+
+! START_INDENT
+! INDENT_EXE let g:rapidSpaceIndent = 0
+! INDENT_EXE set shiftwidth=4
+
+proc bla()
+ var num i;
+ Incr i;
+endproc
+
+! END_INDENT
+
+! START_INDENT
+! INDENT_EXE let g:rapidCommentIndent = 1
+!
+proc bla()
+ ! indent this first column comment because of g:rapidCommentIndent=1
+endproc
+! END_INDENT
+
+! START_INDENT
+! INDENT_EXE let g:rapidNewStyleIndent = 1
+pers string st_Appl_Info{3,3}:=
+[
+ [
+ "["
+ ,
+ "default"
+ ,
+ "case"
+ ]
+ ,
+ [
+ "else"
+ ,
+ "then"
+ ,
+ "endif"
+ ]
+ ,
+ [
+ "do"
+ ,
+ "}"
+ ,
+ ")"
+ ]
+ ,
+];
+! END_INDENT
diff --git a/runtime/indent/testdir/vim.in b/runtime/indent/testdir/vim.in
index c60d2d1160..c2e149ab37 100644
--- a/runtime/indent/testdir/vim.in
+++ b/runtime/indent/testdir/vim.in
@@ -484,6 +484,13 @@ endif
" END_INDENT
" START_INDENT
+if true
+var d = {
+end: 0}
+endif
+" END_INDENT
+
+" START_INDENT
nunmap <buffer> (
nunmap <buffer> )
inoremap [ {
diff --git a/runtime/indent/testdir/vim.ok b/runtime/indent/testdir/vim.ok
index 57f0dbf34d..b10e081dd8 100644
--- a/runtime/indent/testdir/vim.ok
+++ b/runtime/indent/testdir/vim.ok
@@ -484,6 +484,13 @@ endif
" END_INDENT
" START_INDENT
+if true
+ var d = {
+ end: 0}
+endif
+" END_INDENT
+
+" START_INDENT
nunmap <buffer> (
nunmap <buffer> )
inoremap [ {
diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim
index 25bfdeb004..e26d3a17ab 100644
--- a/src/testdir/test_filetype.vim
+++ b/src/testdir/test_filetype.vim
@@ -298,6 +298,7 @@ def s:GetFilenameChecks(): dict<list<string>>
handlebars: ['file.hbs'],
hare: ['file.ha'],
haskell: ['file.hs', 'file.hsc', 'file.hs-boot', 'file.hsig'],
+ haskellpersistent: ['file.persistentmodels'],
haste: ['file.ht'],
hastepreproc: ['file.htpp'],
hb: ['file.hb'],
@@ -316,6 +317,7 @@ def s:GetFilenameChecks(): dict<list<string>>
html: ['file.html', 'file.htm', 'file.cshtml'],
htmlm4: ['file.html.m4'],
httest: ['file.htt', 'file.htb'],
+ hurl: ['file.hurl'],
i3config: ['/home/user/.i3/config', '/home/user/.config/i3/config', '/etc/i3/config', '/etc/xdg/i3/config'],
ibasic: ['file.iba', 'file.ibi'],
icemenu: ['/.icewm/menu', 'any/.icewm/menu'],
@@ -564,6 +566,7 @@ def s:GetFilenameChecks(): dict<list<string>>
readline: ['.inputrc', 'inputrc'],
rego: ['file.rego'],
remind: ['.reminders', 'file.remind', 'file.rem', '.reminders-file'],
+ requirements: ['file.pip', 'requirements.txt'],
rescript: ['file.res', 'file.resi'],
resolv: ['resolv.conf'],
reva: ['file.frt'],
diff --git a/src/testdir/test_lua.vim b/src/testdir/test_lua.vim
index 2f9e21fb62..81e9262ca2 100644
--- a/src/testdir/test_lua.vim
+++ b/src/testdir/test_lua.vim
@@ -616,10 +616,10 @@ endfunc
func Test_lua_blob()
call assert_equal(0z, luaeval('vim.blob("")'))
call assert_equal(0z31326162, luaeval('vim.blob("12ab")'))
- call assert_equal(0z00010203, luaeval('vim.blob("\x00\x01\x02\x03")'))
- call assert_equal(0z8081FEFF, luaeval('vim.blob("\x80\x81\xfe\xff")'))
+ call assert_equal(0z00010203, luaeval('vim.blob("\000\001\002\003")'))
+ call assert_equal(0z8081FEFF, luaeval('vim.blob("\128\129\254\255")'))
- lua b = vim.blob("\x00\x00\x00\x00")
+ lua b = vim.blob("\000\000\000\000")
call assert_equal(0z00000000, luaeval('b'))
call assert_equal(4, luaeval('#b'))
lua b[0], b[1], b[2], b[3] = 1, 32, 256, 0xff
diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim
index f9c21bb073..e81173d2bc 100644
--- a/src/testdir/test_mapping.vim
+++ b/src/testdir/test_mapping.vim
@@ -1341,13 +1341,13 @@ func Test_map_cmdkey_op_pending_mode()
call assert_equal(['lines', 'of test text'], getline(1, '$'))
call assert_equal(['some short '], getreg('"', 1, 1))
" create a new undo point
- let &undolevels = &undolevels
+ let &g:undolevels = &g:undolevels
call feedkeys(".", 'xt')
call assert_equal(['test text'], getline(1, '$'))
call assert_equal(['lines', 'of '], getreg('"', 1, 1))
" create a new undo point
- let &undolevels = &undolevels
+ let &g:undolevels = &g:undolevels
call feedkeys("uu", 'xt')
call assert_equal(['some short lines', 'of test text'], getline(1, '$'))
diff --git a/src/testdir/test_signs.vim b/src/testdir/test_signs.vim
index 95e8d44869..ffde9b8739 100644
---