diff options
| author | KatolaZ <katolaz@freaknet.org> | 2019-08-16 23:43:24 +0100 | 
|---|---|---|
| committer | KatolaZ <katolaz@freaknet.org> | 2019-08-16 23:43:24 +0100 | 
| commit | ce2bfb4d3a49a27bde7c8bbc6c6b1ef6f80054aa (patch) | |
| tree | d1fcd43773692a8473d7c335303370eada9a1569 | |
| parent | 02c54fe6f289901f5b356ca98a81dec78fef4f36 (diff) | |
add position marks (Ma/g'a)
| -rw-r--r-- | TODO | 2 | ||||
| -rw-r--r-- | gramscii.1 | 48 | ||||
| -rw-r--r-- | gramscii.c | 3 | ||||
| -rw-r--r-- | gramscii.h | 9 | ||||
| -rw-r--r-- | screen.c | 37 | 
5 files changed, 88 insertions, 11 deletions
@@ -1,6 +1,7 @@  + optimize redraws (redraw only the modified rectangle)  - add screen geometry option (-g 25x80?)  - (?)maybe move "text" mode to "t" +- implement trapezium  - implement ellipse  - (?) filled box (B)  - (?) manage filled box character (as for other styles) @@ -13,6 +14,7 @@  - allow scrolling (both vertical and horizontal)  - catch SIGWINCH and react appropriately (after scrolling is     enabled) +* add position marks (Ma / g'a)  * implement comment (#: ignore everything until the end of the line)  * implement parallelogram mode (z/Z)  * fix bug in reading commands from files @@ -86,6 +86,17 @@ command).  Load (edit) an existing file from disk, discarding any change to the  current screen.  .TP 5m +.BI M a +Mark (label) the current cursor position as 'a'. The label 'a' must be +one of the 26 ASCII alphabetic characters. The cursor can be moved to a +previously marked position using the global positioning command +.B g +(see below). Position marks are case-insensitive, meaning that both  +.I 'c' +and +.I 'C' +indicate the same mark. +.TP 5m  .BI N  Start a new empty screen. If the current screen has been modified since  the last @@ -178,11 +189,13 @@ units at a time (defaults to 5, change LONG_STEP in config.h as you  wish).  .TP 5m  .BI g -Initiate a global positioning command (go). These are two-letter -commands starting with a +Initiate a global positioning command (go). These are two- or +three-letter commands starting with a  .BI g -and followed by a direction command or by a character that indicates a -global position, namely: +and followed by a direction command, or by a character that indicates a +global position, or by a valid position mark previously defined with  +.B M +and preceded by a single quote. In particular:  .RS  .TP 5m  .BI h @@ -205,9 +218,24 @@ move the cursor to the bottom-right corner of the screen  .TP 5m  .BI m  move the cursor to the middle of the screen. +.TP 5m +.BI 'a +(single-quote followed by a character) move the cursor to the position +previously marked (labelled) with character +.BI 'a' +by the command +.B M +(mark). The character 'a' must be one of the 26 ASCII alphabetic +characters. Notice that position marks are case-insensitive, so the two +commands: +.B g'b +and +.B g'B +move the cursor to the position mark associated to the letter 'b', if it +exists.  .PP -For instance, if you want to move the cursor to the first row of the -current column, you would use the two-letter command  +If you want to move the cursor to the first row of the current +column, you could use the two-letter command   .B gk   (which can be read as "go-up"). Similarly, the command  .B gh @@ -227,13 +255,13 @@ is equivalent to  ).  .PP  Global positioning commands are available in  -.B box, arrow, visual, +.B box, arrow, visual, parallelogram,   and   .B erase  mode. Notice that -.B gg, gG,  -and  -.B gm,  +.B gg, gG, gm  +and moves to position marks like +.B g'b,   are not available in   .B arrow  mode. @@ -142,6 +142,9 @@ void commands(FILE *fc){  					mode = REM;  					get_comment(fc);  					break; +				case 'M': +					mark_pos(fc); +					break;  				case 'q':  					check_modified(fc);/** FALLTHROUGH **/  				case 'Q': @@ -90,6 +90,11 @@ typedef struct{  	line_t *l;  } lineset_t; +typedef struct{ +	int x; +	int y; +} pos_t; +  /** MACROS **/ @@ -105,6 +110,9 @@ lineset_t screen; /* what is visualised */  lineset_t cutbuf; /* cut/paste buffer */  lineset_t *undo;  /* undo list */ +pos_t marks[26]; /* position marks */ +char mark_map[26]; /* marks map */ +  int undo_sz;/* allocated size of undo list*/  int undo_cur;/* undo position */  int undo_lst;/* last valid undo position */ @@ -175,6 +183,7 @@ void crop_to_nonblank();  void crop_to_rect();  void erase_blank_lines(int y1, int y2);  int _isblank(int c); +void mark_pos(FILE *fc);  /**/  /** drawing-related functions **/ @@ -301,6 +301,24 @@ void handle_goto(FILE *fc, char global){  				go_to(MIDDLE);  			} else step = 0;  			break; +		case '\'': +			c = tolower(fgetc(fc)); +			if (global) { +				dir = DIR_N; +				if (isalpha(c) && mark_map[c - 'a']){ +					x = marks[c - 'a'].x; +					y = marks[c - 'a'].y; +#ifdef DEBUG +					fprintf(stderr, "going to valid mark '%c' (%d, %d)\n", c, x, y); +#endif +				} +#ifdef DEBUG +				else  +					fprintf(stderr, "invalid mark '%c'\n", c); +#endif +			} else step = 0; +			break; +  	}  #ifdef DEBUG @@ -435,20 +453,23 @@ void init_screen(){  	for (i=0; i<HEIGHT; i++){  		alloc_line(&(screen.l[i]));  	} +	/* init markers */  	hlines_sz= sizeof(hlines) -1;  	vlines_sz= sizeof(vlines) -1;  	corners_sz = sizeof(corners) -1;  	stmarks_sz = sizeof(st_marks) - 1;  	endmarks_sz = sizeof(st_marks) - 1;  	reset_styles(); +	/* init undo ring */	  	cutbuf.sz = 0;  	cutbuf.l = NULL;  	cutbuf.num = 0; -	  	undo = NULL;  	undo_sz = 0;  	undo_cur = -2;  	undo_lst = -2; +	/* init pos marks */ +	memset(mark_map, 0, 26 * sizeof(char));  }  void find_nonblank_rect(int *x1, int *y1, int *x2, int *y2){ @@ -507,4 +528,18 @@ void crop_to_nonblank(){  	redraw();  } +/** position marks **/ +void mark_pos(FILE *fc){ + +	char c; +	c = tolower(fgetc(fc)); +	if (isalpha(c)){ +		marks[c - 'a'].x = x; +		marks[c - 'a'].y = y; +		mark_map[c - 'a'] = 1; +#ifdef DEBUG +		fprintf(stderr, "marking pos (%d, %d) as '%c'\n", x, y, c); +#endif +	} +}  | 
