changeset 15378:0d76dd701e49 v8.1.0697

patch 8.1.0697: ":sign place" requires the buffer argument commit https://github.com/vim/vim/commit/b328cca2548936c5f68fff683049a929882f5011 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 6 16:24:01 2019 +0100 patch 8.1.0697: ":sign place" requires the buffer argument Problem: ":sign place" requires the buffer argument. Solution: Make the argument optional. Also update the help and clean up the sign test. (Yegappan Lakshmanan, closes #3767)
author Bram Moolenaar <Bram@vim.org>
date Sun, 06 Jan 2019 16:30:05 +0100
parents 88b0a490816e
children 8a81844b9925
files runtime/doc/eval.txt runtime/doc/sign.txt src/sign.c src/testdir/test_signs.vim src/version.c
diffstat 5 files changed, 106 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt*	For Vim version 8.1.  Last change: 2019 Jan 01
+*eval.txt*	For Vim version 8.1.  Last change: 2019 Jan 06
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -3945,20 +3945,24 @@ extend({expr1}, {expr2} [, {expr3}])			*
 feedkeys({string} [, {mode}])				*feedkeys()*
 		Characters in {string} are queued for processing as if they
 		come from a mapping or were typed by the user.
+
 		By default the string is added to the end of the typeahead
 		buffer, thus if a mapping is still being executed the
 		characters come after them.  Use the 'i' flag to insert before
 		other characters, they will be executed next, before any
 		characters from a mapping.
+
 		The function does not wait for processing of keys contained in
 		{string}.
+
 		To include special keys into {string}, use double-quotes
 		and "\..." notation |expr-quote|. For example,
 		feedkeys("\<CR>") simulates pressing of the <Enter> key. But
 		feedkeys('\<CR>') pushes 5 characters.
-		If {mode} is absent, keys are remapped.
+
 		{mode} is a String, which can contain these character flags:
-		'm'	Remap keys. This is default.
+		'm'	Remap keys. This is default.  If {mode} is absent,
+			keys are remapped.
 		'n'	Do not remap keys.
 		't'	Handle keys as if typed; otherwise they are handled as
 			if coming from a mapping.  This matters for undo,
@@ -3972,6 +3976,9 @@ feedkeys({string} [, {mode}])				*feedke
 			will behave as if <Esc> is typed, to avoid getting
 			stuck, waiting for a character to be typed before the
 			script continues.
+			Note that if you manage to call feedkeys() while
+			executing commands, thus calling it recursively, the
+			all typehead will be consumed by the last call.
 		'!'	When used with 'x' will not end Insert mode. Can be
 			used in a test when a timer is set to exit Insert mode
 			a little later.  Useful for testing CursorHoldI.
@@ -6700,8 +6707,9 @@ prop_add({lnum}, {col}, {props})
 				another line; can be zero
 		   end_lnum	line number for the end of text
 		   end_col	column just after the text; not used when "length"
-				is present; when {col} and "end_col" are equal
-				this is a zero-width text property
+				is present; when {col} and "end_col" are
+				equal, and "end_lnum" is omitted or equal to
+				{lnum}, this is a zero-width text property
 		   bufnr	buffer to add the property to; when omitted
 		   		the current buffer is used
 		   id		user defined ID for the property; when omitted
@@ -7454,7 +7462,8 @@ serverlist()					*serverlist()*
 <
 setbufline({expr}, {lnum}, {text})			*setbufline()*
 		Set line {lnum} to {text} in buffer {expr}.  To insert
-		lines use |append()|.
+		lines use |append()|.  Any text properties in {lnum} are
+		cleared.
 
 		For the use of {expr}, see |bufname()| above.
 
@@ -7534,7 +7543,7 @@ setfperm({fname}, {mode})				*setfperm()
 setline({lnum}, {text})					*setline()*
 		Set line {lnum} of the current buffer to {text}.  To insert
 		lines use |append()|. To set lines in another buffer use
-		|setbufline()|.
+		|setbufline()|.  Any text properties in {lnum} are cleared.
 
 		{lnum} is used like with |getline()|.
 		When {lnum} is just below the last line the {text} will be
@@ -7891,7 +7900,9 @@ sign_define({name} [, {dict}])				*sign_
 		   text		text that is displayed when there is no icon
 				or the GUI is not being used.
 		   texthl	highlight group used for the text item
-		For an existing sign, the attributes are updated.
+
+		If the sign named {name} already exists, then the attributes
+		of the sign are updated.
 
 		Returns 0 on success and -1 on failure.
 
