Since we now have revert-buffer, ask the user if a dirty buffer should
be reverted. This should go on top of the "mg: be more aggressive in
checkdirty" diff send earlier.
comments? ok?
--
I'm not entirely sure you are real.
diff --git buffer.c buffer.c
index 60076bb..6bce870 100644
--- buffer.c
+++ buffer.c
@@ -856,11 +856,18 @@ checkdirty(struct buffer *bp)
bp->b_flag |= BFDIRTY;
if ((bp->b_flag & (BFDIRTY | BFIGNDIRTY)) == BFDIRTY) {
- if ((s = eyorn("File changed on disk; really edit the buffer"))
- != TRUE)
+ s = eynorr("File changed on disk; really edit the buffer");
+ switch (s) {
+ case TRUE:
+ bp->b_flag &= ~BFDIRTY;
+ bp->b_flag |= BFIGNDIRTY;
+ return (TRUE);
+ case REVERT:
+ dorevert();
+ return (FALSE);
+ default:
return (s);
- bp->b_flag &= ~BFDIRTY;
- bp->b_flag |= BFIGNDIRTY;
+ }
}
return (TRUE);
@@ -873,10 +880,8 @@ checkdirty(struct buffer *bp)
int
revertbuffer(int f, int n)
{
- struct mgwin *wp = wheadp;
- struct buffer *bp = wp->w_bufp;
+ struct buffer *bp = wheadp->w_bufp;
char fbuf[NFILEN + 32];
- int lineno;
if (bp->b_fname[0] == 0) {
ewprintf("Cannot revert buffer not associated with any files.");
@@ -885,26 +890,36 @@ revertbuffer(int f, int n)
snprintf(fbuf, sizeof(fbuf), "Revert buffer from file %s", bp->b_fname);
- if (eyorn(fbuf)) {
- if (access(bp->b_fname, F_OK|R_OK) != 0) {
- if (errno == ENOENT)
- ewprintf("File %s no longer exists!",
- bp->b_fname);
- else
- ewprintf("File %s is no longer readable!",
- bp->b_fname);
- return (FALSE);
- }
+ if (eyorn(fbuf))
+ return dorevert();
- /* Save our current line, so we can go back after reloading. */
- lineno = wp->w_dotline;
+ return (FALSE);
+}
- /* Prevent readin from asking if we want to kill the buffer. */
- curbp->b_flag &= ~BFCHG;
+int
+dorevert()
+{
+ struct mgwin *wp = wheadp;
+ struct buffer *bp = wp->w_bufp;
+ int lineno;
- if (readin(bp->b_fname))
- return(setlineno(lineno));
+ if (access(bp->b_fname, F_OK|R_OK) != 0) {
+ if (errno == ENOENT)
+ ewprintf("File %s no longer exists!",
+ bp->b_fname);
+ else
+ ewprintf("File %s is no longer readable!",
+ bp->b_fname);
+ return (FALSE);
}
+ /* Save our current line, so we can go back after reloading. */
+ lineno = wp->w_dotline;
+
+ /* Prevent readin from asking if we want to kill the buffer. */
+ curbp->b_flag &= ~BFCHG;
+
+ if (readin(bp->b_fname))
+ return(setlineno(lineno));
return (FALSE);
}
diff --git def.h def.h
index c24c850..2098521 100644
--- def.h
+++ def.h
@@ -37,6 +37,7 @@ typedef int (*PF)(int, int); /* generally useful
type */
#define TRUE 1 /* True, yes, good, etc. */
#define ABORT 2 /* Death, ^G, abort, etc. */
#define UERROR 3 /* User Error. */
+#define REVERT 4 /* Revert the buffer */
#define KCLEAR 2 /* clear echo area */
@@ -415,6 +416,7 @@ int popbuftop(struct buffer *, int);
int getbufcwd(char *, size_t);
int checkdirty(struct buffer *);
int revertbuffer(int, int);
+int dorevert();
/* display.c */
int vtresize(int, int, int);
@@ -426,6 +428,7 @@ int linenotoggle(int, int);
/* echo.c X */
void eerase(void);
int eyorn(const char *);
+int eynorr(const char *);
int eyesno(const char *);
void ewprintf(const char *fmt, ...);
char *ereply(const char *, char *, size_t, ...);
diff --git echo.c echo.c
index beff2f1..e3640a7 100644
--- echo.c
+++ echo.c
@@ -72,6 +72,36 @@ eyorn(const char *sp)
}
/*
+ * Ask a "yes", "no" or "revert" question. Return ABORT if the user answers
+ * the question with the abort ("^G") character. Return FALSE for "no",
+ * TRUE for "yes" and REVERT for "revert". No formatting services are
+ * available. No newline required.
+ */
+int
+eynorr(const char *sp)
+{
+ int s;
+
+ if (inmacro)
+ return (TRUE);
+
+ ewprintf("%s? (y, n or r) ", sp);
+ for (;;) {
+ s = getkey(FALSE);
+ if (s == 'y' || s == 'Y' || s == ' ')
+ return (TRUE);
+ if (s == 'n' || s == 'N' || s == CCHR('M'))
+ return (FALSE);
+ if (s == 'r' || s == 'R')
+ return (REVERT);
+ if (s == CCHR('G'))
+ return (ctrlg(FFRAND, 1));
+ ewprintf("Please answer y or n. %s? (y or n) ", sp);
+ }
+ /* NOTREACHED */
+}
+
+/*
* Like eyorn, but for more important questions. User must type all of
* "yes" or "no" and the trailing newline.
*/