acme: scroll a directory window when navigating if:
- the cursor is on the last line
- the navigation would put the cursor over the tag of the following text
R=rsc
CC=smckean83
https://codereview.appspot.com/15280045
diff --git a/plumb/basic b/plumb/basic
index 5ab07ec..f728132 100644
--- a/plumb/basic
+++ b/plumb/basic
@@ -59,9 +59,18 @@
plumb to openoffice
plumb start openoffice $file
-# existing files tagged by line number:columnumber or linenumber.columnumber, go to editor
+# existing files tagged by line number:columnumber or linenumber.columnumber, twice, go to editor
type is text
-data matches '([.a-zA-Z¡-0-9_/\-]*[a-zA-Z¡-0-9_/\-])'$twocolonaddr'
+data matches '([.a-zA-Z¡-0-9_/\-]*[a-zA-Z¡-0-9_/\-])':$twocolonaddr,$twocolonaddr
+arg isfile $1
+data set $file
+attr add addr=$2-#1+#$3,$4-#1+#$5
+plumb to edit
+plumb client $editor
+
+# existing files tagged by line number:columnumber or linenumber.columnumber, twice, go to editor
+type is text
+data matches '([.a-zA-Z¡-0-9_/\-]*[a-zA-Z¡-0-9_/\-])':$twocolonaddr
arg isfile $1
data set $file
attr add addr=$2-#1+#$3
diff --git a/plumb/fileaddr b/plumb/fileaddr
index cd2f120..f5595bd 100644
--- a/plumb/fileaddr
+++ b/plumb/fileaddr
@@ -1,4 +1,4 @@
addrelem='((#?[0-9]+)|(/[A-Za-z0-9_\^]+/?)|[.$])'
addr=:($addrelem([,;+\-]$addrelem)*)
-twocolonaddr = :([0-9]+)[:.]([0-9]+)
+twocolonaddr = ([0-9]+)[:.]([0-9]+)
diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c
index 3c08cd6..5a491b1 100644
--- a/src/cmd/acme/text.c
+++ b/src/cmd/acme/text.c
@@ -808,6 +808,7 @@
switch(r){
case 0x06: /* ^F: complete */
case Kins:
+ typecommit(t);
rp = textcomplete(t);
if(rp == nil)
return;
@@ -1079,6 +1080,8 @@
{
int qe;
int nl;
+ int tsd;
+ int nc;
uint q;
if(t->what != Body){
@@ -1091,7 +1094,20 @@
if(doselect)
textsetselect(t, q0, q1);
qe = t->org+t->fr.nchars;
- if(t->org<=q0 && (q0<qe || (q0==qe && qe==t->file->b.nc+t->ncache)))
+ tsd = FALSE; /* do we call textscrdraw? */
+ nc = t->file->b.nc+t->ncache;
+ if(t->org <= q0){
+ if(nc==0 || q0<qe)
+ tsd = TRUE;
+ else if(q0==qe && qe==nc){
+ if(textreadc(t, nc-1) == '\n'){
+ if(t->fr.nlines<t->fr.maxlines)
+ tsd = TRUE;
+ }else
+ tsd = TRUE;
+ }
+ }
+ if(tsd)
textscrdraw(t);
else{
if(t->w->nopen[QWevent] > 0)