@@ -7944,6 +7955,7 @@ sign_getplaced([{expr} [, {dict}]])			*s
 		empty string, then only signs in the global group are
 		returned.  If no arguments are supplied, then signs in the
 		global group placed in all the buffers are returned.
+		See |sign-group|.
 
 		Each list item in the returned value is a dictionary with the
 		following entries:
@@ -7959,7 +7971,8 @@ sign_getplaced([{expr} [, {dict}]])			*s
 			name	name of the defined sign
 			priority	sign priority
 
-		Returns an empty list on failure.
+		Returns an empty list on failure or if there are no placed
+		signs.
 
 		Examples: >
 			" Get a List of signs placed in eval.c in the
@@ -7992,7 +8005,8 @@ sign_place({id}, {group}, {name}, {expr}
 		allocated.  Otherwise the specified number is used. {group} is
 		the sign group name. To use the global sign group, use an
 		empty string.  {group} functions as a namespace for {id}, thus
-		two groups can use the same IDs.
+		two groups can use the same IDs. Refer to |sign-identifier|
+		for more information.
 
 		{name} refers to a defined sign.
 		{expr} refers to a buffer name or number. For the accepted
@@ -9496,7 +9510,7 @@ undofile({name})					*undofile()*
 		If {name} is empty undofile() returns an empty string, since a
 		buffer without a file name will not write an undo file.
 		Useful in combination with |:wundo| and |:rundo|.
-		When compiled without the +persistent_undo option this always
+		When compiled without the |+persistent_undo| option this always
 		returns an empty string.
 
 undotree()						*undotree()*
--- a/runtime/doc/sign.txt
+++ b/runtime/doc/sign.txt
@@ -1,4 +1,4 @@
-*sign.txt*      For Vim version 8.1.  Last change: 2019 Jan 01
+*sign.txt*      For Vim version 8.1.  Last change: 2019 Jan 06
 
 
 		  VIM REFERENCE MANUAL    by Gordon Prieur
@@ -52,13 +52,23 @@ Example to set the color: >
 
 	:highlight SignColumn guibg=darkgrey
 <
+							*sign-identifier*
+Each placed sign is identified by a number called the sign identifier. This
+identifier is used to jump to the sign or to remove the sign. The identifier
+is assigned when placing the sign using the |sign-place| command or the
+|sign_place()| function. Each sign identifier should be a unique number. If
+multiple placed signs use the same identifier, then jumping to or removing a
+sign becomes unpredictable. To avoid overlapping identifiers, sign groups can
+be used. The |sign_place()| function can be called with a zero sign identifier
+to allocate the next available identifier.
+
 							*sign-group*
-Each sign can be assigned to either the global group or a named group. When
-placing a sign, if a group name is not supplied, or an empty string is used,
-then the sign is placed in the global group. Otherwise the sign is placed in
-the named group. The sign identifier is unique within a group. The sign group
-allows Vim plugins to use unique signs without interfering with other plugins
-using signs.
+Each placed sign can be assigned to either the global group or a named group.
+When placing a sign, if a group name is not supplied, or an empty string is
+used, then the sign is placed in the global group. Otherwise the sign is
+placed in the named group. The sign identifier is unique within a group. The
+sign group allows Vim plugins to use unique signs without interfering with
+other plugins using signs.
 
 							*sign-priority*
 Each placed sign is assigned a priority value. When multiple signs are placed
@@ -178,8 +188,9 @@ See |sign_place()| for the equivalent Vi
 			:sign place 9 group=g2 priority=50 line=5
 							\ name=sign1 file=a.py
 <
-:sign place {id} line={lnum} name={name} buffer={nr}
-		Same, but use buffer {nr}.
+:sign place {id} line={lnum} name={name} [buffer={nr}]
+		Same, but use buffer {nr}.  If the buffer argument is not
+		given, place the sign in the current buffer.
 
 							*E885*
 :sign place {id} name={name} file={fname}
@@ -191,8 +202,9 @@ See |sign_place()| for the equivalent Vi
 		The optional "group={group}" attribute can be used before
 		"file=" to select a sign in a particular group.
 
-:sign place {id} name={name} buffer={nr}
-		Same, but use buffer {nr}.
+:sign place {id} name={name} [buffer={nr}]
+		Same, but use buffer {nr}.  If the buffer argument is not
+		given, use the current buffer.
 
 
 REMOVING SIGNS						*:sign-unplace* *E159*
@@ -315,11 +327,12 @@ JUMPING TO A SIGN					*:sign-jump* *E157
 :sign jump {id} group={group} file={fname}
 		Same but jump to the sign in group {group}
 
-:sign jump {id} buffer={nr}					*E934*
+:sign jump {id} [buffer={nr}]					*E934*
 		Same, but use buffer {nr}.  This fails if buffer {nr} does not
-		have a name.
+		have a name. If the buffer argument is not given, use the
+		current buffer.
 
-:sign jump {id} group={group} buffer={nr}
+:sign jump {id} group={group} [buffer={nr}]
 		Same but jump to the sign in group {group}
 
 
--- a/src/sign.c
+++ b/src/sign.c
@@ -1168,7 +1168,7 @@ sign_jump_cmd(
 	int		id,
 	char_u		*group)
 {
-    if (buf == NULL && sign_name == NULL && group == NULL && id == -1)
+    if (sign_name == NULL && group == NULL && id == -1)
     {
 	EMSG(_(e_argreq));
 	return;
@@ -1325,6 +1325,11 @@ parse_sign_cmd_args(
 	return FAIL;
     }
 
+    // If the filename is not supplied for the sign place or the sign jump
+    // command, then use the current buffer.
+    if (filename == NULL && (cmd == SIGNCMD_PLACE || cmd == SIGNCMD_JUMP))
+	*buf = curwin->w_buffer;
+
     return OK;
 }
 
--- a/src/testdir/test_signs.vim
+++ b/src/testdir/test_signs.vim
@@ -14,7 +14,8 @@ func Test_sign()
   " the icon name when listing signs.
   sign define Sign1 text=x
   try
-    sign define Sign2 text=xy texthl=Title linehl=Error icon=../../pixmaps/stock_vim_find_help.png
+    sign define Sign2 text=xy texthl=Title linehl=Error
+		\ icon=../../pixmaps/stock_vim_find_help.png
   catch /E255:/
     " Ignore error: E255: Couldn't read in sign data!
     " This error can happen when running in the GUI.
@@ -23,7 +24,9 @@ func Test_sign()
 
   " Test listing signs.
   let a=execute('sign list')
-  call assert_match("^\nsign Sign1 text=x \nsign Sign2 icon=../../pixmaps/stock_vim_find_help.png .*text=xy linehl=Error texthl=Title$", a)
+  call assert_match('^\nsign Sign1 text=x \nsign Sign2 ' .
+	      \ 'icon=../../pixmaps/stock_vim_find_help.png .*text=xy ' .
+	      \ 'linehl=Error texthl=Title$', a)
 
   let a=execute('sign list Sign1')
   call assert_equal("\nsign Sign1 text=x ", a)
@@ -63,7 +66,8 @@ func Test_sign()
 
   " Check placed signs
   let a=execute('sign place')
-  call assert_equal("\n--- Signs ---\nSigns for [NULL]:\n    line=3  id=41  name=Sign1 priority=10\n", a)
+  call assert_equal("\n--- Signs ---\nSigns for [NULL]:\n" .
+		\ "    line=3  id=41  name=Sign1 priority=10\n", a)
 
   " Unplace the sign and try jumping to it again should fail.
   sign unplace 41
@@ -87,12 +91,20 @@ func Test_sign()
   let a=execute('sign place')
   call assert_equal("\n--- Signs ---\n", a)
 
+  " Place a sign without specifying the filename or buffer
+  sign place 77 line=9 name=Sign2
+  let a=execute('sign place')
+  call assert_equal("\n--- Signs ---\nSigns for [NULL]:\n" .
+		\ "    line=9  id=77  name=Sign2 priority=10\n", a)
+  sign unplace *
+
   " Check :jump with file=...
   edit foo
   call setline(1, ['A', 'B', 'C', 'D'])
 
   try
-    sign define Sign3 text=y texthl=DoesNotExist linehl=DoesNotExist icon=doesnotexist.xpm
+    sign define Sign3 text=y texthl=DoesNotExist linehl=DoesNotExist
+		\ icon=doesnotexist.xpm
   catch /E255:/
     " ignore error: E255: it can happens for guis.
   endtry
@@ -148,38 +160,12 @@ func Test_sign()
   call assert_equal("\nsign 4 text=#> linehl=Comment", a)
   exe 'sign place 20 line=3 name=004 buffer=' . bufnr('')
   let a = execute('sign place')
-  call assert_equal("\n--- Signs ---\nSigns for foo:\n    line=3  id=20  name=4 priority=10\n", a)
+  call assert_equal("\n--- Signs ---\nSigns for foo:\n" .
+		\ "    line=3  id=20  name=4 priority=10\n", a)
   exe 'sign unplace 20 buffer=' . bufnr('')
   sign undefine 004
   call assert_fails('sign list 4', 'E155:')
 
-  " Error cases
-  call assert_fails("sign place abc line=3 name=Sign1 buffer=" .
-			  \ bufnr('%'), 'E474:')
-  call assert_fails("sign unplace abc name=Sign1 buffer=" .
-			  \ bufnr('%'), 'E474:')
-  call assert_fails("sign place 1abc line=3 name=Sign1 buffer=" .
-			  \ bufnr('%'), 'E474:')
-  call assert_fails("sign unplace 2abc name=Sign1 buffer=" .
-			  \ bufnr('%'), 'E474:')
-  call assert_fails("sign unplace 2 *", 'E474:')
-  call assert_fails("sign place 1 line=3 name=Sign1 buffer=" .
-			  \ bufnr('%') . " a", 'E488:')
-  call assert_fails("sign place name=Sign1 buffer=" . bufnr('%'), 'E474:')
-  call assert_fails("sign place line=10 buffer=" . bufnr('%'), 'E474:')
-  call assert_fails("sign unplace 2 line=10 buffer=" . bufnr('%'), 'E474:')
-  call assert_fails("sign unplace 2 name=Sign1 buffer=" . bufnr('%'), 'E474:')
-  call assert_fails("sign place 2 line=3 buffer=" . bufnr('%'), 'E474:')
-  call assert_fails("sign place 2", 'E474:')
-  call assert_fails("sign place abc", 'E474:')
-  call assert_fails("sign place 5 line=3", 'E474:')
-  call assert_fails("sign place 5 name=Sign1", 'E474:')
-  call assert_fails("sign place 5 group=g1", 'E474:')
-  call assert_fails("sign place 5 group=*", 'E474:')
-  call assert_fails("sign place 5 priority=10", 'E474:')
-  call assert_fails("sign place 5 line=3 name=Sign1", 'E474:')
-  call assert_fails("sign place 5 group=g1 line=3 name=Sign1", 'E474:')
-
   " After undefining the sign, we should no longer be able to place it.
   sign undefine Sign1
   sign undefine Sign2
@@ -202,7 +188,8 @@ func Test_sign_undefine_still_placed()
 
   " Listing placed sign should show that sign is deleted.
   let a=execute('sign place')
-  call assert_equal("\n--- Signs ---\nSigns for foobar:\n    line=1  id=41  name=[Deleted] priority=10\n", a)
+  call assert_equal("\n--- Signs ---\nSigns for foobar:\n" .
+		\ "    line=1  id=41  name=[Deleted] priority=10\n", a)
 
   sign unplace 41
   let a=execute('sign place')
@@ -220,7 +207,8 @@ func Test_sign_completion()
   call assert_equal('"sign define Sign icon= linehl= text= texthl=', @:)
 
   call feedkeys(":sign define Sign linehl=Spell\<C-A>\<C-B>\"\<CR>", 'tx')
-  call assert_equal('"sign define Sign linehl=SpellBad SpellCap SpellLocal SpellRare', @:)
+  call assert_equal('"sign define Sign linehl=SpellBad SpellCap ' .
+	      \ 'SpellLocal SpellRare', @:)
 
   call writefile(['foo'], 'XsignOne')
   call writefile(['bar'], 'XsignTwo')
@@ -273,17 +261,22 @@ func Test_sign_invalid_commands()
   call assert_fails('sign jump 1 line=100', '474:')
   call assert_fails('sign define Sign2 text=', 'E239:')
   " Non-numeric identifier for :sign place
-  call assert_fails("sign place abc line=3 name=Sign1 buffer=" . bufnr('%'), 'E474:')
+  call assert_fails("sign place abc line=3 name=Sign1 buffer=" . bufnr(''),
+								\ 'E474:')
   " Non-numeric identifier for :sign unplace
-  call assert_fails("sign unplace abc name=Sign1 buffer=" . bufnr('%'), 'E474:')
+  call assert_fails("sign unplace abc name=Sign1 buffer=" . bufnr(''),
+								\ 'E474:')
   " Number followed by an alphabet as sign identifier for :sign place
-  call assert_fails("sign place 1abc line=3 name=Sign1 buffer=" . bufnr('%'), 'E474:')
+  call assert_fails("sign place 1abc line=3 name=Sign1 buffer=" . bufnr(''),
+								\ 'E474:')
   " Number followed by an alphabet as sign identifier for :sign unplace
-  call assert_fails("sign unplace 2abc name=Sign1 buffer=" . bufnr('%'), 'E474:')
+  call assert_fails("sign unplace 2abc name=Sign1 buffer=" . bufnr(''),
+								\ 'E474:')
   " Sign identifier and '*' for :sign unplace
   call assert_fails("sign unplace 2 *", 'E474:')
   " Trailing characters after buffer number for :sign place
-  call assert_fails("sign place 1 line=3 name=Sign1 buffer=" . bufnr('%') . 'xxx', 'E488:')
+  call assert_fails("sign place 1 line=3 name=Sign1 buffer=" .
+						\ bufnr('%') . 'xxx', 'E488:')
   " Trailing characters after buffer number for :sign unplace
   call assert_fails("sign unplace 1 buffer=" . bufnr('%') . 'xxx', 'E488:')
   call assert_fails("sign unplace * buffer=" . bufnr('%') . 'xxx', 'E488:')
@@ -306,16 +299,11 @@ func Test_sign_invalid_commands()
   call assert_fails("sign place abc", 'E474:')
   " Placing a sign with only line number
   call assert_fails("sign place 5 line=3", 'E474:')
-  " Placing a sign with only sign name
-  call assert_fails("sign place 5 name=Sign1", 'E474:')
   " Placing a sign with only sign group
   call assert_fails("sign place 5 group=g1", 'E474:')
   call assert_fails("sign place 5 group=*", 'E474:')
   " Placing a sign with only sign priority
   call assert_fails("sign place 5 priority=10", 'E474:')
-  " Placing a sign without buffer number or file name
-  call assert_fails("sign place 5 line=3 name=Sign1", 'E474:')
-  call assert_fails("sign place 5 group=g1 line=3 name=Sign1", 'E474:')
 
   sign undefine Sign1
 endfunc
@@ -624,11 +612,13 @@ func Test_sign_group()
 
   " :sign place file={fname}
   let a = execute('sign place file=Xsign')
-  call assert_equal("\n--- Signs ---\nSigns for Xsign:\n    line=10  id=5  name=sign1 priority=10\n", a)
+  call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+	      \ "    line=10  id=5  name=sign1 priority=10\n", a)
 
   " :sign place group={group} file={fname}
   let a = execute('sign place group=g2 file=Xsign')
-  call assert_equal("\n--- Signs ---\nSigns for Xsign:\n    line=10  id=5  group=g2  name=sign1 priority=10\n", a)
+  call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+	      \ "    line=10  id=5  group=g2  name=sign1 priority=10\n", a)
 
   " :sign place group=* file={fname}
   let a = execute('sign place group=* file=Xsign')
