On Mon, Nov 23, 2015 at 01:31:11AM -0700, Anthony J. Bentley wrote:
> When I hit backspace after a backslash, usually I just want to delete
> the backslash. I don't think I've ever intended to input a literal ^?.
> If I ever did want to insert ^H, ^?, or ^U, I would just type ^V first.
> 
> I've passed this diff around privately before and gotten a tepid
> response, but it was pointed out to me that it would fit better on tech@.

Original vi had this behaviour. AFAIK no modern vi (esp. all the vim
clones) behaves like this. I never depended on this feature and so think
we can follow the others and drop this magic.
 
> Index: vi/v_txt.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/vi/v_txt.c,v
> retrieving revision 1.27
> diff -u -p -u -p -r1.27 v_txt.c
> --- vi/v_txt.c        12 Nov 2014 04:28:41 -0000      1.27
> +++ vi/v_txt.c        19 Nov 2014 01:17:45 -0000
> @@ -618,30 +617,21 @@ replay: if (LF_ISSET(TXT_REPLAY))
>  
>       /*
>        * !!!
> -      * If this character was quoted by a K_VLNEXT or a backslash, replace
> -      * the placeholder (a carat or a backslash) with the new character.
> -      * If it was quoted by a K_VLNEXT, we've already adjusted the cursor
> -      * because it has to appear on top of the placeholder character.  If
> -      * it was quoted by a backslash, adjust the cursor now, the cursor
> -      * doesn't appear on top of it.  Historic practice in both cases.
> +      * If this character was quoted by a K_VLNEXT, replace the placeholder
> +      * (a carat) with the new character.  We've already adjusted the cursor
> +      * because it has to appear on top of the placeholder character.
> +      * Historic practice.
>        *
>        * Skip tests for abbreviations; ":ab xa XA" followed by "ixa^V<space>"
>        * doesn't perform an abbreviation.  Special case, ^V^J (not ^V^M) is
>        * the same as ^J, historically.
>        */
> -     if (quote == Q_BTHIS || quote == Q_VTHIS) {
> +     if (quote == Q_VTHIS) {
>               FL_CLR(ec_flags, EC_QUOTED);
>               if (LF_ISSET(TXT_MAPINPUT))
>                       FL_SET(ec_flags, EC_MAPINPUT);
>  
> -             if (quote == Q_BTHIS &&
> -                 (evp->e_value == K_VERASE || evp->e_value == K_VKILL)) {
> -                     quote = Q_NOTSET;
> -                     --tp->cno;
> -                     ++tp->owrite;
> -                     goto insl_ch;
> -             }
> -             if (quote == Q_VTHIS && evp->e_value != K_NL) {
> +             if (evp->e_value != K_NL) {
>                       quote = Q_NOTSET;
>                       goto insl_ch;
>               }
> @@ -1201,31 +1191,6 @@ leftmargin:            tp->lb[tp->cno - 1] = ' ';
>               if (LF_ISSET(TXT_SHOWMATCH))
>                       showmatch = 1;
>               goto ins_ch;
> -     case K_BACKSLASH:               /* Quote next erase/kill. */
> -             /*
> -              * !!!
> -              * Historic vi tried to make abbreviations after a backslash
> -              * escape work.  If you did ":ab x y", and inserted "x\^H",
> -              * (assuming the erase character was ^H) you got "x^H", and
> -              * no abbreviation was done.  If you inserted "x\z", however,
> -              * it tried to back up and do the abbreviation, i.e. replace
> -              * 'x' with 'y'.  The problem was it got it wrong, and you
> -              * ended up with "zy\".
> -              *
> -              * This is really hard to do (you have to remember the
> -              * word/non-word state, for example), and doesn't make any
> -              * sense to me.  Both backslash and the characters it
> -              * (usually) escapes will individually trigger the
> -              * abbreviation, so I don't see why the combination of them
> -              * wouldn't.  I don't expect to get caught on this one,
> -              * particularly since it never worked right, but I've been
> -              * wrong before.
> -              *
> -              * Do the tests for abbreviations, so ":ab xa XA",
> -              * "ixa\<K_VERASE>" performs the abbreviation.
> -              */
> -             quote = Q_BNEXT;
> -             goto insq_ch;
>       case K_VLNEXT:                  /* Quote next character. */
>               evp->e_c = '^';
>               quote = Q_VNEXT;
> @@ -1363,8 +1328,6 @@ ebuf_chk:       if (tp->cno >= tp->len) {
>  
>               /* Step the quote state forward. */
>               if (quote != Q_NOTSET) {
> -                     if (quote == Q_BNEXT)
> -                             quote = Q_BTHIS;
>                       if (quote == Q_VNEXT)
>                               quote = Q_VTHIS;
>               }
> Index: vi/vi.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/vi/vi.h,v
> retrieving revision 1.7
> diff -u -p -u -p -r1.7 vi.h
> --- vi/vi.h   28 Nov 2013 22:12:40 -0000      1.7
> +++ vi/vi.h   19 Nov 2014 01:17:45 -0000
> @@ -218,7 +218,7 @@ typedef struct _smap {
>  typedef enum { CNOTSET, FSEARCH, fSEARCH, TSEARCH, tSEARCH } cdir_t;
>  
>  typedef enum { AB_NOTSET, AB_NOTWORD, AB_INWORD } abb_t;
> -typedef enum { Q_NOTSET, Q_BNEXT, Q_BTHIS, Q_VNEXT, Q_VTHIS } quote_t;
> +typedef enum { Q_NOTSET, Q_VNEXT, Q_VTHIS } quote_t;
>  
>  /* Vi private, per-screen memory. */
>  typedef struct _vi_private {
> 

-- 
:wq Claudio

Reply via email to