]> granicus.if.org Git - vim/commitdiff
patch 8.2.0590: no 'backspace' value allows ignoring the insertion point v8.2.0590
authorBram Moolenaar <Bram@vim.org>
Fri, 17 Apr 2020 17:41:21 +0000 (19:41 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 17 Apr 2020 17:41:21 +0000 (19:41 +0200)
Problem:    No 'backspace' value allows ignoring the insertion point.
Solution:   Add the "nostop" and 3 values. (Christian Brabandt, closes #5940)

runtime/doc/options.txt
src/edit.c
src/option.c
src/option.h
src/optionstr.c
src/testdir/gen_opt_test.vim
src/testdir/test_backspace_opt.vim
src/version.c

index 9410726d08fb71424591a84cf00c253ef39fff6e..baccd25d23b02eae09270605361bbf7e4d46d361 100644 (file)
@@ -915,6 +915,8 @@ A jump table for the options with a short description can be found at |Q_op|.
        eol     allow backspacing over line breaks (join lines)
        start   allow backspacing over the start of insert; CTRL-W and CTRL-U
                stop once at the start of insert.
+       nostop  like start, except CTRL-W and CTRL-U do not stop at the start of
+               insert.
 
        When the value is empty, Vi compatible backspacing is used.
 
@@ -923,6 +925,7 @@ A jump table for the options with a short description can be found at |Q_op|.
          0     same as ":set backspace=" (Vi compatible)
          1     same as ":set backspace=indent,eol"
          2     same as ":set backspace=indent,eol,start"
+         3     same as ":set backspace=indent,eol,nostop"
 
        See |:fixdel| if your <BS> or <Del> key does not do what you want.
        NOTE: This option is set to "" when 'compatible' is set.
index edd2374e8fb3d9d3e8c980bfacf17a95c3dd0848..3f0803f685b9d836a69432bc2ac4069703025f78 100644 (file)
@@ -4884,8 +4884,10 @@ ins_bs(
                    revins_on ||
 #endif
                    (curwin->w_cursor.col > mincol
-                   && (curwin->w_cursor.lnum != Insstart_orig.lnum
-                       || curwin->w_cursor.col != Insstart_orig.col)));
+                   &&  (can_bs(BS_NOSTOP)
+                       || (curwin->w_cursor.lnum != Insstart_orig.lnum
+                       || curwin->w_cursor.col != Insstart_orig.col)
+                   )));
        }
        did_backspace = TRUE;
     }
index fa4d188c2d329d877798fd9383593121f28b6cb9..504ddf489d99941197b97f2f0c5485843cac831b 100644 (file)
@@ -1685,6 +1685,10 @@ do_set(
                                        *(char_u **)varp = vim_strsave(
                                                (char_u *)"indent,eol,start");
                                        break;
+                                   case 3:
+                                       *(char_u **)varp = vim_strsave(
+                                               (char_u *)"indent,eol,nostop");
+                                       break;
                                }
                                vim_free(oldval);
                                if (origval == oldval)
