mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
patch 8.2.4160: cannot change the register used for Select mode delete
Problem: Cannot change the register used for Select mode delete. Solution: Make CTRL-R set the register to be used when deleting text for Select mode. (Shougo Matsushita, closes #9531)
This commit is contained in:
committed by
Bram Moolenaar
parent
92000e2e71
commit
4ede01f188
@@ -488,6 +488,11 @@ Commands in Select mode:
|
|||||||
- ESC stops Select mode.
|
- ESC stops Select mode.
|
||||||
- CTRL-O switches to Visual mode for the duration of one command. *v_CTRL-O*
|
- CTRL-O switches to Visual mode for the duration of one command. *v_CTRL-O*
|
||||||
- CTRL-G switches to Visual mode.
|
- CTRL-G switches to Visual mode.
|
||||||
|
- CTRL-R {register} selects the register to be used for the text that is
|
||||||
|
deleted when typing text. *v_CTRL-R*
|
||||||
|
Unless you specify the "_" (black hole) register, the unnamed register is
|
||||||
|
also overwritten.
|
||||||
|
|
||||||
|
|
||||||
Otherwise, typed characters are handled as in Visual mode.
|
Otherwise, typed characters are handled as in Visual mode.
|
||||||
|
|
||||||
|
@@ -875,6 +875,8 @@ EXTERN int VIsual_active INIT(= FALSE);
|
|||||||
// whether Visual mode is active
|
// whether Visual mode is active
|
||||||
EXTERN int VIsual_select INIT(= FALSE);
|
EXTERN int VIsual_select INIT(= FALSE);
|
||||||
// whether Select mode is active
|
// whether Select mode is active
|
||||||
|
EXTERN int VIsual_select_reg INIT(= 0);
|
||||||
|
// register name for Select mode
|
||||||
EXTERN int restart_VIsual_select INIT(= 0);
|
EXTERN int restart_VIsual_select INIT(= 0);
|
||||||
// restart Select mode when next cmd finished
|
// restart Select mode when next cmd finished
|
||||||
EXTERN int VIsual_reselect;
|
EXTERN int VIsual_reselect;
|
||||||
|
34
src/normal.c
34
src/normal.c
@@ -89,7 +89,7 @@ static void nv_window(cmdarg_T *cap);
|
|||||||
static void nv_suspend(cmdarg_T *cap);
|
static void nv_suspend(cmdarg_T *cap);
|
||||||
static void nv_g_cmd(cmdarg_T *cap);
|
static void nv_g_cmd(cmdarg_T *cap);
|
||||||
static void nv_dot(cmdarg_T *cap);
|
static void nv_dot(cmdarg_T *cap);
|
||||||
static void nv_redo(cmdarg_T *cap);
|
static void nv_redo_or_register(cmdarg_T *cap);
|
||||||
static void nv_Undo(cmdarg_T *cap);
|
static void nv_Undo(cmdarg_T *cap);
|
||||||
static void nv_tilde(cmdarg_T *cap);
|
static void nv_tilde(cmdarg_T *cap);
|
||||||
static void nv_operator(cmdarg_T *cap);
|
static void nv_operator(cmdarg_T *cap);
|
||||||
@@ -188,7 +188,7 @@ static const struct nv_cmd
|
|||||||
{Ctrl_O, nv_ctrlo, 0, 0},
|
{Ctrl_O, nv_ctrlo, 0, 0},
|
||||||
{Ctrl_P, nv_up, NV_STS, FALSE},
|
{Ctrl_P, nv_up, NV_STS, FALSE},
|
||||||
{Ctrl_Q, nv_visual, 0, FALSE},
|
{Ctrl_Q, nv_visual, 0, FALSE},
|
||||||
{Ctrl_R, nv_redo, 0, 0},
|
{Ctrl_R, nv_redo_or_register, 0, 0},
|
||||||
{Ctrl_S, nv_ignore, 0, 0},
|
{Ctrl_S, nv_ignore, 0, 0},
|
||||||
{Ctrl_T, nv_tagpop, NV_NCW, 0},
|
{Ctrl_T, nv_tagpop, NV_NCW, 0},
|
||||||
{Ctrl_U, nv_halfpage, 0, 0},
|
{Ctrl_U, nv_halfpage, 0, 0},
|
||||||
@@ -1303,6 +1303,7 @@ normal_end:
|
|||||||
trigger_modechanged();
|
trigger_modechanged();
|
||||||
showmode();
|
showmode();
|
||||||
restart_VIsual_select = 0;
|
restart_VIsual_select = 0;
|
||||||
|
VIsual_select_reg = 0;
|
||||||
}
|
}
|
||||||
if (restart_edit != 0 && !VIsual_active && old_mapped_len == 0)
|
if (restart_edit != 0 && !VIsual_active && old_mapped_len == 0)
|
||||||
(void)edit(restart_edit, FALSE, 1L);
|
(void)edit(restart_edit, FALSE, 1L);
|
||||||
@@ -5997,7 +5998,10 @@ nv_g_cmd(cmdarg_T *cap)
|
|||||||
* start Select mode.
|
* start Select mode.
|
||||||
*/
|
*/
|
||||||
if (cap->arg)
|
if (cap->arg)
|
||||||
|
{
|
||||||
VIsual_select = TRUE;
|
VIsual_select = TRUE;
|
||||||
|
VIsual_select_reg = 0;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
may_start_select('c');
|
may_start_select('c');
|
||||||
setmouse();
|
setmouse();
|
||||||
@@ -6550,11 +6554,30 @@ nv_dot(cmdarg_T *cap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CTRL-R: undo undo
|
* CTRL-R: undo undo or specify register in select mode
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
nv_redo(cmdarg_T *cap)
|
nv_redo_or_register(cmdarg_T *cap)
|
||||||
{
|
{
|
||||||
|
if (VIsual_select && VIsual_active)
|
||||||
|
{
|
||||||
|
int reg;
|
||||||
|
// Get register name
|
||||||
|
++no_mapping;
|
||||||
|
++allow_keys;
|
||||||
|
reg = plain_vgetc();
|
||||||
|
LANGMAP_ADJUST(reg, TRUE);
|
||||||
|
--no_mapping;
|
||||||
|
--allow_keys;
|
||||||
|
|
||||||
|
if (reg == '"')
|
||||||
|
// the unnamed register is 0
|
||||||
|
reg = 0;
|
||||||
|
|
||||||
|
VIsual_select_reg = valid_yank_reg(reg, TRUE) ? reg : 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!checkclearopq(cap->oap))
|
if (!checkclearopq(cap->oap))
|
||||||
{
|
{
|
||||||
u_redo((int)cap->count1);
|
u_redo((int)cap->count1);
|
||||||
@@ -6926,7 +6949,10 @@ unadjust_for_sel(void)
|
|||||||
nv_select(cmdarg_T *cap)
|
nv_select(cmdarg_T *cap)
|
||||||
{
|
{
|
||||||
if (VIsual_active)
|
if (VIsual_active)
|
||||||
|
{
|
||||||
VIsual_select = TRUE;
|
VIsual_select = TRUE;
|
||||||
|
VIsual_select_reg = 0;
|
||||||
|
}
|
||||||
else if (VIsual_reselect)
|
else if (VIsual_reselect)
|
||||||
{
|
{
|
||||||
cap->nchar = 'v'; // fake "gv" command
|
cap->nchar = 'v'; // fake "gv" command
|
||||||
|
@@ -624,6 +624,10 @@ op_delete(oparg_T *oap)
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (VIsual_select && oap->is_VIsual)
|
||||||
|
// use register given with CTRL_R, defaults to zero
|
||||||
|
oap->regname = VIsual_select_reg;
|
||||||
|
|
||||||
#ifdef FEAT_CLIPBOARD
|
#ifdef FEAT_CLIPBOARD
|
||||||
adjust_clip_reg(&oap->regname);
|
adjust_clip_reg(&oap->regname);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -258,4 +258,56 @@ func Test_term_mouse_multiple_clicks_to_select_mode()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for selecting a register with CTRL-R
|
||||||
|
func Test_selectmode_register()
|
||||||
|
new
|
||||||
|
|
||||||
|
" Default behavior: use unnamed register
|
||||||
|
call setline(1, 'foo')
|
||||||
|
call setreg('"', 'bar')
|
||||||
|
call setreg('a', 'baz')
|
||||||
|
exe ":norm! v\<c-g>a"
|
||||||
|
call assert_equal(getline('.'), 'aoo')
|
||||||
|
call assert_equal('f', getreg('"'))
|
||||||
|
call assert_equal('baz', getreg('a'))
|
||||||
|
|
||||||
|
" Use the black hole register
|
||||||
|
call setline(1, 'foo')
|
||||||
|
call setreg('"', 'bar')
|
||||||
|
call setreg('a', 'baz')
|
||||||
|
exe ":norm! v\<c-g>\<c-r>_a"
|
||||||
|
call assert_equal(getline('.'), 'aoo')
|
||||||
|
call assert_equal('bar', getreg('"'))
|
||||||
|
call assert_equal('baz', getreg('a'))
|
||||||
|
|
||||||
|
" Invalid register: use unnamed register
|
||||||
|
call setline(1, 'foo')
|
||||||
|
call setreg('"', 'bar')
|
||||||
|
call setreg('a', 'baz')
|
||||||
|
exe ":norm! v\<c-g>\<c-r>?a"
|
||||||
|
call assert_equal(getline('.'), 'aoo')
|
||||||
|
call assert_equal('f', getreg('"'))
|
||||||
|
call assert_equal('baz', getreg('a'))
|
||||||
|
|
||||||
|
" Use unnamed register
|
||||||
|
call setline(1, 'foo')
|
||||||
|
call setreg('"', 'bar')
|
||||||
|
call setreg('a', 'baz')
|
||||||
|
exe ":norm! v\<c-g>\<c-r>\"a"
|
||||||
|
call assert_equal(getline('.'), 'aoo')
|
||||||
|
call assert_equal('f', getreg('"'))
|
||||||
|
call assert_equal('baz', getreg('a'))
|
||||||
|
|
||||||
|
" use specicifed register, unnamed register is also written
|
||||||
|
call setline(1, 'foo')
|
||||||
|
call setreg('"', 'bar')
|
||||||
|
call setreg('a', 'baz')
|
||||||
|
exe ":norm! v\<c-g>\<c-r>aa"
|
||||||
|
call assert_equal(getline('.'), 'aoo')
|
||||||
|
call assert_equal('f', getreg('"'))
|
||||||
|
call assert_equal('f', getreg('a'))
|
||||||
|
|
||||||
|
bw!
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
4160,
|
||||||
/**/
|
/**/
|
||||||
4159,
|
4159,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user