diff options
| -rw-r--r-- | src/nvim/ops.c | 24 | ||||
| -rw-r--r-- | test/functional/clipboard/autoload/provider/clipboard.vim | 2 | ||||
| -rw-r--r-- | test/functional/clipboard/clipboard_provider_spec.lua | 45 | 
3 files changed, 56 insertions, 15 deletions
| diff --git a/src/nvim/ops.c b/src/nvim/ops.c index e73868a0fa..f0caaad97b 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -5360,10 +5360,13 @@ static void get_clipboard(int name, bool quiet)        goto err;      }      char_u* regtype = res->lv_last->li_tv.vval.v_string; -    if (regtype == NULL || strlen((char*)regtype) != 1) { +    if (regtype == NULL || strlen((char*)regtype) > 1) {        goto err;      }      switch (regtype[0]) { +    case 0: +      reg->y_type = MAUTO; +      break;      case 'v': case 'c':        reg->y_type = MCHAR;        break; @@ -5393,15 +5396,23 @@ static void get_clipboard(int name, bool quiet)      reg->y_array[i++] = (uint8_t *)xstrdup((char *)li->li_tv.vval.v_string);    } -  if (reg->y_type == MAUTO) { -    if (reg->y_size > 0 && strlen((char*)reg->y_array[reg->y_size-1]) == 0) { -      reg->y_type = MLINE; +  if (reg->y_size > 0 && strlen((char*)reg->y_array[reg->y_size-1]) == 0) { +    // a known-to-be charwise yank might have a final linebreak +    // but otherwise there is no line after the final newline +    if (reg->y_type != MCHAR) {        free(reg->y_array[reg->y_size-1]);        reg->y_size--; -    } else { +      if (reg->y_type == MAUTO) { +        reg->y_type = MLINE; +      } +    } +  } else { +    if (reg->y_type == MAUTO) {        reg->y_type = MCHAR;      } -  } else if (reg->y_type == MBLOCK) { +  } + +  if (reg->y_type == MBLOCK) {      int maxlen = 0;      for (int i = 0; i < reg->y_size; i++) {        int rowlen = STRLEN(reg->y_array[i]); @@ -5453,6 +5464,7 @@ static void set_clipboard(int name)      break;    case MBLOCK:      regtype = 'b'; +    list_append_string(lines, (char_u*)"", 0);      break;    }    list_append_string(args, ®type, 1); diff --git a/test/functional/clipboard/autoload/provider/clipboard.vim b/test/functional/clipboard/autoload/provider/clipboard.vim index 6c05a19fc3..c7fd630782 100644 --- a/test/functional/clipboard/autoload/provider/clipboard.vim +++ b/test/functional/clipboard/autoload/provider/clipboard.vim @@ -7,7 +7,7 @@ function! s:methods.get(reg)  endfunction  function! s:methods.set(lines, regtype, reg) -  let g:test_clip[a:reg] = a:lines +  let g:test_clip[a:reg] = [a:lines, a:regtype]  endfunction diff --git a/test/functional/clipboard/clipboard_provider_spec.lua b/test/functional/clipboard/clipboard_provider_spec.lua index f1e011f12d..363dcb1d11 100644 --- a/test/functional/clipboard/clipboard_provider_spec.lua +++ b/test/functional/clipboard/clipboard_provider_spec.lua @@ -73,7 +73,7 @@ describe('clipboard usage', function()      insert("some words")      feed('^"*dwdw"*P')      expect('some ') -    eq({'some '}, eval("g:test_clip['*']")) +    eq({{'some '}, 'v'}, eval("g:test_clip['*']"))    end)    it('supports separate "* and "+ when the provider supports it', function() @@ -90,19 +90,36 @@ describe('clipboard usage', function()        secound line        first line]])      -- linewise selection should be encoded as an extra newline -    eq({'third line', ''}, eval("g:test_clip['+']")) -    eq({'secound line', ''}, eval("g:test_clip['*']")) +    eq({{'third line', ''}, 'V'}, eval("g:test_clip['+']")) +    eq({{'secound line', ''}, 'V'}, eval("g:test_clip['*']"))    end) -  it('handles null bytes', function() +  it('handles null bytes when pasting and in getreg', function()      insert("some\022000text\n\022000very binary\022000")      feed('"*y-+"*p') -    eq({'some\ntext', '\nvery binary\n',''}, eval("g:test_clip['*']")) +    eq({{'some\ntext', '\nvery binary\n',''}, 'V'}, eval("g:test_clip['*']"))      expect("some\00text\n\00very binary\00\nsome\00text\n\00very binary\00")      -- test getreg/getregtype      eq('some\ntext\n\nvery binary\n\n', eval("getreg('*', 1)"))      eq("V", eval("getregtype('*')")) + +    -- getreg supports three arguments +    eq('some\ntext\n\nvery binary\n\n', eval("getreg('*', 1, 0)")) +    eq({'some\ntext', '\nvery binary\n'}, eval("getreg('*', 1, 1)")) +  end) + +  it('support autodectection of regtype', function() +    execute("let g:test_clip['*'] = ['linewise stuff','']") +    execute("let g:test_clip['+'] = ['charwise','stuff']") +    eq("V", eval("getregtype('*')")) +    eq("v", eval("getregtype('+')")) +    insert("just some text") +    feed('"*p"+p') +    expect([[ +      just some text +      lcharwise +      stuffinewise stuff]])    end)    it('support blockwise operations', function() @@ -115,6 +132,11 @@ describe('clipboard usage', function()        very much        blocktext]])      eq("\0225", eval("getregtype('*')")) +    feed('gg4l<c-v>j4l"+ygg"+P') +    expect([[ +       muchvery much +      ktextblocktext]]) +    eq({{' much', 'ktext', ''}, 'b'}, eval("g:test_clip['+']"))    end)    it('supports setreg', function() @@ -126,13 +148,20 @@ describe('clipboard usage', function()          textxplicitly          lines          ]]) +    execute('call setreg("+", "blocky\\nindeed", "b")') +    feed('"+p') +    expect([[ +        esblockyetted +        teindeedxtxplicitly +        lines +        ]])    end)    it('supports let @+ (issue #1427)', function()      execute("let @+ = 'some'")      execute("let @* = ' other stuff'") -    eq({'some'}, eval("g:test_clip['+']")) -    eq({' other stuff'}, eval("g:test_clip['*']")) +    eq({{'some'}, 'v'}, eval("g:test_clip['+']")) +    eq({{' other stuff'}, 'v'}, eval("g:test_clip['*']"))      feed('"+p"*p')      expect('some other stuff')      execute("let @+ .= ' more'") @@ -151,7 +180,7 @@ describe('clipboard usage', function()      insert("some words")      feed('^"*dwdw"*P')      expect('words') -    eq({'words'}, eval("g:test_clip['*']")) +    eq({{'words'}, 'v'}, eval("g:test_clip['*']"))      execute("let g:test_clip['*'] = ['linewise stuff','']")      feed('p') | 
