diff options
-rw-r--r-- | src/nvim/buffer.c | 6 | ||||
-rw-r--r-- | test/functional/ui/sign_spec.lua | 45 |
2 files changed, 47 insertions, 4 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 3a378ea360..4db2b4ef6b 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -4337,10 +4337,8 @@ void buf_addsign( if (lnum == sign->lnum && id == sign->id) { sign->typenr = typenr; return; - } - else if (id < 0 /* keep signs sorted by lnum */ - && lnum < sign->lnum) - { + } else if ((lnum == sign->lnum && id != sign->id) + || (id < 0 && lnum < sign->lnum)) { // attempt to keep signs sorted by lnum insert_sign(buf, prev, sign, id, lnum, typenr); return; } diff --git a/test/functional/ui/sign_spec.lua b/test/functional/ui/sign_spec.lua new file mode 100644 index 0000000000..a7a4172440 --- /dev/null +++ b/test/functional/ui/sign_spec.lua @@ -0,0 +1,45 @@ +local helpers = require('test.functional.helpers') +local Screen = require('test.functional.ui.screen') +local clear, feed, execute = helpers.clear, helpers.feed, helpers.execute + +describe('Signs', function() + local screen + + before_each(function() + clear() + screen = Screen.new() + screen:attach() + screen:set_default_attr_ignore( {{}, {bold=true, foreground=255}} ) + end) + + after_each(function() + screen:detach() + end) + + describe(':sign place', function() + it('shadows previously placed signs', function() + feed('ia<cr>b<cr>c<cr><esc>') + execute('sign define piet text=>> texthl=Search') + execute('sign define pietx text=>! texthl=Search') + execute('sign place 1 line=1 name=piet buffer=1') + execute('sign place 2 line=3 name=piet buffer=1') + execute('sign place 3 line=1 name=pietx buffer=1') + screen:expect([[ + >!a | + b | + >>c | + ^ | + ~ | + ~ | + ~ | + ~ | + ~ | + ~ | + ~ | + ~ | + ~ | + :sign place 3 line=1 name=pietx buffer=1 | + ]]) + end) + end) +end) |