aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/testdir/script_util.vim
diff options
context:
space:
mode:
authorAndy K. Massimino <f8a663@normed.space>2021-03-05 00:03:08 -0500
committerAndy K. Massimino <f8a663@normed.space>2021-03-20 15:56:37 -0400
commit7e89606591c76efc7587911ff6d9c3414525f2a2 (patch)
tree307cb6d78d69e90d382519b578cf6375e5777a50 /src/nvim/testdir/script_util.vim
parent8601e8b0d628037d253b76de8aa524c6174f4af9 (diff)
downloadrneovim-7e89606591c76efc7587911ff6d9c3414525f2a2.tar.gz
rneovim-7e89606591c76efc7587911ff6d9c3414525f2a2.tar.bz2
rneovim-7e89606591c76efc7587911ff6d9c3414525f2a2.zip
vim-patch:8.2.1705: "verbose hi Name" reports incorrect info after ":hi clear"
Problem: "verbose hi Name" reports incorrect info after ":hi clear". Solution: Store the script context. (Antony Scriven, closes vim/vim#6975) https://github.com/vim/vim/commit/e8df0104985af58ee501a6fbac8ac9f886e84e5a Also adds src/nvim/testdir/script_util.vim which originates from patch 8.2.1366 (https://github.com/vim/vim/commit/a6296200bd5191bab7efcdcc16c9e79eb498e8e0) because some tests in test_highlight.vim use it for testing :verbose. Should merge this and older related patches later. Also, fix collateral damage to test_options.vim test_options tests for file name completion in the test directory, but since we've added a new file, the test output is now different. This test is slightly different from upstream anyway, so for now we just add the file name. This may change when more upstream patches are added which alter this test.
Diffstat (limited to 'src/nvim/testdir/script_util.vim')
-rw-r--r--src/nvim/testdir/script_util.vim69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/nvim/testdir/script_util.vim b/src/nvim/testdir/script_util.vim
new file mode 100644
index 0000000000..9913b1dfaf
--- /dev/null
+++ b/src/nvim/testdir/script_util.vim
@@ -0,0 +1,69 @@
+" Functions shared by the tests for Vim Script
+
+" Commands to track the execution path of a script
+com! XpathINIT let g:Xpath = ''
+com! -nargs=1 -bar Xpath let g:Xpath ..= <args>
+com! XloopINIT let g:Xloop = 1
+com! -nargs=1 -bar Xloop let g:Xpath ..= <args> .. g:Xloop
+com! XloopNEXT let g:Xloop += 1
+
+" MakeScript() - Make a script file from a function. {{{2
+"
+" Create a script that consists of the body of the function a:funcname.
+" Replace any ":return" by a ":finish", any argument variable by a global
+" variable, and every ":call" by a ":source" for the next following argument
+" in the variable argument list. This function is useful if similar tests are
+" to be made for a ":return" from a function call or a ":finish" in a script
+" file.
+func MakeScript(funcname, ...)
+ let script = tempname()
+ execute "redir! >" . script
+ execute "function" a:funcname
+ redir END
+ execute "edit" script
+ " Delete the "function" and the "endfunction" lines. Do not include the
+ " word "function" in the pattern since it might be translated if LANG is
+ " set. When MakeScript() is being debugged, this deletes also the debugging
+ " output of its line 3 and 4.
+ exec '1,/.*' . a:funcname . '(.*)/d'
+ /^\d*\s*endfunction\>/,$d
+ %s/^\d*//e
+ %s/return/finish/e
+ %s/\<a:\(\h\w*\)/g:\1/ge
+ normal gg0
+ let cnt = 0
+ while search('\<call\s*\%(\u\|s:\)\w*\s*(.*)', 'W') > 0
+ let cnt = cnt + 1
+ s/\<call\s*\%(\u\|s:\)\w*\s*(.*)/\='source ' . a:{cnt}/
+ endwhile
+ g/^\s*$/d
+ write
+ bwipeout
+ return script
+endfunc
+
+" ExecAsScript - Source a temporary script made from a function. {{{2
+"
+" Make a temporary script file from the function a:funcname, ":source" it, and
+" delete it afterwards. However, if an exception is thrown the file may remain,
+" the caller should call DeleteTheScript() afterwards.
+let s:script_name = ''
+function! ExecAsScript(funcname)
+ " Make a script from the function passed as argument.
+ let s:script_name = MakeScript(a:funcname)
+
+ " Source and delete the script.
+ exec "source" s:script_name
+ call delete(s:script_name)
+ let s:script_name = ''
+endfunction
+
+function! DeleteTheScript()
+ if s:script_name
+ call delete(s:script_name)
+ let s:script_name = ''
+ endif
+endfunc
+
+com! -nargs=1 -bar ExecAsScript call ExecAsScript(<f-args>)
+