diff options
| -rw-r--r-- | runtime/autoload/provider/clipboard.vim | 14 | ||||
| -rw-r--r-- | runtime/doc/options.txt | 33 | ||||
| -rw-r--r-- | src/nvim/ops.c | 6 | ||||
| -rw-r--r-- | test/functional/clipboard/clipboard_provider_spec.lua | 49 | ||||
| -rw-r--r-- | test/functional/fixtures/autoload/provider/clipboard.vim | 12 | 
5 files changed, 73 insertions, 41 deletions
| diff --git a/runtime/autoload/provider/clipboard.vim b/runtime/autoload/provider/clipboard.vim index d20b3a9bf1..5d1ce7896d 100644 --- a/runtime/autoload/provider/clipboard.vim +++ b/runtime/autoload/provider/clipboard.vim @@ -55,13 +55,21 @@ endif  let s:clipboard = {}  function! s:clipboard.get(reg) -  if s:selections[a:reg].owner > 0 -    return s:selections[a:reg].data +  let reg = a:reg == '"' ? '+' : a:reg +  if s:selections[reg].owner > 0 +    return s:selections[reg].data    end -  return s:try_cmd(s:paste[a:reg]) +  return s:try_cmd(s:paste[reg])  endfunction  function! s:clipboard.set(lines, regtype, reg) +  if a:reg == '"' +    call s:clipboard.set(a:lines,a:regtype,'+') +    if s:copy['*'] != s:copy['+'] +      call s:clipboard.set(a:lines,a:regtype,'*') +    end +    return 0 +  end    if s:cache_enabled == 0      call s:try_cmd(s:copy[a:reg], a:lines)      return 0 diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index fea8a59a74..a79903b358 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1402,8 +1402,8 @@ A jump table for the options with a short description can be found at |Q_op|.  			register '*' for all yank, delete, change and put  			operations which would normally go to the unnamed  			register.  When "unnamed" is also included to the -			option, yank operations (but not delete, change or -			put) will additionally copy the text into register +			option, yank and delete operations (but not put) +			will additionally copy the text into register  			'*'. See |nvim-clipboard|.  <  						*clipboard-autoselect* @@ -1427,35 +1427,6 @@ A jump table for the options with a short description can be found at |Q_op|.  	autoselectml	Like "autoselect", but for the modeless selection  			only.  Compare to the 'A' flag in 'guioptions'. -						*clipboard-html* -	html		When the clipboard contains HTML, use this when -			pasting.  When putting text on the clipboard, mark it -			as HTML.  This works to copy rendered HTML from -			Firefox, paste it as raw HTML in Vim, select the HTML -			in Vim and paste it in a rich edit box in Firefox. -			You probably want to add this only temporarily, -			possibly use BufEnter autocommands. -			Only supported for GTK version 2 and later. -			Only available with the |+multi_byte| feature. - -						*clipboard-exclude* -	exclude:{pattern} -			Defines a pattern that is matched against the name of -			the terminal 'term'.  If there is a match, no -			connection will be made to the X server.  This is -			useful in this situation: -			- Running Vim in a console. -			- $DISPLAY is set to start applications on another -			  display. -			- You do not want to connect to the X server in the -			  console, but do want this in a terminal emulator. -			To never connect to the X server use: > -				exclude:.* -			The value of 'magic' is ignored, {pattern} is -			interpreted as if 'magic' was on. -			The rest of the option value will be used for -			{pattern}, this must be the last entry. -  						*'cmdheight'* *'ch'*  'cmdheight' 'ch'	number	(default 1)  			global diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 8a7ced138b..766b5720d9 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -5278,11 +5278,11 @@ static yankreg_T *adjust_clipboard_name(int *name, bool quiet)      }      yankreg_T *target;      if (cb_flags & CB_UNNAMEDPLUS) { -      *name = '+'; -      target = &y_regs[STAR_REGISTER]; +      *name = cb_flags & CB_UNNAMED ? '"': '+'; +      target = &y_regs[PLUS_REGISTER];      } else {        *name = '*'; -      target = &y_regs[PLUS_REGISTER]; +      target = &y_regs[STAR_REGISTER];      }      return target; // unnamed register    } diff --git a/test/functional/clipboard/clipboard_provider_spec.lua b/test/functional/clipboard/clipboard_provider_spec.lua index f6d6188d82..30903e8b57 100644 --- a/test/functional/clipboard/clipboard_provider_spec.lua +++ b/test/functional/clipboard/clipboard_provider_spec.lua @@ -232,12 +232,15 @@ describe('clipboard usage', function()        expect('words')        eq({{'words'}, 'v'}, eval("g:test_clip['*']")) +      -- "+ shouldn't have changed +      eq({''}, eval("g:test_clip['+']")) +        execute("let g:test_clip['*'] = ['linewise stuff','']")        feed('p')        expect([[          words          linewise stuff]]) -      end) +    end)      it('does not clobber "0 when pasting', function()        insert('a line') @@ -284,6 +287,50 @@ describe('clipboard usage', function()    end) +  describe('with clipboard=unnamedplus', function() +    before_each(function() +      execute('set clipboard=unnamedplus') +    end) + +    it('links the "+ and unnamed registers', function() +      insert("one two") +      feed('^"+dwdw"+P') +      expect('two') +      eq({{'two'}, 'v'}, eval("g:test_clip['+']")) + +      -- "* shouldn't have changed +      eq({''}, eval("g:test_clip['*']")) + +      execute("let g:test_clip['+'] = ['three']") +      feed('p') +      expect('twothree') +    end) + +    it('and unnamed, yanks to both', function() +      execute('set clipboard=unnamedplus,unnamed') +      insert([[ +        really unnamed +        text]]) +      feed('ggdd"*p"+p') +      expect([[ +        text +        really unnamed +        really unnamed]]) +      eq({{'really unnamed', ''}, 'V'}, eval("g:test_clip['+']")) +      eq({{'really unnamed', ''}, 'V'}, eval("g:test_clip['*']")) + +      -- unnamedplus takes predecence when pasting +      execute("let g:test_clip['+'] = ['the plus','']") +      execute("let g:test_clip['*'] = ['the star','']") +      feed("p") +      expect([[ +        text +        really unnamed +        really unnamed +        the plus]]) +    end) +  end) +    it('supports :put', function()      insert("a line")      execute("let g:test_clip['*'] = ['some text']") diff --git a/test/functional/fixtures/autoload/provider/clipboard.vim b/test/functional/fixtures/autoload/provider/clipboard.vim index a28484169a..0935ea45ff 100644 --- a/test/functional/fixtures/autoload/provider/clipboard.vim +++ b/test/functional/fixtures/autoload/provider/clipboard.vim @@ -9,16 +9,22 @@ function! s:methods.get(reg)    if g:cliperror      return 0    end +  let reg = a:reg == '"' ? '+' : a:reg    if g:cliplossy      " behave like pure text clipboard -    return g:test_clip[a:reg][0] +    return g:test_clip[reg][0]    else -    "behave like VIMENC clipboard -    return g:test_clip[a:reg] +    " behave like VIMENC clipboard +    return g:test_clip[reg]    end  endfunction  function! s:methods.set(lines, regtype, reg) +  if a:reg == '"' +    call s:methods.set(a:lines,a:regtype,'+') +    call s:methods.set(a:lines,a:regtype,'*') +    return 0 +  end    let g:test_clip[a:reg] = [a:lines, a:regtype]  endfunction | 
