changeset 15085:1783c0b6bc2e v8.1.0553

patch 8.1.0553: it is not easy to edit a script that was sourced commit https://github.com/vim/vim/commit/07dc18ffa4e7ed202f219fe2fd3d6f58246f71f9 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Nov 30 22:48:32 2018 +0100 patch 8.1.0553: it is not easy to edit a script that was sourced Problem: It is not easy to edit a script that was sourced. Solution: Add a count to ":scriptnames", so that ":script 40" edits the script with script ID 40.
author Bram Moolenaar <Bram@vim.org>
date Fri, 30 Nov 2018 23:00:06 +0100
parents e25cb9813f25
children 69acf1d6d719
files runtime/doc/repeat.txt src/Make_all.mak src/ex_cmds.h src/ex_cmds2.c src/testdir/Make_all.mak src/testdir/test_scriptnames.vim src/version.c
diffstat 7 files changed, 58 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/repeat.txt
+++ b/runtime/doc/repeat.txt
@@ -334,6 +334,9 @@ For writing a Vim script, see chapter 41
 			{not in Vi} {not available when compiled without the
 			|+eval| feature}
 
+:scr[iptnames][!] {scriptId}			*:script*
+			Edit script {scriptId}.  Suggested name is ":script".
+
 						*:fini* *:finish* *E168*
 :fini[sh]		Stop sourcing a script.  Can only be used in a Vim
 			script file.  This is a quick way to skip the rest of
--- a/src/Make_all.mak
+++ b/src/Make_all.mak
@@ -153,6 +153,7 @@ NEW_TESTS = \
 	test_reltime \
 	test_retab \
 	test_ruby \
+	test_scriptnames \
 	test_scroll_opt \
 	test_scrollbind \
 	test_search \
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -62,15 +62,15 @@
 #define FILE1	(FILES | NOSPC)	/* 1 file allowed, defaults to current file */
 
 /* values for cmd_addr_type */
-#define ADDR_LINES		0
-#define ADDR_WINDOWS		1
-#define ADDR_ARGUMENTS		2
-#define ADDR_LOADED_BUFFERS	3
-#define ADDR_BUFFERS		4
-#define ADDR_TABS		5
-#define ADDR_TABS_RELATIVE	6   /* Tab page that only relative */
-#define ADDR_QUICKFIX		7
-#define ADDR_OTHER		99
+#define ADDR_LINES		0   // buffer line numbers
+#define ADDR_WINDOWS		1   // window number
+#define ADDR_ARGUMENTS		2   // argument number
+#define ADDR_LOADED_BUFFERS	3   // buffer number of loaded buffer
+#define ADDR_BUFFERS		4   // buffer number
+#define ADDR_TABS		5   // tab page number
+#define ADDR_TABS_RELATIVE	6   // Tab page that only relative
+#define ADDR_QUICKFIX		7   // quickfix list entry number
+#define ADDR_OTHER		99  // something else
 
 #ifndef DO_DECLARE_EXCMD
 typedef struct exarg exarg_T;
@@ -1260,8 +1260,8 @@ EX(CMD_sbrewind,	"sbrewind",	ex_brewind,
 			EDITCMD|TRLBAR,
 			ADDR_LINES),
 EX(CMD_scriptnames,	"scriptnames",	ex_scriptnames,
-			TRLBAR|CMDWIN,
-			ADDR_LINES),
+			BANG|RANGE|NOTADR|COUNT|TRLBAR|CMDWIN,
+			ADDR_OTHER),
 EX(CMD_scriptencoding,	"scriptencoding", ex_scriptencoding,
 			WORD1|TRLBAR|CMDWIN,
 			ADDR_LINES),
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -4690,10 +4690,23 @@ theend:
  * ":scriptnames"
  */
     void
-ex_scriptnames(exarg_T *eap UNUSED)
+ex_scriptnames(exarg_T *eap)
 {
     int i;
 
+    if (eap->addr_count > 0)
+    {
+	// :script {scriptId}: edit the script
+	if (eap->line2 < 1 || eap->line2 > script_items.ga_len)
+	    EMSG(_(e_invarg));
+	else
+	{
+	    eap->arg = SCRIPT_ITEM(eap->line2).sn_name;
+	    do_exedit(eap, NULL);
+	}
+	return;
+    }
+
     for (i = 1; i <= script_items.ga_len && !got_int; ++i)
 	if (SCRIPT_ITEM(i).sn_name != NULL)
 	{
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -158,6 +158,7 @@ NEW_TESTS = test_arabic.res \
 	    test_registers.res \
 	    test_retab.res \
 	    test_ruby.res \
+	    test_scriptnames.res \
 	    test_scrollbind.res \
 	    test_search.res \
 	    test_shortpathname.res \
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_scriptnames.vim
@@ -0,0 +1,26 @@
+" Test for :scriptnames
+
+func Test_scriptnames()
+  call writefile(['let did_load_script = 123'], 'Xscripting')
+  source Xscripting
+  call assert_equal(123, g:did_load_script)
+
+  let scripts = split(execute('scriptnames'), "\n")
+  let last = scripts[-1]
+  call assert_match('\<Xscripting\>', last)
+  let lastnr = substitute(last, '\D*\(\d\+\):.*', '\1', '')
+  exe 'script ' . lastnr
+  call assert_equal('Xscripting', expand('%:t'))
+
+  call assert_fails('script ' . (lastnr + 1), 'E474:')
+  call assert_fails('script 0', 'E939:')
+
+  new
+  call setline(1, 'nothing')
+  call assert_fails('script ' . lastnr, 'E37:')
+  exe 'script! ' . lastnr
+  call assert_equal('Xscripting', expand('%:t'))
+
+  bwipe
+  call delete('Xscripting')
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -793,6 +793,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    553,
+/**/
     552,
 /**/
     551,