diff src/message.c @ 447:8347d456f7e5

updated for version 7.0118
author vimboss
date Thu, 28 Jul 2005 22:28:16 +0000
parents 7472c565592a
children 3709cf52b9b5
line wrap: on
line diff
--- a/src/message.c
+++ b/src/message.c
@@ -929,7 +929,8 @@ wait_return(redraw)
 		c = K_IGNORE;
 	    }
 #endif
-	    if (p_more && !p_cp && (c == 'b' || c == 'k' || c == 'u'))
+	    if (p_more && !p_cp && (c == 'b' || c == 'k' || c == 'u'
+						    || c == 'g' || c == K_UP))
 	    {
 		/* scroll back to show older messages */
 		do_more_prompt(c);
@@ -2057,6 +2058,8 @@ static msgchunk_T *last_msgchunk = NULL;
 static msgchunk_T *msg_sb_start __ARGS((msgchunk_T *mps));
 static msgchunk_T *disp_sb_line __ARGS((int row, msgchunk_T *smp));
 
+static int do_clear_sb_text = FALSE;	/* clear text on next msg */
+
 /*
  * Store part of a printed message for displaying when scrolling back.
  */
@@ -2070,6 +2073,12 @@ store_sb_text(sb_str, s, attr, sb_col, f
 {
     msgchunk_T	*mp;
 
+    if (do_clear_sb_text)
+    {
+	clear_sb_text();
+	do_clear_sb_text = FALSE;
+    }
+
     if (s > *sb_str)
     {
 	mp = (msgchunk_T *)alloc((int)(sizeof(msgchunk_T) + (s - *sb_str)));
@@ -2102,6 +2111,15 @@ store_sb_text(sb_str, s, attr, sb_col, f
 }
 
 /*
+ * Finished showing messages, clear the scroll-back text on the next message.
+ */
+    void
+may_clear_sb_text()
+{
+    do_clear_sb_text = TRUE;
+}
+
+/*
  * Clear any text remembered for scrolling back.
  * Called when redrawing the screen.
  */
@@ -2120,6 +2138,26 @@ clear_sb_text()
 }
 
 /*
+ * "g<" command.
+ */
+    void
+show_sb_text()
+{
+    msgchunk_T	*mp;
+
+    /* Only show somethign if there is more than one line, otherwise it looks
+     * weird, typing a command without output results in one line. */
+    mp = msg_sb_start(last_msgchunk);
+    if (mp == NULL || mp->sb_prev == NULL)
+	vim_beep();
+    else
+    {
+	do_more_prompt('G');
+	wait_return(FALSE);
+    }
+}
+
+/*
  * Move to the start of screen line in already displayed text.
  */
     static msgchunk_T *
@@ -2273,7 +2311,8 @@ msg_puts_printf(str, maxlen)
 /*
  * Show the more-prompt and handle the user response.
  * This takes care of scrolling back and displaying previously displayed text.
- * When at hit-enter prompt "typed_char" is the already typed character.
+ * When at hit-enter prompt "typed_char" is the already typed character,
+ * otherwise it's NUL.
  * Returns TRUE when jumping ahead to "confirm_msg_tail".
  */
     static int
@@ -2291,11 +2330,21 @@ do_more_prompt(typed_char)
     msgchunk_T	*mp;
     int		i;
 
+    if (typed_char == 'G')
+    {
+	/* "g<": Find first line on the last page. */
+	mp_last = msg_sb_start(last_msgchunk);
+	for (i = 0; i < Rows - 2 && mp_last != NULL
+					     && mp_last->sb_prev != NULL; ++i)
+	    mp_last = msg_sb_start(mp_last->sb_prev);
+    }
+
     State = ASKMORE;
 #ifdef FEAT_MOUSE
     setmouse();
 #endif
-    msg_moremsg(FALSE);
+    if (typed_char == NUL)
+	msg_moremsg(FALSE);
     for (;;)
     {
 	/*
@@ -2363,6 +2412,15 @@ do_more_prompt(typed_char)
 	    scroll = Rows - 1;
 	    break;
 
+	case 'g':		/* all the way back to the start */
+	    scroll = -999999;
+	    break;
+
+	case 'G':		/* all the way to the end */
+	    scroll = 999999;
+	    lines_left = 999999;
+	    break;
+
 	case ':':		/* start new command line */
 #ifdef FEAT_CON_DIALOG
 	    if (!confirm_msg_used)
@@ -2444,14 +2502,12 @@ do_more_prompt(typed_char)
 		    if (scroll == -1 && screen_ins_lines(0, 0, 1,
 						       (int)Rows, NULL) == OK)
 		    {
-			/* clear last line, display line at top */
-			screen_fill((int)Rows - 1, (int)Rows, 0,
-						   (int)Columns, ' ', ' ', 0);
+			/* display line at top */
 			(void)disp_sb_line(0, mp);
 		    }
 		    else
 		    {
-			/* redisplay */
+			/* redisplay all lines */
 			screenclear();
 			for (i = 0; i < Rows - 1; ++i)
 			    mp = disp_sb_line(i, mp);
@@ -2466,6 +2522,7 @@ do_more_prompt(typed_char)
 		{
 		    /* scroll up, display line at bottom */
 		    msg_scroll_up();
+		    ++msg_scrolled;
 		    screen_fill((int)Rows - 2, (int)Rows - 1, 0,
 						   (int)Columns, ' ', ' ', 0);
 		    mp_last = disp_sb_line((int)Rows - 2, mp_last);
@@ -2473,9 +2530,11 @@ do_more_prompt(typed_char)
 		}
 	    }
 
-	    if (scroll <= 0)
+	    if (scroll < 0 || (scroll == 0 && mp_last != NULL))
 	    {
 		/* displayed the requested text, more prompt again */
+		screen_fill((int)Rows - 1, (int)Rows, 0,
+						   (int)Columns, ' ', ' ', 0);
 		msg_moremsg(FALSE);
 		continue;
 	    }