To: "Robert Webb" Cc: vim-dev@vim.org Subject: patch 5.4n.6 (was: gv bug) In-Reply-To: <006001bec774$a91964a0$1014a8c0@robertw.pn.beam.com.au> Robert Webb wrote: > Here's a bug with "gv". > > - select some characters near the end of a line in visual mode (eg with > "vlllll"). > - Exit visual mode ("v"). > - Delete the last part of the line, including all the characters that were > previously selected ("D"). > - Now re-select the area ("gv"). > > The cursor goes to a character position past the end of the line. Also, you > can't move left with "h". I see the problem. Actually, "h" does work, but since the cursor is way past the end of the line you have to hit it a few more times. Strange that there was no check for the start and end of the Visual area to be on a valid character. I'll add that now. Patch 5.4n.6 Problem: "gv" could reselect a Visual that starts and/or ends past the end of a line. (Robert Webb) Solution: Check that the start and end of the Visual area are on a valid character by calling adjust_cursor(). Files: src/normal.c *** ../vim-5.4n/src/normal.c Sun Jul 4 20:36:01 1999 --- src/normal.c Tue Jul 6 12:58:32 1999 *************** *** 4927,4954 **** beep_flush(); else { if (VIsual_active) { - tpos = VIsual; - VIsual = curbuf->b_visual_start; - curbuf->b_visual_start = tpos; i = VIsual_mode; VIsual_mode = curbuf->b_visual_mode; curbuf->b_visual_mode = i; ! tpos = curwin->w_cursor; ! curwin->w_cursor = curbuf->b_visual_end; ! curbuf->b_visual_end = tpos; } else { - VIsual = curbuf->b_visual_start; - curwin->w_cursor = curbuf->b_visual_end; VIsual_mode = curbuf->b_visual_mode; } VIsual_active = TRUE; VIsual_reselect = TRUE; ! check_cursor_lnum(); update_topline(); /* * When called from normal "g" command: start Select mode when --- 4927,4959 ---- beep_flush(); else { + /* set w_cursor to the start of the Visual area, tpos to the end */ if (VIsual_active) { i = VIsual_mode; VIsual_mode = curbuf->b_visual_mode; curbuf->b_visual_mode = i; ! tpos = curbuf->b_visual_end; ! curbuf->b_visual_end = curwin->w_cursor; ! curwin->w_cursor = curbuf->b_visual_start; ! curbuf->b_visual_start = VIsual; } else { VIsual_mode = curbuf->b_visual_mode; + tpos = curbuf->b_visual_end; + curwin->w_cursor = curbuf->b_visual_start; } VIsual_active = TRUE; VIsual_reselect = TRUE; ! ! /* Set Visual to the start and w_cursor to the end of the Visual ! * area. Make sure they are on an existing character. */ ! adjust_cursor(); ! VIsual = curwin->w_cursor; ! curwin->w_cursor = tpos; ! adjust_cursor(); update_topline(); /* * When called from normal "g" command: start Select mode when -- VOICE OVER: As the horrendous Black Beast lunged forward, escape for Arthur and his knights seemed hopeless, when, suddenly ... the animator suffered a fatal heart attack. ANIMATOR: Aaaaagh! VOICE OVER: The cartoon peril was no more ... The Quest for Holy Grail could continue. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD --/-/---- Bram Moolenaar ---- Bram@moolenaar.net ---- Bram@vim.org ---\-\-- \ \ www.vim.org/iccf www.moolenaar.net www.vim.org / / .