*todo.txt*      For Vim version 7.0aa.  Last change: 2005 Oct 12


		  VIM REFERENCE MANUAL	  by Bram Moolenaar


			      TODO list for Vim		*todo*

This is a veeeery long list of known bugs, current work and desired
improvements.  To make it a little bit accessible, the items are grouped by
subject.  In the first column of the line a classification is used to be able
to look for "the next thing to do":

Priority classification:
9   next point release
8   next release
7   as soon as possible
6   soon
5   should be included
4   nice to have
3   consider including
2   maybe not
1   probably not
-   unclassified

						    *votes-for-changes*
See |develop.txt| for development plans.  You can vote for which items should
be worked on, but only if you sponsor Vim development.  See |sponsor|.

							*known-bugs*
-------------------- Known bugs and current work -----------------------

ccomplete:
- When an option is set: In completion mode and the user types (identifier)
  characters, advance to the first match instead of removing the popup menu.
  If there is no match remove the selection. (Yegappan Lakshmanan)
- When completing something that is a structure, add the "." or "->".
- When a typedef or struct is local to a file only use it in that file?

spelling:
- When a recognized word ends in a . don't have 'spellcapcheck" match it.
- Use KEEPCASE instead of "KEP".  applies to affixes too.
- Look into hungarian dictionary:
  http://magyarispell.sourceforge.net/rc3-beta2.zip

Mac unicode patch (Da Woon Jung):
- selecting proportional font breaks display
- UTF-8 text causes display problems.  Font replacement causes this.
- Command-key mappings do not work. (Alan Schmitt)
- Add default key mappings for the command key (Alan Schmitt)
    use http://macvim.org/OSX/files/gvimrc
- With 'nopaste' pasting is wrong, with 'paste' Command-V doesn't work.
  (Alan Schmitt)

Win32: Use the free downloadable compiler 7.1.  Figure out how to do debugging
(with Agide?) and describe it. (George Reilly)
Try out using the free MS compiler and debugger, using Make_mvc.mak.

Autoload:
- Add a Vim script in $VIMRUNTIME/tools that takes a file with a list of
  script names and a help file and produces a script that can be sourced to
  install the scripts in the user's directories.
  Use findfile(), so that only file names need to be given:
    script plugin/myscript.vim
    script autoload/mylib.vim
    script autoload/yourlib.vim
    helpfile doc/myscript.txt
  For the "helpfile" item ":helptags" is run.

Add ":smap", Select mode mapping?

Awaiting response:
-   Win32: tearoff menu window should have a scrollbar when it's taller than
    the screen.
-   mblen(NULL, 0) also in Vim 6.3?


PLANNED FOR VERSION 7.0:

-   Omni completion: Understands the programming language and finds matches
    that make sense.  Esp. members of classes/structs.

    It's not much different from other Insert-mode completion, use the same
    mechanism.  Use CTRL-X CTRL-O and 'omnifunc'.  Set 'omnifunc' in the
    filetype plugin, define the function in the autoload directory.
    
    Separately develop the completion logic and the UI.  When adding UI stuff
    make it work for all completion methods.

    UI:
    - GUI implementation of the popup menu.
    - When using tags, show match in preview window (function prototype,
      struct member, etc.).
      Or use one window for matches, another for context/info (Doug Kearns,
      2005 Sep 13)
    - Ideas on: http://www.wholetomato.com/


    Completion logic:
	Use runtime/autoload/{filetype}complete.vim files.

	In function arguments suggest variables of expected type.
	Tags file has "signature" field.

	List of completions is a Dictionary with items:
	    complist[0]['text'] = completion text
	    complist[0]['type'] = type of completion (e.g. function, var, arg)
	    complist[0]['help'] = help text (e.g. function declaration)
	    complist[0]['helpfunc'] = function that shows help text
	    etc.

	Can CTRL-] (jump to tag) include the "." and "->" to restrict the
	number of possible matches? (Flemming Madsen)

	In general: Besides completion, figure out the type of a variable
	and use it for information.

	Ideas from others:
	http://www.vim.org/scripts/script.php?script_id=747
	    http://sourceforge.net/projects/insenvim
		or http://insenvim.sourceforge.net
	    Java, XML, HTML, C++, JSP, SQL, C#
	    MS-Windows only, lots of dependencies (e.g. Perl, Internet
		explorer), uses .dll shared libraries.
	    For C++ uses $INCLUDE environment var.
	    Uses Perl for C++.
	    Uses ctags to find the info:
		ctags -f $allTagsFile --fields=+aiKmnsSz --language-force=C++ --C++-kinds=+cefgmnpsut-dlux -u $files

	    UI: popup menu with list of alternatives, icon to indicate type
		optional popup window with info about selected alternative
	    Unrelated settings are changed (e.g. 'mousemodel').

	www.vim.org script 1213 (Java Development Environment) (Fuchuan Wang)
	IComplete: http://www.vim.org/scripts/script.php?script_id=1265
	    and http://stud4.tuwien.ac.at/~e0125672/icomplete/
	http://cedet.sourceforge.net/intellisense.shtml (for Emacs)
	Ivan Villanueva has something for Java.
	Emads: http://www.xref-tech.com/xrefactory/more_c_completion.html
	Ideas from the Vim 7 BOF at SANE:
	- It's not possible to have one solution for all languages.  Design an
	  interface for completion plugins.  The matches can be done in a
	  Vim-script list.
	- For interpreted languages, use the interpreter to obtain information.
	  Should work for Java (Eclipse does this), Python, Tcl, etc.
	  Richard Emberson mentioned working on an interface to Java.
	- Check Readline for its completion interface.
	- Use ctags for other languages.  Writing a file could trigger running
	  ctags, merging the tags of the changed file.
	"Visual Assist" http://www.wholetomato.com/products:
	Completion in .NET framework SharpDevelop: http://www.icsharpcode.net

        - Pre-expand abbreviations, show which abbrevs would match?

-   UNDO TREE: keep all states of the text, don't delete undo info.
    When making a change, instead of clearing any future undo (thus redo)
    info, make a new branch.
    To navigate through the undo tree number the states of the text
    sequentially and make it possible to go through the tree in that order.
    Use "g+++" to go forward, "g---" to go backward.  Can mix - and +.
    Could also use timestamps (to show the time and/or jump to a state five
    minutes ago). (David Schweikert)
    To go from one state to another: backtrack to a common state, then forward
    again.
    Only difficult thing: When going back in time, how to find the previous
    text state in the tree?
    Show the list of changes in a window to be able to select a version?
-   PERSISTENT UNDO: store undo in a file.
    Use timestamps, so that a version a certain time ago can be found and info
    before some time/date can be flushed. 'undopersist' gives maximum time to
    keep undo: "3h", "1d", "2w", "1y", etc.  For the file use dot and
    extension: ".filename.un~" (like swapfile but "un~" instead of "swp").
