diff options
-rw-r--r-- | runtime/doc/index.txt | 3 | ||||
-rw-r--r-- | runtime/doc/message.txt | 20 | ||||
-rw-r--r-- | runtime/spell/fr/main.aap | 4 | ||||
-rw-r--r-- | src/message.c | 75 | ||||
-rw-r--r-- | src/normal.c | 4 | ||||
-rw-r--r-- | src/spell.c | 30 |
6 files changed, 112 insertions, 24 deletions
diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt index f48382a2d..6146ee3de 100644 --- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1,4 +1,4 @@ -*index.txt* For Vim version 7.0aa. Last change: 2005 Jul 27 +*index.txt* For Vim version 7.0aa. Last change: 2005 Jul 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -684,6 +684,7 @@ tag char note action in Normal mode ~ of the current screen line |g8| g8 print hex value of bytes used in UTF-8 character under the cursor +|g<| g< display previous command output |g?| g? 2 Rot13 encoding operator |g?g?| g?? 2 Rot13 encode current line |g?g?| g?g? 2 Rot13 encode current line diff --git a/runtime/doc/message.txt b/runtime/doc/message.txt index 8b7e7b0c9..0784da01c 100644 --- a/runtime/doc/message.txt +++ b/runtime/doc/message.txt @@ -1,4 +1,4 @@ -*message.txt* For Vim version 7.0aa. Last change: 2005 Jul 27 +*message.txt* For Vim version 7.0aa. Last change: 2005 Jul 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -21,6 +21,14 @@ depends on the 'shortmess' option. The number of remembered messages is fixed at 20. + *g<* +The "g<" command can be used to see the last page of previous command output. +This is especially useful if you accidentally typed <Space> at the hit-return +prompt. +Note: when you stopped the output with "q" at the more prompt only up to that +point will be displayed. +The previous command output is cleared when another command produces output. + If you are using translated messages, the first printed line tells who maintains the messages or the translations. You can use this to contact the maintainer when you spot a mistake. @@ -728,8 +736,8 @@ and the screen is about to be redrawn: -> Press <Enter> or <Space> to redraw the screen and continue, without that key being used otherwise. -> Press ':' or any other Normal mode command character to start that command. --> Press 'k', 'u' or 'b' to scroll back in the messages. This works the same - way as at the |more-prompt|. Only works when 'compatible' is off and +-> Press 'k', 'u', 'b' or 'g' to scroll back in the messages. This works the + same way as at the |more-prompt|. Only works when 'compatible' is off and 'more' is on. -> Press <C-Y> to copy (yank) a modeless selection to the clipboard register. -> Use a menu. The characters defined for Cmdline-mode are used. @@ -739,6 +747,9 @@ and the screen is about to be redrawn: pressing <Space>. {Vi: only ":" commands are interpreted} +If you accidentally hit <Enter> or <Space> and you want to see the displayed +text then use |g<|. This only works when 'more' is set. + To reduce the number of hit-enter prompts: - Set 'cmdheight' to 2 or higher. - Add flags to 'shortmess'. @@ -760,10 +771,13 @@ Type effect ~ <CR> or <NL> or j or <Down> one more line d down a page (half a screen) <Space> or <PageDown> down a screen + G down all the way, until the hit-enter + prompt <BS> or k or <Up> one line back (*) u up a page (half a screen) (*) b or <PageUp> back a screen (*) + g back to the start (*) q, <Esc> or CTRL-C stop the listing : stop the listing and enter a diff --git a/runtime/spell/fr/main.aap b/runtime/spell/fr/main.aap index 787af7319..ca160c5a5 100644 --- a/runtime/spell/fr/main.aap +++ b/runtime/spell/fr/main.aap @@ -13,11 +13,11 @@ all: $(SPELLDIR)/fr.latin1.spl $(SPELLDIR)/fr.utf-8.spl ../README_fr.txt $(SPELLDIR)/fr.latin1.spl : $(VIM) $(FILES) :sys env LANG=fr_FR.ISO8859-1 - $(VIM) -e -c "mkspell! $(SPELLDIR)/fr fr_FR" -c q + $(VIM) -u NONE -e -c "mkspell! $(SPELLDIR)/fr fr_FR" -c q $(SPELLDIR)/fr.utf-8.spl : $(VIM) $(FILES) :sys env LANG=fr_FR.UTF-8 - $(VIM) -e -c "mkspell! $(SPELLDIR)/fr fr_FR" -c q + $(VIM) -u NONE -e -c "mkspell! $(SPELLDIR)/fr fr_FR" -c q ../README_fr.txt : README_fr_FR.txt :copy $source $target diff --git a/src/message.c b/src/message.c index 81c0a8e6e..ed12d8c3e 100644 --- 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; /* last displayed text */ 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, finish) { 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, finish) } /* + * 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; } diff --git a/src/normal.c b/src/normal.c index 5f78f334d..6279a6b48 100644 --- a/src/normal.c +++ b/src/normal.c @@ -7564,6 +7564,10 @@ nv_g_cmd(cap) break; #endif + case '<': + show_sb_text(); + break; + /* * "gg": Goto the first line in file. With a count it goes to * that line number like for "G". -- webb diff --git a/src/spell.c b/src/spell.c index 52b7b4aa6..a66ff61b0 100644 --- a/src/spell.c +++ b/src/spell.c @@ -672,6 +672,9 @@ static linenr_T apply_prefixes __ARGS((slang_T *slang, char_u *word, int round, # define SPELL_TOUPPER(c) ((c) < 256 ? spelltab.st_upper[c] : (c)) # define SPELL_ISUPPER(c) ((c) < 256 ? spelltab.st_isu[c] : FALSE) #else +# if defined(HAVE_WCHAR_H) +# include <wchar.h> /* for towupper() and towlower() */ +# endif /* Multi-byte implementation. For Unicode we can call utf_*(), but don't do * that for ASCII, because we don't want to use 'casemap' here. Otherwise use * the "w" library function for characters above 255 if available. */ @@ -3147,7 +3150,7 @@ static int spell_read_dic __ARGS((char_u *fname, spellinfo_T *spin, afffile_T *a static char_u *get_pfxlist __ARGS((afffile_T *affile, char_u *afflist, sblock_T **blp)); static int store_aff_word __ARGS((char_u *word, spellinfo_T *spin, char_u *afflist, afffile_T *affile, hashtab_T *ht, hashtab_T *xht, int comb, int flags, char_u *pfxlist)); static int spell_read_wordfile __ARGS((char_u *fname, spellinfo_T *spin)); -static void *getroom __ARGS((sblock_T **blp, size_t len)); +static void *getroom __ARGS((sblock_T **blp, size_t len, int align)); static char_u *getroom_save __ARGS((sblock_T **blp, char_u *s)); static void free_blocks __ARGS((sblock_T *bl)); static wordnode_T *wordtree_alloc __ARGS((sblock_T **blp)); @@ -3240,7 +3243,7 @@ spell_read_aff(fname, spin) /* * Allocate and init the afffile_T structure. */ - aff = (afffile_T *)getroom(&spin->si_blocks, sizeof(afffile_T)); + aff = (afffile_T *)getroom(&spin->si_blocks, sizeof(afffile_T), TRUE); if (aff == NULL) return NULL; hash_init(&aff->af_pref); @@ -3368,7 +3371,7 @@ spell_read_aff(fname, spin) /* New affix letter. */ cur_aff = (affheader_T *)getroom(&spin->si_blocks, - sizeof(affheader_T)); + sizeof(affheader_T), TRUE); if (cur_aff == NULL) break; cur_aff->ah_key[0] = *items[1]; /* TODO: multi-byte? */ @@ -3428,7 +3431,7 @@ spell_read_aff(fname, spin) /* New item for an affix letter. */ --aff_todo; aff_entry = (affentry_T *)getroom(&spin->si_blocks, - sizeof(affentry_T)); + sizeof(affentry_T), TRUE); if (aff_entry == NULL) break; aff_entry->ae_rare = rare; @@ -4003,7 +4006,7 @@ get_pfxlist(affile, afflist, blp) } } if (round == 1 && cnt > 0) - res = getroom(blp, cnt + 1); + res = getroom(blp, cnt + 1, FALSE); if (res == NULL) break; } @@ -4379,13 +4382,20 @@ spell_read_wordfile(fname, spin) * Returns NULL when out of memory. */ static void * -getroom(blp, len) +getroom(blp, len, align) sblock_T **blp; - size_t len; /* length needed */ + size_t len; /* length needed */ + int align; /* align for pointer */ { char_u *p; sblock_T *bl = *blp; + if (align && bl != NULL) + /* Round size up for alignment. On some systems structures need to be + * aligned to the size of a pointer (e.g., SPARC). */ + bl->sb_used = (bl->sb_used + sizeof(char *) - 1) + & ~(sizeof(char *) - 1); + if (bl == NULL || bl->sb_used + len > SBLOCKSIZE) { /* Allocate a block of memory. This is not freed until much later. */ @@ -4413,7 +4423,7 @@ getroom_save(blp, s) { char_u *sc; - sc = (char_u *)getroom(blp, STRLEN(s) + 1); + sc = (char_u *)getroom(blp, STRLEN(s) + 1, FALSE); if (sc != NULL) STRCPY(sc, s); return sc; @@ -4444,7 +4454,7 @@ free_blocks(bl) wordtree_alloc(blp) sblock_T **blp; { - return (wordnode_T *)getroom(blp, sizeof(wordnode_T)); + return (wordnode_T *)getroom(blp, sizeof(wordnode_T), TRUE); } /* @@ -4541,7 +4551,7 @@ tree_add_word(word, root, flags, region, prefixID, blp) || node->wn_prefixID != prefixID))) { /* Allocate a new node. */ - np = (wordnode_T *)getroom(blp, sizeof(wordnode_T)); + np = (wordnode_T *)getroom(blp, sizeof(wordnode_T), TRUE); if (np == NULL) return FAIL; np->wn_byte = word[i]; |