aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/undo.txt26
-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/lua/vim/filetype.lua6
-rw-r--r--test/old/testdir/test_filetype.vim3
-rw-r--r--test/old/testdir/test_mapping.vim4
-rw-r--r--test/old/testdir/test_signs.vim4
8 files changed, 821 insertions, 9 deletions
diff --git a/runtime/doc/undo.txt b/runtime/doc/undo.txt
index 36b2ff9e4e..3fcc196250 100644
--- a/runtime/doc/undo.txt
+++ b/runtime/doc/undo.txt
@@ -114,7 +114,17 @@ 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: >
+new value is equal to the old value. Use `g:undolevels` to explicitly read
+and write only the global value of 'undolevels'. >
+ 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
==============================================================================
@@ -351,12 +361,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/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/lua/vim/filetype.lua b/runtime/lua/vim/filetype.lua
index 1bbe88f06d..1ea88ebc06 100644
--- a/runtime/lua/vim/filetype.lua
+++ b/runtime/lua/vim/filetype.lua
@@ -479,15 +479,16 @@ local extension = {
hsig = 'haskell',
hsc = 'haskell',
hs = 'haskell',
+ persistentmodels = 'haskellpersistent',
ht = 'haste',
htpp = 'hastepreproc',
+ hcl = 'hcl',
hb = 'hb',
h = detect.header,
sum = 'hercules',
errsum = 'hercules',
ev = 'hercules',
vc = 'hercules',
- hcl = 'hcl',
heex = 'heex',
hex = 'hex',
['h32'] = 'hex',
@@ -506,6 +507,7 @@ local extension = {
stm = detect.html,
htt = 'httest',
htb = 'httest',
+ hurl = 'hurl',
hw = detect.hw,
module = detect.hw,
pkg = detect.hw,
@@ -818,6 +820,7 @@ local extension = {
rego = 'rego',
rem = 'remind',
remind = 'remind',
+ pip = 'requirements',
res = 'rescript',
resi = 'rescript',
frt = 'reva',
@@ -1419,6 +1422,7 @@ local filename = {
inputrc = 'readline',
['.inputrc'] = 'readline',
['.reminders'] = 'remind',
+ ['requirements.txt'] = 'requirements',
['resolv.conf'] = 'resolv',
['robots.txt'] = 'robots',
Gemfile = 'ruby',
diff --git a/test/old/testdir/test_filetype.vim b/test/old/testdir/test_filetype.vim
index b459191159..f1d08e3d99 100644
--- a/test/old/testdir/test_filetype.vim
+++ b/test/old/testdir/test_filetype.vim
@@ -288,6 +288,7 @@ func s:GetFilenameChecks() abort
\ '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'],
@@ -306,6 +307,7 @@ func s:GetFilenameChecks() abort
\ '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'],
@@ -524,6 +526,7 @@ func s:GetFilenameChecks() abort
\ '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/test/old/testdir/test_mapping.vim b/test/old/testdir/test_mapping.vim
index 8c957d4665..f8c8bc95f9 100644
--- a/test/old/testdir/test_mapping.vim
+++ b/test/old/testdir/test_mapping.vim
@@ -1321,13 +1321,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/test/old/testdir/test_signs.vim b/test/old/testdir/test_signs.vim
index 1e972371a5..64271c588e 100644
--- a/test/old/testdir/test_signs.vim
+++ b/test/old/testdir/test_signs.vim
@@ -1668,7 +1668,7 @@ func Test_sign_lnum_adjust()
" Break the undo. Otherwise the undo operation below will undo all the
" changes made by this function.
- let &undolevels=&undolevels
+ let &g:undolevels=&g:undolevels
" Nvim: make sign adjustment when deleting lines match Vim
set signcolumn=yes:1
@@ -1684,7 +1684,7 @@ func Test_sign_lnum_adjust()
call assert_equal(5, l[0].signs[0].lnum)
" Break the undo
- let &undolevels=&undolevels
+ let &g:undolevels=&g:undolevels
" Delete few lines at the end of the buffer including the line with the sign
" Sign line number should not change (as it is placed outside of the buffer)