summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-01 20:45:11 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-01 20:45:11 +0200
commit909443028b57d7514ce3c71f00e9d808f2126b4f (patch)
tree1d574ce00cdb456fbd241dadb493ed652d657a40
parent491799be5084dde7aa3367462f306e7b71dbc4a5 (diff)
downloadvim-git-909443028b57d7514ce3c71f00e9d808f2126b4f.tar.gz
patch 8.2.1347: cannot easily get the script IDv8.2.1347
Problem: Cannot easily get the script ID. Solution: Support expand('<SID>').
-rw-r--r--runtime/doc/map.txt4
-rw-r--r--src/ex_docmd.c14
-rw-r--r--src/testdir/test_expand_func.vim25
-rw-r--r--src/version.c2
4 files changed, 38 insertions, 7 deletions
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index 0ad43d449..79c46f712 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -1167,6 +1167,10 @@ When executing an autocommand or a user command, it will run in the context of
the script it was defined in. This makes it possible that the command calls a
local function or uses a local mapping.
+In case the value is used in a context where <SID> cannot be correctly
+expanded, use the expand() function: >
+ let &includexpr = expand('<SID>') .. 'My_includeexpr()'
+
Otherwise, using "<SID>" outside of a script context is an error.
If you need to get the script number to use in a complicated script, you can
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 7f9d71635..1f36bf7e0 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -8302,9 +8302,11 @@ find_cmdline_var(char_u *src, int *usedlen)
#define SPEC_AMATCH (SPEC_ABUF + 1)
"<sflnum>", // script file line number
#define SPEC_SFLNUM (SPEC_AMATCH + 1)
+ "<SID>", // script ID: <SNR>123_
+#define SPEC_SID (SPEC_SFLNUM + 1)
#ifdef FEAT_CLIENTSERVER
"<client>"
-# define SPEC_CLIENT (SPEC_SFLNUM + 1)
+# define SPEC_CLIENT (SPEC_SID + 1)
#endif
};
@@ -8581,6 +8583,16 @@ eval_vars(
break;
#endif
+ case SPEC_SID:
+ if (current_sctx.sc_sid <= 0)
+ {
+ *errormsg = _(e_usingsid);
+ return NULL;
+ }
+ sprintf((char *)strbuf, "<SNR>%d_", current_sctx.sc_sid);
+ result = strbuf;
+ break;
+
#ifdef FEAT_CLIENTSERVER
case SPEC_CLIENT: // Source of last submitted input
sprintf((char *)strbuf, PRINTF_HEX_LONG_U,
diff --git a/src/testdir/test_expand_func.vim b/src/testdir/test_expand_func.vim
index 41673e50a..42aa8e01b 100644
--- a/src/testdir/test_expand_func.vim
+++ b/src/testdir/test_expand_func.vim
@@ -1,5 +1,7 @@
" Tests for expand()
+source shared.vim
+
let s:sfile = expand('<sfile>')
let s:slnum = str2nr(expand('<slnum>'))
let s:sflnum = str2nr(expand('<sflnum>'))
@@ -18,20 +20,20 @@ endfunc
" This test depends on the location in the test file, put it first.
func Test_expand_sflnum()
- call assert_equal(5, s:sflnum)
- call assert_equal(22, str2nr(expand('<sflnum>')))
+ call assert_equal(7, s:sflnum)
+ call assert_equal(24, str2nr(expand('<sflnum>')))
" Line-continuation
call assert_equal(
- \ 25,
+ \ 27,
\ str2nr(expand('<sflnum>')))
" Call in script-local function
- call assert_equal(16, s:expand_sflnum())
+ call assert_equal(18, s:expand_sflnum())
" Call in command
command Flnum echo expand('<sflnum>')
- call assert_equal(34, str2nr(trim(execute('Flnum'))))
+ call assert_equal(36, str2nr(trim(execute('Flnum'))))
delcommand Flnum
endfunc
@@ -60,7 +62,7 @@ func Test_expand_sfile_and_stack()
endfunc
func Test_expand_slnum()
- call assert_equal(4, s:slnum)
+ call assert_equal(6, s:slnum)
call assert_equal(2, str2nr(expand('<slnum>')))
" Line-continuation
@@ -86,6 +88,17 @@ func Test_expand()
quit
endfunc
+func s:sid_test()
+ return 'works'
+endfunc
+
+func Test_expand_SID()
+ let sid = expand('<SID>')
+ execute 'let g:sid_result = ' .. sid .. 'sid_test()'
+ call assert_equal('works', g:sid_result)
+endfunc
+
+
" Test for 'wildignore' with expand()
func Test_expand_wildignore()
set wildignore=*.vim
diff --git a/src/version.c b/src/version.c
index cdb26a258..6b1a36773 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1347,
+/**/
1346,
/**/
1345,