7   Support WINDOW TABS.  Works like several pages, each with their own
    split windows.
    In Emacs these are called frames.  Could also call them "pages".
    Use the name of the first buffer in the tab (ignoring the help window,
    unless it's the only one).  Add a number for the window count.
    First make it work on the console.  Use a line of text with highlighting.
    Then add GUI Tabs for some systems.
    Patch for GTK 1.2 passed on by Christian Michon, 2004 Jan 6.
    Simple patch for GTK by Luis M (nov 7).
    Don't forget to provide an "X" to close a tab.
    Implementation: keep the list of windows as-is.  When switching to another
    tab make the buffers in the current windows hidden, save the window
    layout, buildup the other window layout and fill with buffers.
    Need to be able to search the windows in inactive tabs, e.g. for the
    quickfix window.
    Use "1gt" - "99gt" to switch to a tab?
-   EMBEDDING: Make it possible to run Vim inside a window of another program.
    For Xwindows this can be done with XReparentWindow().
    For GTK Neil Bird has a patch to use Vim like a widget.
-   Add COLUMN NUMBERS to ":" commands ":line1,line2[col1,col2]cmd".  Block
    can be selected with CTRL-V.  Allow '$' (end of line) for col2.
-   Add DEBUGGER INTERFACE.  Implementation for gdb by Xavier de Gaye,
    assisted by Mikolaj Machowski.  Should work like an IDE.  Try to keep it
    generic.  Also found here: http://skawina.eu.org/mikolaj/vimgdb
    And the idevim plugin/script.
    To be able to start the debugger from inside Vim: For GUI run a program
    with a netbeans connection; for console: start a program that splits the
    terminal, runs the debugger in one window and reconnect Vim I/O to the
    other window.
    Wishes for NetBeans commands:
    - make it possible to have 'defineAnnoType' also handle terminal colors.
    - send 'balloonText' events for the cursor position (using CursorHold ?)
      in terminal mode.
-   ECLIPSE plugin.  Problem is: the interface is very complicated.  Need to
    implement part in Java and then connect to Vim.  Some hints from Alexandru
    Roman, 2004 Dec 15.  Should then also work with Oracle Jdeveloper, see JSR
    198 standard http://www.jcp.org/en/jsr/detail?id=198.
-   STICKY CURSOR: Add a way of scrolling that leaves the cursor where it is.
    Especially when using the scrollbar.  Typing a cursor-movement command
    scrolls back to where the cursor is.
-   Execute a function with standard option values.  No need to save and
    restore option values.  Especially useful for new options.  Problem: how
    to avoid a performance penalty (esp. for string options)?
8   Support four composing/combining characters, needed for Hebrew. (Ron Aaron)
    Add the 'maxcombining' option to set the nr. of composing characters.
    At the same time support more colors (use two bytes when necessary).
8   Searching for a composing character by itself should work.  Perhaps "."
    with a composing char should work too.
-   Add a few more things to 'diffopt': "horizontal", "vertical",
    "foldcolumn". (Benji Fisher, 2004 Jun 21)
-   FileChangedShellPost autocommand event: after (not) reloading a changed
    file.  Can be used to update statusline oslt.
-   VimResized autocmd event: When the Vim window has been resized (SIGWINCH)
    patch from Yakov Lerner, 2003 July 24.
	It's not clear that this doesn't cause problems when the executed
	commands do something like changing 'lines'.  Esp. because the 
	screen has not yet been allocated with the new size.
-   Running a shell command from the GUI still has limitations.  Look into how
    the Vim shell project can help: http://vimshell.wana.at
-   Displaying size of Visual area: use 24-33 column display.
    When selecting multiple lines, up to about a screenfull, also count the
    characters.
-   Mac: Unicode input and display (Eckehard Berns, 2004 June 27)
    Other patch from Da Woon Jung, 2005 Jan 16.
8   Add patch from Muraoka Taro (Mar 16) to support input method on Mac?
    New patch 2004 Jun 16
9   Add cursor-column highlighting.  Enable it with 'cursorcolumn' option,
    set highlighting with "CursorColumn" group.  Useful for aligning text.
    Also cursor-row highlighting.  Patch from Yasuhiro Matsumoto for
    underlining the cursor line: 2004 Jun 17.  Should use highlight group
    instead.
    Alternative: when 'number' is set highlight the number of the current
    line.
7   Make ":startinsert" command work directly for functions and scripts?
    Also make it possible to append (it's difficult at end of line).
-   When using 'incsearch" CTRL-R CTRL-W gets the word under the cursor, but
    the part that already matched is doubled then.  Remove the part of the
    word that would be doubled.  Make it work line CTRL-N in Insert mode.
-   Add Lua interface? (Wolfgang Oertl)
-   "onemore" flag in 'virtualedit': move cursor past end of line.  Patch by
    Mattias Flodin (2004 Jul 30)
-   In a :s command multi-byte characters should also be upper/lower cased
    with \u, \U, etc.
8   Add a command to jump to a certain kind of tag.  Allow the user to specify
    values for the optional fields.  E.g., ":tag size type=m".
    Also allow specifying the file and command, so that the result of
    taglist() can be used.

Adjust src/main.aap for installing manpages like in Makefile.

When editing a file with both utf-8 and latin1 text Vim always falls back to
latin1.  Add a command to convert the latin1 characters to utf-8?
    :unmix utf-8,latin1 filename
Would only work when 'encoding' is utf-8.
Also: command to search for illegal utf-8 byte sequence?

Also generate the .pdb file that can be used to generate a useful crash report
on MS-Windows. (George Reilly)

Add strtol() to avoid the problems with leading zero causing octal conversion.

Try new POSIX tests, made after my comments. (Geoff Clare, 2005 April 7)
Version 1.5 is in ~/src/posix/1.5. (Lynne Canal)

Add a 'tool' window: behaves like a preview window but there can be several.
Don't count it in only_one_window(). (Alexei Alexandrov)

Win32: Patch for Korean IME. (Yusung, 2005 March 21)

When "= evaluation results in a List, use it as a sequence of lines.

Support ":set syntax=cpp.doxygen"?  Suggested patch by Michael Geddes (9 Aug
2004).  Should also work for 'filetype'.

For manipulating buffers without opening a new window, support Virtual
windows.  Example:
    :virtwin let l = GetBufLine(4, 10)
    :fun GetBufLine(bufnr, lnum)
    :  exe "buffer " . a:bufnr
    :  return getline(lnum)
    :endfun
The getline() and setline() functions could work for other buffers, using a
Virtual window.
A Virtual window only exists for one command.  There can be several (for
nested commands).  The window works as if it comes after the last window, size
is the Vim window size, but it's never displayed.

Win32: In the generated batch files, use $VIMRUNTIME if it's set.  Examples by
Mathias Michaelis (2004 Sep 6)
Also place vimtutor.bat in %windir%?

Add gui_mch_browsedir() for Motif, KDE and Mac OS/X.

Add extra list of file locations.  A bit like the quickfix list, but there is
one per window.  Can be used with:
    :ltag	      list of matching tags, like :tselect
Commands to use the location list:
    :lnext	      next location
    :lprevious :lNext previous location
    :lnfile	      location in next file
    :lNfile :lpfile   location in previous file
    :lrewind :lfirst  first location
    :llast	      last location
    :ll [N]	      go to location N (current one if N omitted)
    :lwindow	      open window with locations (separate from quickfix window)
    :lopen	      open window with locations
    :lclose	      close window with locations
    :llist	      list locations
    :lfile	      read locations from file using 'errorformat'
    :lgetfile	      idem, don't jump to first one
    :lbuffer	      idem, from current buffer.

HTML indenting can be slow, find out why.  Any way to do some kind of
profiling for Vim script?  At least add a function to get the current time in
usec.  reltime([start, [end]])
    reltime().sec == seconds, reltime().usec = microseconds
    reltime(start) current time relative to [start]
	echo timestring(reltime(start), 3)  (3 is nr of digits after dot)
    reltime(start, end) difference between start and end
Real Profiling:
    - :profile start /tmp/somefile  (append if exists)
    - :profile pause
    - :profile resume
    - :profile stop
    - per function line
    - self, Vim and total time (incl system time)
    - dump results in file on exit or when stopped.

Add more tests for all new functionality in Vim 7.  Especially new functions.

Updated Ruby interface. (Ryan Paul)

Awaiting updated patches:
    --- awaiting updated patch ---
    8   Add ":n" to fnamemodify(): normalize path, remove "../" when possible.
	Aric Blumer has a patch for this.
	He will update the patch for 6.3.
    Autocommands:
    7   Completion of network shares, patch by Yasuhiro Matsumoto.
	Update 2004 Sep 6.
	How does this work?  Missing comments.
	gettext()	Translate a message.  (Patch from Yasuhiro Matsumoto)
			Update 2004 Sep 10
			More docs.  Search in 'runtimepath'?
			How to get the messages into the .po files?
    --- did not respond (yet) --
    -	Patch for 'breakindent' option: repeat indent for wrapped line. (Vaclav
	Smilauer, 2004 Sep 13, fix Oct 31)
	Asked for improvements 2004 Dec 20.
    7   Make "5dd" on last-but-one-line not delete anything (Vi compatible).
	Add flag in 'cpoptions' for this.  When not present, "2dd" in the last
	line should delete the last line.  Patch from greenx 2002 Apr 11.
    8   Add a few more command names to the menus.  Patch from Jiri Brezina
	(28 feb 2002).
    7   ATTENTION dialog choices are more logical when "Delete it' appears
	before "Quit".  Patch by Robert Webb, 2004 May 3.
    -   Include flipcase patch: ~/vim/patches/wall.flipcase2 ?  Make it work
	for multi-byte characters.
    -   Win32: add options to print dialog.  Patch from Vipin Aravind.
    -   Patch to add highlighting for whitespace. (Tom Schumm, 2003 Jul 5)
	use the patch that keeps using HLF_8 if HLF_WS has not
	been given values.
	Add section in help files for these highlight groups?
    8   "fg" and "bg" don't work in an xterm.  Get default colors from xterm
	with an ESC sequence.  Ideas in: ~/vim/patches/vikas.xtermcolors .
    7   Add "DefaultFG" and "DefaultBG" for the colors of the menu. (Marcin
	Dalecki has a patch for Motif and Carbon)
    -   Add possibility to highlight specific columns (for Fortran).  Or put a
	line in between columns (e.g., for 'textwidth').
	Patch to add 'hlcolumn' from Vit Stradal, 2004 May 20.
    8   Add functions:
	confirm()		add "flags" argument, with 'v' for vertical
				layout and 'c' for console dialog. (Haegg)
				Flemming Madsen has a patch for the 'c' flag
				(2003 May 13)
	raisewin()		raise gvim window (see HierAssist patch for
				Tcl implementation ~/vim/HierAssist/ )
    7   Make globpath() also work with upwards search. (Brian Medley)
    7   Add patch from Benoit Cerrina to integrate Vim and Perl functions
	better.  Now also works for Ruby (2001 Nov 10)
    -   Patch from Herculano de Lima Einloft Neto for better formatting of the
	quickfix window (2004 dec 2)
    7   When 'rightleft' is set, the search pattern should be displayed right
	to left as well?  See patch of Dec 26. (Nadim Shaikli)
    8   Lock all used memory so that it doesn't get swapped to disk (uncrypted).
	Patch by Jason Holt, 2003 May 23.
    7   Support a stronger encryption.  Jason Holt implemented AES (May 6 2003).
    7   Add ! register, for shell commands. (patch from Grenie)
    8   In the gzip plugin, also recognize *.gz.orig, *.gz.bak, etc.  Like it's
	done for filetype detection.  Patch from Walter Briscoe, 2003 Jul 1.
    7   Add a "-@ filelist" argument: read file names from a file. (David
	Kotchan has a patch for it)
    8   Include a connection to an external program through a pipe?  See
	patches from Felbinger for a mathematica interface.
	Or use emacs server kind of thing?
    7   Add ":justify" command.  Patch from Vit Stradal 2002 Nov 25.
    -   findmatch() should be adjusted for Lisp.  See remark at
	get_lisp_indent().  Esp. \( and \) should be skipped. (Dorai Sitaram,
	incomplete patch Mar 18)
    -	Set user variables to the names of the actually used user vimrc file,
	the first directory looked for user plugins/syntax files.
	$MYVIMRC for .vimrc, $MYGVIMRC for .gvimrc, $MYRUNTIME/plugin for
	runtime files?
	Also: when the environment variable exists, use it.  If it doesn't
	exist, set it.  Requires good names: $VIM_USER_VIMRC  $VIM_USER_DIR
    -	The Replace dialog takes "\r" literal, unless "replace all" is used.
	Need to escape backslashes.
        Win32: the text to replace with isn't remembered.
    -	For GUI Find/Replace dialog support using a regexp.  Patch for Motif
	and GTK by degreneir (nov 10 and nov 18).

Patch for "paranoid mode" by Kevin Collins, March 7.  Needs much more work.

Check if file explorer can handle directory names and links with a single
quote. (Nieko Maatjes, 2005 Jan 4)


Vi incompatibility:
8   With undo/redo only marks in the changed lines should be changed.  Other
    marks should be kept.  Vi keeps each mark at the same text, even when it
    is deleted or restored. (Webb)
    Also: A mark is lost after: make change, undo, redo and undo.
    Example: "{d''" then "u" then "d''": deletes an extra line, because the ''
    position is one line down. (Veselinovic)
8   When stdin is not a tty, and Vim reads commands from it, an error should
    make Vim exit.
7   Unix Vim (not gvim): Typing CTRL-C in Ex mode should finish the line
    (currently you can continue typing, but it's truncated later anyway).
    Requires a way to make CTRL-C interrupt select() when in cooked input.
8   When loading a file in the .exrc, Vi loads the argument anyway.  Vim skips
    loading the argument if there is a file already.  When no file argument
    given, Vi starts with an empty buffer, Vim keeps the loaded file. (Bearded)
6   In Insert mode, when using <BS> or <Del>, don't wipe out the text, but
    only move back the cursor.	Behaves like '$' in 'cpoptions'.  Use a flag
    in 'cpoptions' to switch this on/off.
8   When editing a file which is a symbolic link, and then opening another
    symbolic link on the same file, Vim uses the name of the first one.
    Adjust the file name in the buffer to the last one used?  Use several file
    names in one buffer???
    Also: When first editing file "test", which is symlink to "test2", and
    then editing "test2", you end up editing buffer "test" again.  It's not
    logical that the name that was first used sticks with the buffer.
7   The ":undo" command works differently in Ex mode.  Edit a file, make some
    changes, "Q", "undo" and _all_ changes are undone, like the ":visual"
    command was one command.
    On the other hand, an ":undo" command in an Ex script only undoes the last
    change (e.g., use two :append commands, then :undo).
7   The ":map" command output overwrites the command.  Perhaps it should keep
    the ":map" when it's used without arguments?
7   CTRL-L is not the end of a section?  It is for Posix!  Make it an option.
7   Implement 'prompt' option.	Init to off when stdin is not a tty.
7   CTRL-T in Insert mode inserts 'shiftwidth' of spaces at the cursor.  Add a
    flag in 'cpoptions' for this.
7   Add a way to send an email for a crashed edit session.  Create a file when
    making changes (containing name of the swap file), delete it when writing
    the file.  Supply a program that can check for crashed sessions (either
    all, for a system startup, or for one user, for in a .login file).
7   Vi doesn't do autoindenting when input is not from a tty (in Ex mode).
7   "z3<CR>" should still use the whole window, but only redisplay 3 lines.
7   ":tag xx" should move the cursor to the first non-blank.  Or should it go
    to the match with the tag?	Option?
7   Implement 'autoprint'/'ap' option.
7   Add flag in 'cpoptions' that makes <BS> after a count work like <Del>
    (Sayre).
7   Add flag in 'cpoptions' that makes operator (yank, filter) not move the
    cursor, at least when cancelled. (default Vi compatible).
7   This Vi-trick doesn't work: "Q" to go to Ex mode, then "g/pattern/visual".
    In Vi you can edit in visual mode, and when doing "Q" you jump to the next
    match.  Nvi can do it too.
7   Support '\' for line continuation in Ex mode for these commands: (Luebking)
	g/./a\		    g/pattern1/ s/pattern2/rep1\\
	line 1\		    line 2\\
	line 2\		    line 3\\
	.		    line4/
6   ":e /tmp/$tty" doesn't work.  ":e $uid" does.  Is $tty not set because of
    the way the shell is started?
6   Vi compatibility (optional): make "ia<CR><ESC>10." do the same strange
    thing.  (only repeat insert for the first line).


GTK+ 1 (OK in GTK 2):
8   When menus are disabled, 'm' removed from 'guioptions', Alt-F still pops
    up the File menu.  Cannot reproduce this: gives a warning for a NULL
    pointer if the menu was never displayed.
8   When using "gvim -geom 40x30" or setting 'columns' in .gvimrc or with a
    GUIEnter autocommand, the width is still set to fit the toolbar.  Also
    happens when changing the font.  How to avoid that the toolbar specifies
    the minimal window width?
8   When using a theme with different scrollbars (gtkstep), the scrollbars can
    be too narrow. (Drazen Kacar)
8   Font "7x14" has a bold version "7x14bold".  Try to find the bold font by
    appending "bold" when there are not 14 dashes.

GTK+ GUI known bugs:
8   GTK 2: Combining UTF-8 characters not displayed properly in menus (Mikolaj
    Machowski)  They are displayed as separate characters.  Problem in
    creating a label?
8   GTK 2: Combining UTF-8 characters are sometimes not drawn properly.
    Depends on the font size, "monospace 13" has the problem.  Vim seems to do
    everything right, must be a GTK bug.  Is there a way to work around it?
9   Can't paste a Visual selection from GTK-gvim to vim in xterm or Motif gvim
    when it is longer than 4000 characters.  Works OK from gvim to gvim and
    vim to vim.  Pasting through xterm (using the shift key) also works.
    It starts working after GTK gvim loses the selection and gains it again.
7   DND doesn't work with KDE (also with GTK 1).

KDE GUI known bugs:
-   There is no active maintenance and "yzis" is supposed to replace it.
-   With the default 'guifont' value bold text differs in size from normal
    text, causing the display to be messed up.
-   Error messages when starting up.  The "tip of the day" box is empty.
-   Encoding of menu items needs to be converted. (Yasuhiro Matsumoto)

Win32 GUI known bugs:
8   On Windows 98 the unicows library is needed to support functions with UCS2
    file names.  Can we load unicows.dll dynamically?
8   The -P argument doesn't work very well with many MDI applications.
    The last argument of CreateWindowEx() should be used, see MSDN docs.
    Tutorial: http://win32assembly.online.fr/tut32.html
8   In eval.c, io.h is included when MSWIN32 is defined.  Shouldn't this be
    WIN32?  Or can including io.h be moved to vim.h? (Dan Sharp)
7   Windows XP: When using "ClearType" for text smoothing, a column of yellow
    pixels remains when typing spaces in front of a "D" ('guifont' set to
    "lucida_console:h8").
6   Win32 GUI: With "-u NONE -U NONE" and doing "CTRL-W v" "CTRL-W o", the ":"
    of ":only" is highlighted like the cursor.  (Lipelis)
8   When 'encoding' is "utf-8", should use 'guifont' for both normal and wide
    characters to make Asian languages work.  Win32 fonts contain both
    type of characters.
7   When font smoothing is enabled, redrawing can become very slow.  The reason
    appears to be drawing with a transparent background.  Would it be possible
    to use an opaque background in most places?
8   Use another default for 'termencoding': the active codepage.  Means that
    when 'encoding' is changed typing characters still works properly.
    Alternative: use the Unicode functions to obtain typed characters.
8   Win32: Multi-byte characters are not displayed, even though the same font
    in Notepad can display them. (Srinath Avadhanula)  Try with the
    UTF-8-demo.txt page with Andale Mono.
7   The cursor color indicating IME mode doesn't work properly. (Shizhu Pan,
    2004 May 9)
8   Win32: When clicking on the gvim title bar, which gives it focus, produces
    a file-changed dialog, after clicking on a button in that dialog the gvim
    window follows the mouse.  The button-up event is lost.  Only with
    MS-Windows 98?
    Try this: ":set sw ts", get enter-prompt, then change the file in a
    console, go back to Vim and click "reload" in the dialog for the changed
    file: Window moves with the cursor!
    Put focus event in input buffer and let generic Vim code handle it?
8   When activating the Vim window with mouse click, don't move cursor to
    mouse position.  Catch WM_MOUSEACTIVATE. (Luevelsmeyer)
8   Win32: When mouse is hidden and in the toolbar, moving it won't make it
    appear. (Sami Salonen)
8   Windows NT: writing to aux.* makes Vim hang. (Acevedo)
8   Win32 GUI: With maximized window, ":set go-=r" doesn't use the space that
    comes available. (Poucet)  It works OK on Win 98 but doesn't work on Win
    NT 4.0.  Leaves a grey area where the scrollbar was.  ":set go+=r" also
    doesn't work properly.
8   When Vim is minimized and when maximizing it a file-changed dialog pops
    up, Vim isn't maximized.  It should be done before the dialog, so that it
    appears in the right position. (Webb)
9   When selecting at the more-prompt or hit-enter-prompt, the right mouse
    button doesn't give popup menu.
    At the hit-enter prompt CTRL-Y doesn't work to copy the modeless
    selection.
    On the command line, don't get a popup menu for the right mouse button.
    Let the middle button paste selected text (not the clipboard but the
    non-Visual selection)?  Otherwise CTRL-Y has to be used to copy the text.
8   When 'grepprg' doesn't execute, the error only flashes by, the
    user can hardly see what is wrong. (Moore)
    Could use vimrun with an "-nowait" argument to only wait when an error
    occurs, but "command.com" doesn't return an error code.
8   When the 'shell' cannot be executed, should give an appropriate error msg.
    Esp. for a filter command, currently it only complains the file could not
    be read.
7   Add an option to add one pixel column to the character width?  Lucida
    Console italic is wider than the normal font ("d" overlaps with next char).
    Opposite of 'linespace': 'columnspace'.
7   At the hit-enter prompt scrolling now no longer works.  Need to use the
    keyboard to get around this.  Pretend <CR> was hit when the user tries to
    scroll?
7   Scrollbar width doesn't change when selecting other windows appearance.
    Also background color of Toolbar and rectangle below vert. scrollbar.
7   "!start /min cmd" should run in a minimized window, instead of using
    "/min" as the command name. (Rogall)
6   Drawing text transparently doesn't seem to work (when drawing part cursor).
8   CTRL key doesn't always work in combination with ALT key.  It does work
    for function keys, not for alphabetic characters.  Perhaps this is because
    CTRL-ALT is used by Windows as AltGr?
8   CTRL-- doesn't work for AZERTY, because it's CTRL-[ for QWERTY.  How do we
    know which keyboard is being used?
7   When scrolling, and a background color is dithered, the dither pattern
    doesn't always join correctly between the scrolled area and the new drawn
    area (Koloseike).
8   When gui_init_font() is called with "*", p_guifont is freed while it might
    still be used somewhere.  This is too tricky, do the font selection first,
    then set the new font by name (requires putting all logfont parameters in
    the font name).


Athena and Motif:
6   New Motif toolbar button from Marcin Dalecki:
    - When the mouse pointer is over an Agide button the red becomes black.
      Something with the way colors are specified in the .xpm file.
    - The pixmap is two pixels smaller than it should be.  The gap is filled
      with grey instead of the current toolbar background color.
9   Can configure be changed to disable netbeans if the Xpm library is
    required and it's missing?
8   When using the resource "Vim*borderwidth 2" the widgets are positioned
    wrong.
9   XIM is disabled by default for SGI/IRIX.  Fix XIM so that 'imdisable' can
    be off by default.
9   XIM doesn't work properly for Athena/Motif. (Yasuhiro Matsumoto)  For now,
    keep XIM active at all times when the input method has the preediting
    flag.
8   X11: A menu that contains an umlaut is truncated at that character.
    Happens when the locale is "C", which uses ASCII instead of IS0-8859-1.
    Is there a way to use latin1 by default?  Gnome_init() seems to do this.
8   Perhaps use fontsets for everything?
6   When starting in English and switching the language to Japanese, setting
    the locale with ":lang", 'guifontset' and "hi menu font=", deleting all
    menus and setting them again, the menus don't use the new font.  Most of
    the tooltips work though...
7   Motif: when using a file selection dialog, the specified file name is not
    always used (when specifying a filter or another directory).
8   When 'encoding' is different from the current locale (e.g., utf-8) the
    menu strings don't work.  Requires conversion from 'encoding' to the
    current locale.  Workaround: set 'langmenu'.


Athena GUI:
9   When dragging the scrollbar thumb very fast, focus is only obtained in
    the scrollbar itself.  And the thumb is no longer updated when moving
    through files.
7   The file selector is not resizable.  With a big font it is difficult to
    read long file names. (Schroeder)
4   Re-write the widget attachments and code so that we will not have to go
    through and calculate the absolute position of every widget every time the
    window is refreshed/changes size.  This will help the "flashing-widgets"
    problem during a refresh.
5   When starting gvim with all the default colors and then typing
    ":hi Menu guibg=cyan", the menus change color but the background of the
    pullright pixmap doesn't change colors.
    If you type ":hi Menu guibg=cyan font=anyfont", then the pixmap changes
    colors as it should.
    Allocating a new pixmap and setting the resource doesn't change the
    pullright pixmap's colors.  Why?  Possible Athena bug?


Motif GUI:
7   Use XmStringCreateLocalized() instead of XmStringCreateSimple()?
    David Harrison says it's OK (it exists in Motif 1.2).
8   Lesstif: When deleting a menu that's torn off, the torn off menu becomes
    very small instead of disappearing.  When closing it, Vim crashes.
    (Phillipps)


GUI:
9   On Solaris, creating the popup menu causes the right mouse button no
    longer to work for extending the selection. (Halevy)
9   When running an external program, it can't always be killed with CTRL-C.
    e.g., on Solaris 5.5, when using "K" (Keech).  Other 'guipty' problems on
    Solaris 2.6. (Marley)
9   On Solaris: Using a "-geometry" argument, bigger than the window where Vim
    is started from, causes empty lines below the cmdline. (raf)
8   X11 GUI: When menu is disabled by excluding 'm' from 'guioptions', ALT key
    should not be used to trigger a menu (like the Win32 version).
8   When setting 'langmenu', it should be effective immediately.  Store both
    the English and the translated text in the menu structure.  Re-generate
    the translation when 'langmenu' has changed.
8   Basic flaw in the GUI code: NextScreen is updated before calling
    gui_write(), but the GUI code relies on NextScreen to represent the state
    of where it is processing the output.
    Need better separation of Vim core and GUI code.
8   When fontset support is enabled, setting 'guifont' to a single font
    doesn't work.
8   Menu priority for sub-menus for: Amiga, BeOS.
8   Add menu separators for Amiga, RISCOS.
8   Add way to specify the file filter for the browse dialog.  At least for
    browse().
8   Add dialog for search/replace to other GUIs?  Tk has something for this,
    use that code?  Or use console dialog.
8   When selecting a font with the font dialog and the font is invalid, the
    error message disappears too quick.
7   More features in the find/replace dialog:
    - regexp on/off
    - search in selection/buffer/all buffers/directory
       when all buffers/directory is used:
	- filter for file name
       when directory is used:
	- subdirectory on/off
	- top directory browser
8   gui_check_colors() is not called at the right moment.  Do it much later,
    to avoid problems.
8   gui_update_cursor() is called for a cursor shape change, even when there
    are mappings to be processed.  Only do something when going to wait for
    input.  Or maybe every 100 ms?
8   X11: When the window size is reduced to fit on screen, there are blank
    lines below the text and bottom scrollbar.  "gvim -geometry 80x78+0+0".
    When the "+0+0" is omitted it works.
8   When starting an external command, and 'guipty' set, BS and DEL are mixed
    up.  Set erase character somehow?
8   A dead circumflex followed by a space should give the '^' character
    (Rommel).  Look how xterm does this.
    Also: Bednar has some code for dead key handling.
    Also: Nedit 5.0.2 with USE_XMIM does it right. (Gaya)
8   The compose key doesn't work properly (Cepas).  Both for Win32 and X11.
7   The cursor in an inactive window should be hollow.  Currently it's not
    visible.
7   GUI on Solaris 2.5.1, using /usr/dt/..: When gvim starts, cursor is
    hollow, after window lowered/raised it's OK. (Godfrey)
7   When starting GUI with ":gui", and window is made smaller because it
    doesn't fit on the screen, there is an extra redraw.
8   When setting font with .Xdefaults, there is an extra empty line at the
    bottom, which disappears when using ":set guifont=<Tab>". (Chadzelek)
8   When font shape changes, but not the size, doing ":set font=" does not
    redraw the screen with the new font.  Also for Win32.
    When the size changes, on Solaris 2.5 there isn't a redraw for the
    remaining part of the window (Phillipps).
-   Flashes really badly in certain cases when running remotely from a Sun.
4   Re-write the code so that the highlighting isn't changed multiple times
    when doing a ":hi clear".  The color changes happen three or more times
    currently.  This is very obvious on a 66Mhz 486.


MSDOS/DJGPP:
9   Pressing CTRL-C often crashes the console Vim runs in. (Ken Liao)
    When 'bioskey' isn't set it doesn't happen.  Could be a problem with the
    BIOS emulation of the console.  Version 5.6 already had this problem.
8   DJGPP: "cd c:" can take us to a directory that no longer exists.
    change_drive() doesn't check this.  How to check for this error?
9   The 16 bit version runs out of memory very quickly.  Should find unused
    code and reduce static data.
9   Crash when running on Windows 98 in a console window and pressing CTRL-C.
    Happens now and then.  When debugging Vim in gdb this also happens.  Since
    the console crashes, might be a bug in the DOS console.  Resetting
    'bioskey' avoids it, but then CTRL-C doesn't work.
9   DOS: Make CTRL-Fx and ALT-Fx work.
    CTRL-F1 = CE-5E, CTRL-F2 = CE-5F, .., CTRL-F10 = CE-67
    ALT-F1 = CE-68, ALT-F2 = CE-69, .., ALT-F10 = CE-71
    Shifted cursor keys produce same codes as unshifted keys.  Use bioskey(2)
    to get modifier mask for <S-C-M-Fx>.
    Use K_SPECIAL/KS_MODIFIER codes to insert modifier mask in input stream?
    Make this work like in Win32 console.
    Mapping things like <M-A> doesn't work, because it generates an extended
    key code.  Use a translation table?
9   Can't read an opened swap file when the "share" command has not been used.
    At least ignore the swap files that Vim has opened itself.
8   Use DJGPP 2.03.
8   The Dos32 version (DJGPP) can't use long file names on Windows NT.
    Check if new package can be used (v2misc/ntlfn08[bs].zip).
8   setlocale() is bogus.
8   Vim busy waits for new characters or mouse clicks.	Should put in some
    sort of sleep, to avoid eating 50% of the CPU time.  Test on an unpatched
    Windows 95 system!
8   DJGPP: when shell is bash, make fails. (Donahoe)
7   Hitting CTRL-P twice quickly (e.g., in keyword completion) on a 8088
    machine, starts printer echo! (John Mullin).
7   MSDOS 16 bit version can't work with COMSPEC that has an argument, e.g.:
    COMSPEC=C:\WINDOWS\COMMAND.COM /E:4096    (Bradley)
    Caused by BCC system() function (Borland "make" has the same problem).
8   Mouse: handle left&right button pressed as middle button pressed.  Add
    modifier keys shift, ctrl and alt.
7   When too many files are open (depends on FILES), strange things happen.
    The Dos16 version runs out of memory, in the Dos32 version "!ls" causes a
    crash.  Another symptom: .swp files are not deleted, existing files are
    "[New file]".
7   DJGPP version doesn't work with graphics display mode.  Switch to a mode
    that is supported?
8   DJGPP: ":mode" doesn't work for many modes.  Disable them.
8   DJGPP: When starting in Ex mode, shouldn't clear the screen. (Walter
    Briscoe)


MSDOS, OS/2 and Win32:
8   OS/2: Add backtick expansion.  Undefine NO_EXPANDPATH and use
    gen_expand_wildcards().
8   OS/2: Add clipboard support?  See example clipbrd.exe from Alexander
    Wagner.
8   OS/2: Add Extended Attributes support and define HAVE_ACL.
8   OS/2: When editing a file name "foo.txt" that is actually called FOO.txt,
    writing uses "foo.txt".  Should obtain the real file name.
8   Should $USERPROFILE be preferred above $HOMEDRIVE/$HOMEPATH?
8   Win32 console: <M-Up> and <M-Down> don't work. (Geddes)  We don't have
    special keys for these.  Should use modifier + key.
8   Win32 console: caps-lock makes non-alpha keys work like with shift.
    Should work like in the GUI version.
8   Environment variables in DOS are not case sensitive.  Make a define for
    STRCMP_ENV(), and use it when comparing environment var names.
8   Setting 'shellslash' has no immediate effect.  Change all file names when
    it is set/reset?  Or only use it when actually executing a shell command?
8   When editing a file on a Samba server, case might matter.  ":e file"
    followed by ":e FILE" will edit "file" again, even though "FILE" might be
    another one.  Set last used name in buflist_new()?  Fix do_ecmd(), etc.
8   ":mksession" generates a "cd" command where "aa\#bb" means directory "#bb"
    in "aa", but it's used as "aa#bb". (Ronald Hoellwarth)
8   When a buffer is editing a file like "ftp://mach/file", which is not going
    to be used like a normal file name, don't change the slashes to
    backslashes. (Ronald Hoellwarth)


Windows 95:
8   Editing a file by it's short file name and writing it, makes the long file
    name disappear.  Setting 'backupcopy' helps.
    Use FindFirstFile()->cAlternateFileName in fname_case() (George Reilly).
8   Doing wildcard expansion, will match the short filename, but result in the
    long filename (both DJGPP and Win32).


Win32 console:
9   When editing a file by its short file name, it should be expanded into its
    long file name, to avoid problems like these: (Mccollister)
     1) Create a file called ".bashrc" using some other editor.
     2) Drag that file onto a shortcut or the actual executable.
     3) Note that the file name is something like BASHRC~1
     4) Go to File->Save As menu item and type ".bashrc" as the file name.
     5) Press "Yes" to indicate that I want to overwrite the file.
     6) Note that the message "File exists (add ! to override)" is displayed
	and the file is not saved.
    Use FindFirstFile() to expand a file name and directory in the path to its
    long name.
8   Also implement 'conskey' option for the Win32 console version?  Look at
    how Xvi does console I/O under Windows NT.
7   Re-install the use of $TERM and support the use of different terminals,
    besides the console.
8   Use of <altgr> modifier doesn't work?  5.3 was OK. (Garcia-Suarez/Guckes)
9   Mapping <C-S-Tab> doesn't work correctly.  How to see the difference with
    <C-S-i>?
9   tmpnam() uses file in root of file system: "\asdf".  That doesn't work on
    a Netware network drive.  Use same function as for Win32 GUI?
8   In os_win32.h, HAVE_STRICMP and HAVE_STRNICMP are defined only if __GNUC__
    is not defined.  Shouldn't that be the other way around?
7   Use SetConsoleCP() and SetConsoleOutputCP() to implement 'termencoding'?
    Avoids that input and output work differently.  Need to be restored when
    exiting.


Amiga:
8   In mch_inchar() should use convert_input_safe() to handle incomplete byte
    sequences.
9   In mch_expandpath() a "*" is to be expanded, but "\*" isn't.  Remove
    backslashes in result.
8   Executing a shell, only one option for 'shell' is separated.  Should do
    all options, using white space separation.


Macintosh:
7   Implement "undercurl".
7   Patch to add 'transparency' option.  Disadvantage: it's slow. (Eckehard
    Berns, 2004 May 9) http://ecki.to/vim/TransBack-2004-05-09.diff
    Needs more work.  Add when someone really wants it.
7   Loading the Perl library only works on OS/X 10.2 or 10.3, never on both.
    Load the Perl library dynamically see Python sources file dynload_mac
    (Jack)
    dynamic linking: http://developer.apple.com/technotes/tn2002/tn2064.html
8   Inputting Unicode characters does not work in the terminal.  They appear
    to arrive as upper and lower bytes. (David Brown, 2004 April 17)
8   Typing Unicode characters doesn't work at all in the GUI.
9   Problems in Carbon version for OS X: (Benji Fisher)
    - keyboard shortcuts in the menus get lost.
8   The Vim/About menu doesn't work.
8   ":gui" doesn't fork.  Enabling the code in gui.c to fork causes a SEGV.
8   Define vim_mkdir() for Macintosh.
8   Define mch_writable() for Macintosh.
9   When DiskLock is running, using a swap file causes a crash.  Appears to be
    a problem with writing a file that starts with a dot. (Giacalone)
9   On G3 Mac, OS version 8, control strip causes characters messed up when
    scrolling (CTRL-L cleans it up). (Benji Fisher)
9   On G3 Mac, OS version 8, variable-speed scrolling doesn't work, after two
    seconds of scrolling the screen freezes. (Benji Fisher)
9   In mac_expandpath() check that handling of backslashes is done properly.
8   Standard Mac shortcuts are missing.  (Amerige)
8   Handling of non-fixed width fonts is wrong. (Amerige)


"Small" problems:
8   When an ":edit" is inside a try command and the ATTENTION prompt is used,
    the :catch commands are always executed, also when the file is edited
    normally.  Should reset did_emsg and undo side effects.  Also make sure
    the ATTENTION message shows up.  Servatius Brandt works on this.
9   When using ":e ++enc=foo file" and the file is already loaded with
    'fileencoding' set to "bar", then do_ecmd() uses that buffer, even though
    the fileencoding differs.  Reload the buffer in this situation?  Need to
    check for the buffer to be unmodified.
8   ":g//" gives "Pattern not found error" with E486.  Should not use the
    error number, it's not a regular error message.
7   Vimtutor leaves escape sequence in terminal. This is the xterm response to
    requesting the version number.  (Yasuhiro Matsumoto)
8   When redirecting and using ":silent" the current column for displaying and
    redirection can be different.  Use a separate variable to hold the column
    for redirection.
7   There is no way to change directory and go back without changing the local
    and/or global directory.  Add a way to find out if the current window uses
    a local directory.  Add cdcmd() that returns ":cd" or ":lcd"?
7   The messages for "vim --help" and "vim --version" don't use
    'termencoding'.
8   When 'scrollbind' is set, a window won't scroll horizontally if the cursor
    line is too short.  Add a word in 'scrollopt' to allow moving the cursor
    to longer line that is visible.  A similar thing is done for the GUI when
    using the horizontal scrollbar.
7   VisVim can only open one file.  Hard to solve: each opened file is passed
    with a separate invocation, would need to use timestamps to know the
    invocations belong together.
8   When giving a ":bwipeout" command a file-changed dialog may popup for this
    buffer, which is pointless.  (Mike Williams)
8   On MS-Windows ":make" doesn't show output while it is working.  Use the
    tee.exe from  http://unxutils.sourceforge.net/ ?  About 16 Kbyte in the
    UnxUtils.zip archive.
    Alternate one: http://www.pramodx.20m.com/tee_for_win32.htm, but Walter
    Briscoe says it's not as good.
8   'fillchars' doesn't work for multi-byte characters.
8   Command line completion: buffers "foo.txt" and "../b/foo.txt", completing
    ":buf foo<Tab>" doesn't find the second one. (George V. Reilly)
7   Output for ":scriptnames" and ":breaklist" should shorten the file names:
    use "~/" when possible.
7   mb_off2cells() doesn't work correctly on the tail byte of a double-byte
    character. (Yasuhiro Matsumoto)  It should return 1 when used on a tail
    byte, like for utf-8.  Store second byte of double-byte in ScreenLines2[]
    (like for DBCS_JPNU) and put a zero in the second byte (like for UTF-8).
8   'backupdir' and 'directory' should use $TMPDIR, $TMP and/or $TEMP when
    defined.
