*message.txt*   For Vim version 7.4.  Last change: 2016 Jul 16


		  VIM REFERENCE MANUAL    by Bram Moolenaar


This file contains an alphabetical list of messages and error messages that
Vim produces.  You can use this if you don't understand what the message
means.  It is not complete though.

1. Old messages		|:messages|
2. Error messages	|error-messages|
3. Messages		|messages|

==============================================================================
1. Old messages			*:messages* *:mes* *message-history*

The ":messages" command can be used to view previously given messages.  This
is especially useful when messages have been overwritten or truncated.  This
depends on the 'shortmess' option.

	:messages		Show all messages.

	:{count}messages	Show the {count} most recent messages.

	:messages clear		Clear all messages.

	:{count}messages clear	Clear messages, keeping only the {count} most
				recent ones.

The number of remembered messages is fixed at 20 for the tiny version and 200
for other versions.

								*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-enter
prompt.  You are then back at the hit-enter prompt and can then scroll further
back.
Note: If the output has been stopped with "q" at the more prompt, it will only
be displayed up to this point.
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.

If you want to find help on a specific (error) message, use the ID at the
start of the message.  For example, to get help on the message: >

	E72: Close error on swap file

or (translated): >

	E72: Errore durante chiusura swap file

Use: >

	:help E72

If you are lazy, it also works without the shift key: >

	:help e72

==============================================================================
2. Error messages				*error-messages* *errors*

When an error message is displayed, but it is removed before you could read
it, you can see it again with: >
  :echo errmsg
Or view a list of recent messages with: >
  :messages
See `:messages` above.


LIST OF MESSAGES
			*E222* *E228* *E232* *E256* *E293* *E298* *E304* *E317*
			*E318* *E356* *E438* *E439* *E440* *E316* *E320* *E322*
			*E323* *E341* *E473* *E570* *E685*  >
  Add to read buffer
  makemap: Illegal mode
  Cannot create BalloonEval with both message and callback
  Hangul automata ERROR
  block was not locked
  Didn't get block nr {N}?
  ml_upd_block0(): Didn't get block 0??
  pointer block id wrong {N}
  Updated too many blocks?
  get_varp ERROR
  u_undo: line numbers wrong
  undo list corrupt
  undo line missing
  ml_get: cannot find line {N}
  cannot find line {N}
  line number out of range: {N} past the end
  line count wrong in block {N}
  Internal error
  Internal error: {function}
  fatal error in cs_manage_matches

This is an internal error.  If you can reproduce it, please send in a bug
report. |bugs|

>
  ATTENTION
  Found a swap file by the name ...

See |ATTENTION|.

							*E92*  >
  Buffer {N} not found

The buffer you requested does not exist.  This can also happen when you have
wiped out a buffer which contains a mark or is referenced in another way.
|:bwipeout|

							*E95*  >
  Buffer with this name already exists

You cannot have two buffers with the same name.

							*E72*  >
  Close error on swap file

The |swap-file|, that is used to keep a copy of the edited text, could not be
closed properly.  Mostly harmless.

							*E169*  >
  Command too recursive

This happens when an Ex command executes an Ex command that executes an Ex
command, etc.  This is only allowed 200 times.  When it's more there probably
is an endless loop.  Probably a |:execute| or |:source| command is involved.

							*E254*  >
  Cannot allocate color {name}

The color name {name} is unknown.  See |gui-colors| for a list of colors that
are available on most systems.

							*E458*  >
  Cannot allocate colormap entry, some colors may be incorrect

This means that there are not enough colors available for Vim.  It will still
run, but some of the colors will not appear in the specified color.  Try
stopping other applications that use many colors, or start them after starting
gvim.
Browsers are known to consume a lot of colors.  You can avoid this with
netscape by telling it to use its own colormap: >
	netscape -install
Or tell it to limit to a certain number of colors (64 should work well): >
	netscape -ncols 64
This can also be done with a line in your Xdefaults file: >
	Netscape*installColormap: Yes
or >
	Netscape*maxImageColors:  64
<
							*E79*  >
  Cannot expand wildcards

A filename contains a strange combination of characters, which causes Vim to
attempt expanding wildcards but this fails.  This does NOT mean that no
matching file names could be found, but that the pattern was illegal.

							*E459*  >
  Cannot go back to previous directory

