diff options
Diffstat (limited to 'src/nvim/normal.c')
| -rw-r--r-- | src/nvim/normal.c | 28 | 
1 files changed, 23 insertions, 5 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 2b5b47c0b3..2fce3e10b8 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -164,7 +164,7 @@ static const struct nv_cmd {    { Ctrl_O,    nv_ctrlo,       0,                      0 },    { Ctrl_P,    nv_up,          NV_STS,                 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_T,    nv_tagpop,      NV_NCW,                 0 },    { Ctrl_U,    nv_halfpage,    0,                      0 }, @@ -961,6 +961,7 @@ normal_end:        && s->oa.regname == 0) {      if (restart_VIsual_select == 1) {        VIsual_select = true; +      VIsual_select_reg = 0;        trigger_modechanged();        showmode();        restart_VIsual_select = 0; @@ -6186,6 +6187,7 @@ static void nv_g_cmd(cmdarg_T *cap)        // start Select mode.        if (cap->arg) {          VIsual_select = true; +        VIsual_select_reg = 0;        } else {          may_start_select('c');        } @@ -6698,11 +6700,26 @@ static void nv_dot(cmdarg_T *cap)    }  } -/* - * CTRL-R: undo undo - */ -static void nv_redo(cmdarg_T *cap) +// CTRL-R: undo undo or specify register in select mode +static void nv_redo_or_register(cmdarg_T *cap)  { +  if (VIsual_select && VIsual_active) { +    int reg; +    // Get register name +    no_mapping++; +    reg = plain_vgetc(); +    LANGMAP_ADJUST(reg, true); +    no_mapping--; + +    if (reg == '"') { +      // the unnamed register is 0 +      reg = 0; +    } + +    VIsual_select_reg = valid_yank_reg(reg, true) ? reg : 0; +    return; +  } +    if (!checkclearopq(cap->oap)) {      u_redo((int)cap->count1);      curwin->w_set_curswant = true; @@ -7023,6 +7040,7 @@ static void nv_select(cmdarg_T *cap)  {    if (VIsual_active) {      VIsual_select = true; +    VIsual_select_reg = 0;    } else if (VIsual_reselect) {      cap->nchar = 'v';               // fake "gv" command      cap->arg = true;  | 
