mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	clipboard: support clipboard=unnamedplus,unnamed
This commit is contained in:
		| @@ -55,13 +55,21 @@ endif | |||||||
| let s:clipboard = {} | let s:clipboard = {} | ||||||
|  |  | ||||||
| function! s:clipboard.get(reg) | function! s:clipboard.get(reg) | ||||||
|   if s:selections[a:reg].owner > 0 |   let reg = a:reg == '"' ? '+' : a:reg | ||||||
|     return s:selections[a:reg].data |   if s:selections[reg].owner > 0 | ||||||
|  |     return s:selections[reg].data | ||||||
|   end |   end | ||||||
|   return s:try_cmd(s:paste[a:reg]) |   return s:try_cmd(s:paste[reg]) | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| function! s:clipboard.set(lines, regtype, reg) | 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 |   if s:cache_enabled == 0 | ||||||
|     call s:try_cmd(s:copy[a:reg], a:lines) |     call s:try_cmd(s:copy[a:reg], a:lines) | ||||||
|     return 0 |     return 0 | ||||||
|   | |||||||
| @@ -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 | 			register '*' for all yank, delete, change and put | ||||||
| 			operations which would normally go to the unnamed | 			operations which would normally go to the unnamed | ||||||
| 			register.  When "unnamed" is also included to the | 			register.  When "unnamed" is also included to the | ||||||
| 			option, yank operations (but not delete, change or | 			option, yank and delete operations (but not put) | ||||||
| 			put) will additionally copy the text into register | 			will additionally copy the text into register | ||||||
| 			'*'. See |nvim-clipboard|. | 			'*'. See |nvim-clipboard|. | ||||||
| < | < | ||||||
| 						*clipboard-autoselect* | 						*clipboard-autoselect* | ||||||
|   | |||||||
| @@ -5278,7 +5278,7 @@ static yankreg_T *adjust_clipboard_name(int *name, bool quiet) | |||||||
|     } |     } | ||||||
|     yankreg_T *target; |     yankreg_T *target; | ||||||
|     if (cb_flags & CB_UNNAMEDPLUS) { |     if (cb_flags & CB_UNNAMEDPLUS) { | ||||||
|       *name = '+'; |       *name = cb_flags & CB_UNNAMED ? '"': '+'; | ||||||
|       target = &y_regs[PLUS_REGISTER]; |       target = &y_regs[PLUS_REGISTER]; | ||||||
|     } else { |     } else { | ||||||
|       *name = '*'; |       *name = '*'; | ||||||
|   | |||||||
| @@ -232,12 +232,15 @@ describe('clipboard usage', function() | |||||||
|       expect('words') |       expect('words') | ||||||
|       eq({{'words'}, 'v'}, eval("g:test_clip['*']")) |       eq({{'words'}, 'v'}, eval("g:test_clip['*']")) | ||||||
|  |  | ||||||
|  |       -- "+ shouldn't have changed | ||||||
|  |       eq({''}, eval("g:test_clip['+']")) | ||||||
|  |  | ||||||
|       execute("let g:test_clip['*'] = ['linewise stuff','']") |       execute("let g:test_clip['*'] = ['linewise stuff','']") | ||||||
|       feed('p') |       feed('p') | ||||||
|       expect([[ |       expect([[ | ||||||
|         words |         words | ||||||
|         linewise stuff]]) |         linewise stuff]]) | ||||||
|       end) |     end) | ||||||
|  |  | ||||||
|     it('does not clobber "0 when pasting', function() |     it('does not clobber "0 when pasting', function() | ||||||
|       insert('a line') |       insert('a line') | ||||||
| @@ -284,6 +287,50 @@ describe('clipboard usage', function() | |||||||
|  |  | ||||||
|   end) |   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() |   it('supports :put', function() | ||||||
|     insert("a line") |     insert("a line") | ||||||
|     execute("let g:test_clip['*'] = ['some text']") |     execute("let g:test_clip['*'] = ['some text']") | ||||||
|   | |||||||
| @@ -9,16 +9,22 @@ function! s:methods.get(reg) | |||||||
|   if g:cliperror |   if g:cliperror | ||||||
|     return 0 |     return 0 | ||||||
|   end |   end | ||||||
|  |   let reg = a:reg == '"' ? '+' : a:reg | ||||||
|   if g:cliplossy |   if g:cliplossy | ||||||
|     " behave like pure text clipboard |     " behave like pure text clipboard | ||||||
|     return g:test_clip[a:reg][0] |     return g:test_clip[reg][0] | ||||||
|   else |   else | ||||||
|     "behave like VIMENC clipboard |     " behave like VIMENC clipboard | ||||||
|     return g:test_clip[a:reg] |     return g:test_clip[reg] | ||||||
|   end |   end | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| function! s:methods.set(lines, regtype, reg) | 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] |   let g:test_clip[a:reg] = [a:lines, a:regtype] | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Björn Linse
					Björn Linse