While expanding a file name, Vim failed to go back to the previously used
directory.  All file names being used may be invalid now!  You need to have
execute permission on the current directory.

							*E190* *E212*  >
  Cannot open "{filename}" for writing
  Can't open file for writing

For some reason the file you are writing to cannot be created or overwritten.
The reason could be that you do not have permission to write in the directory
or the file name is not valid.

							*E166*  >
  Can't open linked file for writing

You are trying to write to a file which can't be overwritten, and the file is
a link (either a hard link or a symbolic link).  Writing might still be
possible if the directory that contains the link or the file is writable, but
Vim now doesn't know if you want to delete the link and write the file in its
place, or if you want to delete the file itself and write the new file in its
place.  If you really want to write the file under this name, you have to
manually delete the link or the file, or change the permissions so that Vim
can overwrite.

							*E46*  >
  Cannot change read-only variable "{name}"

You are trying to assign a value to an argument of a function |a:var| or a Vim
internal variable |v:var| which is read-only.

							*E90*  >
  Cannot unload last buffer

Vim always requires one buffer to be loaded, otherwise there would be nothing
to display in the window.

							*E40*  >
  Can't open errorfile <filename>

When using the ":make" or ":grep" commands: The file used to save the error
messages or grep output cannot be opened.  This can have several causes:
- 'shellredir' has a wrong value.
- The shell changes directory, causing the error file to be written in another
  directory.  This could be fixed by changing 'makeef', but then the make
  command is still executed in the wrong directory.
- 'makeef' has a wrong value.
- The 'grepprg' or 'makeprg' could not be executed.  This cannot always be
  detected (especially on MS-Windows).  Check your $PATH.

 >
  Can't open file C:\TEMP\VIoD243.TMP

On MS-Windows, this message appears when the output of an external command was
to be read, but the command didn't run successfully.  This can be caused by
many things.  Check the 'shell', 'shellquote', 'shellxquote', 'shellslash' and
related options.  It might also be that the external command was not found,
there is no different error message for that.

							*E12*  >
  Command not allowed from exrc/vimrc in current dir or tag search

Some commands are not allowed for security reasons.  These commands mostly
come from a .exrc or .vimrc file in the current directory, or from a tags
file.  Also see 'secure'.

							*E74*  >
  Command too complex

A mapping resulted in a very long command string.  Could be caused by a
mapping that indirectly calls itself.

>
  CONVERSION ERROR

When writing a file and the text "CONVERSION ERROR" appears, this means that
some bits were lost when converting text from the internally used UTF-8 to the
format of the file.  The file will not be marked unmodified.  If you care
about the loss of information, set the 'fileencoding' option to another value
that can handle the characters in the buffer and write again.  If you don't
care, you can abandon the buffer or reset the 'modified' option.

							*E302*  >
  Could not rename swap file

When the file name changes, Vim tries to rename the |swap-file| as well.
This failed and the old swap file is now still used.  Mostly harmless.

							*E43* *E44*  >
  Damaged match string
  Corrupted regexp program

Something inside Vim went wrong and resulted in a corrupted regexp.  If you
know how to reproduce this problem, please report it. |bugs|

							*E208* *E209* *E210*  >
  Error writing to "{filename}"
  Error closing "{filename}"
  Error reading "{filename}"

This occurs when Vim is trying to rename a file, but a simple change of file
name doesn't work.  Then the file will be copied, but somehow this failed.
The result may be that both the original file and the destination file exist
and the destination file may be incomplete.

>
  Vim: Error reading input, exiting...

This occurs when Vim cannot read typed characters while input is required.
Vim got stuck, the only thing it can do is exit.  This can happen when both
stdin and stderr are redirected and executing a script that doesn't exit Vim.

							*E47*  >
  Error while reading errorfile

Reading the error file was not possible.  This is NOT caused by an error
message that was not recognized.

							*E80*  >
  Error while writing

Writing a file was not completed successfully.  The file is probably
incomplete.

							*E13* *E189*  >
  File exists (add ! to override)
  "{filename}" exists (add ! to override)

You are protected from accidentally overwriting a file.  When you want to
write anyway, use the same command, but add a "!" just after the command.
Example: >
	:w /tmp/test
changes to: >
	:w! /tmp/test
<
							*E768*  >
  Swap file exists: {filename} (:silent! overrides)

