0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 9.0.0078: star register is unexpectedly changed when deleting

Problem:    Star register is changed when deleting and both "unnamed" and
            "unnamedplus" are in 'clipboard'.
Solution:   Make the use of the star register work as documented. (Ernie Rael,
            closes #10669)
This commit is contained in:
Ernie Rael
2022-07-26 14:44:36 +01:00
committed by Bram Moolenaar
parent b03950fafa
commit 559f230fd6
4 changed files with 45 additions and 1 deletions

View File

@@ -1409,7 +1409,8 @@ op_yank(oparg_T *oap, int deleting, int mess)
# ifdef FEAT_X11
// If we were yanking to the '+' register, send result to selection.
// Also copy to the '*' register, in case auto-select is off. But not when
// 'clipboard' has "unnamedplus" and not "unnamed".
// 'clipboard' has "unnamedplus" and not "unnamed"; and not when
// deleting and both "unnamedplus" and "unnamed".
if (clip_plus.available
&& (curr == &(y_regs[PLUS_REGISTER])
|| (!deleting && oap->regname == 0
@@ -1425,6 +1426,8 @@ op_yank(oparg_T *oap, int deleting, int mess)
if (!clip_isautosel_star()
&& !clip_isautosel_plus()
&& !((clip_unnamed | clip_unnamed_saved) == CLIP_UNNAMED_PLUS)
&& !(deleting && (clip_unnamed | clip_unnamed_saved)
== (CLIP_UNNAMED | CLIP_UNNAMED_PLUS))
&& !did_star
&& curr == &(y_regs[PLUS_REGISTER]))
{

View File

@@ -233,6 +233,15 @@ func CheckX11BasedGui()
endif
endfunc
" Command to check that there are two clipboards
command CheckTwoClipboards call CheckTwoClipboards()
func CheckTwoClipboards()
" avoid changing the clipboard here, only X11 supports both
if !has('X11')
throw 'Skipped: requires two clipboards'
endif
endfunc
" Command to check for satisfying any of the conditions.
" e.g. CheckAnyOf Feature:bsd Feature:sun Linux
command -nargs=+ CheckAnyOf call CheckAnyOf(<f-args>)

View File

@@ -411,6 +411,36 @@ func Test_clipboard_regs()
bwipe!
endfunc
" Test unnamed for both clipboard registers (* and +)
func Test_clipboard_regs_both_unnamed()
CheckNotGui
CheckFeature clipboard_working
CheckTwoClipboards
let @* = 'xxx'
let @+ = 'xxx'
new
set clipboard=unnamed,unnamedplus
call setline(1, ['foo', 'bar'])
" op_yank copies to both
:1
:normal yw
call assert_equal('foo', getreg('*'))
call assert_equal('foo', getreg('+'))
" op_delete only copies to '+'
:2
:normal dw
call assert_equal('foo', getreg('*'))
call assert_equal('bar', getreg('+'))
set clipboard&vim
bwipe!
endfunc
" Test for restarting the current mode (insert or virtual replace) after
" executing the contents of a register
func Test_put_reg_restart_mode()

View File

@@ -735,6 +735,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
78,
/**/
77,
/**/