@@ -649,11 +639,13 @@ func Test_sign_group()
 
   " :sign place buffer={fname}
   let a = execute('sign place buffer=' . bnum)
-  call assert_equal("\n--- Signs ---\nSigns for Xsign:\n    line=10  id=5  name=sign1 priority=10\n", a)
+  call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+	      \ "    line=10  id=5  name=sign1 priority=10\n", a)
 
   " :sign place group={group} buffer={fname}
   let a = execute('sign place group=g2 buffer=' . bnum)
-  call assert_equal("\n--- Signs ---\nSigns for Xsign:\n    line=12  id=5  group=g2  name=sign1 priority=10\n", a)
+  call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
+	      \ "    line=12  id=5  group=g2  name=sign1 priority=10\n", a)
 
   " :sign place group=* buffer={fname}
   let a = execute('sign place group=* buffer=' . bnum)
@@ -690,6 +682,12 @@ func Test_sign_group()
   sign jump 5 group=g2 file=Xsign
   call assert_equal(12, line('.'))
 
+  " Test for :sign jump command without the filename or buffer
+  sign jump 5
+  call assert_equal(10, line('.'))
+  sign jump 5 group=g1
+  call assert_equal(11, line('.'))
+
   " Error cases
   call assert_fails("sign place 3 group= name=sign1 buffer=" . bnum, 'E474:')
 
--- a/src/version.c
+++ b/src/version.c
@@ -800,6 +800,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    697,
+/**/
     696,
 /**/
     695,