summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/eval.txt36
-rw-r--r--runtime/doc/sign.txt41
-rw-r--r--src/sign.c7
-rw-r--r--src/testdir/test_signs.vim94
-rw-r--r--src/version.c2
5 files changed, 106 insertions, 74 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 5d9e7b2f1..8bb025ccf 100644
--- 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}]) *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()*
diff --git a/runtime/doc/sign.txt b/runtime/doc/sign.txt
index d889844f3..6eb11a052 100644
--- 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 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}
diff --git a/src/sign.c b/src/sign.c
index e600bfc99..fd5528c18 100644
--- 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;
}
diff --git a/src/testdir/test_signs.vim b/src/testdir/test_signs.vim
index a9a347270..5bb0cf926 100644
--- 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:')
diff --git a/src/version.c b/src/version.c
index 3f6b5ec3b..78baf4745 100644
--- 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,