You are protected from overwriting a file that is being edited by Vim.  This
happens when you use ":w! filename" and a swapfile is found.
- If the swapfile was left over from an old crashed edit session you may want
  to delete the swapfile.  Edit {filename} to find out information about the
  swapfile.
- If you want to write anyway prepend ":silent!" to the command.  For example: >
	:silent! w! /tmp/test
< The special command is needed, since you already added the ! for overwriting
  an existing file.

							*E139*  >
  File is loaded in another buffer

You are trying to write a file under a name which is also used in another
buffer.  This would result in two versions of the same file.

							*E142*  >
  File not written: Writing is disabled by 'write' option

The 'write' option is off.  This makes all commands that try to write a file
generate this message.  This could be caused by a |-m| commandline argument.
You can switch the 'write' option on with ":set write".

							*E25*  >
  GUI cannot be used: Not enabled at compile time

You are running a version of Vim that doesn't include the GUI code.  Therefore
"gvim" and ":gui" don't work.

							*E49*  >
  Invalid scroll size

This is caused by setting an invalid value for the 'scroll', 'scrolljump' or
'scrolloff' options.

							*E17*  >
  "{filename}" is a directory

You tried to write a file with the name of a directory.  This is not possible.
You probably need to append a file name.

							*E19*  >
  Mark has invalid line number

You are using a mark that has a line number that doesn't exist.  This can
happen when you have a mark in another file, and some other program has
deleted lines from it.

							*E219* *E220*  >
  Missing {.
  Missing }.

Using a {} construct in a file name, but there is a { without a matching } or
the other way around.  It should be used like this: {foo,bar}.  This matches
"foo" and "bar".

							*E315*  >
  ml_get: invalid lnum: {number}

This is an internal Vim error.  Please try to find out how it can be
reproduced, and submit a bug report |bugreport.vim|.

							*E173*  >
  {number} more files to edit

You are trying to exit, while the last item in the argument list has not been
edited.  This protects you from accidentally exiting when you still have more
files to work on.  See |argument-list|.  If you do want to exit, just do it
again and it will work.

							*E23* *E194*  >
  No alternate file
  No alternate file name to substitute for '#'

The alternate file is not defined yet.  See |alternate-file|.

							*E32*  >
  No file name

The current buffer has no name.  To write it, use ":w fname".  Or give the
buffer a name with ":file fname".

							*E141*  >
  No file name for buffer {number}

One of the buffers that was changed does not have a file name.  Therefore it
cannot be written.  You need to give the buffer a file name: >
	:buffer {number}
	:file {filename}
<
							*E33*  >
  No previous substitute regular expression

When using the '~' character in a pattern, it is replaced with the previously
used pattern in a ":substitute" command.  This fails when no such command has
been used yet.  See |/~|.  This also happens when using ":s/pat/%/", where the
"%" stands for the previous substitute string.

							*E35*  >
  No previous regular expression

When using an empty search pattern, the previous search pattern is used.  But
that is not possible if there was no previous search.

							*E24*  >
  No such abbreviation

You have used an ":unabbreviate" command with an argument which is not an
existing abbreviation.  All variations of this command give the same message:
":cunabbrev", ":iunabbrev", etc.  Check for trailing white space.

>
  /dev/dsp: No such file or directory

Only given for GTK GUI with Gnome support.  Gnome tries to use the audio
device and it isn't present.  You can ignore this error.

							*E31*  >
  No such mapping

You have used an ":unmap" command with an argument which is not an existing
mapping.  All variations of this command give the same message: ":cunmap",
":unmap!", etc.  A few hints:
- Check for trailing white space.
- If the mapping is buffer-local you need to use ":unmap <buffer>".
  |:map-<buffer>|

							*E37* *E89*  >
  No write since last change (add ! to override)
  No write since last change for buffer {N} (add ! to override)

You are trying to |abandon| a file that has changes.  Vim protects you from
losing your work.  You can either write the changed file with ":w", or, if you
are sure, |abandon| it anyway, and lose all the changes.  This can be done by
adding a '!' character just after the command you used.  Example: >
	:e other_file
changes to: >
	:e! other_file
<
							*E162*  >
  No write since last change for buffer "{name}"

This appears when you try to exit Vim while some buffers are changed.  You
will either have to write the changed buffer (with |:w|), or use a command to
abandon the buffer forcefully, e.g., with ":qa!".  Careful, make sure you
don't throw away changes you really want to keep.  You might have forgotten
about a buffer, especially when 'hidden' is set.

