vi: make autoindent respect expandtab setting
Autoindent took a copy of the indent from a neighbouring line, which may not have respected the expandtab setting. Determine the target column and construct a suitable indent. This will consist entirely of spaces if expandtab is enabled or an efficient combination of tabs and spaces otherwise. function old new delta char_insert 719 741 +22 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/0 up/down: 22/0) Total: 22 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		
				
					committed by
					
						
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						parent
						
							d95f89ec57
						
					
				
				
					commit
					16e2fa9049
				
			
							
								
								
									
										32
									
								
								editors/vi.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								editors/vi.c
									
									
									
									
									
								
							@@ -2111,6 +2111,7 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p'
 | 
			
		||||
#if ENABLE_FEATURE_VI_SETOPTS
 | 
			
		||||
	char *q;
 | 
			
		||||
	size_t len;
 | 
			
		||||
	int col, ntab, nspc;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (c == 22) {		// Is this an ctrl-V?
 | 
			
		||||
@@ -2151,7 +2152,7 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p'
 | 
			
		||||
		}
 | 
			
		||||
#if ENABLE_FEATURE_VI_SETOPTS
 | 
			
		||||
	} else if (c == '\t' && expandtab) {	// expand tab
 | 
			
		||||
		int col = get_column(p);
 | 
			
		||||
		col = get_column(p);
 | 
			
		||||
		col = next_tabstop(col) - col + 1;
 | 
			
		||||
		while (col--) {
 | 
			
		||||
# if ENABLE_FEATURE_VI_UNDO
 | 
			
		||||
@@ -2186,23 +2187,28 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p'
 | 
			
		||||
			showmatching(p - 1);
 | 
			
		||||
		}
 | 
			
		||||
		if (autoindent && c == '\n') {	// auto indent the new line
 | 
			
		||||
			// use current/previous line as template
 | 
			
		||||
			// use indent of current/previous line
 | 
			
		||||
			q = openabove ? p : prev_line(p);
 | 
			
		||||
			len = strspn(q, " \t"); // space or tab
 | 
			
		||||
			if (openabove) {
 | 
			
		||||
				p--;		// this replaces dot_prev() in do_cmd()
 | 
			
		||||
				q += len;	// template will be shifted by text_hole_make()
 | 
			
		||||
			}
 | 
			
		||||
			if (openabove)
 | 
			
		||||
				p--;	// indent goes before newly inserted NL
 | 
			
		||||
			if (len) {
 | 
			
		||||
				uintptr_t bias;
 | 
			
		||||
				bias = text_hole_make(p, len);
 | 
			
		||||
				p += bias;
 | 
			
		||||
				q += bias;
 | 
			
		||||
				col = get_column(q + len);
 | 
			
		||||
				if (expandtab) {
 | 
			
		||||
					ntab = 0;
 | 
			
		||||
					nspc = col;
 | 
			
		||||
				} else {
 | 
			
		||||
					ntab = col / tabstop;
 | 
			
		||||
					nspc = col % tabstop;
 | 
			
		||||
				}
 | 
			
		||||
				p += text_hole_make(p, ntab + nspc);
 | 
			
		||||
# if ENABLE_FEATURE_VI_UNDO
 | 
			
		||||
				undo_push_insert(p, len, undo);
 | 
			
		||||
				undo_push_insert(p, ntab + nspc, undo);
 | 
			
		||||
# endif
 | 
			
		||||
				memcpy(p, q, len);
 | 
			
		||||
				p += len;
 | 
			
		||||
				memset(p, '\t', ntab);
 | 
			
		||||
				p += ntab;
 | 
			
		||||
				memset(p, ' ', nspc);
 | 
			
		||||
				p += nspc;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user