@@ -6818,7 +6822,7 @@ fill_breakat_flags(void)
  */
     int
 can_bs(
-    int                what)       // BS_INDENT, BS_EOL or BS_START
+    int                what)       // BS_INDENT, BS_EOL, BS_START or BS_NOSTOP
 {
 #ifdef FEAT_JOB_CHANNEL
     if (what == BS_START && bt_prompt(curbuf))
@@ -6826,7 +6830,8 @@ can_bs(
 #endif
     switch (*p_bs)
     {
-       case '2':       return TRUE;
+       case '3':       return TRUE;
+       case '2':       return (what != BS_NOSTOP);
        case '1':       return (what != BS_START);
        case '0':       return FALSE;
     }
index 52166cf2d2df0ac5983abf873a3e4d60fd7f23e7..bead4c5bb630cf0cc7f8ae99a47ac6dc32e55ac9 100644 (file)
 #define WIM_BUFLASTUSED        0x08
 
 // arguments for can_bs()
+// each defined char should be unique over all values
+// except for BS_START, that intentionally also matches BS_NOSTOP
+// because BS_NOSTOP behaves exactly the same except it
+// does not stop at the start of the insert point
 #define BS_INDENT      'i'     // "Indent"
-#define BS_EOL         'o'     // "eOl"
+#define BS_EOL         'l'     // "eoL"
 #define BS_START       's'     // "Start"
+#define BS_NOSTOP      'p'     // "nostoP
 
 // flags for the 'culopt' option
 #define CULOPT_LINE    0x01    // Highlight complete line
index 1cf1ee9dfc1438db8f76457784065634feca0417..17613a656712f638d32dafbc5d3f662075e2de67 100644 (file)
@@ -68,7 +68,7 @@ static char *(p_debug_values[]) = {"msg", "throw", "beep", NULL};
 static char *(p_ead_values[]) = {"both", "ver", "hor", NULL};
 static char *(p_buftype_values[]) = {"nofile", "nowrite", "quickfix", "help", "terminal", "acwrite", "prompt", "popup", NULL};
 static char *(p_bufhidden_values[]) = {"hide", "unload", "delete", "wipe", NULL};
-static char *(p_bs_values[]) = {"indent", "eol", "start", NULL};
+static char *(p_bs_values[]) = {"indent", "eol", "start", "nostop", NULL};
 #ifdef FEAT_FOLDING
 static char *(p_fdm_values[]) = {"manual", "expr", "marker", "indent", "syntax",
 # ifdef FEAT_DIFF
@@ -1910,7 +1910,7 @@ did_set_string_option(
     {
        if (VIM_ISDIGIT(*p_bs))
        {
-           if (*p_bs > '2' || p_bs[1] != NUL)
+           if (*p_bs > '3' || p_bs[1] != NUL)
                errmsg = e_invarg;
        }
        else if (check_opt_strings(p_bs, p_bs_values, TRUE) != OK)
index 4cb168a8adfbdc3668e145c9381a8e7b1d0875b8..8914902916faa391fc8b17329dae5f8ab7423e78 100644 (file)
@@ -63,7 +63,7 @@ let test_values = {
       \
       \ 'ambiwidth': [['', 'single'], ['xxx']],
       \ 'background': [['', 'light', 'dark'], ['xxx']],
-      \ 'backspace': [[0, 2, '', 'eol', 'eol,start'], ['xxx']],
+      \ 'backspace': [[0, 2, 3, '', 'eol', 'eol,start', 'indent,eol,nostop'], ['4', 'xxx']],
       \ 'backupcopy': [['yes', 'auto'], ['', 'xxx', 'yes,no']],
       \ 'backupext': [['xxx'], ['']],
       \ 'belloff': [['', 'all', 'copy,error'], ['xxx']],
index f0e13d1c028eef8bc4e334956730cd440423de58..ad051cca4565f5c57eea42c117d185c59a7ce65f 100644 (file)
@@ -19,6 +19,8 @@ func Test_backspace_option()
   call assert_equal('eol', &backspace)
   set backspace=start
   call assert_equal('start', &backspace)
+  set backspace=nostop
+  call assert_equal('nostop', &backspace)
   " Add the value
   set backspace=
   set backspace=indent
@@ -27,7 +29,11 @@ func Test_backspace_option()
   call assert_equal('indent,eol', &backspace)
   set backspace+=start
   call assert_equal('indent,eol,start', &backspace)
+  set backspace+=nostop
+  call assert_equal('indent,eol,start,nostop', &backspace)
   " Delete the value
+  set backspace-=nostop
+  call assert_equal('indent,eol,start', &backspace)
   set backspace-=indent
   call assert_equal('eol,start', &backspace)
   set backspace-=start
@@ -47,7 +53,9 @@ func Test_backspace_option()
   call assert_equal('1', &backspace)
   set backspace=2
   call assert_equal('2', &backspace)
-  call assert_false(match(Exec('set backspace=3'), '.*E474'))
+  set backspace=3
+  call assert_equal('3', &backspace)
+  call assert_false(match(Exec('set backspace=4'), '.*E474'))
   call assert_false(match(Exec('set backspace=10'), '.*E474'))
 
   " Cleared when 'compatible' is set
@@ -101,6 +109,39 @@ func Test_backspace_ctrl_u()
         \ "8 this shouldn't be deleted (not touched yet) vim7",
         \ ""], getline(1, '$'))
 
+  " Reset values
+  set compatible&vim
+  set visualbell&vim
+  set backspace&vim
+
+  " Test new nostop option
+  %d_
+  let expected = "foo bar foobar"
+  call setline(1, expected)
+  call cursor(1, 8)
+  exe ":norm! ianotherone\<c-u>"
+  call assert_equal(expected, getline(1))
+  call cursor(1, 8)
+  exe ":norm! ianothertwo\<c-w>"
+  call assert_equal(expected, getline(1))
+
+  let content = getline(1)
+  for value in ['indent,nostop', 'eol,nostop', 'indent,eol,nostop', 'indent,eol,start,nostop']
+    exe ":set bs=".. value
+    %d _
+    call setline(1, content)
+    let expected = " foobar"
+    call cursor(1, 8)
+    exe ":norm! ianotherone\<c-u>"
+    call assert_equal(expected, getline(1), 'CTRL-U backspace value: '.. &bs)
+    let expected = "foo  foobar"
+    call setline(1, content)
+    call cursor(1, 8)
+    exe ":norm! ianothertwo\<c-w>"
+    call assert_equal(expected, getline(1), 'CTRL-W backspace value: '.. &bs)
+  endfor
+
+  " Reset options
   set compatible&vim
   set visualbell&vim
   set backspace&vim
index 76f501da99d3f2dc5a715930aa907b2db8910574..ee4608b73c879b0b46a5fb71e1cf923f918a7dbc 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    590,
 /**/
     589,
 /**/