Introduction
Introduction Statistics Contact Development Disclaimer Help
add undo in erase mode - gramscii - A simple editor for ASCII box-and-arrow cha…
Log
Files
Refs
Tags
README
LICENSE
---
commit 08485aacd8d561f2650175b7a16211262396b2ce
parent f660595c236a21555d3558dd51afae4a67d651a3
Author: KatolaZ <[email protected]>
Date: Thu, 1 Aug 2019 11:26:12 +0100
add undo in erase mode
Diffstat:
M TODO | 10 +++++-----
M draw.c | 16 ++++++++++++++--
M gramscii.1 | 25 ++++++++++++++++++++-----
M screen.c | 2 +-
4 files changed, 40 insertions(+), 13 deletions(-)
---
diff --git a/TODO b/TODO
@@ -1,9 +1,4 @@
+ optimize redraws (redraw only the modified rectangle)
-+ undo (by storing lines changed across insert/remove operations)
- * re-organise undo-ring management
- * add undo for arrow mode
- * add undo for text mode
- - add undo for erase mode
- fix bug with 'g' commands in arrow mode
- add screen geometry option (-g 25x80?)
- read file at point
@@ -23,6 +18,11 @@
- allow scrolling (both vertical and horizontal)
- catch SIGWINCH and react appropriately (after scrolling is
enabled)
+* undo (by storing lines changed across insert/remove operations)
+ * re-organise undo-ring management
+ * add undo for arrow mode
+ * add undo for text mode
+ * add undo for erase mode
* visual selection
* crop-to-rectangle
* yank
diff --git a/draw.c b/draw.c
@@ -168,7 +168,6 @@ update_box:
void draw_arrow(int x, int y, char *a, int a_len, int fix){
- /* FIXME: copy affected lines to undo */
int i, j, cur_dir;
char line;
void (*f)(int, int, char);
@@ -285,13 +284,24 @@ void erase(FILE *fc){
/*FIXME: add affected lines to undo */
char c;
int orig_x = x, orig_y = y;
+ char first = 1, opened = 0;
status_bar();
show_cursor();
- invalidate_undo();
while((c=fgetc(fc))!=EOF && c!=27 && c!= 'x' && c != '\n'){
if (!move_around(c, fc)) continue;
check_bound();
+ if (first ||
+ (y != orig_y && ! opened) ||
+ (y == orig_y && x != orig_x && !opened) ){
+ copy_lines_to_ring(MIN(y, orig_y), MAX(y, orig_y), PRV…
+ first = 0;
+ opened = 1;
+ }
do_erase(orig_x, orig_y);
+ if (y != orig_y && opened){
+ copy_lines_to_ring(MIN(y, orig_y), MAX(y, orig_y), NEW…
+ opened = 0;
+ }
step = 1;
modified = 1;
orig_x = x;
@@ -300,6 +310,8 @@ void erase(FILE *fc){
status_bar();
show_cursor();
}
+ if (opened)
+ copy_lines_to_ring(y, y, NEW_STATE);
mode = MOVE;
}
diff --git a/gramscii.1 b/gramscii.1
@@ -26,6 +26,26 @@ available for further processing.
.TP
.BI -h
Print short usage unstructions and exit.
+.PP
+If one or more files are provided after the last option, gramscii will
+consider them command files and will read them one after the other
+(i.e., as if the characters in the file were typed while gramscii was
+running), before accepting commands from stdin. This allows to use
+gramscii scripts. For instance, if you start gramscii as:
+.EX
+
+ gramscii file.txt
+
+.EE
+and "file.txt" contains the lines:
+.EX
+
+ gg10lbLLJJb
+ gg10l15jbLLJJ
+
+.EE
+then gramscii will show two boxes and then will start accepting
+commands as usual.
.SH COMMANDS
gramscii is a visual modal editor. Commands are associated to
keystrokes, and keystrokes have different meaning in different modes.
@@ -537,11 +557,6 @@ would automatically save the screen into "filename".
gramscii currently manages only a fixed screen of the same size of the
screen where it starts from. This will be changed in a future release to
support scrolling and "virtual" screens of any (reasonable) size.
-.PP
-Undo commands are only available in box, visual (cut, fill), arrow, and
-text mode, and for copy/paste operations. gramscii currently does
-.B not
-support undo commands for erase mode. This will be fixed soon.
.SH AUTHORS
gramscii is written and maintained by Vincenzo "KatolaZ" Nicosia
<[email protected]>. You can use, copy, modify, and redistribute
diff --git a/screen.c b/screen.c
@@ -445,7 +445,7 @@ void crop_to_rect(int x1, int y1, int x2, int y2){
int i;
for (i=0; i<= y2-y1; i ++){
- ensure_line_length(&(screen.l[i]), screen.l[i+y1].lst);
+ ensure_line_length(&(screen.l[i]), screen.l[i+y1].lst+1);
sprintf(screen.l[i].s, "%s", screen.l[i+y1].s + x1);
screen.l[i].lst = screen.l[i+y1].lst - x1;
}
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.