>
  [No write since last change]

This appears when executing a shell command while at least one buffer was
changed.  To avoid the message reset the 'warn' option.

							*E38*  >
  Null argument

Something inside Vim went wrong and resulted in a NULL pointer.  If you know
how to reproduce this problem, please report it. |bugs|

							*E172*  >
  Only one file name allowed

The ":edit" command only accepts one file name.  When you want to specify
several files for editing use ":next" |:next|.

						*E41* *E82* *E83* *E342*  >
  Out of memory!
  Out of memory!  (allocating {number} bytes)
  Cannot allocate any buffer, exiting...
  Cannot allocate buffer, using other one...

Oh, oh.  You must have been doing something complicated, or some other program
is consuming your memory.  Be careful!  Vim is not completely prepared for an
out-of-memory situation.  First make sure that any changes are saved.  Then
try to solve the memory shortage.  To stay on the safe side, exit Vim and
start again.

Buffers are only partly kept in memory, thus editing a very large file is
unlikely to cause an out-of-memory situation.  Undo information is completely
in memory, you can reduce that with these options:
- 'undolevels'  Set to a low value, or to -1 to disable undo completely.  This
  helps for a change that affects all lines.
- 'undoreload' Set to zero to disable.

							*E339*  >
  Pattern too long

This happens on systems with 16 bit ints: The compiled regexp pattern is
longer than about 65000 characters.  Try using a shorter pattern.
It also happens when the offset of a rule doesn't fit in the space available.
Try simplifying the pattern.

							*E45*  >
  'readonly' option is set (add ! to override)

You are trying to write a file that was marked as read-only.  To write the
file anyway, either reset the 'readonly' option, or add a '!' character just
after the command you used.  Example: >
	:w
changes to: >
	:w!
<
							*E294* *E295* *E301*  >
  Read error in swap file
  Seek error in swap file read
  Oops, lost the swap file!!!

Vim tried to read text from the |swap-file|, but something went wrong.  The
text in the related buffer may now be corrupted!  Check carefully before you
write a buffer.  You may want to write it in another file and check for
differences.

							*E192*  >
  Recursive use of :normal too deep

You are using a ":normal" command, whose argument again uses a ":normal"
command in a recursive way.  This is restricted to 'maxmapdepth' levels.  This
example illustrates how to get this message: >
	:map gq :normal gq<CR>
If you type "gq", it will execute this mapping, which will call "gq" again.

							*E22*  >
  Scripts nested too deep

Scripts can be read with the "-s" command-line argument and with the ":source"
command.  The script can then again read another script.  This can continue
for about 14 levels.  When more nesting is done, Vim assumes that there is a
recursive loop somewhere and stops with this error message.

							*E319*  >
  Sorry, the command is not available in this version

You have used a command that is not present in the version of Vim you are
using.  When compiling Vim, many different features can be enabled or
disabled.  This depends on how big Vim has chosen to be and the operating
system.  See |+feature-list| for when which feature is available.  The
|:version| command shows which feature Vim was compiled with.

							*E300*  >
  Swap file already exists (symlink attack?)

This message appears when Vim is trying to open a swap file and finds it
already exists or finds a symbolic link in its place.  This shouldn't happen,
because Vim already checked that the file doesn't exist.  Either someone else
opened the same file at exactly the same moment (very unlikely) or someone is
attempting a symlink attack (could happen when editing a file in /tmp or when
'directory' starts with "/tmp", which is a bad choice).

							*E432*  >
  Tags file not sorted: {file name}

Vim (and Vi) expect tags files to be sorted in ASCII order.  Binary searching
can then be used, which is a lot faster than a linear search.  If your tags
files are not properly sorted, reset the |'tagbsearch'| option.
This message is only given when Vim detects a problem when searching for a
tag.  Sometimes this message is not given, even though the tags file is not
properly sorted.

							*E460*  >
  The resource fork would be lost (add ! to override)

On the Macintosh (classic), when writing a file, Vim attempts to preserve all
info about a file, including its resource fork.  If this is not possible you
get this error message.  Append "!" to the command name to write anyway (and
lose the info).

							*E424*  >
  Too many different highlighting attributes in use