7   Inside a function with "perl <<EOF" a line with "$i++" is recognized as an
    ":insert" command, causing the following "endfunction" not to be found.
    Add skipping this perl construction inside function definitions.
7   When 'ttimeoutlen' is 10 and 'timeoutlen' is 1000, there is a keycode
    "<Esc>a" and a mapping <Esc>x", when typing "<Esc>a" with half a second
    delay should not be interpreted as a keycode. (Hans Ginzel)
7   ":botright 1 new" twice causes all window heights to be changed.  Make the
    bottom window only bigger as much as needed.
7   "[p" doesn't work in Visual mode. (David Brown)
7   The Cygwin and MingW makefiles define "PC", but it's not used anywhere.
    Remove? (Dan Sharp)
9   The argument <f-args> of a user command doesn't handle backslashes
    properly.  "Cmd \ e" is one argument, "Cmd \\ e" still is one argument.
    "Cmd \  e" is two arguments, first one ending in space. (Kontra Gergely)
9   User commands use the context of the script they were defined in.  This
    causes a "s:var" argument to unexpectedly use a variable in the defining
    script, not the calling script.  Add an argument to ":command":
    "-keepcontext".  Do replace <SID>, so that a function in the defining
    script can be called.
8   The Japanese message translations for MS-Windows are called ja.sjis.po,
    but they use encoding cp932.  Rename the file and check that it still
    works.
9   When a syntax region does not use "keepend" and a contained item does use
    "extend", this makes the outer region stop at the end of the contained
    region. (Lutz Eymers)  Another example Nov 14 2002.
8   A very long message in confirm() can't be quit.  Make this possible with
    CTRL-C.
7   clip_x11_own_selection() uses CurrentTime, that is not allowed.  VNC X
    server has a problem with this.  (Mark Waggoner) Remembering the timestamp
    of events isn't always possible.  We don't get them in an xterm.  GTK
    doesn't obtain the selection again when the timestamp differs, thus it
    won't work for GTK anyway.
8   When the clipboard isn't supported: ":yank*" gives a confusing error
    message.  Specifically mention that the register name is invalid.
8   "gf" always excludes trailing punctuation characters.  file_name_in_line()
    is currently fixed to use ".,:;!".  Add an option to make this
    configurable?
8   'hkmap' should probably be global-local.
9   When "$" is in 'cpoptions' and folding is active, a "C" command changes
    the folds and resets w_lines_valid.  The display updating doesn't work
    then. (Pritesh Mistry)
8   ":s!from!to!" works, but ":smagic!from!to!" doesn't.  It sees the "!" as a
    flag to to the command.  Same for ":snomagic". (Johan Spetz)
8   Using ":s" in a function changes the previous replacement string.  Save
    "old_sub" in save_search_patterns()?
8   When appending to a file and 'patchmode' isn't empty, a backup file is
    always written, even when the original file already exists.
7   When using "daw" on the last word in a file and this is a single letter,
    nothing is deleted.  Should delete the letter and preceding white space.
9   When getting focus while writing a large file, could warn for this file
    being changed outside of Vim.  Avoid checking this while the file is being
    written.
9   The "Error detected while processing modelines" message should have an
    error number.
7   The message in bt_dontwrite_msg() could be clearer.
8   The script ID that is stored with an option and displayed with ":verbose
    set" isn't reset when the option is set internally.  For example when
    'foldlevel' is set from 'foldlevelstart'.
8   In the fileformat dialog, "Cancel" isn't translated.  Add a global
    variable for this. (Eduardo Fernandez)
9   When editing a file with 'readonly' set, there is no check for an existing
    swap file.  Then using ":write" (without making any changes) doesn't give
    a warning either.  Should check for an existing swap file without creating
    one.
7   When 'showbreak' is set, the amount of space a Tab occupies changes.
    Should work like 'showbreak' is inserted without changing the Tabs.
7   When there is a "help.txt" window in a session file, restoring that
    session will not get the "LOCAL ADDITIONS" back.
7   When 'mousefocus' is set and switching to another window with a typed
    command, the mouse pointer may be moved to a part of the window that's
    covered by another window and we lose focus.  Only move in the y
    direction, not horizontally?
8   When using CTRL-D after ":help", restrict the number of matches to a
    thousand, otherwise using CTRL-D without an argument takes too long.
8   ":hardcopy":
    - Using the cterm_color[] table is wrong when t_colors is > 16.
    - Need to handle unprintable characters.
    - Win32: On a B&W printer syntax highlighting isn't visible.  Perform
      dithering to make grey text?
    - Add a flag in 'printoptions' to add an empty page to make the total
      number even.  "addempty"? (Mike Williams)
    - Respect 'linebreak'.  Perhaps also 'showbreak'?
    - Should interpreted CTRL-L as a page break.
    - Grey line numbers are not always readable.  Add field in 'printoptions'.
      Default to black when no syntax highlighting.
    - Be able to print a window in diff mode.
    - Be able to specify a colorscheme to use for printing.  And a separate
      one for B&W printing (if that can be detected).
8   In Visual block mode with 'lbr' set, a change command doesn't insert the
    text in following lines where the linebreak changes.
9   dosinst.c: The DJGPP version can't uninstall the Uninstall registry key on
    Windows NT.  How to install a .inf file on Windows NT and how to detect
    that Windows NT is being used?
8   When 'virtualedit' is "block,insert" and encoding is "utf-8", selecting a
    block of one double-wide character, then "d" deletes only half of it.
8   When 'virtualedit' is set, should "I" in blockwise visual mode also insert
    in lines that don't extend into the block?
8   With 'virtualedit' set, in Insert mode just after the end of line, CTRL-O
    yh does not yank the last character of the line. (Pavel Papushev)
    Doing "hl" first appears to make it work.
8   With 'virtualedit' set it's possible to move into the blank area from
    'linebreak'.
8   With 'virtualedit' set and 'selection' "exclusive", a Visual selection
    that ends in or after a tab, "d" doesn't delete (part of) the tab.
    (Helmut Stiegler)
8   With 'virtualedit' set, a blockwise Visual selection that starts and ends
    in a tab, "<" shifts too much. (Helmut Stiegler)
9   When jumping to a tag, the search pattern is put in the history.  When
    'magic' is on, the pattern may not work.  Translate the pattern depending
    on p_magic when putting it in the history?  Alternative: Store value of
    'magic' in history.  (Margo)
9   optwin.vim: Restoring a mapping for <Space> or <CR> is not correct for
    ":noremap".  Add "mapcmd({string}, {mode})?  Use code from ":mkexrc".
