[PATCH 2/2] vi: don't touch file with :x when modified_count == 0

walter harms wharms at bfs.de
Wed Feb 22 14:03:20 UTC 2017



Am 22.02.2017 14:11, schrieb Yousong Zhou:
> Along with it, there are other changes
> 
>  - Check for uppercase X is removed as the expression will be always false and
>    :X itself is another totally different command in standard vim
>  - The status line will show number of written lines instead of lines requested
>    by the colon command.  This is also how the standard vim is doing, though
>    the difference is that '!' has to be explicitly specified in vim to allow
>    partial writes
> 
> "make bloatcheck" output
> 
>     function                                             old     new   delta
>     colon                                               3190    3193      +3
>     ------------------------------------------------------------------------------
>     (add/remove: 0/0 grow/shrink: 1/0 up/down: 3/0)                 Total: 3 bytes
> 
> Signed-off-by: Yousong Zhou <yszhou4tech at gmail.com>
> ---
>  editors/vi.c | 43 ++++++++++++++++++++++++++-----------------
>  1 file changed, 26 insertions(+), 17 deletions(-)
> 
> diff --git a/editors/vi.c b/editors/vi.c
> index 4b5b7cd..f33db66 100644
> --- a/editors/vi.c
> +++ b/editors/vi.c
> @@ -1034,7 +1034,9 @@ static void colon(char *buf)
>  	 || strncmp(p, "wn", cnt) == 0
>  	 || (p[0] == 'x' && !p[1])
>  	) {
> -		cnt = file_write(current_filename, text, end - 1);
> +		if (modified_count != 0 || p[0] != 'x') {
> +			cnt = file_write(current_filename, text, end - 1);
> +		}
>  		if (cnt < 0) {
>  			if (cnt == -1)
>  				status_line_bold("Write error: %s", strerror(errno));
> @@ -1045,8 +1047,9 @@ static void colon(char *buf)
>  				current_filename,
>  				count_lines(text, end - 1), cnt
>  			);
> -			if (p[0] == 'x' || p[1] == 'q' || p[1] == 'n'
> -			 || p[0] == 'X' || p[1] == 'Q' || p[1] == 'N'
> +			if (p[0] == 'x'
> +			 || p[1] == 'q' || p[1] == 'n'
> +			 || p[1] == 'Q' || p[1] == 'N'
>  			) {
>  				editing = 0;
>  			}

	maybe you can save a few bit by using:
	if ( strchr("xqnQN",p[0]) )
		editing = 0;


> @@ -1476,16 +1479,19 @@ static void colon(char *buf)
>  			goto ret;
>  		}
>  #endif
> -		// how many lines in text[]?
> -		li = count_lines(q, r);
> -		size = r - q + 1;
>  		//if (useforce) {
>  			// if "fn" is not write-able, chmod u+w
>  			// sprintf(syscmd, "chmod u+w %s", fn);
>  			// system(syscmd);
>  			// forced = TRUE;
>  		//}
> -		l = file_write(fn, q, r);
> +		if (modified_count != 0 || cmd[0] != 'x') {
> +			size = r - q + 1;
> +			l = file_write(fn, q, r);
> +		} else {
> +			size = 0;
> +			l = 0;
> +		}

you can turn this an its head an simplify you life:
	size = 0;
	l = 0;
	if (modified_count != 0 || cmd[0] != 'x') {
		size = r - q + 1;
		l = file_write(fn, q, r);
	}

>  		//if (useforce && forced) {
>  			// chmod u-w
>  			// sprintf(syscmd, "chmod u-w %s", fn);
> @@ -1496,17 +1502,20 @@ static void colon(char *buf)
>  			if (l == -1)
>  				status_line_bold_errno(fn);
>  		} else {
> +			// how many lines written
> +			li = count_lines(q, q + l - 1);
>  			status_line("'%s' %dL, %dC", fn, li, l);
> -			if (q == text && r == end - 1 && l == size) {
> -				modified_count = 0;
> -				last_modified_count = -1;
> -			}
> -			if ((cmd[0] == 'x' || cmd[1] == 'q' || cmd[1] == 'n'
> -			    || cmd[0] == 'X' || cmd[1] == 'Q' || cmd[1] == 'N'
> -			    )
> -			 && l == size
> -			) {
> -				editing = 0;
> +			if (l == size) {

		save and reduce indent level

		if (l != size ) break;

> +				if (q == text && q + l == end) {
> +					modified_count = 0;
> +					last_modified_count = -1;
> +				}
> +				if (cmd[0] == 'x'
> +				 || cmd[1] == 'q' || cmd[1] == 'n'
> +				 || cmd[1] == 'Q' || cmd[1] == 'N'
> +				) {
> +					editing = 0;
> +				}
		strchr("xqnQN",cmd[0])

hope that helps,
re,
 wh
	
>  			}
>  		}
>  #if ENABLE_FEATURE_VI_YANKMARK


More information about the busybox mailing list