To: vim_dev@googlegroups.com Subject: Patch 8.1.0971 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0971 Problem: Failure for selecting quoted text object moves cursor. Solution: Restore the Visual selection on failure. (Christian Brabandt, closes #4024) Files: src/search.c, src/testdir/test_textobjects.vim *** ../vim-8.1.0970/src/search.c 2019-02-17 17:44:36.219875473 +0100 --- src/search.c 2019-02-22 14:55:16.869702567 +0100 *************** *** 4359,4369 **** int col_end; int col_start = curwin->w_cursor.col; int inclusive = FALSE; ! int vis_empty = TRUE; /* Visual selection <= 1 char */ ! int vis_bef_curs = FALSE; /* Visual starts before cursor */ ! int inside_quotes = FALSE; /* Looks like "i'" done before */ ! int selected_quote = FALSE; /* Has quote inside selection */ int i; /* Correct cursor when 'selection' is "exclusive". */ if (VIsual_active) --- 4359,4370 ---- int col_end; int col_start = curwin->w_cursor.col; int inclusive = FALSE; ! int vis_empty = TRUE; // Visual selection <= 1 char ! int vis_bef_curs = FALSE; // Visual starts before cursor ! int inside_quotes = FALSE; // Looks like "i'" done before ! int selected_quote = FALSE; // Has quote inside selection int i; + int restore_vis_bef = FALSE; // restore VIsual on abort /* Correct cursor when 'selection' is "exclusive". */ if (VIsual_active) *************** *** 4377,4388 **** { if (!vis_bef_curs) { ! /* VIsual needs to be start of Visual selection. */ pos_T t = curwin->w_cursor; curwin->w_cursor = VIsual; VIsual = t; vis_bef_curs = TRUE; } dec_cursor(); } --- 4378,4390 ---- { if (!vis_bef_curs) { ! // VIsual needs to be the start of Visual selection. pos_T t = curwin->w_cursor; curwin->w_cursor = VIsual; VIsual = t; vis_bef_curs = TRUE; + restore_vis_bef = TRUE; } dec_cursor(); } *************** *** 4431,4437 **** * opening quote. */ col_start = find_next_quote(line, col_start + 1, quotechar, NULL); if (col_start < 0) ! return FALSE; col_end = find_next_quote(line, col_start + 1, quotechar, curbuf->b_p_qe); if (col_end < 0) --- 4433,4439 ---- * opening quote. */ col_start = find_next_quote(line, col_start + 1, quotechar, NULL); if (col_start < 0) ! goto abort_search; col_end = find_next_quote(line, col_start + 1, quotechar, curbuf->b_p_qe); if (col_end < 0) *************** *** 4445,4451 **** { col_end = find_prev_quote(line, col_start, quotechar, NULL); if (line[col_end] != quotechar) ! return FALSE; col_start = find_prev_quote(line, col_end, quotechar, curbuf->b_p_qe); if (line[col_start] != quotechar) --- 4447,4453 ---- { col_end = find_prev_quote(line, col_start, quotechar, NULL); if (line[col_end] != quotechar) ! goto abort_search; col_start = find_prev_quote(line, col_end, quotechar, curbuf->b_p_qe); if (line[col_start] != quotechar) *************** *** 4480,4491 **** /* Find open quote character. */ col_start = find_next_quote(line, col_start, quotechar, NULL); if (col_start < 0 || col_start > first_col) ! return FALSE; /* Find close quote character. */ col_end = find_next_quote(line, col_start + 1, quotechar, curbuf->b_p_qe); if (col_end < 0) ! return FALSE; /* If is cursor between start and end quote character, it is * target text object. */ if (col_start <= first_col && first_col <= col_end) --- 4482,4493 ---- /* Find open quote character. */ col_start = find_next_quote(line, col_start, quotechar, NULL); if (col_start < 0 || col_start > first_col) ! goto abort_search; /* Find close quote character. */ col_end = find_next_quote(line, col_start + 1, quotechar, curbuf->b_p_qe); if (col_end < 0) ! goto abort_search; /* If is cursor between start and end quote character, it is * target text object. */ if (col_start <= first_col && first_col <= col_end) *************** *** 4502,4515 **** /* No quote before the cursor, look after the cursor. */ col_start = find_next_quote(line, col_start, quotechar, NULL); if (col_start < 0) ! return FALSE; } /* Find close quote character. */ col_end = find_next_quote(line, col_start + 1, quotechar, curbuf->b_p_qe); if (col_end < 0) ! return FALSE; } /* When "include" is TRUE, include spaces after closing quote or before --- 4504,4517 ---- /* No quote before the cursor, look after the cursor. */ col_start = find_next_quote(line, col_start, quotechar, NULL); if (col_start < 0) ! goto abort_search; } /* Find close quote character. */ col_end = find_next_quote(line, col_start + 1, quotechar, curbuf->b_p_qe); if (col_end < 0) ! goto abort_search; } /* When "include" is TRUE, include spaces after closing quote or before *************** *** 4596,4601 **** --- 4598,4617 ---- } return OK; + + abort_search: + if (VIsual_active && *p_sel == 'e') + { + inc_cursor(); + if (restore_vis_bef) + { + pos_T t = curwin->w_cursor; + + curwin->w_cursor = VIsual; + VIsual = t; + } + } + return FALSE; } #endif /* FEAT_TEXTOBJ */ *** ../vim-8.1.0970/src/testdir/test_textobjects.vim 2019-01-09 23:00:58.001176090 +0100 --- src/testdir/test_textobjects.vim 2019-02-22 14:56:31.897291834 +0100 *************** *** 52,57 **** --- 52,82 ---- bw! endfunc + func Test_quote_selection_selection_exclusive_abort() + new + set selection=exclusive + call setline(1, "'abzzc'") + let exp_curs = [0, 1, 6, 0] + call cursor(1,1) + exe 'norm! fcdvi"' + " make sure to end visual mode to have a clear state + exe "norm! \" + call assert_equal(exp_curs, getpos('.')) + call cursor(1,1) + exe 'norm! fcvi"' + exe "norm! \" + call assert_equal(exp_curs, getpos('.')) + call cursor(1,2) + exe 'norm! vfcoi"' + exe "norm! \" + let exp_curs = [0, 1, 2, 0] + let exp_visu = [0, 1, 7, 0] + call assert_equal(exp_curs, getpos('.')) + call assert_equal(exp_visu, getpos("'>")) + set selection&vim + bw! + endfunc + " Tests for string and html text objects func Test_string_html_objects() enew! *** ../vim-8.1.0970/src/version.c 2019-02-22 14:38:46.447452832 +0100 --- src/version.c 2019-02-22 15:02:30.395260732 +0100 *************** *** 781,782 **** --- 781,784 ---- { /* Add new patch number below this line */ + /**/ + 971, /**/ -- hundred-and-one symptoms of being an internet addict: 11. You find yourself typing "com" after every period when using a word processor.com /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///