clipboard: support clipboard=unnamedplus,unnamed

This commit is contained in:
Björn Linse
2015-08-05 15:57:34 +02:00
parent 162361abac
commit d4ebbaa91a
5 changed files with 71 additions and 10 deletions

View File

@@ -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

View File

@@ -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*

View File

@@ -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 = '*';

View File

@@ -232,6 +232,9 @@ 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([[
@@ -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']")

View File

@@ -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