style change in box and arrow modes + fix manpage - gramscii - A simple editor … | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit 4cb5948229fea24c9a2eb3413d6dbe53613bada7 | |
parent 2e1d9e58798f35b1861862d5dcff8088aab4edea | |
Author: KatolaZ <[email protected]> | |
Date: Sun, 21 Jul 2019 00:11:03 +0100 | |
style change in box and arrow modes + fix manpage | |
Diffstat: | |
M TODO | 13 ++++++++++++- | |
M gramscii.1 | 19 ++++++++++++++----- | |
M gramscii.c | 145 +++++++++++++++++------------… | |
3 files changed, 108 insertions(+), 69 deletions(-) | |
--- | |
diff --git a/TODO b/TODO | |
@@ -1,8 +1,17 @@ | |
+ optimize redraws (i.e., avoid to redraw if possible) | |
-- (?) change cursor shape according to action | |
+- move configs in config.h | |
+- add Makefile | |
- auto-arrow 'A' (automatic end-char) | |
- change screen management (i.e., use an array of lines) | |
- read file at point | |
+- parse control characters | |
+ - parse arrows (text-mode will allow movements as well) | |
+- implement CTRL+G as abort (aside ESC) | |
+- change "g" command: | |
+ - g-g (goto top-left) | |
+ - g-G (goto bottom-right) | |
+ - g-m (goto middle) | |
+ - g-[hjkl] (goto leftmost, bottom, top, rightmost) | |
+ visual selection | |
- crop | |
- yank/put | |
@@ -13,6 +22,8 @@ | |
(also do not print unmanaged chars!) | |
- get screen geometry | |
- allow scrolling (both vertical and horizontal) | |
+* move style commands in a separate function | |
+ (and allow style change in all the modes...) | |
* add "vis" (for visual) in mode strings | |
* implement "." to reset styles to defaults. | |
* load from file | |
diff --git a/gramscii.1 b/gramscii.1 | |
@@ -17,7 +17,9 @@ keystrokes, and keystrokes have different meaning in differen… | |
The default mode is | |
.B move | |
mode, which allows the user to move the cursor around the screen. | |
-Exiting from any other mode automatically puts gramscii in | |
+Exiting from any other mode (either via pressing | |
+.B [ESC] | |
+or by toggling the current mode) automatically puts gramscii in | |
.B move | |
mode. There are four classes of commands in gramscii, namely | |
.B GENERAL, | |
@@ -195,7 +197,9 @@ while in | |
.BI erase | |
mode, the current erase operation is aborted. Press | |
.B x | |
-again to make the erase permanent. | |
+again to make the erase permanent and return to | |
+.B move | |
+mode. | |
.TP 7m | |
.BI i | |
Enter | |
@@ -255,8 +259,13 @@ mode. | |
.RE | |
.SS STYLES | |
-The following commands can be used to customise the style of lines, | |
-corners, and arrow start and end points: | |
+The style of lines, corners and markers can be changed at any time while | |
+in | |
+.B move, | |
+.B box, | |
+and | |
+.B arrow | |
+mode. The following style commands are available: | |
.TP 5m | |
.B . | |
(dot) Reset all styles to their default values. | |
@@ -362,7 +371,7 @@ would automatically save the screen into "filename". | |
.SH BUGS | |
gramscii currently manages only a fixed screen of 25 rows by 100 | |
columns. This will be changed in a future release to support scrolling | |
-and "virtual" screen of any (reasonable) size. | |
+and "virtual" screens of any (reasonable) size. | |
.PP | |
gramscii currently does | |
.B not | |
diff --git a/gramscii.c b/gramscii.c | |
@@ -362,6 +362,33 @@ void toggle_end_mark(){ | |
mark_end = end_marks[cur_end]; | |
} | |
+int change_style(char c){ | |
+ switch(c){ | |
+ case '-': | |
+ toggle_hline(); | |
+ break; | |
+ case '|': | |
+ toggle_vline(); | |
+ break; | |
+ case '+': | |
+ toggle_corner(); | |
+ break; | |
+ case '<': | |
+ toggle_st_mark(); | |
+ break; | |
+ case '>': | |
+ toggle_end_mark(); | |
+ break; | |
+ case '.': | |
+ reset_styles(); | |
+ break; | |
+ default: | |
+ return 0; | |
+ } | |
+ return c; | |
+} | |
+ | |
+ | |
/***** text, box, arrows *****/ | |
@@ -430,10 +457,14 @@ void get_box(){ | |
step = 1; | |
draw_box(x,y,NOFIX); | |
while((c=getchar())!=EOF && c != 27 && c!= 'b'){ | |
- if (!move_around(c)) continue; | |
+ if (change_style(c)) | |
+ goto update_box; | |
+ if (!move_around(c)) | |
+ continue; | |
check_bound(); | |
redraw(); | |
step = 1; | |
+update_box: | |
draw_box(orig_x, orig_y, NOFIX); | |
status_bar(); | |
show_cursor(); | |
@@ -504,7 +535,10 @@ void get_arrow(){ | |
step = 1; | |
draw_arrow(x,y, arrow, 0, NOFIX); | |
while((c=getchar())!=EOF && c != 27 && c!= 'a'){ | |
- if (!move_around(c)) continue; | |
+ if (change_style(c)) | |
+ goto update_arrow; | |
+ if (!move_around(c)) | |
+ continue; | |
check_bound(); | |
/* FIXME: if we are out of bound, do nothing? */ | |
if (arrow_len == arrow_sz){ | |
@@ -515,6 +549,7 @@ void get_arrow(){ | |
arrow[arrow_len++] = step; | |
redraw(); | |
step = 1; | |
+update_arrow: | |
draw_arrow(orig_x, orig_y, arrow, arrow_len, NOFIX); | |
status_bar(); | |
show_cursor(); | |
@@ -701,67 +736,51 @@ void commands(){ | |
char c; | |
while((c=getchar())!=EOF){ | |
- if (!move_around(c)) switch(c){ | |
- case 'i': | |
- state = TEXT; | |
- get_text(); | |
- break; | |
- case 'R': | |
- redraw(); | |
- break; | |
- case 'b': | |
- state = BOX; | |
- get_box(); | |
- break; | |
- case 'a': | |
- state = ARROW; | |
- get_arrow(); | |
- break; | |
- case 'W': | |
- force_new = 1;/** FALLTHROUGH **/ | |
- case 'w': | |
- write_file(); | |
- break; | |
- case 'e': | |
- check_modified();/** FALLTHROUGH **/ | |
- case 'E': | |
- load_file(); | |
- break; | |
- case 'N': | |
- new_file(); | |
- break; | |
- case 'x': | |
- state = DEL; | |
- delete(); | |
- break; | |
- case 'v': | |
- state = VIS; | |
- visual_box(); | |
- break; | |
- case '-': | |
- toggle_hline(); | |
- break; | |
- case '|': | |
- toggle_vline(); | |
- break; | |
- case '+': | |
- toggle_corner(); | |
- break; | |
- case '<': | |
- toggle_st_mark(); | |
- break; | |
- case '>': | |
- toggle_end_mark(); | |
- break; | |
- case '.': | |
- reset_styles(); | |
- break; | |
- case 'q': | |
- check_modified();/** FALLTHROUGH **/ | |
- case 'Q': | |
- cleanup(0); | |
- exit(0); | |
- break; | |
+ if (!change_style(c) && !move_around(c)){ | |
+ switch(c){ | |
+ case 'i': | |
+ state = TEXT; | |
+ get_text(); | |
+ break; | |
+ case 'R': | |
+ redraw(); | |
+ break; | |
+ case 'b': | |
+ state = BOX; | |
+ get_box(); | |
+ break; | |
+ case 'a': | |
+ state = ARROW; | |
+ get_arrow(); | |
+ break; | |
+ case 'W': | |
+ force_new = 1;/** FALLTHROUGH **/ | |
+ case 'w': | |
+ write_file(); | |
+ break; | |
+ case 'e': | |
+ check_modified();/** FALLTHROUGH **/ | |
+ case 'E': | |
+ load_file(); | |
+ break; | |
+ case 'N': | |
+ new_file(); | |
+ break; | |
+ case 'x': | |
+ state = DEL; | |
+ delete(); | |
+ break; | |
+ case 'v': | |
+ state = VIS; | |
+ visual_box(); | |
+ break; | |
+ case 'q': | |
+ check_modified();/** FALLTHROUGH **/ | |
+ case 'Q': | |
+ cleanup(0); | |
+ exit(0); | |
+ break; | |
+ } | |
} | |
check_bound(); | |
status_bar(); |