Vim can only handle about 223 different kinds of highlighting.  If you run
into this limit, you have used too many |:highlight| commands with different
arguments.  A ":highlight link" is not counted.

							*E77*  >
  Too many file names

When expanding file names, more than one match was found.  Only one match is
allowed for the command that was used.

							*E303*  >
  Unable to open swap file for "{filename}", recovery impossible

Vim was not able to create a swap file.  You can still edit the file, but if
Vim unexpectedly exits the changes will be lost.  And Vim may consume a lot of
memory when editing a big file.  You may want to change the 'directory' option
to avoid this error.  See |swap-file|.

							*E140*  >
  Use ! to write partial buffer

When using a range to write part of a buffer, it is unusual to overwrite the
original file.  It is probably a mistake (e.g., when Visual mode was active
when using ":w"), therefore Vim requires using a !  after the command, e.g.:
":3,10w!".
>

  Warning: Cannot convert string "<Key>Escape,_Key_Cancel" to type
  VirtualBinding

Messages like this appear when starting up.  This is not a Vim problem, your
X11 configuration is wrong.  You can find a hint on how to solve this here:
http://groups.yahoo.com/group/solarisonintel/message/12179.
[this URL is no longer valid]

							*W10*  >
  Warning: Changing a readonly file

The file is read-only and you are making a change to it anyway.  You can use
the |FileChangedRO| autocommand event to avoid this message (the autocommand
must reset the 'readonly' option).  See 'modifiable' to completely disallow
making changes to a file.
This message is only given for the first change after 'readonly' has been set.

							*W13*  >
  Warning: File "{filename}" has been created after editing started

You are editing a file in Vim when it didn't exist, but it does exist now.
You will have to decide if you want to keep the version in Vim or the newly
created file.  This message is not given when 'buftype' is not empty.

							*W11*  >
  Warning: File "{filename}" has changed since editing started

The file which you have started editing has got another timestamp and the
contents changed (more precisely: When reading the file again with the current
option settings and autocommands you would end up with different text).  This
probably means that some other program changed the file.  You will have to
find out what happened, and decide which version of the file you want to keep.
Set the 'autoread' option if you want to do this automatically.
This message is not given when 'buftype' is not empty.

There is one situation where you get this message even though there is nothing
wrong: If you save a file in Windows on the day the daylight saving time
starts.  It can be fixed in one of these ways:
- Add this line in your autoexec.bat: >
	   SET TZ=-1
< Adjust the "-1" for your time zone.
- Disable "automatically adjust clock for daylight saving changes".
- Just write the file again the next day.  Or set your clock to the next day,
  write the file twice and set the clock back.

							*W12*  >
  Warning: File "{filename}" has changed and the buffer was changed in Vim as well

Like the above, and the buffer for the file was changed in this Vim as well.
You will have to decide if you want to keep the version in this Vim or the one
on disk.  This message is not given when 'buftype' is not empty.

							*W16*  >
  Warning: Mode of file "{filename}" has changed since editing started

When the timestamp for a buffer was changed and the contents are still the
same but the mode (permissions) have changed.  This usually occurs when
checking out a file from a version control system, which causes the read-only
bit to be reset.  It should be safe to reload the file.  Set 'autoread' to
automatically reload the file.

							*E211*  >
  File "{filename}" no longer available

The file which you have started editing has disappeared, or is no longer
accessible.  Make sure you write the buffer somewhere to avoid losing
changes.  This message is not given when 'buftype' is not empty.

							*W14*  >
  Warning: List of file names overflow

You must be using an awful lot of buffers.  It's now possible that two buffers
have the same number, which causes various problems.  You might want to exit
Vim and restart it.

							*E931*  >
  Buffer cannot be registered

Out of memory or a duplicate buffer number.  May happen after W14.  Looking up
a buffer will not always work, better restart Vim.

							*E296* *E297*  >
  Seek error in swap file write
  Write error in swap file

This mostly happens when the disk is full.  Vim could not write text into the
|swap-file|.  It's not directly harmful, but when Vim unexpectedly exits some
text may be lost without recovery being possible.  Vim might run out of memory
when this problem persists.

						*connection-refused*  >
  Xlib: connection to "<machine-name:0.0" refused by server

This happens when Vim tries to connect to the X server, but the X server does
not allow a connection.  The connection to the X server is needed to be able
to restore the title and for the xterm clipboard support.  Unfortunately this
error message cannot be avoided, except by disabling the |+xterm_clipboard|
and |+X11| features.

							*E10*  >
  \\ should be followed by /, ? or &

