Mercurial > vim
diff src/normal.c @ 6927:58d9f967ae1a v7.4.782
patch 7.4.782
Problem: Still a few problems with CTRL-A and CTRL-X in Visual mode.
Solution: Fix the reported problems. (Christian Brabandt)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Fri, 17 Jul 2015 13:03:48 +0200 |
parents | f9876721bedc |
children | 1e621b31948b |
line wrap: on
line diff
--- a/src/normal.c +++ b/src/normal.c @@ -40,6 +40,7 @@ static void find_start_of_word __ARGS((p static void find_end_of_word __ARGS((pos_T *)); static int get_mouse_class __ARGS((char_u *p)); #endif +static void prep_redo_visual __ARGS((cmdarg_T *cap)); static void prep_redo_cmd __ARGS((cmdarg_T *cap)); static void prep_redo __ARGS((int regname, long, int, int, int, int, int)); static int checkclearop __ARGS((oparg_T *oap)); @@ -3613,6 +3614,43 @@ find_ident_at_pos(wp, lnum, startcol, st } /* + * Add commands to reselect Visual mode into the redo buffer. + */ + static void +prep_redo_visual(cap) + cmdarg_T *cap; +{ + ResetRedobuff(); + AppendCharToRedobuff(VIsual_mode); + if (VIsual_mode == 'V' && curbuf->b_visual.vi_end.lnum + != curbuf->b_visual.vi_start.lnum) + { + AppendNumberToRedobuff(curbuf->b_visual.vi_end.lnum + - curbuf->b_visual.vi_start.lnum); + AppendCharToRedobuff('j'); + } + else if (VIsual_mode == 'v' || VIsual_mode == Ctrl_V) + { + /* block visual mode or char visual mmode*/ + if (curbuf->b_visual.vi_end.lnum != curbuf->b_visual.vi_start.lnum) + { + AppendNumberToRedobuff(curbuf->b_visual.vi_end.lnum - + curbuf->b_visual.vi_start.lnum); + AppendCharToRedobuff('j'); + } + if (curbuf->b_visual.vi_curswant == MAXCOL) + AppendCharToRedobuff('$'); + else if (curbuf->b_visual.vi_end.col > curbuf->b_visual.vi_start.col) + { + AppendNumberToRedobuff(curbuf->b_visual.vi_end.col + - curbuf->b_visual.vi_start.col - 1); + AppendCharToRedobuff(' '); + } + } + AppendNumberToRedobuff(cap->count1); +} + +/* * Prepare for redo of a normal command. */ static void @@ -4207,16 +4245,9 @@ nv_addsub(cap) { if (visual) { - ResetRedobuff(); - AppendCharToRedobuff(VIsual_mode); - if (VIsual_mode == 'V') - { - AppendNumberToRedobuff(cap->oap->line_count); - AppendCharToRedobuff('j'); - } - AppendNumberToRedobuff(cap->count1); - if (cap->nchar != NUL) - AppendCharToRedobuff(cap->nchar); + prep_redo_visual(cap); + if (cap->arg) + AppendCharToRedobuff('g'); AppendCharToRedobuff(cap->cmdchar); } else @@ -4227,7 +4258,8 @@ nv_addsub(cap) if (visual) { VIsual_active = FALSE; - redraw_later(CLEAR); + redo_VIsual_busy = FALSE; + redraw_later(INVERTED); } }