]> granicus.if.org Git - vim/commitdiff
patch 8.1.0697: ":sign place" requires the buffer argument v8.1.0697
authorBram Moolenaar <Bram@vim.org>
Sun, 6 Jan 2019 15:24:01 +0000 (16:24 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 6 Jan 2019 15:24:01 +0000 (16:24 +0100)
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)

runtime/doc/eval.txt
runtime/doc/sign.txt
src/sign.c
src/testdir/test_signs.vim
src/version.c

index 5d9e7b2f138136ece2a0418775aa8e9072af692c..8bb025ccff8ca6ea60a36e414c50fd1091b92edc 100644 (file)
@@ -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}])                    *extend()*
 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}])                             *feedkeys()*
                        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()* *chmod*
 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_define()*
                   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}]])                       *sign_getplaced()*
                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}]])                       *sign_getplaced()*
                        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} [, {dict}])
                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()*
index d889844f3cb3a5bd801e31b5c870fd9d19854f42..6eb11a052dde83bc031198744dd99551774d41a9 100644 (file)
@@ -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 Vim script function.
                        :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 Vim script function.
                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}
 
 
index e600bfc99ee7a86be45a76f377e90351d50d4dc1..fd5528c18d7f6951bc848b8b78e37764d39cbc30 100644 (file)
@@ -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;
 }
 
index a9a347270e6fc501e2b431c636493d82581dba16..5bb0cf92632d4e611719ed8a0bf6466eb0b29b84 100644 (file)
@@ -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:')
 
index 3f6b5ec3b2ed8f7bd8c2222441632dad1b2ed677..78baf47457cadab900d2f58abac07d8bdeb3250b 100644 (file)
@@ -799,6 +799,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    697,
 /**/
     696,
 /**/