A command line started with a backslash or the range of a command contained a
backslash in a wrong place.  This is often caused by command-line continuation
being disabled.  Remove the 'C' flag from the 'cpoptions' option to enable it.
Or use ":set nocp".

							*E471*  >
  Argument required

This happens when an Ex command with mandatory argument(s) was executed, but
no argument has been specified.

							*E474* *E475*  >
  Invalid argument
  Invalid argument: {arg}

An Ex command has been executed, but an invalid argument has been specified.

							*E488*  >
  Trailing characters

An argument has been added to an Ex command that does not permit one.

							*E477* *E478*  >
  No ! allowed
  Don't panic!

You have added a "!" after an Ex command that doesn't permit one.

							*E481*  >
  No range allowed

A range was specified for an Ex command that doesn't permit one.  See
|cmdline-ranges|.

							*E482* *E483*  >
  Can't create file {filename}
  Can't get temp file name

Vim cannot create a temporary file.

							*E484* *E485*  >
  Can't open file {filename}
  Can't read file {filename}

Vim cannot read a temporary file.  Especially on Windows, this can be caused
by wrong escaping of special characters for cmd.exe; the approach was
changed with patch 7.3.443.  Try using |shellescape()| for all shell arguments
given to |system()|, or explicitly add escaping with ^.  Also see
'shellxquote' and 'shellxescape'.

							*E464*  >
  Ambiguous use of user-defined command

There are two user-defined commands with a common name prefix, and you used
Command-line completion to execute one of them. |user-cmd-ambiguous|
Example: >
	:command MyCommand1 echo "one"
	:command MyCommand2 echo "two"
	:MyCommand
<
							*E492*  >
  Not an editor command

You tried to execute a command that is neither an Ex command nor
a user-defined command.

==============================================================================
3. Messages						*messages*

This is an (incomplete) overview of various messages that Vim gives:

			*hit-enter* *press-enter* *hit-return*
			*press-return* *hit-enter-prompt*

  Press ENTER or type command to continue

This message is given when there is something on the screen for you to read,
and the screen is about to be redrawn:
- After executing an external command (e.g., ":!ls" and "=").
- Something is displayed on the status line that is longer than the width of
  the window, or runs into the 'showcmd' or 'ruler' output.

-> 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', <Up>, '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.
-> Pressing 'j', 'f', 'd' or <Down> is ignored when messages scrolled off the
   top of the screen, 'compatible' is off and 'more' is on, to avoid that
   typing one 'j' or 'f' too many causes the messages to disappear.
-> Press <C-Y> to copy (yank) a modeless selection to the clipboard register.
-> Use a menu.  The characters defined for Cmdline-mode are used.
-> When 'mouse' contains the 'r' flag, clicking the left mouse button works
   like pressing <Space>.  This makes it impossible to select text though.
-> For the GUI clicking the left mouse button in the last line works like
   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'.
- Reset 'showcmd' and/or 'ruler'.

If your script causes the hit-enter prompt and you don't know why, you may
find the |v:scrollstart| variable useful.

Also see 'mouse'.  The hit-enter message is highlighted with the |hl-Question|
group.


						*more-prompt* *pager*  >
  -- More --
  -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit

This message is given when the screen is filled with messages.  It is only
given when the 'more' option is on.  It is highlighted with the |hl-MoreMsg|
group.

Type					effect ~
     <CR> or <NL> or j or <Down>	one more line
     d					down a page (half a screen)
     <Space> or f 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
					     command-line
    <C-Y>				yank (copy) a modeless selection to
					the clipboard ("* and "+ registers)
    {menu-entry}			what the menu is defined to in
					Cmdline-mode.
    <LeftMouse> (**)			next page

Any other key causes the meaning of the keys to be displayed.

(*)  backwards scrolling is {not in Vi}.  Only scrolls back to where messages
     started to scroll.
(**) Clicking the left mouse button only works:
     - For the GUI: in the last line of the screen.
     - When 'r' is included in 'mouse' (but then selecting text won't work).


Note: The typed key is directly obtained from the terminal, it is not mapped
and typeahead is ignored.

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-enter
prompt.

 vim:tw=78:ts=8:ft=help:norl:
