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
						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