9   incsearch is incorrect for "/that/<Return>/this/;//" (last search pattern
    isn't updated).
9   term_console is used before it is set (msdos, Amiga).
9   Get out-of-memory for ":g/^/,$s//@/" on 1000 lines, this is not handled
    correctly.  Get many error messages while redrawing the screen, which
    cause another redraw, etc.
8   [<C-I> doesn't work when '*' is in 'iskeyword'.  find_pattern_in_path()
    must escape special characters in the pattern.
8   Vim can overwrite a read-only file with ":w!".  ":w" can't overwrite an
    existing file, "w!" can, but perhaps not a read-only file?  Then use
    ":w!!" for that.
    Or ask for permission to overwrite it (if file can be made writable) and
    restore file to readonly afterwards.
    Overwriting a file for which a swap file exists is similar issue.
7   When compiled with "xterm_clipboard", startup can be slower and might get
    error message for invalid $DISPLAY.  Try connecting to the X server in the
    background (forked), so that Vim starts up quicker?  Connect as soon as
    the clipboard is to be used (Visual select mode starts, paste from
    clipboard)
7   X11: Some people prefer to use CLIPBOARD instead of PRIMARY for the normal
    selection.  Add an "xclipboard" argument to the 'clipboard' option? (Mark
    Waggoner)
8   For xterm need to open a connection to the X server to get the window
    title, which can be slow.  Can also get the title with "<Esc>[21t", no
    need to use X11 calls.  This returns "<Esc>]l{title}<Esc>\".
6   When the xterm reports the number of colors, a redraw occurs.  This is
    annoying on a slow connection.  Wait for the xterm to report the number of
    colors before drawing the screen.  With a timeout.
8   When the builtin xterm termcap contains codes that are not wanted, need a
    way to avoid using the builtin termcap.
8   Xterm sends ^[[H for <Home> and ^[[F for <End> in some mode.  Also
    recognize these keys?  Mostly useful for xterm simulators, like gnometerm.
    See http://dickey.his.com/xterm/xterm.faq.html#xterm_pc_style.
8   '[ and '] should be set to start/end of line when using a linewise operator
    (e.g., ":w").
8   CTRL-A can't handle big "long" numbers, they become negative.  Check for
    "-" character, if not present, use unsigned long.
8   Make it possible to disable the special meaning of "#" in the first column
    for ">>".
8   Add suspending with CTRL-Z at the "more" prompt, and when executing a long
    script in do_cmdline().
8   When using 'hidden', many swap files will be open.  When Vim runs into the
    maximum number of open files, error messages will appear.  Detect that
    this problem is present, and close any hidden files that don't have
    changes.
8   With 'viminfo' set such that the ".viminfo" file is written on a FAT
    filesystem, an illegal file name may be created: ".vim".
8   For each buffer that is opened, the viminfo file is opened and read to
    check for file marks.  This can be slow.
7   In xterm, recognize both vt100 and vt220 cursor keys.  Change
    add_termcode() to not remove an existing entry for a name, when it's
    needed.
    Need a generic solution to recognize different codes for the same key.
8   Core dump within signal function: gdb doesn't show stack backtrace!  Option
    to skip catch_signals()?
9   Repeating a "cw" with "." doesn't work if the text was pasted from the
    clipboard. (Thomas Jones)  It's because the menu/toolbar item exits Insert
    mode and uses "gP".  How to fix this without breaking inserting a block of
    text?
8   In Replace mode pasting from the clipboard (using menu or toolbar) inserts
    all the text.  Add ":rmenu"?
8   Pasting with the mouse in Replace mode inserts the text, instead of
    overwriting, when it is more than one line.  Same for using <C-R>.
9   CTRL-E and CTRL-Y don't work in small window when 'so' is 4 and lines are
    wrapping (Acevedo/in.226).  E.g., when using CTRL-E, window height 7,
    window might actually scroll down when last line of buffer is displayed.
    --> Remember if the previous command was "cursor follows screen" or
    "screen follow cursor" and use this in cursupdate().
7   tilde_replace() can only handle "~/", should also do "~user/".
    Get the list of home directories (from /etc/passwd?  Use getpwent()) and
    use some clever algorithm to match a path with that.  Find common strings
    in the list?
8   When dragging status line with mouse, sometimes a jump when first clicking
    on the status line (caused by 'winheight').  Select window on button up,
    instead of on button down.
8   Dragging the status line doesn't scroll but redraw.
9   Evaluating 'statusline' in build_stl_str_hl() does not properly check for
    reaching the end of the available buffer.
8   When performing incremental search, should abort searching as soon as a
    character is typed.
8   When the value of $MAKE contains a path, configure can't handle this.
    It's an autoconf bug.  Remove the path from $MAKE to work around it.
8   How to set VIMRC_FILE to \"something\" for configure?  Why does this not
    work: CFLAGS='-DVIMRC_FILE=\"/mydir/myfile\"' ./configure
8   The temporary file is sometimes not writable.  Check for this, and use an
    alternate name when it isn't.  Or add the 'temptemplate' option: template
    for the temp file name ":set temptemplate=/usr/tmp/?????.tmp".
    Also: Win32 version uses Windows temp directory, which might not work for
    cygwin bash.
7   Get error "*, \+ or \( operand could be empty" for pattern "\(.\)\1\{3}".
    Remember flags for backreferences.
7   When switching to Daylight Saving Time, Vim complains that a file has been
    changed since last read.  Can we use a function that uses GMT?
7   When completing an environment variable after a '$', check for file names
    that contain a '$' after all have been found.
8   When "cm" termcap entry is missing, starting gvim shouldn't complain about
    it. (Lohner)  Try out with "vt100" entry, cm replaced with cX.
7   When an include file starts with "../", the check for already visiting
    this file doesn't work.  Need to simplify the file name.
7   The names and comments for the arguments of do_browse() are confusing.
    "dflt" isn't the default file name when "initdir" is not NULL and
    "initdir" is the default path to be used.
7   When 'scrolloff' is exactly half the window height, "j" causes a scroll of
    two lines at a time.  "k" doesn't do this. (Cory T. Echols)
8   When write_viminfo() is used while there are many orphaned viminfo
    tempfiles writing the viminfo file fails.  Give a clear error message so
    that the user knows he has to delete the files.
7   It's possible to redefine a script-local function with ":func
    <SNR>123_Test()". (Krishna)  Disallow this.


I can't reproduce these (if you can, let me know how!):
9   NT 4.0 on NTFS file system: Editing ".bashrc" (drag and drop), file
    disappears.  Editing ".xyz" is OK.  Also, drag&drop only works for three
    files. (McCollister)


Problems that will (probably) not be solved:
-   xterm title: The following scenario may occur (esp. when running the Vim
    test script): Vim 1 sets the title to "file1", then restores the title to
    "xterm" with an ESC sequence when exiting.  Vim 2 obtains the old title
    with an X library call, this may result in "file1", because the window
    manager hasn't processed the "xterm" title yet.  Can apparently only be
    worked around with a delay.
-   In a terminal with 'mouse' set such that the mouse is active when entering
    a command line, after executing a shell command that scrolls up the
    display and then pressing ":": Selecting text with the mouse works like
    the display wasn't scrolled.  Vim doesn't know how much the external
    command scrolled up the display.  Use Shift to select text.
-   X windows: When $DISPLAY points to a X server where there is no access
    permission, trying to connect to the X server causes an error message.
    XtOpenDisplay() prints this directly, there is no way to avoid it.
-   X windows: Setting 'guifontset' to an illegal value sometimes crashes Vim.
    This is caused by a fault in a X library function, can't be solved in Vim.
-   Motif: When adding a menu item "Find this &Symbol", the "s" in "this" will
    be underlined, instead of in "Symbol".  Motif doesn't let us specify which
    character gets the highlighting.
-   Moving the cursor removes color in color-xterm.  This is a color-xterm
    problem!  color-xterm ver. 6.1 beta 3 and later work properly.
-   In zsh, "gvim&" changes the terminal settings.  This is a zsh problem.
    (Jennings)
-   Problem with HPterm under X: old contents of window is lost (Cosentino).
-   Amiga: When using quickfix with the Manx compiler we only get the first 25
    errors.  How do we get the rest?
-   Amiga: The ":cq" command does not always abort the Manx compiler.  Why?
-   Linux: A file with protection r--rw-rw- is seen readonly for others.  The
    access() function in GNU libc is probably wrong.
-   MSDOS: When using smartdrive with write-back buffering, writing to a
    readonly floppy will cause problems.  How to test for a writable floppy
    first?
-   MSDOS: Both 16 and 32 bit versions: File name expansion doesn't work for
    names that start with a dot.  These used to be illegal file names.
-   When doing a CTRL-Z and typing a command for the shell, while Vim is busy
    (e.g. writing a file), the command for the shell is sometimes eaten by Vim,
    because the terminal mode is changed from RAW to CBREAK.
-   An old version of GNU tgoto can't handle the terminfo code for "AF".  The
    "%p1" is interpreted as "%p" and "1", causing color not to be working.
    Fix: Change the "%p1" in the "AF" and "AB" terminfo entries to "%p".
    (Benzinger).
-   When running an external command from the GUI, typeahead is going to that
    program, not to Vim.  It looks like the shell eats the characters, Vim
    can't get back what the external command didn't use.
-   Win32 GUI: Error code from external command not returned in shell_error.
    It appears that cmd.exe and command.com don't return an error code.
-   Win32 GUI: The Toolbar is a bit too high when the flat style is being
    used.  We don't have control over the height of the Toolbar.
-   Win32: All files created on the day of switching from winter to summer
    time cause "changed since editing started" messages.  It goes away when
    the file is written again the next day, or the timezone is adjusted.
    DJGPP version is OK. (Zaimi)  Looks like a problem with the Win32 library.
    Rebooting doesn't help.  Time stamps look OK in directory. (Penn)
    Is this on FAT (stores wall clock time) or NTFS (stores UTS)?
-   Win32, MS-Windows XP: $HOME uses the wrong drive when the user profiles
    are not on the boot disk.  This is caused by a wrong value of $HOMEDRIVE.
    This is a bug in XP, see MSKB article 818134.
-   SunOS 5.5.1 with Motif: The file open dialog does not have a horizontal
    scroll bar for the "files" selection.  This is a problem in the Motif
    libraries, get a patch from Sun.
-   Solaris 2.6 with GTK and Perl: gvim crashes when started.  Problem with X
    input method called from GDK code.  Without Perl it doesn't crash.
-   VMS: Vimdiff doesn't work with the VMS diff, because the output looks
    different.  This makes test 47 fail.  Install a Unix-compatible diff.
-   VMS v7.1 and older: Tests 21 and 32 fail.  From VMS v7.1-2 and newer Vim
    does not have this behavior. (Zoltan Arpadffy)
-   Win32 GUI: mouse wheel always scrolls rightmost window.  The events arrive
    in Vim as if the rightmost scrollbar was used.
-   GTK with Gnome: Produces an error message when starting up:
	Gdk-WARNING **: locale not supported by C library
    This is caused by the gnome library gnome_init() setting $LC_CTYPE to
    "en_US".  Not all systems support this locale name, thus causing the
    error.  Hopefully a newer version of GTK/Gnome fixes this problem.
-   GTK 2: With this mapping the hit-enter prompt is _sometimes_ below the
    screen, at other times there is a grey area below the command line:
	:nmap <F11> :if &guioptions=~'m' \| set guioptions-=m \| else \| set guioptions+=m \| endif<cr>
-   GTK: When pasting a selection from Vim to xclipboard gvim crashes with a
    ABRT signal.  Probably an error in the file gdkselection.c, the assert
    always fails when XmbTextListToTextProperty() fails. (Tom Allard)
-   GTK 2: gives an assertion error for every non-builtin icon in the toolbar.
    This is a GTK 2.4.x bug, fixed in GTK 2.4.2. (Thomas de Grenier de Latour)
-   When using an xterm that supports the termresponse feature, and the 't_Co'
    termcap option was wrong when Vim started, it will be corrected when the
    termresponse is received.  Since the number of colors changes, the
    highlighting needs to be initialized again.  This may cause colors defined
    in the vimrc file to be lost.
-   On Windows NT 4.0 the number of files passed to Vim with drag&drop and
    "Edit with Vim" is limited.  The maximum command line length is 255 chars.

---------------------  extensions and improvements ----------------------
						    *extensions-improvements*

Documentation:
8   The GUI help should explain the Find and Find/Replace dialogs.  Add a link
    to it from ":promptrepl" and ":promptfind".
8   List of options should mention whether environment variables are expanded
    or not.
8   Extend usr_27.txt a bit. (Adam Seyfarth)
7   Add a section on debugging scripts in the user manual.
9   Make the Reference Manual more precise.  For each command mention:
    - change to cursor position and curswant
    - if it can be undone (u/CTRL-R) and redone (.)
    - how it works for folded lines
    - how it works with multi-byte characters
9   In change.txt, remark about Javadoc isn't right.  Right alignment would
    work too.
8   Spread the windows commands over the other files.  For example, ":stag"
    should be with ":tag".  Cross-link with tags to avoid too much double
    text.
8   Add tags for all features, e.g. "gui_running".
7   MS-Windows: When a wrong command is typed with an ALT key, give a hint to
    look at the help for 'winaltkeys'.
7   Add a help.vim plugin that maps <Tab> to jump to the next tag in || and
    <C-Tab> (and <S-Tab>) to the previous tag.
-   Check text editor compendium for vi and Vim remarks.


Help:
-   First try using the ":help" argument literally, before using it as a
    pattern.  And then match it as part of a tag.
-   When a help item has multiple matches make it possible to use ":tn" to go
    to the other matches.
-   Support a way to view (and edit) .info files.
-   Default mapping for help files: <Tab> to position cursor on next |:tag|.
-   Implement a "sticky" help window, some help text lines that are always
    displayed in a window with fixed height. (Guckes)  Use "~/.vimhelp" file,
    user can edit it to insert his favorite commands, new account can contain a
    default contents.
-   Make 'winminheight' a local option, so that the user can set a minimal
    height for the help window (and other windows).
-   ":help :s^I" should expand to ":help :substitute".
-   Make the help key (<F1>) context sensitive?
-   Learn mode: show short help while typing commands.


User Friendlier:
8   Windows install with NSIS: make it possible to do a silent install, see
    http://nsis.sourceforge.net/Docs/Chapter4.html#4.12
8   Windows install with install.exe: Use .exe instead of .bat files for
    links, so that command line arguments are passed on unmodified? (Walter
    Briscoe)
8   Windows install: Be able to associate Vim with a selection of file types?
8   Windows uninstall: Have uninstal.c delete the vimfiles directories that
    dosinst.c creates.  List the contents of the directory (recursively) if
    the user asks for it.  Requires an implementation of "rm -rf".
8   Remember the name of the vimrc file that was used (~/.vimrc, $VIM/_vimrc,
    $HOME/_vimrc, etc.) and add "edit vimrc" to the File menu.
-   Add a way to save local settings and mappings into a new plugin file.
    ":mkplugin <file>"?
8   Add ":plugininstall" command.  Can be used to install a plugin file that
    includes documentation.  Let the user select a directory from
    'runtimepath'.
	" Vim plugin
	<main plugin code>
	" >>> plugin help start <<<
	<plugin docs>
-   Add mappings local to a window: ":map <window> ..."?
9   Add buffer-local menu.  Should offer a choice between removing the menu or
    disabling it.  Be careful that tear-offs don't disappear (keep one empty
    item?).
    Alternative: use BufEnter and BufLeave autocommands.
8   make a vimtutor script for Amiga and other systems.
7   Add the arguments for configure to the ":version" output?
7   When Vim detects a file is being edited elsewhere and it's a gvim session
    of the same user it should offer a "Raise" button, so that the other gvim
    window can be displayed. (Eduard)


Spell checking:
9   Work together with OpenOffice.org to update the wordlists.  (Adri Verhoef,
    Aad Nales)  Setup vim-spell maillist?
-   Compound word is accepted if nr of words is <= COMPOUNDMAX OR nr of
    syllables <= COMPOUNDSYLMAX.  Specify using AND in the affix file?
-   COMPOUNDMAX -> COMPOUNDWORDMAX?
-   Support flags on a suffix.  Used for second level affixes.  The flags may
    also be used for compounding.  Default is an OR mechanism with the flags
    of the word.  Adding "compset" on the affixes means the compound flags of
    the word are not used.  Instead of "SFX a 0 add/FLAGS ." we could use "SFX
    a 0 add . /FLAGS" (or support both).
-   NEEDCOMPOUND also used for affix?  Or use "needcomp" after affix?
-   Do we need a flag for the rule that when compounding is done the following
    word doesn't have a capital after a word character, even for Onecap words?
-   New hunspell home page: http://hunspell.sourceforge.net/
    - Version 1.1.0 is out now, look into that.
    - Lots of code depends on LANG, that isn't right.  Enable each mechanism
      in the affix file separately.
    - Example with compounding dash is bad, gets in the way of setting
      COMPOUNDMIN and COMPOUNDMAX to a reasonable value.
    - PSEUDOROOT == NEEDAFFIX
    - COMPOUNDROOT -> COMPOUNDED?  For a word that already is a compound word
	    Or use COMPOUNDED2, COMPOUNDED3, etc.
-   CIRCUMFIX: when a word uses a prefix marked with the CIRCUMFIX flag, then
    the word must also have a suffix marked with the CIRCUMFIX flag.  It's a
    bit primitive, since only one flag is used, which doesn't allow matching
    specific prefixes with suffixes.
    Alternative:
	PSFX {flag} {pchop} {padd} {pcond} {schop} {sadd}[/flags] {scond}
    We might not need this at all, you can use the NEEDAFFIX flag and the
    affix which is required.
-   When a suffix has more than one syllable, it may count as a word for
    COMPOUNDMAX.
-   Add flags to count extra syllables in a word.  SYLLABLEADD1 SYLLABLEADD2,
    etc.?  Or make it possible to specify the syllable count of a word
    directly, e.g., after another slash: /abc/3
-   MORPHO item in affix file: ignore morphological fields after word and
    affix.
-   Implement multiple flags for compound words and CMP item?
    Await comments from other spell checking authors.
-   Also see tklspell: http://tkltrans.sourceforge.net/
8   Charles Campbell asks for method to add "contained" groups to existing
    syntax items (to add @Spell).
    Add ":syntax contains {pattern} add=@Spell" command?  A bit like ":syn
    cluster" but change the contains list directly for matching syntax items.
8   Install spell files with src/main.aap.
-   References: MySpell library (in OpenOffice.org).
	http://spellchecker.mozdev.org/source.html
	http://whiteboard.openoffice.org/source/browse/whiteboard/lingucomponent/source/spellcheck/myspell/
      author: Kevin Hendricks <kevin.hendricks@sympatico.ca>
8   Make "en-rare" spell file?  Ask Charles Campbell.
8   The English dictionaries for different regions are not consistent in their
    use of words with a dash.
8   Alternate Dutch word list at www.nederlandsewoorden.nl (use script to
    obtain).  But new Myspell wordlist will come (Hagen)
7   Insert mode completion mechanism that uses the spell word lists.
8   Add hl groups to 'spelllang'?
	:set spelllang=en_us,en-rare/SpellRare,en-math/SpellMath
    More complicated: Regions with different languages?  E.g., comments
    in English, strings in German (po file).
8   Implement compound words when it works for Myspell.  Current idea has the
    problem that "foo/X" always allows "foofoo", there is no way to specify a
    word can only be at the start or end, or that only certain words combine.


Diff mode:
8   Use diff mode to show the changes made in a buffer (compared to the file).
    Use an unnamed buffer, like doing:
	new | set bt=nofile | r # | 0d_ | diffthis | wincmd p | diffthis
7   Add cursor-binding: when moving the cursor in one diff'ed buffer, also
    move it in other diff'ed buffers, so that CTRL-W commands go to the same
    location.


Folding:
    (commands still available: zg zG zI zJ zK zp zP zq zQ zV zw zW zy zY;
    secondary: zB zS zT zZ)
8   Add "z/" and "z?" for searching in not folded text only.
8   Add different highlighting for a fold line depending on the fold level.
    (Noel Henson)
7   Use "++--", "+++--" for different levels instead of "+---" "+----".
8   When a closed fold is displayed open because of 'foldminlines', the
    behavior of commands is still like the fold is closed.  How to make the
    user aware of this?
8   Add an option 'foldskip' with values like 'foldopen' that specifies which
    commands skip over a closed fold.
8   "H" and "L" count buffer lines instead of window lines. (Servatius Brandt)
8   Add a way to add fold-plugins.  Johannes Zellner has one for VB.
7   When using manual folding, the undo command should also restore folds.
-   Allow completely hiding a closed fold.  E.g., by setting 'foldtext' to an
    empty string.  Require showing a character in 'foldcolumn' to avoid the
    missing line goes unnoticed.
    How to implement this?
-   When pressing the down arrow of a scrollbar, a closed fold doesn't scroll
    until after a long time.  How to make scrolling with closed folds
    smoother?
-   When creating a session, also store folds for buffers in the buffer list,
    using the wininfo in wi_folds.
-   'foldmethod' "textobject": fold on sections and paragraph text objects.
-   Add 'hidecomment' option: don't display comments in /* */ and after //.
    Or is the conceal patch from Vince Negri a more generic solution?
-   "zu": undo change in manual fold. "zU" redo change in manual fold.  How to
    implement this?
-   "zJ" command: add the line or fold below the fold in the fold under the
    cursor.
-   'foldmethod' "syntax": "fold=3": set fold level for a region.
-   Apply a new foldlevel to a range of lines. (Steve Litt)
8   Have some way to restrict commands to not folded text.  Also commands like
    searches.


Multi-byte characters:
9   When the tail byte of a double-byte character is illegal (e.g., a CR), the
    display is messed up (Yasuhiro Matsumoto).  Should check for illegal
    double-byte characters and display them differently (display each single
    byte).
8   Add an item in 'fileencodings' to check the first lines of a file for
    the encoding.  See Python PEP: http://www.python.org/peps/pep-0263.html.
    To avoid getting a wrong encoding only accept something Emacs-like:
    "-*- coding: enc-na_me.foo -*-" and "-*- coding= enc-na_me.foo -*-"
    Match with "-\*-\s*coding[:=]\s*\([::word::-_.]\+\)\s*-\*-" and use first
    item.
8   Add an item in 'fileencodings' to check the first line of an XML file for
    the encoding.  <?xml version="1.0" encoding="UTF-8"?>  Or "charset=UTF-8"?
    For HTML look for "charset=utf-8".
8   The quickfix file is read without conversion, thus in 'encoding'.  Add an
    option to specify the encoding of the errorfile and convert it.  Also for
    ":grep" and ":helpgrep".
    More generic solution: support a filter (e.g., by calling a function).
8   When a file was converted from 'fileencoding' to 'encoding', a tag search
    should also do this on the search pattern. (Andrzej M. Ostruszka)
7   When converting a file fails, mention which byte could not be converted,
    so that the user can fix the problem.
8   Add configure option to be able to disable using the iconv library. (Udo
    Schweigert)
9   'aleph' should be set to 1488 for Unicode. (Zvi Har'El)
8   Should add test for using various commands with multi-byte characters.
8   'infercase' doesn't work with multi-byte characters.
8   toupper() function doesn't handle byte count changes.
8   "ga" should show all composing characters, also if there are more than 2.
7   When searching, should order of composing characters be ignored?
8   Should implement 'delcombine' for command line editing.
8   Detect overlong UTF-8 sequences and handle them like illegal bytes.
8   ":s/x/\u\1/" doesn't work, making uppercase isn't done for multi-byte
    characters.
8   UTF-8: "r" in Visual mode doesn't take composing characters.
8   UTF-8: When there is a precomposed character in the font, use it instead
    of a character and a composing character.  See xterm for an example.
7   When a character can't be displayed, display its digraph instead.
    'display' option to specify this.
7   Use ideas for nl_langinfo() from Markus Kuhn in enc_default():
    (www.cl.cam.ac.uk/~mgk25/ucs/langinfo.c)
-   GTK and Win32: Allow selecting fonts for 'guifontset' with the
    fontselector somehow.
-   GTK and Win32: make it possible to set the font for the menu to make it
    possible to have 'encoding' different from the current locale.
-   dbcs_class() only works for Japanese and Korean.  Implement this for
    other encodings.  The "euc-jp" and "euc-kr" choices might be wrong.
-   Find some way to automatically select the right GUI font or fontset,
    depending on the default value of 'encoding'.
    Irrelevant in the GTK+ 2 GUI so long as UTF-8 is used.
    For Windows, the charset_pairs[] table could be used.  But how do we know
    if a font exists?
-   Do keyboard conversion from 'termencoding' to 'encoding' with
    convert_input() for Mac GUI and RiscOS GUI.
-   Add mnemonics from RFC1345 longer than two characters.
    Support CTRL-K _{mnemonic}_
7   In "-- INSERT (lang) --" show the name of the keymap used instead of
    "lang". (Ilya Dogolazky)
-   Make 'langmap' accept multi-byte characters.
-   Make 'breakat' accept multi-byte characters.  Problem: can't use a lookup
    table anymore (breakat_flags[]).
    Simplistic solution: when 'formatoptions' contains "m" also break a line
    at a multi-byte character >= 0x100.
-   Do we need the reverse of 'keymap', like 'langmap' but with files and
    multi-byte characters?  E.g., when using a Russian keyboard.
-   Add the possibility to enter mappings which are used whenever normal text
    could be entered.  E.g., for "f" command.  But not in Normal mode.  Sort
    of opposite of 'langmap'.  Use ":tmap" command?
-   When breaking a line, take properties of multi-byte characters into
    account.  The "linebreak" program from Bruno Haible can do it:
    ftp://ftp.ilog.fr/pub/Users/haible/gnu/linebreak-0.1.tar.gz
    But it's very complicated...


Printing:
7   Implement "undercurl" for printing.
-   Add "page width" to wrap long lines.
-   Win32: use a font dialog for setting 'printfont'.  Can reuse the code for
    the 'guifont' dialog, put the common code in a separate function.
-   Add the file timestamp to the page header (with an option). (George
    Reilly)
-   Win32: when 'printfont' is empty use 'guifont'.
-   Unix: Use some dialog box to do the obvious settings (paper size, printer
    name, portrait/landscape, etc).
-   PostScript: only works for 7-bit ASCII and EBCDIC.  Should support
    different 'encoding' values somehow.
-   Allow specifying the paper size, instead of using a standard size.  Same
    units as for the margins.
-   Support right-to-left text?
8   Make the foreground color darkening function preserve the hue of the
    color.


Syntax highlighting:
8   Make ":syn off" use 'runtimepath' instead of $VIMRUNTIME. (Gary Johnson)
    Should do the same for ":syn on" and ":syn manual".
8   Support "containedin" argument for ":syn include", so that the defined
    cluster can be added to existing syntax items.
8   C syntax: Don't highlight {} as errors inside () when used like this:
    "({ something })", often used in GCC code.
8   When editing a new file without a name and giving it a name (by writing
    it) and 'filetype' is not set, detect the filetype.  Avoid doing it for
    ":wq file".
8   Make conversion to HTML faster (Write it in C or pre-compile the script).
9   There is still a redraw bug somewhere.  Probably because a cached state is
    used in a wrong way.  I can't reproduce it...
7   Be able to change only the background highlighting.  Useful for Diff* and
    Search highlighting.
8   Allow the user to add items to the Syntax menu sorted, without having to
    change this for each release.
8   Add a "matchcontains" for regions: items contained in the start or end
    pattern, but not in the body.
8   Add a "keepend-contained" argument: Don't change the end of an item this
    one is contained in.  Like "keepend" but specified on the contained item,
    instead of the containing item.
8   cpp.vim: In C++ it's allowed to use {} inside ().
8   Some syntax files set 'iskeyword'.  When switching to another filetype
    this isn't reset.  Add a special keyword definition for the syntax rules?
    When this is done, use vim.vim syntax highlighting for help file examples,
    but without ":" in 'iskeyword' for syntax.
8   Add specific syntax item to match with parens/braces that don't have a
    "%" match.  :syntax nomatch cMatchError (,{,[,),},] [contained]
8   Highlight the text between two matching parens (e.g., with a grey
    background) when on one of the parens or in between them.
    Or highlight the matching paren when the cursor is on one.
8   Add a command to jump to the next character highlighted with "Error".
8   When using a cterm, and no ctermfg or ctermbg are defined, use start/stop
    sequences.	Add remark in docs that :if 'term' == "term-name" should be
    used.
8   Add @spell cluster to String and Comment groups for many languages.  Will
    allow spell checking. (Fleiner)
8   When listing syntax items, try to sort the keywords alphabetically.  And
    re-insert the [] if possible.
8   Make it possible to use color of text for Visual highlight group (like for
    the Cursor).
8   Make it possible to only highlight a sub-expression of a match.  Like
    using "\1" in a ":s" command.
8   Support for deleting syntax items:
    :syn keyword cTodo remove this
    :syn match cTodo remove "pattern"
    :syn region cString remove start="this" end="that"
8   Add possibility to sync on something else, when the syncing in one way
    doesn't find match.  For HTML: When no {script} is found, try looking for
    a '<'.  (Fleiner)
7   Replace the synchronizing method with a state machine specification?
    Should be able to start at any line in the file, search forwards or
    backwards, and use the result of matching a pattern.
7   Use parsing like awk, so that e.g., a ( without a matching ) can be
    detected.
8   Make it possible to use "inverted" highlighting, invert the original
    character.  For Visual mode.  (xterm-selection already does this).
8   Highlight non-printable characters with "SpecialChar", linked to
    "Special".  Display them with the digraph characters, if possible.
8   Highlight the clipboard-selection with a highlight group.
8   Be able to reset highlighting to its original (default) values.
7   Be able to write current highlighting to a file as commands, similar to
    ":mkvimrc".
8   Improve c.vim:
    - Add check for unterminated strings, with a variable to switch it on:
      "c_strict_ansi".
    - Detect unbalanced "#endif".  Requires looking back a long way...
8   Add an option to restrict the updating of syntax highlighting to the
    current line while in Insert mode.
8   When guessing value of 'background', the syntax file has already been
    loaded (from the .gvimrc).	After changing 'background', load it again?
8   Add ":syn resync" command, to re-parse the whole file until the current
    display position.
8   Should support "me" offset for a region start pattern.  To be used to
    allow searching for the end pattern inside the match of the end pattern.
    Example: syn region pikeXX start="([^{]" end=")" should work on "()".
8   When using a regexp for "contains=", should delay matching with it until
    redrawing happens.  Set a flag when a group is added, check this flag when
    highlighting starts.
7   Add "semitrans": Add highlighting.  E.g., make the text bold, but keep the
    colors.  And add colors, so that Green+Red becomes Yellow.
    E.g. for this html:
	<B> bold text <I> italic+bold text </B> italic text </I>
7   Wild idea: Not only set highlighting, but also change what is displayed
    (e.g., remove characters, so that "<B>bold</B>" can be shown as "bold"):
	:syn region boldstuff start="<B>" display="" end="</B>" display=""
7   CTRL-] checks the highlight group for finding out what the tag is.
7   Add an explanation how a list of words can be used to highlight misspelled
    words.
7   Command line completion for ":find" should search in 'path'.
8   Add more command line completion for :syntax.
8   Add more command line completion for :highlight.
8   Add more command line completion for :sign.
7   Should find a better way to parse the :syntax and :highlight commands.
    Use tables or lists that can be shared by parsing for execution and
    completion?
8   Add ColorSchemePost autocommand event, so that scripts can set up their
    highlighting. (Salman Halim)
7   Add a few sets of colors (e.g. Borland Turbo C one).  With a menu to
    select one of the sets.
8   Add offsets to sub-matches: "\(a*\) *"he=e1-1
    'e' is end of match 'e1' is end of sub-match 1, 's2' is start of submatch
    2, etc.
8   In Insert mode, when there are typeahead characters, postpone the
    highlighting (for "." command).
8   Syncing on comments isn't 100% correct when / / lines mix with / * and * /.
    For example: What about a line that starts with / / and contains * /?
8   Ignore / * and  * / inside strings, when syncing.
7   Build a few more syntax files from the file "/usr/share/misc/vgrindefs":
    ISP, LDL, Icon, ratfor.  And check "nedit/source/highlight.c".
6   Add possibility to have background color continue until the right edge of
    the window.  Useful for comment blocks and function headings. (Rogall)
-   Make it possible to add "contains" items for all items in a group.	Useful
    when extending an already existing syntax file.
-   Add line-continuation pattern for non-syncing items too?
-   Add possibility to highlight the whole line, including the right margin
    (for comment blocks).
-   Add 'hlmatch' option: List of flags:
    'c': highlight match for character under the cursor.
    'b': highlight the previous (, and its match.
    'a': highlight all text from the previous ( until its match.
	 Also for {}, <>, etc.?
    'e': highlight all braces without a match (slow?)
    OR: add an argument "cursor" to the syntax command, which means that the
    region/match/keyword is only highlighted when the cursor is on it.
    (Campbell)
    Or do it like Elvis: define text objects and how to highlight them around
    the cursor. (Iain Truskett)
7   Make it possible to use all words in the tags files as Keyword.
    Can also be done with a script (but it's slow).
7   Make it possible to call a ":" command when a match is found.  Should
    allow for adding keywords from the text (e.g. variables that are set).
    And allows for sections with different highlighting.
7   Add highlight group for commandline: "Commandline".  Make sure it
    highlights the command line while typing a command, and any output from
    messages.  And external commands?
8   Make a version that works like less, but with highlighting: read stdin for
    text, exit at end of file, don't allow editing, etc.  moreim?  lessim?
7   SpecialKey highlighting overrules syntax highlighting.  Can't give an
    unprintable char another color.  Would be useful for ^M at end of line.


Built-in script language:
8   Add referring to key options with "&t_xx".  Both for "echo &t_xx" and
    ":let &t_xx =".  Useful for making portable mappings.
8   exists("&&option") tests if 'option' is actually implemented.  Useful for
    'shellslash', for example.
-   Add "{range}source": execute lines from a buffer.
    Alternative: Allow range for ":exec", pass it on to the executed command.
    (Webb)
    You can already yank lines and use :@" to execute them.
8   Have a look at VSEL.  Would it be useful to include? (Bigham)
8   Add ":fungroup" command, to group function definitions together.  When
    encountered, all functions in the group are removed.  Suggest using an
    obscure name to avoid name clashes.  Require a ":fungroup END" in the same
    sourced file?  Assume the group ends at the end of the file.  Handle
    nested packages?
    Alternative: Support packages.  {package-name}:{function-name}().
    Packages are loaded automatically when first used, from
    $VIMRUNTIME/packages (or use a search path).
7   Add the markclear() function to delete a mark in another buffer.  Charles
    Campbell (2004 Jan 9)
    http://mysite.verizon.net/astronaut/vim/index.html#Patch
    Implement setmark(markname, lnum [, col [, filename]]) instead?
    When "lnum" is zero delete the mark.
    When "filename" has no wildcards and there is no matching buffer, add
    the buffer (unlisted).
7   Pre-parse or compile Vim scripts into a bytecode.
    1. Put the bytecode with the original script, with an ":if
       has('bytecode')" around it, so that it's only used with a Vim that
       supports it.  Update the code with a command, can be used in an
       autocommand.
    2. Use a ".vic" file (like Python use .pyc).  Create it when writing a
       .vim file.  Problem: distribution.
    3. Use a cache directory for each user.  How to recognize which cached
       file belongs to a sourced script?
7   Add argument to winwidth() to subtract the space taken by 'foldcolumn',
    signs and/or 'number'.
8   Add functions:
	realname()		Get user name (first, last, full)
				user_fullname() patch by Nikolai Weibull, Nov
				3 2002
				Only add this when also implemented for
				non-Unix systems, otherwise a shell cmd could
				be used.
				get_user_name() gets login name.
	menuprop({name}, {idx}, {what})
				Get menu property of menu {name} item {idx}.
				menuprop("", 1, "name") returns "File".
				menuprop("File", 1, "n") returns "nmenu
				File.Open..." argument.
				Patch by Ilya Sher, 2004 Apr 22
				Return a list of menus and/or a dictionary
				with properties instead.
	mapname({idx}, mode)	return the name of the idx'th mapping.
				Patch by Ilya Sher, 2004 Mar 4.
				Return a list instead.
	char2hex()		convert char string to hex string.
	attributes()		return file protection flags "drwxrwxrwx"
	filecopy(from, to)	Copy a file
	shorten(fname)		shorten a file name, like home_replace()
	perl(cmd)		call Perl and return string
	inputrl()		like input() but right-to-left
	virtualmode()		add argument to obtain whether "$" was used in
				Visual block mode.
	getacp()		Win32: get codepage (Glenn Maynard)
	deletebufline()		delete line in any buffer
	appendbufline()		append line in any buffer
	libcall()		Allow more than one argument.
	libcallext()		Like libcall(), but using a callback function
				to allow the library to execute a command or
				evaluate an expression.
7   Make bufname("'0") return the buffer name from mark '0.  How to get the
    column and line number?  col("'0") currently returns zero.
8   argc() returns 0 when using "vim -t tag".  How to detect that no file was
    specified in any way?  To be able to jump to the last edited file.
8   Pass the executable name to the Vim scripts in some way.  As v:argv0?
8   Add command arguments with three dashes, passed on to Vim scripts.
8   When starting to source a vim script, delete all functions that it has
    previously defined?  Avoids using ":fun!" all the time.
7   Add optional arguments to user functions:
	:func myFunc(arg1, arg2, arg3 = "blah", arg4 = 17)
6   User functions: Functions local to buffer "b:func()"?
8   Add ":let var[{expr}] = {expr}".  When past the end of "var" just ignore.
8   The "= register should be writable, if followed by the name of a variable,
    option or environment variable.
8   ":let &option" should list the value of the option.
7   Add synIDlist(), making the whole list of syntax items on the
    stack available (separated with '\n').
8   Add autocommand-event for when a variable is changed:
	:au VarChanged {varname} {commands}
8   Add "has("gui_capable")", to check if the GUI can be started.
8   Add possibility to use variables like registers: characterwise (default),
    linewise (when ending in '\n'), blockwise (when ending in '\001').	reg0,
    rega, reg%, etc.  Add functions linewise({expr}), blockwise({expr}) and
    charwise({expr}).
7   Make it possible to do any command on a string variable (make a buffer
    with one line, containing the string).  Maybe add an (invisible) scratch
    buffer for this?
	result = scratch(string, command)
	result = apply(string, command)
	result = execute(string, command)
    "command" would use <> notation.
    Does scratch buffer have a number?  Or re-use same number?
7   Add function to generate unique number (date in milliseconds).
7   Automatically load a function from a file when it is called.  Need an
    option for the search path. (Sekera)
7   Persistent variables: "p:var"; stored in viminfo file and sessions files.


Robustness:
6   Add file locking.  Lock a file when starting to edit it with flock() or
    fcntl().  This patch has advisory file locking while reading/writing
    the file for Vim 5.4: ~/vim/patches/kahn_file_locking .
    The patch is incomplete (needs support for more systems, autoconf).
    Andy doesn't have time to work on it.
    Disadvantage: Need to find ways to gracefully handle failure to obtain a
    lock.  When to release a lock: When buffer is unloaded?


Performance:
7   For strings up to 3 bytes don't allocate memory, use v_list itself as a
    character array.  Use VAR_SSTRING (short string).
8   Loading plugins takes startup time.  Only load the part that is used to
    trigger the rest, and load the rest when it's needed?
8   Turn b_syn_ic and b_syn_containedin into b_syn_flags.
9   Loading menu.vim still takes quite a bit of time.  How to make it faster?
8   in_id_list() takes much time for syntax highlighting.  Cache the result?
7   setpcmark() shifts the jumplist, this takes quite a bit of time when
    jumping around.  Instead use an index for the start?
8   When displaying a space with only foreground highlighting, it's the same
    as a space without attributes.  Avoid displaying spaces for the "~" lines
    when starting up in a color terminal.
8   Avoid alloc() for scratch buffer use, esp. in syntax.c.  It's very slow on
    Win16.
9   Setting GUI options in the console (e.g., 'guifont') should not cause a
    redraw.
8   Profiling shows that in_id_list() is used very often for C code.  Can this
    function be improved?
8   For an existing file, the page size of the swap file is always the
    default, instead of using the block size of the device, because the swap
    file is created only after setting the block size in mf_open().  How can
    this be improved?
8   Set default for 'ttyscroll' to half a screen height?  Should speed up
    MS-DOS version. (Negri)
7   C syntax highlighting gets a lot slower after ":set foldmethod=syntax".
    (Charles Campbell)  Inserting a "{" is very slow. (dman)
7   HTML syntax highlighting is slow for long lines.  Try displaying
    http://www.theregister.co.uk/content/4/22908.html. (Andre Pang)
7   Check how performance of loading the wordlist can be improved (adding a
    lot of abbreviations).
7   DOS console: Add t_DL support, to make scrolling faster.
7   Compile Ex commands to byte codes.  Store byte codes in a vim script file
    at the end, after "compiled:.  Make it look like a single comment line
    for old Vim versions.  Insert first line "Vim script compiled <timestamp>.
    Only used compiled code when timestamp matches the file stat.
    Add command to compile a vim script and add it to the file in-place.
    Split Ex command executing into a parsing and executing phase.
    Use compiled code for functions, while loops, etc.
8   When editing a file with extremely long lines (e.g., an executable), the
    "linerest" in readfile() is allocated twice to be able to copy what was
    read so far.  Use realloc() instead?  Or split the line when allocating
    memory fails and "linerest" is big (> 100000)?
8   When defining autocommands (e.g., from $VIMRUNTIME/filetype.vim), need to
    compare each pattern with all existing patterns.  Use a hash code to avoid
    using strcmp() too often?
7   Include turbo_loader patches, speeding up reading a file?
    Speed up reading a file by reading it into a fixed-size buffer, creating
    the list of indexes in another buffer, and then copying the result into a
    memfile block with two copies.  Then read the next block into another
    fixed-size buffer, create the second list of indexes and copy text from
    the two blocks to the memfile block.
7   do_cmdline(): Avoid that the command line is copied to allocated memory
    and freed again later all the time.  For while loops, and for when called
    with an argument that can be messed with.
    Generic solution: Make a struct that contains a pointer and a flag that
    indicates if the pointer should be freed when replaced.
7   Check that the file size is not more than "sizeof(long)".
-   Further improve finding mappings in maphash[] in vgetorpeek()
8   Syntax highlighting is slow when deleting lines.  Try in
    $VIMRUNTIME/filetype.vim.
-   "out of memory" after deleting (1,$d) and changing (:%s/^/> /) a lot of
    lines (27000) a few times.  Memory fragmentation?
-   Have a look at how pdksh does memory allocation (alloc.c). (Dalecki)
-   Do profiling on:
    - :g/pat/normal cmd
    - 1000ii<Esc>
    - deleting 10Mbyte worth of lines (netscape binary)
    - "[i" and "[d" (Yegappan Lakshmanan)
    - ":g/^/m0" on a 450Kbyte file.  And the "u".
    - highlighting "~/vim/test/longline.tex", "~/vim/test/scwoop.tcl" and
      "~/vim/test/lockup.pl".
    - loading a syntax file to highlight all words not from a dictionary.
    - editing a vim script with syntax highlighting on (loading vim.vim).
7   Screen updating can be further improved by only redrawing lines that were
    changed (and lines after them, when syntax highlighting was used, and it
    changed).
    - On each change, remember start and end of the change.
    - When inserting/deleting lines, remember begin, end, and line count.
-   Use macros/duarte/capicua for profiling.  Nvi 1.71 is the fastest!
-   When using a file with one long line (1Mbyte), then do "$hhhh", is still
    very slow.  Avoid calling getvcol() for each "h"?
-   Executing a register, e.g. "10000@@" is slow, because ins_typebuf has to
    move the previous commands forward each time.  Pass count from
    normal_cmd() down to do_execreg().
-   Repeating insert "1000i-<Esc>" displays --INSERT-- all the time, because of
    the <Esc> at the end.  Make this work faster (disable redrawing).
-   Avoid calls to plines() for cursor line, use w_cline_height.
-   After ":set nowrap" remove superfluous redraw with wrong hor. offset if
    cursor is right of the screen.
8   Make CTRL-C on Unix generate a signal, avoid using select() to check for a
    CTRL-C (it's slow).


Code size:
8   GUI: When NO_CONSOLE is defined, more code can be excluded.
-   Put getline() and cookie in a struct, so only one argument has to be
    passed to do_cmdline() and other functions.
8   Make a GUI-only version for Unix?
8   In buf_write _() isn't needed when setting errmsg, do it once when using
    it.
7   When compiling with a GUI-only version, the code for cterm colors can be
    left out.
8   When compiled with a GUI-only version, the termcap entries for terminals
    can be removed.
8   Can the check for libelf in configure.in be removed?


Messages:
8   When using ":q" in a changed file, the error says to "add !".  Add the
    command so that beginners understand it: "use :q!".
8   For 'verbose' level 12 prints commands from source'ed files.  How to skip
    lines that aren't executed?  Perhaps move the echoing to do_cmdline()?
8   Use 'report' for ":bdel"?  (Krishna)  To avoid these messages when using a
    script.
-   Delete message after new command has been entered and have waited for key.
    Perhaps after ten seconds?
-   Make message history available in "msg" variables: msg1, msg2, .. msg9.
9   Check handling of overwriting of messages and delays:
    Very wrong: errors while redrawing cause endless loop.
    When switching to another file and screen scrolls because of the long
    message and return must be typed, don't scroll the screen back before
    redrawing.
7   Add an option, which is a regexp, that disables warning messages which
    match that regexp (Tsirkin).
8   When address range is wrong you only get "Invalid range".  Be a bit more
    specific: Negative, beyond last line, reverse range?  Include the text.
8   Make it possible to ignore errors for a moment ('errorignore'?).  Another
    option to switch off giving error messages ('errorquiet'?).  Also an option
    not to give any messages ('quiet')?  Or ":quiet on", ":quiet off".
    Careful: For a severe error (out of memory), and when the user starts
    typing, error messages must be switched back on.
    Also a flag to ignore error messages for shell commands (for mappings).
-   Option to set time for emsg() sleep.  Interrupt sleep when key is typed?
    sleep before second message?
8   In Ex silent mode or when reading commands from a file, what exactly is
    not printed and what is?  Check ":print", ":set all", ":args", ":vers",
    etc.  At least there should be no prompt. (Smulders)  And don't clear the
    screen when reading commands from stdin. (Kendall)
    --> Make a difference between informative messages, prompts, etc. and
	error messages, printing text, etc.
8   Window should be redrawn when resizing at the hit-enter prompt.
    Also at the ":tselect" prompt.  Find a generic solution for redrawing when
    a prompt is present (with a callback function?).


Screen updating:
7   Add a string to the 'display' option to make CTRL-E and CTRL-Y scroll one
    screen line, also if this means the first line doesn't start with the
    first character (like what happens with a single line that doesn't fit).
-   screen_line():
    - insert/delete character stuff.
    - improve delete rest of line (spaces at end of line).
-   When moving or resizing window, try to avoid a complete redraw (esp. when
    dragging the status line with the mouse).
-   When 'lazyredraw' set, don't echo :ex commands?  Need a flag to redraw when
    waiting for a character.
8   Add a ":refresh [winnr]" command, to force updating a window.  Useful from
    an event handler where ":normal" can't be used.  Also useful when
    'lazyredraw' is set in a mapping.
7   Make 'list' and 'linebreak' work together.


Scrolling:
8   Add "zm" command: scroll horizontally to put the cursor in the middle.
6   Add option to set the overlap for CTRL-F and CTRL-B. (Garhi)
-   extend 'scrollbind' option: 'scrollopt' words "search", "relative", etc..
    Also 'e'xecute some commands (search, vertical movements) in all bound
    windows.
7   Add 'scrollbind' feature to make the offset of one window with the next
    one equal to the window height.  When editing one file in both windows it
    looks like each window displays a page of the buffer.
-   Allow scrolling by dragging with the mouse (grab a character and move it
    up/down).  Like the "hand" in Acrobat reader.  Use Alt-LeftMouse for this?
    (Goldfarb)
-   Add command to execute some commands (search, vertical movements) in all
    bound windows.
-   Add 'search' option to 'scrollopt' to allow 'scrollbind' windows to
    be bound by regexp searches
-   Add "z>" and "z<": scroll sideways one screenful. (Campbell)
-   Add option to set the number of lines when not to scroll, instead of the
    fixed number used now (for terminals that scroll slow with a large number
    of lines but not with a single line).


Autoconf:
8   Should use acconfig.h to define prototypes that are used by autoheader.
8   Some compilers don't give an error for "-OPT:Olimit" but a warning. (Webb)
    Add a check for the warning, so that "Olimit" can be added automatically?
-   Autoconf: Use @datadir@ for the system independent files.  Make sure the
    system dependent and system independent files are separated. (Leitner).
-   Add autoconf check for waitpid()/wait4().
-   Remove fcntl() from autoconf, all systems have it?
-   Set default for 'dictionary', add search for dictionary to autoconf.


Perl interface:
8   Rename typemap file to something else?
7   Make buffers accessed as Perl arrays. (Clark)
7   Make it possible to compile with non-ANSI C?
6   Tcl/Tk has the "load" command: load a shared library (.so or .dll).


Shared libraries:
6   Add support for loading shared libraries, and calling functions in it.
	:libload internal-name libname
	:libunload internal-name
	:liblist
	:libcall internal-name function(arg1, arg2, ...)
	:libcall function(arg1, arg2, ...)
    libcall() can have only one integer or String argument at the moment.
6   Have a look on how Perl handles loading dynamic libraries.


Tags:
8   Add a function that returns the line in the tags file for a matching tag.
    Can be used to extract more info (class name, inheritance, etc.) (Rico
    Hendriks)
7   Count before CTRL-]: jump to N'th match
8   Scope arguments for ":tag", e.g.: ":tag class:cPage open", like Elvis.
8   When output of ":tselect" is long, getting the more-prompt, should be able
    to type the tag number directly.
7   Add a tag-select window.  Works like ":cwindow".  (Michal Malecki)
7   Add the possibility to use the "-t {tag}" argument multiple times.  Open a
    window for each tag.
7   Make output of ":tselect" a bit nicer.  Use highlighting?
7   Highlight the "tag 1 of >2" message.  New highlight group, or same as "hit
    bottom" search message.
7   When using ":tag" at the top of the tag stack, should add another entry,
    so CTRL-T can bring you back to where you are now AND to where you were
    before the previous ":tag" command. (Webb)
-   When doing "[^I" or "[^D" add position to tag stack.
-   Add command to put current position to tag stack: ":tpush".
7   When using CTRL-] on someClass::someMethod, separate class from method and
    use ":ta class:someClass someMethod".
    Include C++ tags changes (Bertin).	Change "class::func" tag into "func"
    with "class=class"?  Docs in oldmail/bertin/in.xxx.
7   Add ":tagargs", to set values for fields:
	:tagargs class:someclass file:version.c
	:tagargs clear
    These are then the default values (changes the order of priority in tag
    matching).
7   Support for "gtags" and "global"?  With ":rtag" command?
    There is an example for how to do this in Nvi.
    Or do it like Elvis: 'tagprg' and 'tagprgonce' options. (Yamaguchi)
    The Elvis method is far more flexible, do it that way.
7   Support "col:99" extra field, to position the cursor in that column.  With
    a flag in 'cpoptions' to switch it off again.
7   Better support for jumping to where a function or variable is used.  Use
    the id-utils, with a connection to "gid" (Emacs can do it too).  Add
    ":idselect", which uses an "ID" database (made by "mkid") like "tselect".


Security:
-   nothing at the moment


Win32 GUI:
8   Make debug mode work while starting up (vim -D).  Open console window for
    the message and input?
7   The Python interface only works with one version of Python, selected at
    compile time.  Can this be made to work with version 2.1 and 2.2
    dynamically?
7   GvimExt: when there are several existing Vims, move the list to a submenu.
    (Mike McCollister)
8   When using "Edit with Vim" for one file it changes directory, when several
    files are selected and using "Edit with single Vim" the directory isn't
    changed.  At least change directory when the path is the same for all
    files.  Perhaps just use the path of the first file or use the longest
    common part of the path.
8   Add font argument to set the lfCharSet. (Bobcik)
8   Somehow automatically detect the system language and set $LANG, so that
    gettext and menus work.
8   Could keep console open to run multiple commands, to avoid the need to hit
    return in every console.
    Also: Look at how Emacs does runs external commands:
	http://www.cs.washington.edu/homes/voelker/ntemacs.html.
8   Need a separate PopUp menu for modeless selection.  Need two new commands:
    Copy selection to clipboard, Paste selection (as typed text).
8   Support copy/paste for other file formats.  At least HTML, perhaps RTF.
    Add "copy special" and "paste special" commands?
7   Use different default colors, to match the current Windows color scheme.
    Sys_WindowText, Sys_Window, etc. (Lionel Schaffhauser)
7   Use <C-Tab> to cycle through open windows (e.g., the find dialog).
7   <Esc> should close a dialog.
7   Keep the console for external commands open.  Don't wait for a key to be
    hit.  Re-open it when the user has closed it anyway.  Or use a prepended
    command: ":nowait {cmd}", or ":quiet", which executes {cmd} without any
    prompts.
7   Should be able to set an option so that when you double click a file that
    is associated with Vim, you can either get a new instance of Vim, or have
    the file added into an already running Vim.
7   The "-P" argument only works for the current codepage.  Use wide
    functions to find the window title.


GUI:
8   Make inputdialog() work for Photon, Amiga, RiscOS.
-   <C--> cannot be mapped.  Should be possible to recognize this as a
    normal "-" with the Ctrl modifier.
7   Implement ":popup" for other systems than Windows.
8   Implement ":tearoff" for other systems than Win32 GUI.
6   Implement ":untearoff": hide a torn-off menu.
8   When using the scrollbar to scroll, don't move the cursor position.  When
    moving the cursor: scroll to the cursor position.
9   Make <S-Insert> paste from the clipboard by default. (Kunze)
7   Menu local to a buffer, like mappings.  Or local to a filetype?
8   In Buffers menu, add a choice whether selecting a buffer opens it in the
    current window, splits the window or uses ":hide".
8   Dragging the mouse pointer outside of a Vim Window should make the text
    scroll.  Return a value from gui_send_mouse_event() to the machine
    specific code to indicate the time in which the event should be repeated.
8   Make it possible to ignore a mouse click when it's used to give Vim (gvim)
    window focus.  Also when a mouse click is used to bring a window to front.
8   Make the split into system independent code and system specific code more
    explicit.  There are too many #ifdefs in gui.c.
    If possible, separate the Vim code completely from the GUI code, to allow
    running them in separate processes.
7   X11: Support cursorColor resource and "-cr" argument.
8   X11 (and others): CTRL-; is not different from ';'.  Set the modifier mask
    to include CTRL for keys where CTRL produces the same ASCII code.
7   Add some code to handle proportional fonts on more systems?  Need to draw
    each character separately (like xterm).  Also for when a double-width font
    is not exactly double-width. (Maeda)
8   Should take font from xterm where gvim was started (if no other default).
8   Selecting font names in X11 is difficult, make a script or something to
    select one.
8   Visual highlighting should keep the same font (bold, italic, etc.).
8   Add flag to 'guioptions' to not put anything in the clipboard at all?
8   Should support a way to use keys that we don't recognize yet.  Add a
    command that adds entries to special_keys somehow.	How do we make this
    portable (X11, Win32, ..)?
7   Add a flag to 'guioptions' that tells not to remove inactive menu items.
    For systems where greying-out or removing menu items is very slow.  The
    menu items would remain visibly normally, but not do anything.
7   Add ":minimize" and ":maximize", which iconize the window and back.
    Useful when using gvim to run a script (e.g. 2html.vim).
7   X11: Is it possible to free allocated colors, so that other programs can
    use them again?  Otherwise, allow disabling allocating the default colors.
    Or allocate an own colormap (check UAE).  With an option to use it.  For
    the commandline, "-install" is mostly used for X11 programs.
7   Add command line argument for "gvim" not to start the GUI.  Sort of the
    inverse of "vim -g". (Vikas)
7   Should support multi-column menus.
-   Should add option for where to put the "Help" menu: like Motif at the far
    right, or with the other menus (but still at the right).
-   Add menu item to "Keep Insert mode".
8   ":mkgvimrc" command, that includes menus.
6   Big change: Move GUI to separate program "vimgui", to make startup of vim a
    lot faster, but still be able to do "vim -g" or ":gui".
7   More explicit mouse button binding instead of 'mousemodel'?
7   Add option to set the position of the window on the screen.  'windowpos',
    which has a value of "123,456": <x>,<y>.
    Or add a command, like ":winsize"?
7   Add toolbar for more GUIs.
8   Make it possible to use "amenu icon=BuiltIn##", so that the toolbar item
    name can be chosen free.
7   Make it possible to put the toolbar on top, left, right and/or bottom of
    the window?  Allows for softkey-like use.
6   Separate the part of Vim that does the editing from the part that runs the
    GUI.  Communicate through a pseudo-tty.  Vim starts up, creates a
    pty that is connected to the terminal.  When the GUI starts, the pty is
    reconnected to the GUI process.  When the GUI stops, it is connected to
    the terminal again.  Also use the pty for external processes, it looks
    like a vt100 terminal to them.  Vim uses extra commands to communicate GUI
    things.
7   Motif: For a confirm() dialog <Enter> should be ignored when no default
    button selected, <Esc> should close the dialog.
7   When using a pseudo-tty Vim should behave like some terminal (vt52 looks
    simple enough).  Terminal codes to/from shell should be translated.
-   Would it be useful to be able to quit the GUI and go back to the terminal
    where it was started from?
7   Support "-visual <type>" command line argument.


Autocommands:
7   For autocommand events that trigger multiple times per buffer (e.g.,
    CursorHold), go through the list once and cache the result for a specific
    buffer.  Invalidate the cache when adding/deleting autocommands or
    changing the buffer name.
8   Add ScriptReadCmd event: used to load remote Vim scripts, e.g.
    "vim -u http://mach/path/vimrc".
7   Add TagJump event: do something after jumping to a tag.
8   Use another option than 'updatetime' for the CursorHold event.  The two
    things are unrelated for the user (but the implementation is more
    difficult).
8   Also trigger CursorHold in Insert mode?
7   Add autocommand event for when a buffer cannot be abandoned.  So that user
    can define the action taking (autowrite, dialog, fail) based on the kind
    of file. (Yakov Lerner)  Or is BufLeave sufficient?
8   Can't use ":normal" in CursorHold autocommands.  Make the CursorHold event
    insert a special key code, and call the autocommand functions from a
    higher level, so that vgetc() isn't used recursively.
8   Autocommands should not change registers.  And marks?  And the jumplist?
    And anything else?
8   Autocommand for when modified files have been found, when getting input
    focus again (e.g., FileChangedFocus).
    Check when: getting focus, jumping to another buffer, ...
8   Add autocommands, user functions and user commands to ":mkvimrc".
8   Add "TagJumpFile" autocommand: When jumping to another file for a tag.
    Can be used to open "main.c.gz" when "main.c" isn't found.
6   Add KeymapChanged event, so that the effects of a different keymap can be
    handled (e.g., other font) (Ron Aaron)
7   Add a way to skip an autocommand if going from one *.c file to another *.c
    file.
7   When trying to open a directory, don't load the file but trigger an
    autocommand event OpenDirectory.
7   Add file type in front of file pattern: <d> for directory, <l> for link,
    <x> for executable, etc.  <&xxx> for Risc OS.  With commas to separate
    alternatives.  The autocommand is only executed when both the file type
    AND the file pattern match. (Leonard)
5   Add option that specifies extensions which are to be discarded from the
    file name.  E.g. 'ausuffix', with ".gz,.orig".  Such that file.c.gz will
    trigger the "*.c" autocommands.  (Belabas)
7   Add something to break the autocommands for the current event, and for
    what follows.  Useful for a "BufWritePre" that wants to avoid writing the
    file.
8   When editing "tt.gz", which is in DOS format, 'fileformat' stays at
    "unix", thus writing the file changes it.  Somehow detect that the read
    command used dos fileformat.  Same for 'fileencoding'.
-   Add events to autocommands:
    Error	    - When an error happens
    NormalEnter	    - Entering Normal mode
    InsertEnter	    - Entering Insert mode
    ReplaceEnter    - Entering Replace mode
    CmdEnter	    - Entering Cmdline mode
    VisualEnter	    - Entering Visual mode
    *Leave	    - Leaving a mode (in pair with the above *Enter)
    VimLeaveCheck    - Before Vim decides to exit, so that it can be cancelled
		      when exiting isn't a good idea.
    WinMoved	    - when windows have been moved around, e.g, ":wincmd J"
    CmdUndefined    - Like FuncUndefined but for user commands.
    SearchPost	    - After doing a search command (e.g. to do "M")
    PreDirChanged/PostDirChanged
		    - Before/after ":cd" has been used (for changing the
		      window title)
    BufReadAction   - replaces reading a file
    BufWriteAction  - replaces writing a file
    ShutDown	    - when the system is about to shut down
    InsertCharPre   - user typed character Insert mode, before inserting the
		      char.  Pattern is matched with text before the cursor.
		      Set v:char to the character, can be changed.
		      (not triggered when 'paste' is set).
    InsertCharPost  - user typed a character in Insert mode, after inserting
		      the char.
    BufModified	    - When a buffer becomes modified, or unmodified (for
		      putting a [+] in the window title or checking out the
		      file from CVS).
    BufFirstChange  - When making a change, when 'modified' is set.  Can be
		      used to do a :preserve for remote files.
    BufChange	    - after a change was made.  Set some variables to indicate
		      the position and number of inserted/deleted lines, so
		      that marks can be updated.  HierAssist has patch to add
		      BufChangePre, BufChangePost and RevertBuf. (Shah)
    WinResized	    - When a window has been resized
-   Add autocommand to be executed every so many seconds?  For writing the
    file now and then ('autosave').
				  *'autosave'* *'as'* *'noautosave'* *'noas'*
    'autosave' 'aw' number  (default 0)
	    Automatically write the current buffer to file N seconds after the
	    last change has been made and when |'modified'| is still set.
	    Default: 0 = do not autosave the buffer.
    Alternative: have 'autosave' use 'updatetime' and 'updatecount' but make
    them save the file itself besides the swapfile.


Insert mode completion/expansion:
8   When there is no word before the cursor but something like "sys." complete
    with "sys.".  Works well for C and similar languages.
9   ^X^L completion doesn't repeat correctly.  It uses the first match with
    the last added line, instead of continuing where the last match ended.
    (Webb)
8   Add option to set different behavior for Insert mode completion:
    - ignore/match case
    - different characters than 'iskeyword'
8   Add a command to undo the completion, go back to the original text.
7   Completion of an abbreviation: Can leave letters out, like what Instant
    text does: www.textware.com
8   Use the class information in the tags file to do context-sensitive
    completion.  After "foo." complete all member functions/variables of
    "foo".  Need to search backwards for the class definition of foo.
    Should work for C++ and Java.
    Even more context would be nice: "import java.^N" -> "io", "lang", etc.
7   When expanding $HOME/dir with ^X^F keep the $HOME (with an option?).
7   Add CTRL-X command in Insert mode like CTRL-X CTRL-N, that completes WORDS
    instead of words.
8   Add CTRL-X CTRL-R: complete words from register contents.
8   Add completion of previously inserted texts (like what CTRL-A does).
    Requires remembering a number of insertions.
8   Add 'f' flag to 'complete': Expand file names.
    Also apply 'complete' to whole line completion.
-   Make it possible to search include files in several places.  Use the
    'path' option?  Can this be done with the dictionary completion (use
    wildcards in the file name)?
-   Make CTRL-X CTRL-K do a binary search in the dictionary (if it's sorted).
-   Speed up CTRL-X CTRL-K dictionary searching (don't use a regexp?).
-   Set a mark at the position where the match was found (file mark, could
    be in another file).
-   Add CTRL-A command in CTRL-X mode: show all matches.
-   Make CTRL-X CTRL-L use the 'complete' option?
-   Add command in CTRL-X mode to add following words to the completed string
    (e.g. to complete "Pointer->element" with CTRL-X CTRL-P CTRL-W CTRL-W)
-   CTRL-X CTRL-F: Use 'path' to find completions.
-   CTRL-X CTRL-F: Option to use forward slashes on MS-Windows?
-   CTRL-X CTRL-F: Don't replace "$VIM" with the actual value. (Kelly)
8   Add option 'isexpand', containing characters when doing expansion (so that
    "." and "\" can be included, without changing 'iskeyword'). (Goldfarb)
    Also: 'istagword': characters used for CTRL-].
    When 'isexpand' or 'istagword' are empty, use 'iskeyword'.
-   Allow listing all matches in some way (and picking one from the list).


Command line editing:
7   Add commands (keys) to delete from the cursor to the end of the command
    line.
8   Custom completion of user commands can't use the standard completion
    functions.  Add a hook to invoke a user function that returns the type of
    completion to be done: "file", "tag", "custom", etc.
-   Add flags to 'whichwrap' for command line editing (cursor right at end of
    lines wraps to start of line).
-   Make editing the command line work like Insert mode in a single-line view
    on a buffer that contains the command line history.  But this has many
    disadvantages, only implement it when these can be solved.  Elvis has run
    into these, see remarks from Steve (~/Mail/oldmail/kirkendall/in.00012).
    - Going back in history and editing a line there would change the history.
      Would still need to keep a copy of the history elsewhere.  Like the
      cmdwin does now already.
    - Use CTRL-O to execute one Normal mode command.  How to switch to normal
      mode for more commands?  <Esc> should cancel the command line.  CTRL-T?
    - To allow "/" and "= need to recursively call getcmdline(), overwrite the
      cmdline.  But then we are editing a command-line again.  How to avoid
      that the user gets confused by the stack of command lines?
    - Use edit() for normal cmdline editing?  Would have to integrate
      getcmdline() into edit().  Need to solve conflicts between Insert mode
      and Command-line mode commands.  Make it work like Korn shell and tcsh.
      Problems:
	- Insert: completion with 'wildchar'
	- Insert: use cmdline abbreviations
	- Insert: CTRL-D deletes indent instead of listing matches
	- Normal: no CTRL-W commands
	- Normal: no ":" commands?
	- Normal: allow Visual mode only within one line.
    - where to show insert/normal mode message?  Change highlighting of
      character in first column?
    - Implementation ideas:
      - Set "curwin" and "curbuf" to the command line window and buffer.
      - curwin->w_topline is always equal to curwin->w_cursor.lnum.
      - never set 'number', no folding, etc.  No status line.
      - sync undo after entering a command line?
      - use NV_NOCL flag for commands that are not allowed in Command-line
	Mode.


Command line completion:
8   Change expand_interactively into a flag that is passed as an argument.
8   With command line completion after '%' and '#', expand current/alternate
    file name, so it can be edited.  Also with modifiers, such as "%:h".
8   When completing command names, either sort them on the long name, or list
    them with the optional part inside [].
7   Completion of ":map x ": fill in the current mapping, so that it can be
    edited. (Sven Guckes)
-   For 'wildmenu': Simplify "../bar" when possible.
-   When using <Up> in wildmenu mode for a submenu, should go back to the
    current menu, not the first one.  E.g., ":emenu File.Save<Up>".
8   For ":find" and ":sfind" expand files found in 'path'.
8   When using backtick expansion, the external command may write a greeting
    message.  Add an option or commands to remove lines that match a regexp?
7   When listing matches of files, display the common path separately from the
    file names, if this makes the listing shorter. (Webb)
-   Add command line completion for ":ilist" and friends, show matching
    identifiers (Webb).
8   Add command line completion for "old value" of a command.  ":args <key>"
    would result in the current list of arguments, which you can then edit.
7   Add command line completion with CTRL-X, just like Insert mode completion.
    Useful for ":s/word/xx/".
-   Add command to go back to the text as it was before completion started.
    Also to be used for <Up> in the command line.
-   Add 'wildlongest' option: Key to use to find longest common match for
    command line completion (default CTRL-L), like 'wildchar'. (Cregut)
    Also: when there are several matches, show them line a CTRL-D.


Command line history:
9   Remember which command lines were actually typed and were not loaded from
    viminfo.  When writing viminfo append only these lines, so that lines from
    other Vim's are not overwritten.
-   Add "KeyWasTyped" flag: It's reset before each command and set when a
    character from the keyboard is consumed. Value is used to decide to put a
    command line in history or not. Put line in history if it didn't
    completely resulted from one mapping.
-   When using ":browse", also put the resulting edit command in the history,
    so that it can be repeated. (Demirel)


Insert mode:
9   When 'autoindent' is set, hitting <CR> twice, while there is text after
    the cursor, doesn't delete the autoindent in the resulting blank line.
    (Rich Wales) This is Vi compatible, but it looks like a bug.
8   When using CTRL-O in Insert mode, then executing an insert command
    "a" or "i", should we return to Insert mode after <Esc>? (Eggink)
    Perhaps it can be allowed a single time, to be able to do
    "<C-O>10axyz<Esc>".  Nesting this further is confusing.
    ":map <F2> 5aabc<Esc>" works only once from Insert mode.
7   Use CTRL-G <count> to repeat what follows.  Useful for inserting a
    character multiple times or repeating CTRL-Y.
7   Use 'matchpairs' for 'showmatch': When inserting a character check if it
    appears in the rhs of 'matchpairs'.
-   In Insert mode (and command line editing?): Allow undo of the last typed
    character.	This is useful for CTRL-U, CTRL-W, delete and backspace, and
    also for characters that wrap to the next line.
    Also: be able to undo CTRL-R (insert register).
    Possibly use 'backspace'="whole" for a mode where at least a <CR> that
    inserts autoindent is undone by a single <BS>.
-   Use CTRL-G in Insert mode for an extra range of commands, like "g" in
    Normal mode.
-   Make 'paste' work without resetting other options, but override their
    value.  Avoids problems when changing files and modelines or autocommands
    are used.
-   When typing CTRL-V and a digit higher than 2, only expect two digits.
-   Insert binary numbers with CTRL-V b.
-   Make it possible to undo <BS>, <C-W> and <C-U>.  Bash uses CTRL-Y.


'cindent', 'smartindent':
8   Wrong indent below ? : with ():
	if ((a ? (b) : c) != 0)
		       aligns with ":".
8   Using "+" part of 'cinoptions' where it's not expected (Alexei Alexandrov):
	if (a)
	{
	} else
			asdf;
8   Wrong indent for ":" after a method with line break in arguments:
	Foo::Foo (int one,
		    int two)
	: something(4)
	{}
8   Wrong indent for ":" after a method with multiple lines:
	Foo::Foo (int one, int two)
		: something(4),
	somethingelse(3)
	{}
9   Too much indent for "lulu": (Uwe Zeisberger)
       int main ()
       {
	 if (lala)
	   do
	     ++(*lolo);
	   while (lili
		  && lele);
	   lulu;
       }
9   Function gets extra indent: (Jamax)
	void function(int param) {
	     if (false)
		 return;
	}
9   brace not indented correctly:
	case 'c':   if (cond)
			{
    Should align with "if" in case statement.
7   Allow aligning a closing ")" with the line above, instead of the matching
    "(": (Riehm) if (asdfasdf &&
			asdf
			)
8   Java: Inside an anonymous class, after an "else" or "try" the indent is
    too small. (Vincent Bergbauer)
8   In C++ it's possible to have {} inside (): (Kirshna)
		func(
			new String[] {
			    "asdf",
			    "asdf"
			}
		    );
7   Separate "(0" option into inside/outside a function (Zellner):
	func(
	   int x)	// indent like "(4"
	{
	   if (a
	       && b)	// indent like "(0"
8   Strange problem with this code, "hello" is indented wrong: (Gary Holloway)
    main() { char	foo[] = "/*";
	 /* This is a comment; the indentation of C
	  * source below this comment gets messed up due to the string above.
	  */
	  hello
9   Using "{" in a comment: (Helmut Stiegler)
    if (a)
    {
	    if (b)
	    {
		    // {
	    }
	    } <-- this is indented incorrect
9   Wrong indent for cino=(4, removing the (void) fixes it: (Zellner)
	(void) MyFancyFunction(
			       argument);
-   Make smartindenting configurable.  Add 'sioptions', e.g. '#' setting the
    indent to 0 should be switched on/off.
7   Support ANSI style function header, with each argument on its own line.
-   "[p" and "]p" should use 'cindent' code if it's on (only for the first
    line).
-   Add option to 'cindent' to set indent for comments outside of {}?
-   Make a command to line up a comment after a code line with a previous
    comment after a code line.	Can 'cindent' do this automatically?
7   Add 'j' flag to 'formatoptions': Remove comment leader when joining lines.
-   When 'cindent'ing a '}', showmatch is done before fixing the indent.  It
    looks better when the indent is fixed before the showmatch. (Webb)
-   Add option to make indenting work in comments too (for commented-out
    code), unless the line starts with "*".
-   Don't use 'cindent' when doing formatting with "gq"?
-   When formatting a comment after some text, insert the '*' for the new line
    (indent is correct if 'cindent' is set, but '*' doesn't get inserted).
8   When 'comments' has both "s1:/*,mb:*,ex:*/" and "s1:(*,mb:*,ex:*)", the
    'x' flag always uses the first match.  Need to continue looking for more
    matches of "*" and remember all characters that could end the comment.
-   For smartindent: When typing 'else' line it up with matching 'if'.
-   'smartindent': allow patterns in 'cinwords', for e.g. TeX files, where
    lines start with "\item".
-   Support this style of comments (with an option): (Brown)
	/* here is a comment that
	is just autoindented, and
	nothing else */
-   Add words to 'cinwords' to reduce the indent, e.g., "end" or "fi".
7   Use Tabs for the indent of starting lines, pad with spaces for
    continuation lines.  Allows changing 'tabstop' without messing up the
    indents.
    And/or: Add option to copy indent as-is, without changing spaces to tabs.
    also for 'autoindent'.  'keeptabs': when set don't change the tabs and
    spaces used for indent, when the indent remains the same or increases.


Java:
8   Can have {} constructs inside parens.  Include changes from Steve
    Odendahl?
8   Recognize "import java.util.Vector" and use $CLASSPATH to find files for
    "[i" commands and friends.
-   For files found with 'include': handle "*" in included name, for Java.
    (Jason)
-   How to make a "package java.util" cause all classes in the package to be
    searched?  Also for "import java.util.*". (Mark Brophy)


'comments':
8   When formatting C comments that are after code, the "*" isn't repeated
    like it's done when there is no code.  And there is no automatic wrapping.
    Recognize comments that come after code.  Should insert the comment leader
    when it's "#" or "//".
    Other way around: when a C command starts with "* 4" the "*" is repeated
    while it should not.  Use syntax HL comment recognition?
7   When using "comments=fg:--", Vim inserts three spaces for a new line.
    When hitting a TAB, these spaces could be removed.
7   The 'n'esting flag doesn't do the indenting of the last (rightmost) item.
6   Make strings in 'comments' option a RE, to be able to match more
    complicated things. (Phillipps)  Use a special flag to indicate that a
    regexp is used.
8   Make the 'comments' option with "/* * */" lines only repeat the "*" line
    when there is a "/*" before it?  Or include this in 'cindent'?


Virtual edit:
8   Make the horizontal scrollbar work to move the text further left.
7   Add a mode where the cursor is only allowed to go one character after the
    end of the line?
7   Allow specifying it separately for Tabs and beyond end-of-line?


Text objects:
8   Add test script for text object commands "aw", "iW", etc.
8   Add text object for part of a CamelHumedWord and under_scored_word.
    (Scott Graham)  "ac" and "au"?
8   Add a text object for any kind of quoting, also with multi-byte
    characters.  Option to specify what quotes are recognized (default: all)
    use "aq" and "iq".  Use 'quotepairs' to define pairs of quotes, like
    'matchpairs'?
8   Add text object for any kind of parens, also multi-byte ones.
7   Add text object for current search pattern: "a/" and "i/".  Makes it
    possible to turn text highlighted for 'hlsearch' into a Visual area.
8   Add "gp" and "gP" commands: insert text and make sure there is a single
    space before it, unless at the start of the line, and after it, unless at
    the end of the line or before a ".".
7   Add objects with backwards extension?  Use "I" and "A".  Thus "2dAs"
    deletes the current and previous sentence. (Jens Paulus)
7   Add "g{" and "g}" to move to the first/last character of a paragraph
    (instead of the line just before/after a paragraph as with "{" and "}").
6   Ignore comment leaders for objects.  Make "das" work in reply-email.
5   Make it possible to use syntax group matches as a text object.  For
    example, define a "ccItem" group, then do "da<ccItem>" to delete one.
    Or, maybe just define "dai", delete-an-item, to delete the syntax item the
    cursor is on.


Select mode:
8   In blockwise mode, typed characters are inserted in front of the block,
    backspace deletes a column before the block. (Steve Hall)
7   Alt-leftmouse starts block mode selection in MS Word.
    See http://www.vim.org/tips/tip.php?tip_id=743
7   Add Cmdline-select mode.  Like Select mode, but used on the command line.
    - Change gui_send_mouse_event() to pass on mouse events when 'mouse'
      contains 'C' or 'A'.
    - Catch mouse events in ex_getln.c.  Also shift-cursor, etc., like in
      normal_cmd().
    - remember start and end of selection in cmdline_info.
    - Typing text replaces the selection.


Visual mode:
-   When dragging the Visual selection with the mouse and 'scrolloff' is zero,
    behave like 'scrolloff' is one, so that the text scrolls when the pointer
    is in the top line.
8   When using "I" or "A" in Visual block mode, short lines do not get the new
    text.  make it possible to add the text to short lines too, with padding
    where needed.
7   With a Visual block selected, "2x" deletes a block of double the width,
    "3y" yanks a block of triple width, etc.
7   When selecting linewise, using "itext" should insert "text" at the start
    of each selected line.
8   What is "R" supposed to do in Visual mode?
8   Make Visual mode local to the buffer.  Allow changing to another buffer.
    When starting a new Visual selection, remove the Visual selection in any
    other buffer. (Ron Aaron)
8   Support dragging the Visual area to drop it somewhere else. (Ron Aaron,
    Ben Godfrey)
7   Support dragging the Visual area to drop it in another program, and
    receive dropped text from another program. (Ben Godfrey)
7   With blockwise Visual mode and "c", "C", "I", "A", etc., allow the use of
    a <CR>.  The entered lines are repeated over the Visual area.
7   CTRL-V :s should substitute only in the block, not to whole lines. (David
    Young is working on this)
7   Filtering a block should only apply to the block, not to the whole lines.
    When the number of lines is increased, add lines. When decreased, pad with
    spaces or delete? Use ":`<,`>" on the command line.
8   After filtering the Visual area, make "gv" select the filtered text?
    Currently "gv" only selects a single line, not useful.
7   Don't move the cursor when scrolling?  Needed when the selection should
    stay the same.  Scroll to the cursor at any movement command.  With an
    option!
7   In Visual block mode, need to be able to define a corner on a position
    that doesn't have text?  Also: when using the mouse, be able to select
    part of a TAB.  Even more: Add a mode where the cursor can be on a screen
    position where there is no text.  When typing, add spaces to fill the gap.
    Other solution: Always use curswant, so that you can move the cursor to
    the right column, and then use up/down movements to select the line,
    without changing the column.
6   ":left" and ":right" should work in Visual block mode.
7   CTRL-I and CTRL-O should work in Visual mode, but only jump to marks in the
    current buffer.
7   CTRL-A and CTRL-X should increase/decrease all numbers in the Visual area.
6   In non-Block mode, "I" should insert the same text in front of each line,
    before the first non-blank, "gI" in column 1.
6   In non-Block mode, "A" should append the same text after each line.
6   ":'<,'>source" should read the selected lines and ":source" them.
6   When in blockwise visual selection (CTRL-V), allow cursor to be placed
    right of the line.  Could also allow cursor to be placed anywhere on a TAB
    or other special character.
6   Add commands to move selected text, without deselecting.


More advanced repeating commands:
-   Add "." command for visual mode: redo last visual command (e.g. ":fmt").
7   Repeating "d:{cmd}" with "." doesn't work. (Benji Fisher)  Somehow remember
    the command line so that it can be repeated?
-   Add "." command after operator: repeat last command of same operator.  E.g.
    "c." will repeat last change, also when "x" used since then (Webb).
    "y." will repeat last yank.
    "c2." will repeat the last but one change?
    Also: keep history of Normal mode commands, add command to list the history
    and/or pick an older command.
-   History stack for . command?  Use "g." command.


Mappings and Abbreviations:
8   When "0" is mapped (it is a movement command) this mapping should not be
    used after typing another number, e.g. "20l". (Charles Campbell)
    Is this possible without disabling the mapping of the following command?
8   Should mapping <C-A> and <C-S-A> both work?
7   ":abbr b byte", append "b " to an existing word still expands to "byte".
    This is Vi compatible, but can we avoid it anyway?
8   To make a mapping work with a prepended "x to select a register, store the
    last _typed_ register name and access it with "&.
8   Add ":amap", like ":amenu".
8   Add ":cab!", abbreviations that only apply to Command-line mode and not to
    entering search strings.
8   Add a flag to ":abbrev" to eat the character that triggers the
    abbreviation.  Thus "abb ab xxx" and typing "ab<Space>" inserts "xxx" and
    not the <Space>.
8   Allow mapping of CTRL-@ (anywhere in the LHS).
8   Give a warning when using CTRL-C in the lhs of a mapping.  It will never
    (?) work.
8   Add a way to save a current mapping and restore it later.  Use a function
    that returns the mapping command to restore it: mapcmd()?  mapcheck() is
    not fool proof.  How to handle ambiguous mappings?
7   Add <0x8f> (hex), <033> (octal) and <123> (decimal) to <> notation?
7   Allow mapping "Q" and "Q}" at the same time.  Need to put a flag with "Q",
    that it needs an extra character before it can match.  See Vile 'maplonger'
    option.
7   When someone tries to unmap with a trailing space, and it fails, try
    unmapping without the trailing space.  Helps for ":unmap xx | unmap yy".
7   Make it possible to map 'wildchar', but only when it's a special character
    (like CTRL-E).  Currently it's only recognized when typed.  Useful for
    mapping a key to do something and then completion.
7   Add a mapping that works always, for remapping the keyboard.
6   Context-sensitive abbreviations: Specify syntax group(s) in which the
    abbreviations are to be used.
-   Add mappings that take arguments.  Could work like the ":s" command.  For
    example, for a mouse escape sequence:
	:mapexp  <Esc>{\([0-9]*\),\([0-9]*\);	H\1j\2l
-   Make it possible to include a <Nul> in the lhs and rhs of a mapping.
-   Add command to repeat a whole mapping ("." only repeats the last change in
    a mapping).  Also: Repeat a whole insert command, including any mappings
    that it included.  Sort-of automatic recording?
-   Add an option to ":map" that makes it display the special keys in
    <> notation (e.g. <CR> instead of ^M).  Or just always do this?
-   Include an option (or flag to 'cpoptions') that makes errors in mappings
    not flush the rest of the mapping (like nvi does).
-   Use context sensitiveness of completion to switch abbreviations and
    mappings off for :unab and :unmap.
6   When using mappings in Insert mode, insert characters for incomplete
    mappings first, then remove them again when a mapping matches.  Avoids
    that characters that are the start of some mapping are not shown until you
    hit another character.
-   Add optional <Number> argument for mappings:
    :map <Number>q	     ^W^W<Number>G
    :map <Number>q<Number>t  ^W^W<Number1-1>G<Number2>l
    :map q<Char>	    :s/<Char>/\u\0/g
    Or implicit:
    :map q			<Register>d<Number>$
-   Add mappings for replace mode: ":rmap".  How do we then enter mappings for
    non-replace Insert mode?
-   Add separate mappings for Visual-character/block/line mode?
6   Alias for Normal mode commands, works like :substitute?  Would allow
    mappings with arguments.
-   Add 'mapstop' command, to stop recursive mappings.
-   List mappings that have a raw escape sequence both with the name of the key
    for that escape sequence (if there is one) and the sequence itself.
-   List mappings: Once with special keys listed as <>, once with meta chars as
    <M-a>, once with the byte values (octal?).  Sort of "spell mapping" command?
-   When entering mappings: Add the possibility to enter meta keys like they
    are displayed, within <>: <M-a>, <~@> or <|a>.
-   Allow multiple arguments to :unmap.
-   Command to show keys that are not used and available for mapping
    ":freekeys".
-   Allow any character except white space in abbreviations lhs (Riehm).


Incsearch:
-   Add a limit to the number of lines that are searched for 'incsearch'?
-   When no match is found and the user types more, the screen is redrawn
    anyway.  Could skip that.  Esp. if the line wraps and the text is scrolled
    up every time.
-   Temporarily open folds to show where the search ends up.  Restore the
    folds when going to another line.
-   When incsearch used and hitting return, no need to search again in many
    cases, saves a lot of time in big files. (Slootman wants to work on this?)
    When not using special characters, can continue search from the last match
    (or not at all, when there was no match).  See oldmail/webb/in.872.
-   With incsearch, use CTRL-N/CTRL-P to go to next/previous match, some other
    key to copy matched word to search pattern (Alexander Schmid).


Searching:
7   Add "g/" and "gb" to search for a pattern in the Visually selected text?
    "g?" is already used for rot13.
8   Add a mechanism for recursiveness: "\@(([^()]*\@g[^()]*)\)".  \@g stands
    for "go recursive here" and \@( \) marks the recursive part.
    Perl does it this way:
	    $paren = qr/ \(( [^()] | (??{ $paren }) )* \) /x;
    Here $paren is evaluated when it's encountered.  This is like a regexp
    inside a regexp.  In the above terms it would be:
	    \@((\([^()]\|\@g\)*)\)
7   Support for approximate-regexps to find similar words (agrep
    http://www.tgries.de/agrep/ tre: http://laurikari.net/tre/index.html).
8   Add an item for a big character range, so that one can search for a
    chinese character: \z[234-1234]  or \z[XX-YY] or \z[0x23-0x234].
7   Add an item stack to allow matching ().  One side is "push X on
    the stack if previous atom matched".  Other side is "match with top of
    stack, pop it when it matches".  Use "\@pX" and "\@m"?
	Example: \((\@p).\{-}\@m\)*
7   Add an option to accept a match at the cursor position.  Also for
    search(). (Brett)
7   Add a flag to "/pat/" to discard an error.  Useful to continue a mapping
    when a search fails.  Could be "/pat/E" (e is already used for an offset).
7   Add pattern item to use properties of Unicode characters.  In Perl it's
    "\p{L}" for a letter.  See Regular Expression Pocket Reference.
8   Would it be possible to allow ":23,45/pat/flags" to search for "pat" in
    lines 23 to 45?  Or does this conflict with Ex range syntax?
8   Allow identical pairs in 'matchpairs'.  Restrict the search to the current
    line.
7   Allow longer pairs in 'matchpairs'.  Use ~/vim/macros/matchit.vim as an
    example.
8   Make it possible to define the character that "%" checks for in
    #if/#endif.  For nmake it's !if/!endif.
-   For "%" command: set hierarchy for which things include other things that
    should be ignored (like "*/" or "#endif" inside /* */).
    Also: use "%" to jump from start to end of syntax region and back.
    Alternative: use matchit.vim
8   "/:/e+1" gets stuck on a match at the end of the line.  Do we care?
8   A pattern like "\([^a]\+\)\+" takes an awful long time.  Recognize that
    the recursive "\+" is meaningless and optimize for it.
    This one is also very slow on "/* some comment */": "^\/\*\(.*[^/]\)*$".
7   Recognize "[a-z]", "[0-9]", etc. and replace them with the faster "\l" and
    "\d".
7   Add a way to specify characters in <C-M> or <Key> form.  Could be
    \%<C-M>.
8   Flags that apply to the whole pattern.
    This works for all places where a regexp is used.
    Add "\q" to not store this pattern as the last search pattern?
8   Add an argument after ":s/pat/str/" for a range of matches.  For example,
    ":s/pat/str/#3-4" to replace only the third and fourth "pat" in a line.
8   Add an option not to use 'hlsearch' highlighting for ":s" and ":g"
    commands. (Kahn)  It would work like ":noh" is used after that command.
    Also: An extra flag to do this once, and a flag to keep the existing
    search pattern.
-   Add \%h{group-name}; to search for a specific highlight group.
    Add \%s{syntax-group}; to search for a specific syntax group.
-   Support Perl regexp.  Use PCRE (Perl Compatible RE) package. (Shade)
    Or translate the pattern to a Vim one.
    Don't switch on with an option for typed commands/mappings/functions, it's
    too confusing.  Use "\@@" in the pattern, to avoid incompatibilities.
7   Add POSIX regexp, like Nvi, with 'extended' option?  It's like very-magic.
-   Remember flags for backreferenced items, so that "*" can be used after it.
    Check with "\(\S\)\1\{3}". (Hemmerling)
-   Add flags to search command (also for ":s"?):
    i	ignore case
    I	use case
    p	use Perl regexp syntax (or POSIX?)
    v	use Vi regexp syntax
    f	forget pattern, don't keep it for "n" command
    F   remember pattern, keep it for "n" command
    Perl uses these too:
    e	evaluate the right side as an expression (Perl only)
    m	multiple line expression (we don't need it)
    o	compile only once (Perl only)
    s	single line expression (we don't need it)
    x	extended regexp (we don't need it)
    When used after ":g" command, backslash needed to avoid confusion with the
    following command.
    Add 'searchflags' for default flags (replaces 'gdefault').
-   Add command to display the last used substitute pattern and last used
    pattern. (Margo)  Maybe make it accessible through a register (like "/
    for search string)?
7   Use T-search algorithm, to speed up searching for strings without special
    characters.  See C't article, August 1997.
-   Add 'fuzzycase' option, so that case doesn't matter, and '-' and '_' are
    equivalent (for Unix filenames).
-   Add 'v' flag to search command: enter Visual mode, with the matching text
    as Visual area. (variation on idea from Bertin)
-   Searching: "/this//that/" should find "that" after "this".
-   Add global search commands: Instead of wrapping at the end of the buffer,
    they continue in another buffer.  Use flag after search pattern:
    a	for the next file in the argument list
    f	for file in the buffer list
    w	for file edited in a window.
    e.g. "/pat/f".  Then "n" and "N" work through files too.  "f" flag also for
    ":s/pat/foo/f"???  Then when 'autowrite' and 'hidden' are both not set, ask
    before saving files: "Save modified buffer "/path/file"? (Yes/Hide/No
    Save-all/hide-All/Quit) ".
-   ":s/pat/foo/3": find 3rd match of "pat", like sed. (Thomas Koehler)
7   When searching with 'n' give message when getting back where the search
    first started.  Remember start of search in '/ mark.
7   Add option that scrolls screen to put cursor in middle of screen after
    search always/when off-screen/never.  And after a ":tag" command.  Maybe
    specify how many lines below the screen causes a redraw with the cursor in
    the middle (default would be half a screen, zero means always).
6   Support multiple search buffers, so macros can be made without side
    effects.
7   From xvim: Allow a newline in search patterns (also for :s, can delete
    newline).  Add BOW, EOW, NEWL, NLORANY, NLBUTANY, magic 'n' and 'r', etc.
    [not in xvim:] Add option to switch on matches crossing ONE line boundary.
7   Add ":iselect", a combination of ":ilist" and ":tselect". (Aaron) (Zellner)
    Also ":dselect".


Undo:
-   Make it possible to undo all the commands from a mapping, including a
    trailing unfinished command, e.g. for ":map K iX^[r".
-   When accidentally hitting "R" instead of Ctrl-R, further Ctrl-R is not
    possible, even when typing <Esc> immediately. (Grahn)  Also for "i", "a",
    etc.  Postpone saving for undo until something is really inserted?
8   When Inserting a lot of text, it can only be undone as a whole.  Make undo
    sync points at every line or word.  Could recognize the start of a new
    word (white space and then non-white space) and backspacing.
    Can already use CTRL-G u, but that requires remapping a lot of things.
8   Make undo more memory-efficient: Compare text before and after change,
    only remember the lines that really changed.
7   Add undo for a range of lines.  Can change these back to a previous
    version without changing the rest of the file.  Stop doing this when a
    change includes only some of these lines and changes the line count.  Need
    to store these undo actions as a separate change that can be undone.
-   For u_save() include the column number. This can be used to set '[ and '].
    And in the future the undo can be made more efficient (Webb).
-   In out-of-memory situations: Free allocated space in undo, and reduce the
    number of undo levels (with confirmation).
-   Instead of [+], give the number of changes since the last write: [+123].
    When undoing to before the last write, change this to a negative number:
    [-99].
-   With undo with simple line delete/insert: optimize screen updating.
-   When executing macro's: Save each line for undo only once.
-   Store undo info in a file that survives until the next edit.  Then it's
    possible to undo to before the current editing session.  Combined with
    viminfo?
-   When doing a global substitute, causing almost all lines to be changed,
    undo info becomes very big.  Put undo info in swap file??


Buffer list:
7   Command to execute a command in another buffer: ":inbuf {bufname} {cmd}".
    Also for other windows: ":inwin {winnr} {cmd}".  How to make sure that
    this works properly for all commands, and still be able to return to the
    current buffer/window?  E.g.: ":inbuf xxx only".
8   Add File.{recent_files} menu entries: Recently edited files.
    Ron Aaron has a plugin for this: mru.vim.
8   Unix: Check all uses of fnamecmp() and fnamencmp() if they should check
    inode too.
7   Add another number for a buffer, which is visible for the user.  When
    creating a new buffer, use the lowest number not in use (or the highest
    number in use plus one?).
7   Offer some buffer selection from the command line?  Like using ":ls" and
    asking for a buffer number. (Zachmann)
-   When starting to edit a file that is already in the buffer list, use the
    file name argument for the new short file name. (Webb)
-   Add an option to make ":bnext" and ":bprev" wrap around the end of the
    buffer list.  Also for ":next" and ":prev"?
7   Add argument to ":ls" which is a pattern for buffers to list.
    E.g. ":ls *.c". (Thompson)
7   Add expansion of buffer names, so that "*.c" is expanded to all buffer
    names.  Needed for ":bdel *.c", ":bunload *.c", etc.
8   Support for <afile> where a buffer name is expected.
8   Some commands don't use line numbers, but buffer numbers.  '$'
    should then mean the number of the last buffer.  E.g.: "4,$bdel".
7   Add an option to mostly use slashes in file names.  Separately for
    internal use and for when executing an external program?


Swap (.swp) files:
8   If writing to the swap file fails, should try to open one in another
    directory from 'dir'.  Useful in case the file system is full and when
    there are short file name problems.
8   Also use the code to try using a short file name for the backup and swap
    file for the Win32 and Dos 32 bit versions.
8   When a file is edited by root, add $LOGNAME to know who did su.
8   When the edited file is a symlink, try to put the swap file in the same
    dir as the actual file.  Adjust FullName().  Avoids editing the same file
    twice (e.g. when using quickfix).  Also try to make the name of the backup
    file the same as the actual file?
    Use the code for resolve()?
7   When using 64 bit inode numbers, also store the top 32 bits.  Add another
    field for this, using part of bo_fname[], to keep it compatible.
7   When editing a file on removable media, should put swap file somewhere
    else.  Use something like 'r' flag in 'viminfo'.  'diravoid'?
    Also: Be able to specify minimum disk space, skip directory when not
    enough room.
7   Add a configure check for which directory should be used: /tmp, /var/tmp
    or /var/preserve.
-   Add an option to create a swap file only when making the first change to
    the buffer.  (Liang)  Or only when the buffer is not read-only.
-   Add option to set "umask" for backup files and swap files (Antwerpen).
    'backupumask' and 'swapumask'?  Or 'umaskback' and 'umaskswap'?
-   When editing a readonly file, don't use a swap file but read parts from the
    original file.  Also do this when the file is huge (>'maxmem').  We do
    need to load the file once to count the number of lines?  Perhaps keep a
    cached list of which line is where.


Viminfo:
7   Can probably remove the code that checks for a writable viminfo file,
    because we now do the chown() for root, and others can't overwrite someone
    else's viminfo file.
8   Add argument to keep the list of buffers when Vim is started with a file
    name. (Schild)
8   Keep the last used directory of the file browser (File/Open menu).
8   Remember the last used register for "@@".
8   Remember a list of last accessed files.  To be used in the
    "File.Open Recent" menu.  Default is to remember 10 files or so.
    Also remember which files have been read and written.  How to display
    this?
7   Also store the ". register (last inserted text).
7   Make it possible to store buffer names in viminfo file relative to some
    directory, to make them portable over a network. (Aaron)
6   Store a snapshot of the currently opened windows.  So that when quitting
    Vim, and then starting again (without a file name argument), you see the
    same files in the windows.  Use ":mksession" code?
-   Make marks present in .viminfo usable as file marks: Display a list of
    "last visited files" and select one to jump to.


Modelines:
8   Before trying to execute a modeline, check that it looks like one (valid
    option names).  If it's very wrong, silently ignore it.
    Ignore a line that starts with "Subject: ".
-   When an option value is coming from a modeline, do not carry it over to
    another edited file?  Would need to remember the value from before the
    modeline setting.
-   Allow setting a variable from a modeline?  Only allow using fixed strings,
    no function calls, to avoid a security problem.
-   Allow ":doauto BufRead x.cpp" in modelines, to execute autocommands for
    .cpp files.
-   Support the "abbreviate" command in modelines (Kearns).  Careful for
    characters after <Esc>, that is a security leak.
-   Add option setting to ask user if he wants to have the modelines executed
    or not.  Same for .exrc in local dir.


Options:
8   Make ":mksession" store buffer-specific options for the specific buffer.
8   With ":mksession" always store the 'sessionoptions' option, even when
    "options" isn't in it. (St-Amant)
7   ":with option=value | command": temporarily set an option value and
    restore it after the command has executed.
7   Setting an option always sets "w_set_curswant", while this is only
    required for a few options.  Only do it for those options to avoid the
    side effect.
8   When using ":mksession", also store a command to reset all options to
    their default value, before setting the options that are not at their
    default value.
7   With ":mksession" also store the tag stack and jump history. (Michal
    Malecki)
8   Make "old" number options that really give a number of effects into string
    options that are a comma separated list.  The old number values should
    also be supported.
8   Add commands to save and restore an option, which also preserves the flag
    that marks if the option was set.  Useful to keep the effect of setting
    'compatible' after ":syntax on" has been used.
7   There is 'titleold', why is there no 'iconold'? (Chazelas)
7   Make 'scrolloff' a global-local option, so that it can be different in the
    quickfix window, for example. (Gary Holloway)
7   Add plugins for formatting.  Should be able to make a choice depending on
    the language of a file (English/Korean/Japanese/etc.).


External commands:
8   When filtering text, redirect stderr so that it can't mess up the screen
    and Vim doesn't need to redraw it.  Also for ":r !cmd".
4   Set separate shell for ":sh", piping "range!filter", reading text "r !ls"
    and writing text "w !wc". (Deutsche)  Allow arguments for fast start (e.g.
    -f).
4   Allow direct execution, without using a shell.
4   Run an external command in the background.  But how about I/O in the GUI?
    Careful: don't turn Vim into a shell!
4   Add feature to disable using a shell or external commands.


Multiple Windows:
7   "vim -oO file ..." use both horizontal and vertical splits.
8   Add CTRL-W T: go to the top window in the column of the current window.
    And CTRL-W B: go to bottom window.
7   Use CTRL-W <Tab>, like alt-tab, to switch between buffers.  Repeat <Tab>
    to select another buffer (only loaded ones?), <BS> to go back, <Enter> to
    select buffer, <Esc> to go back to original buffer.
7   Add a 'winfixwidth' option, similar to 'winfixheight'.
6   Add an option to resize the shell when splitting and/or closing a window.
    ":vsp" would make the shell wider by as many columns as needed for the new
    window.  Specify a maximum size (or use the screen size).  ":close" would
    shrink the shell by as many columns as come available. (Demirel)
7   When starting Vim several times, instantiate a Vim server, that allows
    communication between the different Vims.  Feels like one Vim running with
    multiple top-level windows.  Esp. useful when Vim is started from an IDE
    too.  Requires some form of inter process communication.
-   Support a connection to an external viewer.  Could call the viewer
    automatically after some seconds of non-activity, or with a command.
    Allow some way of reporting scrolling and cursor positioning in the viewer
    to Vim, so that the link between the viewed and edited text can be made.


Marks:
8   When cursor is first moved because of scrolling, set a mark at this
    position.  (Rimon Barr)  Use '-.
8   Add a command to jump to a mark and make the motion inclusive.  g'm and g`m?
8   The '" mark is set to the first line, even when doing ":next" a few times.
    Only set the '" mark when the cursor was really moved in a file.
8   Make `` and '', which would position the new cursor position in the middle
    of the window, restore the old topline (or relative position) from when
    the mark was set.
7   Make a list of file marks in a separate window.  For listing all buffers,
    matching tags, errors, etc.  Normal commands to move around.  Add commands
    to jump to the mark (in current window or new window).  Start it with
    ":browse marks"?
6   Add a menu that lists the Marks like ":marks". (Amerige)
7   For ":jumps", ":tags" and ":marks", for not loaded buffers, remember the
    text at the mark.  Highlight the column with the mark.
7   Highlight each mark in some way (With "Mark" highlight group).
    Or display marks in a separate column, like 'number' does.
7   Use d"m to delete rectangular area from cursor to mark m (like Vile's \m
    command).
7   Try to keep marks in the same position when:
    - replacing with a line break, like in ":s/pat/^M/", move marks after the
      line break column to the next line. (Acevedo)
    - inserting/deleting characters in a line.
5   Include marks for start/end of the current word and section.  Useful in
    mappings.
6   Add "unnamed mark" feature: Like marks for the ":g" command, but place and
    unplace them with commands before doing something with the lines.
    Highlight the marked lines somehow.


Digraphs:
7   Make "ga" show the digraph for a character, if it exists.
    Also the keymap?
-   Make it possible to enter "r<C-E>" and "r<C-Y>" (get character from line
    below/above).
-   Use digraph table to tell Vim about the collating sequence of special
    characters?
8   Add command to remove one or more (all) digraphs. (Brown)
7   Support different sets of digraphs (depending on the character set?).  At
    least Latin1/Unicode, Latin-2, MS-DOS (esp. for Win32).


Writing files:
-   In vim_rename(), should lock "from" file when deleting "to" file for
    systems other than Amiga.  Avoids problems with unexpected longname to
    shortname conversion.
8   write mch_isdevice() for Amiga, Mac, VMS, etc.
8   When appending to a file, Vim should also make a backup and a 'patchmode'
    file.
8   'backupskip' doesn't write a backup file at all, a bit dangerous for some
    applications.  Add 'backupelsewhere' to write a backup file in another
    directory?  Or add a flag to 'backupdir'?
7   The 'directory' option supports changing path separators to "%" to make
    file names unique, also support this for 'backupdir'. (Mikolaj Machowski)
6   Add an option to write a new, numbered, backup file each time.  Like
    'patchmode', e.g., 'backupmode'.
6   Make it possible to write 'patchmode' files to a different directory.
    E.g., ":set patchmode=~/backups/*.orig". (Thomas)
6   Add an option to prepend something to the backup file name.  E.g., "#".
    Or maybe allow a function to modify the backup file name?
8   Only make a backup when overwriting a file for the first time.  Avoids
    losing the original when writing twice. (Slootman)
7   On non-Unix machines, also overwrite the original file in some situations
    (file system full, it's a link on an NFS partition).
7   When editing a file, check that it has been change outside of Vim more
    often, not only when writing over it.  E.g., at the time the swap file is
    flushed.  Or every ten seconds or so (use the time of day, check it before
    waiting for a character to be typed).
8   When a file was changed since editing started, show this in the status
    line of the window, like "[time]".
    Make it easier to reload all outdated files that don't have changes.
    Automatic and/or with a command.


Substitute:
8   Substitute with hex/unicode number "\%xff" and "\%uabcd".  Just like
    "\%uabcd" in search pattern.
8   Make it easier to replace in all files in the argument list.  E.g.:
    ":argsub/oldword/newword/".  Works like ":argdo %s/oldword/newword/g|w".
-   :s///p prints the line after a substitution.
-   With :s///c replace \&, ~, etc. when showing the replacement pattern.
8   With :s///c allow scrolling horizontally when 'nowrap' is effective.
    Also allow a count before the scrolling keys.
-   Add number option to ":s//2": replace second occurrence of string?  Or:
    :s///N substitutes N times.
-   Add answers to ":substitute" with 'c' flag, used in a ":global", e.g.:
    ":g/pat1/s/pat2/pat3/cg": 'A' do all remaining replacements, 'Q' don't do
    any replacements, 'u' undo last substitution.
7   Substitute in a block of text.  Use {line}.{column} notation in an Ex
    range, e.g.: ":1.3,$.5s" means to substitute from line 1 column 3 to the
    last line column 5.
5   Add commands to bookmark lines, display bookmarks, remove bookmarks,
    operate on lines with bookmarks, etc.  Like ":global" but with the
    possibility to keep the bookmarks and use them with several commands.
    (Stanislav Sitar)


Mouse support:
8   Add 'o' flag to 'mouse'?
7   Be able to set a 'mouseshape' for the popup menu.
8   Add 'mouse' flag, which sets a behavior like Visual mode, but automatic
    yanking at the button-up event.  Or like Select mode, but typing gets you
    out of Select mode, instead of replacing the text. (Bhaskar)
7   Checkout sysmouse() for FreeBSD console mouse support.
-   Implement mouse support for the Amiga console.
-   Using right mouse button to extend a blockwise selection should attach to
    the nearest corner of the rectangle (four possible corners).
-   Precede mouse click by a number to simulate double clicks?!?
-   When mouse click after 'r' command, get character that was pointed to.


Crypt and security:
8   Also crypt the swapfile, each block separately.  Change mf_write() and
    mf_read().  How to get b_p_key to these functions?


Argument list:
6   Add command to put all filenames from the tag files in the argument list.
    When given an argument, only use the files where that argument matches
    (like `grep -l ident`) and jump to the first match.
6   Add command to form an args list from all the buffers?


Registers:
8   Don't display empty registers with ":display". (Etienne)
8   Make the # register writable, so that it can be restored after jumping
    around in windows.
8   Add put command that overwrites existing text.  Should also work for
    blocks.  Useful to move text around in a table.  Works like using "R ^R r"
    for every line.
6   When yanking into the unnamed registers several times, somehow make the
    previous contents also available (like it's done for deleting).  What
    register names to use?  g"1, g"2, etc.?
-   When appending to a register, also report the total resulting number of
    lines.  Or just say "99 more lines yanked", add the "more".
-   When inserting a register in Insert mode with CTRL-R, don't insert comment
    leader when line wraps?
-   The ":@r" commands should take a range and execute the register for each
    line in the range.
-   Add "P" command to insert contents of unnamed register, move selected text
	to position of previous deleted (to swap foo and bar in " + foo")
8   Should be able to yank and delete into the "/ register.
    How to take care of the flags (offset, magic)?


Debug mode:
7   Add something to enable debugging when a remote message is received.
8   Add breakpoints for setting an option
8   Add breakpoints for assigning to a variable.
7   Add a watchpoint in the debug mode: An expression that breaks execution
    when evaluating to non-zero.  Add the "watchadd expr" command, stop when
    the value of the expression changes.  ":watchdel" deletes an item,
    ":watchlist" lists the items. (Charles Campbell)
7   Store the history from debug mode in viminfo.
7   Make the debug mode history available with histget() et al.


Various improvements:
7   [t to move to previous xml/html tag (like "vatov"), ]t to move to next
    ("vatv").
7   [< to move to previous xml/html tag, e.g., previous <li>. ]< to move to
    next <li>, ]< to next </li>, [< to previous </li>.
8   Add ":rename" command: rename the file of the current buffer and rename
    the buffer.  Buffer may be modified.
-   Perhaps ":cexpr" could read errors from a list?
    Add %b to 'errorformat': buffer number. (Yegappan Lakshmanan / Suresh
    Govindachar)
6   In the quickfix window statusline add the command used to get the list of
    errors, e.g. ":make foo", ":grep something *.c".
6   Python interface: add vim.message() function. (Michal Vitecek, 2002 Nov 5)
7   Support using ":vert" with User commands.  Add expandable items <vert>.
    Do the same for ":browse" and ":confirm"?
    For ":silent" and ":debug" apply to the whole user command.
7   Allow a window not to have a statusline.  Makes it possible to use a
    window as a buffer-tab selection.
7   Add an invisible buffer which can be edited.  For use in scripts that want
    to manipulate text without changing the window layout.
8   Add a command to revert to the saved version of file; undo or redo until
    all changes are gone.
7   Add a ":cpfile", go in the other direction as ":cnfile".
6   "vim -q -" should read the list of errors from stdin. (Gautam Mudunuri)
8   Add "--remote-fail": When contacting the server fails, exit Vim.
    Add "--remote-self": When contacting the server fails, do it in this Vim.
    Overrules the default of "--remote-send" to fail and "--remote" to do it
    in this Vim.
8   When Vim was started without a server, make it possible to start one, as
    if the "--servername" argument was given.  ":startserver <name>"?
8   No address range can be used before the command modifiers.  This makes
    them difficult to use in a menu for Visual mode.  Accept the range and
    have it apply to the following command.
8   Add the possibility to set 'fileformats' to force a format and strip other
    CR characters.  For example, for "dos" files remove CR characters at the
    end of the line, so that a file with mixed line endings is cleaned up.
    To just not display the CR characters: Add a flag to 'display'?
7   Some compilers give error messages in which the file name does not have a
    path.  Be able to specify that 'path' is used for these files.
7   Xterm sends <Esc>O3F for <M-End>.  Similarly for other <M-Home>, <M-Left>,
    etc.  Combinations of Alt, Ctrl and Shift are also possible.  Recognize
    these to avoid inserting the raw byte sequence, handle like the key
    without modifier (unless mapped).
8   Add ":breakdel *": delete all breakpoints.
7   Support ":browse edit" in console, using explorer.vim?
6   Add "gG": like what "gj" is to "j": go to the N'th window line.
8   Add command like ":normal" that accepts <Key> notation like ":map".
9   Support ACLs on more systems.
7   Add ModeMsgVisual, ModeMsgInsert, etc. so that each mode message can be
    highlighted differently.
7   Add a message area for the user.  Set some option to reserve space (above
    the command line?).  Use an ":echouser" command to display the message
    (truncated to fit in the space).
7   Add %s to 'keywordprg': replace with word under the cursor. (Zellner)
8   Support printing on Unix.  Can use "lpansi.c" as an example. (Bookout)
8   Add put command that replaces the text under it.  Esp. for blockwise
    Visual mode.
7   Enhance termresponse stuff: Add t_CV(?): pattern of term response, use
    regexp: "\e\[[>?][0-9;]*c", but only check just after sending t_RV.
7   Add "g|" command: move to N'th column from the left margin (after wrapping
    and applying 'leftcol').  Works as "|" like what "g0" is to "0".
7   Support setting 'equalprg' to a user function name.
7   Highlight the characters after the end-of-line differently.
7   When 'whichwrap' contains "l", "$dl" should join lines?
8   Add an argument to configure to use $CFLAGS and not modify it? (Mooney)
8   Enabling features is a mix of configure arguments and defines in
    feature.h.  How to make this consistent?  Feature.h is required for
    non-unix systems.  Perhaps let configure define CONF_XXX, and use #ifdef
    CONF_XXX in feature.h?  Then what should min-features and max-features do?
8   Add "g^E" and "g^Y", to scroll a screen-full line up and down.
6   Add ":timer" command, to set a command to be executed at a certain
    interval, or once after some time has elapsed. (Aaron)
8   Add ":confirm" handling in open_exfile(), for when file already exists.
8   When quitting with changed files, make the dialog list the changed file
    and allow "write all", "discard all", "write some".  The last one would
    then ask "write" or "discard" for each changed file.  Patch in HierAssist
    does something like this. (Shah)
7   Use growarray for replace stack.
7   Have a look at viH (Hellenic or Greek version of Vim).  But a solution
    outside of Vim might be satisfactory (Haritsis).
3   Make "2d%" work like "d%d%" instead of "d2%"?
8   Make "more" prompt accept command characters, like "hit-enter" prompt?
    Or extend it with more commands, like "less": 'b' for back, 'j' for one
    line down, etc.
8   For the "--more--" prompt, support the 'b'ack command for more commands.
    Possible implementation: Do it at a very low level, caching the lines that
    are on the screen (with highlight attributes).  Avoids that changes have
    to be made for all functions that list something.
7   "g CTRL-O" jumps back to last used buffer.	Skip CTRL-O jumps in the same
    buffer.  Make jumplist remember the last ten accessed buffers?
-   Keep a list of most recently used files for each window, use "[o" to go
    back (older file) and "]n" to go forward (newer file) (like ^O and ^I for
    jumps). (Webb)  Use ":files" and ":ls" to list the files in history order.
7   Add a history of recently accessed buffer.	Maybe make "2 CTRL-^" jump to
    the 2nd previously visited buffer, "3 CTRL-^" to the third, etc.  Or use
    "3 g CTRL-^" for this?
-   Add code to disable the CAPS key when going from Insert to Normal mode.
-   Set date/protection/etc. of the patchfile the same as the original file.
-   Use growarray for termcodes[] in term.c
-   Add <window-99>, like <cword> but use filename of 99'th window.
7   Add a way to change an operator to always work characterwise-inclusive
    (like "v" makes the operator characterwise-exclusive).  "x" could be used.
-   Make a set of operations on list of names: expand wildcards, replace home
    dir, append a string, delete a string, etc.
-   Remove mktemp() and use tmpname() only?  Ctags does this.
-   When replacing environment variables, and there is one that is not set,
    turn it into an empty string?  Only when expanding options? (Hiebert)
-   Option to set command to be executed instead of producing a beep (e.g. to
    call "play newbeep.au").
-   Add option to show the current function name in the status line.  More or
    less what you find with "[[k", like how 'cindent' recognizes a function.
    (Bhatt).
-   "[r" and "]r": like "p" and "P", but replace instead of insert (esp. for
    blockwise registers).
-   Add 'timecheck' option, on by default.  Makes it possible to switch off the
    timestamp warning and question. (Dodt).
-   Add an option to set the time after which Vim should check the timestamps
    of the files.  Only check when an event occurs (e.g., character typed,
    mouse moved).  Useful for non-GUI versions where keyboard focus isn't
    noticeable.
9   When using ":w <fname>" it's possible that this file is loaded in another
    buffer.  Give a warning right away, don't wait for a shell command.
-   Make 'smartcase' work even though 'ic' isn't set (Webb).
7   When formatting text, allow to break the line at a number of characters.
    Use an option for this: 'breakchars'?  Useful for formatting Fortran code.
-   Add flag to 'formatoptions' to be able to format book-style paragraphs
    (first line of paragraph has larger indent, no empty lines between
    paragraphs).  Complements the '2' flag.  Use '>' flag when larger indent
    starts a new paragraph, use '<' flag when smaller indent starts a new
    paragraph.	Both start a new paragraph on any indent change.
7   Add a way to define an item list with a pattern in 'formatoptions'.  The
    'n' flag doesn't work for "6.3" or "6a.".
8   Add 'formatexpr' option: Used for formatting operator "gq" instead of the
    builtin formatting or 'formatprg'.
8   Allow using a trailing space to signal a paragraph that continues on the
    next line (MIME text/plain; format=flowed, RFC 2646).  Can be used for
    continuous formatting.  Could use 'autoformat' option, which specifies a
    regexp which triggers auto-formatting (for one line).
    ":set autoformat=\\s$".
-   Be able to redefine where a sentence stops.  Use a regexp pattern?
-   Support multi-byte characters for sentences.  Example from Ben Peterson.
7   Add command "g)" to go to the end of a sentence, "g(" to go back to the
    end of a sentence. (Servatius Brandt)
-   Be able to redefine where a paragraph starts.  For "[[" where the '{' is
    not in column 1.
6   Add ":cdprev": go back to the previous directory.  Need to remember a
    stack of previous directories.  We also need ":cdnext".
7   Should ":cd" for MS-DOS go to $HOME, when it's defined?
-   Make "gq<CR>" work on the last line in the file.  Maybe for every operator?
8   findmatchlimit() should be able to skip comments.  Solves problem of
    matching the '{' in /* if (foo) { */ (Fiveash)
-   Add more redirecting of Ex commands:
	:redir #>  bufname
	:redir #>> bufname   (append)
-   Give error message when starting :redir: twice or using END when no
    redirection was active.
-   Setting of options, specifically for a buffer or window, with
    ":set window.option" or ":set buffer.option=val".  Or use ":buffer.set".
    Also: "buffer.map <F1> quit".
6   Would it be possible to change the color of the cursor in the Win32
    console?  (Klaus Hast)
-   Add :delcr command:
			    *:delcr*
     :[range]delcr[!]	Check [range] lines (default: whole buffer) for lines
			ending in <CR>.  If all lines end in <CR>, or [!] is
			used, remove the <CR> at the end of lines in [range].
			A CTRL-Z at the end of the file is removed.  If
			[range] is omitted, or it is the whole file, and all
			lines end in <CR> 'textmode' is set.  {not in Vi}
-   Should integrate addstar() and file_pat_to_reg_pat().
-   When working over a serial line with 7 bit characters, remove meta
    characters from 'isprint'.
-   Use fchdir() in init_homedir(), like in FullName().
-   In win_update(), when the GUI is active, always use the scrolling area.
    Avoid that the last status line is deleted and needs to be redrawn.
-   That "cTx" fails when the cursor is just after 'x' is Vi compatible, but
    may not be what you expect.  Add a flag in 'cpoptions' for this?  More
    general: Add an option to allow "c" to work with a null motion.
-   Give better error messages by using errno (strerror()).
-   Give "Usage:" error message when command used with wrong arguments (like
    Nvi).
-   Make 'restorescreen' option also work for xterm (and others), replaces the
    SAVE_XTERM_SCREEN define.
7   Support for ":winpos" In xterm: report the current window position.
-   Give warning message when using ":set t_xx=asdf" for a termcap code that
    Vim doesn't know about.  Add flag in 'shortmess'?
6   Add ":che <file>", list all the include paths which lead to this file.
-   For a commandline that has several commands (:s, :d, etc.) summarize the
    changes all together instead of for each command (e.g. for the rot13
    macro).
-   Add command like "[I" that also shows the tree of included files.
-   ":set sm^L" results in ":set s", because short names of options are also
    expanded.  Is there a better way to do this?
-   Add ":@!" command, to ":@" like what ":source!" is to ":source".
8   Add ":@:!": repeat last command with forceit set.
-   Should be possible to write to a device, e.g. ":w! /dev/null".
-   Add 't_normal': Used whenever t_me, t_se, t_ue or t_Zr is empty.
-   ":cab map test ^V| je", ":cunab map" doesn't work.	This is vi compatible!
-   CTRL-W CTRL-E and CTRL-W CTRL-Y should move the current window up or down
    if it is not the first or last window.
-   Include-file-search commands should look in the loaded buffer of a file (if
    there is one) instead of the file itself.
7   Change 'nrformats' to include the leader for each format.  Example:
	nrformats=hex:$,binary:b,octal:0
    Add setting of 'nrformats' to syntax files.
-   'path' can become very long, don't use NameBuff for expansion.
-   When unhiding a hidden buffer, put the same line at top of the window as
    the one before hiding it.  Or: keep the same relative cursor position (so
    many percent down the windows).
-   Make it possible for the 'showbreak' to be displayed at the end of the
    line.  Use a comma to separate the part at the end and the start of the
    line?  Highlight the linebreak characters, add flag in 'highlight'.
-   Some string options should be expanded if they have wildcards, e.g.
    'dictionary' when it is "*.h".
-   Use a specific type for number and boolean options, making it possible to
    change it for specific machines (e.g. when a long is 64 bit).
-   Add option for <Insert> in replace mode going to normal mode. (Nugent)
-   Add a next/previous possibility to "[^I" and friends.
-   Add possibility to change the HOME directory.  Use the directory from the
    passwd file? (Antwerpen)
8   Add commands to push and pop all or individual options. ":setpush tw",
    ":setpop tw", ":setpush all".  Maybe pushing/popping all options is
    sufficient.  ":setflush" resets the option stack?
    How to handle an aborted mapping?  Remember position in tag stack when
    mapping starts, restore it when an error aborts the mapping?
-   Change ":fixdel" into option 'fixdel', t_del will be adjusted each time
    t_bs is set? (Webb)
-   "gc": goto character, move absolute character positions forward, also
    counting newlines.  "gC" goes backwards (Weigert).
-   When doing CTRL-^, redraw buffer with the same topline. (Demirel)  Store
    cursor row and window height to redraw cursor at same percentage of window
    (Webb).
-   Besides remembering the last used line number of a file, also remember the
    column.  Use it with CTRL-^ et. al.
-   Check for non-digits when setting a number option (careful when entering
    hex codes like 0xff).
-   Add option to make "." redo the "@r" command, instead of the last command
    executed by it.  Also to make "." redo the whole mapping.  Basically: redo
    the last TYPED command.
-   Support URL links for ^X^F in Insert mode, like for "gf".
-   Support %name% expansion for "gf" on Windows.
-   Make "gf" work on "file://c:/path/name".  "file:/c:/" and "file:///c:/"
    should also work?
-   Add 'urlpath', used like 'path' for when "gf" used on an URL?
8   When using "gf" on an absolute file name, while editing a remote file
    (starts with scp:// or http://) should prepend the method and machine
    name.
-   When finding an URL or file name, and it doesn't exist, try removing a
    trailing '.'.
-   Add ":path" command modifier.  Should work for every command that takes a
    file name argument, to search for the file name in 'path'.	Use
    find_file_in_path().
-   Highlight control characters on the screen: Shows the difference between
    CTRL-X and "^" followed by "X" (Colon).
-   Integrate parsing of cmdline command and parsing for expansion.
-   Create a program that can translate a .swp file from any machine into a
    form usable by Vim on the current machine.
-   Add ":noro" command: Reset 'ro' flag for all buffers, except ones that have
    a readonly file.  ":noro!" will reset all 'ro' flags.
-   Add a variant of CTRL-V that stops interpretation of more than one
    character.	For entering mappings on the command line where a key contains
    several special characters, e.g. a trailing newline.
-   Add regex for 'paragraphs' and 'sections': 'parare' and 'sectre'.  Combine
    the two into a regex for searching. (Ned Konz)
-   Make '2' option in 'formatoptions' also work inside comments.
-   Add 's' flag to 'formatoptions': Do not break when inside a string. (Dodt)
-   When window size changed (with the mouse) and made too small, set it back
    to the minimal size.
-   Add "]>" and "[<", shift comment at end of line (command;  /* comment */).
-   Should not call cursorcmd() for each vgetc() in getcmdline().
-   ":split file1 file2" adds two more windows (Webb).
-   Don't give message "Incomplete last line" when editing binary file.
-   Add ":a", ":i" for preloading of named buffers.
-   Allow autowrite when doing ":e file" (with an option 'eaw').
-   Allow a "+command" argument before each file name in the Vim command line:
    "vim +123 file1 +234 file2 +345 file3". ???
-   When entering text, keep other windows on same buffer updated (when a line
    entered)?
-   Check out how screen does output optimizing.  Apparently this is possible
    as an output filter.
-   In dosub() regexec is called twice for the same line.  Try to avoid this.
-   Window updating from memline.c: insert/delete/replace line.
-   Optimize ml_append() for speed, esp. for reading a file.
-   V..c should keep indent when 'ai' is set, just like [count]cc.
-   Updatescript() can be done faster with a string instead of a char.
-   Screen updating is inefficient with CTRL-F and CTRL-B when there are long
    lines.
-   Uppercase characters in ex commands can be made lowercase?
8   Add option to show characters in text not as "|A" but as decimal ("^129"),
    hex ("\x81") or octal ("\201") or meta (M-x).  Nvi has the 'octal' option
    to switch from hex to octal.  Vile can show unprintable characters in hex
    or in octal.
7   Tighter integration with xxd to edit binary files.  Make it more
    easy/obvious to use.  Command line argument?
-   How does vi detect whether a filter has messed up the screen?  Check source.
    After ":w !command" a wait_return?
-   Improve screen updating code for doput() (use s_ins()).
-   With 'p' command on last line: scroll screen up (also for terminals without
    insert line command).
-   Use insert/delete char when terminal supports it.
-   Optimize screen redraw for slow terminals.
-   Optimize "dw" for long row of spaces (say, 30000).
-   Add "-d null" for editing from a script file without displaying.
-   In Insert mode: Remember the characters that were removed with backspace
    and re-insert them one at a time with <key1>, all together with <key2>.
-   Amiga: Add possibility to set a keymap.  The code in amiga.c does not work
    yet.
-   Implement 'redraw' option.
-   Add special code to 'sections' option to define something else but '{' or
    '}' as the start of a section (e.g. one shiftwidth to the right).
7   Allow using Vim in a pipe: "ls | vim -u xxx.vim - | yyy".  Only needs
    implementing ":w" to stdout in the buffer that was read from stdin.
    Perhaps writing to stdout will work, since stderr is used for the terminal
    I/O.
8   Allow opening an unnamed buffer with ":e !cmd" and ":sp !cmd".  Vile can
    do it.
-   Add commands like ]] and [[ that do not include the line jumped to.
-   When :unab without matching "from" part and several matching "to" parts,
    delete the entry that was used last, instead of the first in the list.
-   Add text justification option.
-   Set boolean options on/off with ":set paste=off", ":set paste=on".
-   After "inv"ing an option show the value: ":set invpaste" gives "paste is
    off".
-   Check handling of CTRL-V and '\' for ":" commands that do not have TRLBAR.
-   When a file cannot be opened but does exist, give error message.
-   Amiga: When 'r' protection bit is not set, file can still be opened but
    gives read errors.  Check protection before opening.
-   When writing check for file exists but no permission, "Permission denied".
-   If file does not exists, check if directory exists.
-   MSDOS: although t_cv and t_ci are not set, do invert char under cursor.
-   Settings edit mode: make file with ":set opt=xx", edit it, parse it as ex
    commands.
-   ":set -w all": list one option per line.
-   Amiga: test for 'w' flag when reading a file.
-   :table command (Webb)
-   Add new operator: clear, make area white (replace with spaces): "g ".
-   Make it possible for a user to define a new operator.  Implementation with
    internal scripting language or Perl?
-   Add command to ":read" a file at a certain column (blockwise read?).
-   Add sort of replace mode where case is taken from the old text (Goldfarb).
-   Allow multiple arguments for ":read", read all the files.
-   Support for tabs in specific columns: ":set tabcol=8,20,34,56" (Demirel).
-   Add 'searchdir' option: Directories to search for file name being edited
    (Demirel).
-   Modifier for the put command: Change to linewise, charwise, blockwise, etc.
-   Add commands for saving and restoring options ":set save" "set restore",
    for use in macro's and the like.
-   Keep output from listings in a window, so you can have a look at it while
    working in another window.  Put cmdline in a separate window?
-   Add possibility to put output of ex commands in a buffer or file, e.g. for
    ":set all".  ":r :set all"?
-   'edit' option: When off changing the buffer is not possible (Really
    read-only mode).
-   When the 'equalalways' option is set, creating a new window should not
    result in windows to become bigger.  Deleting a window should not result in
    a window to become smaller (Webb).
-   When resizing the whole Vim window, the windows inside should be resized
    proportionally (Webb).
-   Include options directly in option table, no indirect pointers.  Use
    mkopttab to make option table?
-   When doing ":w dir", where "dir" is a directory name, write the current
    file into that directory, with the current file name (without the path)?
-   Support for 'dictionary's that are sorted, makes access a lot faster
    (Haritsis).
-   Add "^Vrx" on the command line, replace with contents of register x.  Used
    instead of CTRL-R to make repeating possible. (Marinichev)
-   Add "^Vb" on the command line, replace with word before or under the
    cursor?
-   Option to make a .swp file only when a change is made (Templeton).
-   Support mapping for replace mode and "r" command (Vi doesn't do this)?
5   Add 'ignorefilecase' option: Ignore case when expanding file names.
    ":e ma<Tab>" would also find "Makefile" on Unix.
8   Sorting of filenames for completion is wrong on systems that ignore
    case of filenames.  Add 'ignorefncase' option.  When set, case in
    filenames is ignored for sorting them. Patch by Mike Williams:
    ~/vim/patches/ignorefncase.  Also change what matches?  Or use another
    option name.
8   Should be able to compile Vim in another directory, with $(srcdir) set to
    where the sources are. Add $(srcdir) in the Makefile in a lot of places.
    (Netherton)
6   Make it configurable when "J" inserts a space or not.  Should not add a
    space after "(", for example.
5   When inserting spaces after the end-of-line for 'virtualedit', use tabs
    when the user wants this (e.g., add a "tab" field to 'virtualedit').
    (Servatius Brandt)


From Elvis:
-   Use "instman.sh" to install manpages?
-   Add ":alias" command.
-   fontchanges recognized "\\fB" etc.
-   Search patterns:
      \@	match word under cursor.
    but do:
      \@w	match the word under the cursor?
      \@W	match the WORD under the cursor?
8   ":window" command:
    :win +	next window (up)
    :win ++	idem, wrapping
    :win -	previous window (down)
    :win --	idem, wrapping
    :win nr	to window number "nr"
    :win name	to window editing buffer "name"
7   ":cc" compiles a single file (default: current one).  'ccprg'   option is
    program to use with ":cc".  Use ":compile" instead of ":cc"?


From Nvi:
-   'searchincr' option, alias for 'incsearch'?
-   'leftright' option, alias for 'nowrap'?
-   Have a look at "vi/doc/vi.chart", for Nvi specialties.
8   Add 'keytime', time in 1/10 sec for mapping timeout?
-   Add 'filec' option as an alternative for 'wildchar'.
6   Support Nvi command names as an alias:
    :bg		    :hide
    :fg	fname	    :buf fname (with 'hidden' set?)
    :dis b	    :ls
    :Edit fname	    :split fname
    :Fg fname	    :sbuf fname (with 'hidden' set?)
    :Next	    :snext (can't do this, already use :Next)
    :Previous	    :sprevious
    :Tag	    :stag


From xvi:
-   CTRL-_ : swap 8th bit of character.
-   Add egrep-like regex type, like xvi (Ned Konz) or Perl (Emmanuel Mogenet)


From vile:
-   When horizontal scrolling, use '>' for lines continuing right of a window.
-   Support putting .swp files in /tmp: Command in rc.local to move .swp files
    from /tmp to some directory before deleting files.


Far future and "big" extensions:
-   Instead of using a Makefile and autoconf, use a simple shell script to
    find the C compiler and do everything with C code.  Translate something
    like an Aap recipe and configure.in to C.  Avoids depending on Python,
    thus will work everywhere.  With batch file to find the C compiler it
    would also work on MS-Windows.
-   Make it easy to setup Vim for groups of users: novice vi users, novice
    Vim users, C programmers, xterm users, GUI users,...
-   Change layout of blocks in swap file: Text at the start, with '\n' in
    between lines (just load the file without changes, except for Mac).
    Indexes for lines are from the end of the block backwards.  It's the
    current layout mirrored.
-   Make it possible to edit a register, in a window, like a buffer.
-   Add stuff to syntax highlighting to change the text (upper-case keywords,
    set indent, define other highlighting, etc.).
-   Mode to keep C-code formatted all the time (sort of on-line indent).
-   Several top-level windows in one Vim session.  Be able to use a different
    font in each top-level window.
-   Allow editing above start and below end of buffer (flag in 'virtualedit').
-   Smart cut/paste: recognize words and adjust spaces before/after them.
-   Add open mode, use it when terminal has no cursor positioning.
-   Special "drawing mode": a line is drawn where the cursor is moved to.
    Backspace deletes along the line (from jvim).
-   Implement ":Bset", set option in all buffers.  Also ":Wset", set in all
    windows, ":Aset, set in all arguments and ":Tset", set in all files
    mentioned in the tags file.
    Add buffer/arg range, like in ":2,5B%s/..." (do we really need this???)
    Add search string: "B/*.c/%s/.."?  Or ":F/*.c/%s/.."?
-   Support for underlining (underscore-BS-char), bold (char-BS-char) and other
    standout modes switched on/off with , 'overstrike' option (Reiter).
-   Add vertical mode (Paul Jury, Demirel): "5vdw" deletes a word in five
    lines, "3vitextESC" will insert "text" in three lines, etc..
4   Recognize l, #, p as 'flags' to EX commands:
    :g/RE/#l shall print lines with line numbers and in list format.
    :g/RE/dp shall print lines that are deleted.
    POSIX: Commands where flags shall apply to all lines written: list,
    number, open, print, substitute, visual, &, z.  For other commands, flags
    shall apply to the current line after the command completes.  Examples:
    :7,10j #l Join the lines 7-10 and print the result in list
-   Allow two or more users to edit the same file at the same time.  Changes
    are reflected in each Vim immediately.  Could work with local files but
    also over the internet.  See http://www.codingmonkeys.de/subethaedit/.


vim:tw=78:sw=4:sts=4:ts=8:ft=help:norl:
vim: set fo+=n :
