On Tue, 13 Apr 2021 09:51:01 -0600, Todd C. Miller wrote:

> This is consistent with vim's expandtab behavior.
>
> From nvi2 (Craig Leres):
> https://github.com/lichray/nvi2/commit/7d3f43559026e0927032a105b217850feaefec
> 66
>
> I know most of us don't use expandtab but it is helpful when dealing
> with a codebase that is space-indented.  Since the option originated
> with vim we should be as compatible as possible...

Any objections?  This change brings our vi in line with both nvi2
and vim when it comes to expandtab behavior.

 - todd

> Index: docs/USD.doc/vi.man/vi.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/docs/USD.doc/vi.man/vi.1,v
> retrieving revision 1.79
> diff -u -p -u -r1.79 vi.1
> --- docs/USD.doc/vi.man/vi.1  8 Mar 2021 02:47:29 -0000       1.79
> +++ docs/USD.doc/vi.man/vi.1  13 Apr 2021 15:44:26 -0000
> @@ -2356,8 +2356,12 @@ characters to
>  when inserting, replacing or shifting text, autoindenting,
>  indenting with
>  .Aq Ic control-T ,
> -or outdenting with
> -.Aq Ic control-D .
> +outdenting with
> +.Aq Ic control-D ,
> +or
> +when filtering lines with the
> +.Cm !\&
> +command.
>  .It Cm exrc , ex Bq off
>  Read the startup files in the local directory.
>  .It Cm extended Bq off
> Index: ex/ex_bang.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/ex/ex_bang.c,v
> retrieving revision 1.11
> diff -u -p -u -r1.11 ex_bang.c
> --- ex/ex_bang.c      18 Apr 2017 01:45:35 -0000      1.11
> +++ ex/ex_bang.c      13 Apr 2021 15:44:26 -0000
> @@ -171,6 +171,10 @@ ex_bang(SCR *sp, EXCMD *cmdp)
>       if (!F_ISSET(sp, SC_VI) && !F_ISSET(sp, SC_EX_SILENT))
>               (void)ex_puts(sp, "!\n");
>  
> +     /* Apply expandtab to the new text */
> +     if (O_ISSET(sp, O_EXPANDTAB))
> +             ex_retab(sp, cmdp);
> +
>       /*
>        * XXX
>        * The ! commands never return an error, so that autoprint always
> Index: ex/ex_shift.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/ex/ex_shift.c,v
> retrieving revision 1.9
> diff -u -p -u -r1.9 ex_shift.c
> --- ex/ex_shift.c     30 Apr 2020 10:40:21 -0000      1.9
> +++ ex/ex_shift.c     13 Apr 2021 15:44:26 -0000
> @@ -21,7 +21,7 @@
>  
>  #include "../common/common.h"
>  
> -enum which {LEFT, RIGHT};
> +enum which {RETAB, LEFT, RIGHT};
>  static int shift(SCR *, EXCMD *, enum which);
>  
>  /*
> @@ -48,6 +48,18 @@ ex_shiftr(SCR *sp, EXCMD *cmdp)
>  }
>  
>  /*
> + * ex_retab -- Expand tabs (if enabled)
> + *
> + *
> + * PUBLIC: int ex_retab(SCR *, EXCMD *);
> + */
> +int
> +ex_retab(SCR *sp, EXCMD *cmdp)
> +{
> +     return (shift(sp, cmdp, RETAB));
> +}
> +
> +/*
>   * shift --
>   *   Ex shift support.
>   */
> @@ -109,7 +121,9 @@ shift(SCR *sp, EXCMD *cmdp, enum which r
>                               break;
>  
>               /* Calculate the new indent amount. */
> -             if (rl == RIGHT)
> +             if (rl == RETAB)
> +                     newcol = oldcol;
> +             else if (rl == RIGHT)
>                       newcol = oldcol + sw;
>               else {
>                       newcol = oldcol < sw ? 0 : oldcol - sw;
> Index: include/ex_extern.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/include/ex_extern.h,v
> retrieving revision 1.16
> diff -u -p -u -r1.16 ex_extern.h
> --- include/ex_extern.h       27 May 2016 09:18:12 -0000      1.16
> +++ include/ex_extern.h       13 Apr 2021 15:44:26 -0000
> @@ -76,6 +76,7 @@ int ex_set(SCR *, EXCMD *);
>  int ex_shell(SCR *, EXCMD *);
>  int ex_exec_proc(SCR *, EXCMD *, char *, const char *, int);
>  int proc_wait(SCR *, pid_t, const char *, int, int);
> +int ex_retab(SCR *, EXCMD *);
>  int ex_shiftl(SCR *, EXCMD *);
>  int ex_shiftr(SCR *, EXCMD *);
>  int ex_source(SCR *, EXCMD *);
>

Reply via email to