Skip to content
Find file
Fetching contributors…
Cannot retrieve contributors at this time
3771 lines (2803 sloc) 166 KB
NOTE: Each bug in this file is marked with either "*", "/", or "?".
The "*" means the bug is still pending. The "/" means that I believe it has
been solved. A "?" means that I've done some work on it, and *hope* it is
solved because it seems to work better but I never really understood what
was wrong in the first place. A "?" will become a "/" if I don't receive
more reports of that bug. More than 80% of this file lists *fixed* bugs.
NOTE: Not all of these are truly bugs. This file also serves as my "to do"
list, so some items are just unimplemented features that sounded like a good
idea at one time or another.
* Add a new warpto value, "window", which moves the mouse pointer as little
as possible. Use XQueryPointer() and XTranslateCoordinates() to do the
coordinate math.
And maybe use XTranslateCoordinates() to choose the position of a
pop-up dialog too.
* Something adds buffers with names that aren't full pathnames of files.
Maybe the :make command? This is a problem because it allows multiple
buffers to be open for the same file.
* Running "elvis -Gtermcap README.html" starts with a scrambled display.
This has something to do with the rcssince alias. If I disable the
autocmd that runs rcssince, it looks okay.
It is apparently due to quirks of the guitcap->prgclose() function.
That function tries to be clever about waiting for a keystroke with
the cursor on the bottom row, which is basically what "scrambled"
means in this context. This is probably the nastiest, most complex
aspect of the termcap interface -- it uses a couple of variables
that are used in many functions, in subtle ways. Ugh. (The purpose
of all this cleverness is to allow programs to use the whole screen
instead of just one window. The portable part of Elvis doesn't know
that guitcap.c is trying to do this, so guitcap.c needs to do some
pretty bizarre things.)
Current status is that it works okay, except that if you switch to
another file, and that file has an RCS file, then Elvis will wait
for you to hit <Enter> before switching to the other file. Only
in the termcap interface.
What about vio?
* When the :gdb interface switches buffers, it doesn't always update the
window name to reflect the name of the new buffer. (This is a bug in
Elvis' buffer-switching code, not the gdb interface.)
* Something weird with, where it gives priority to "share"
directories. It isn't looking for the existence of directories correctly.
* The "html" display mode doesn't hide <style>...</style> contents.
* Is there some way I could make the persist.args flag avoid changing the
args in some cases? I'm specifically thinking of when Elvis is used as
an external editor. I don't want "~/.sylpheed/tmp/tmp.98S498DS" becoming
my default argument string.
Maybe add a -p flag to disable updates of the persistent information.
Still allow it to be loaded, just not saved. Though it might be nice
to make saving/not-saving be buffer-specific, the args list isn't
buffer-specific so that would be impractical. (Vim uses "-iNONE",
sort of.)
* In a search expression, ^X00 doesn't cause elvis to search for a NUL byte.
The regbuild() function should probably convert any NUL bytes into
\0 escape sequences. The incsearch code may need special help.
Fixed between 2.2.0 and 2.2.1
/ The "x11" interface can generate a BadMatch error for the X_SetInputFocus
request. This has been reported for both icewm and ratpoison WMs, though
in different contexts.
/ When using incremental search, probably the search expression should be
appended to history when user hits <Enter>. Even if incsearch doesn't
allow you to look back through history interactively, it should still be
saved for the benefit of persistfile.
I wanted to find a way to edit it, ideally by switching to the
non-incremental version of a search since that supports all vi
commands via a <Control-O> prefix. But that quickly became very
complex. For now, incremental searches support ^Ok and ^Oj, and
that's good enough to make the <Up> and <Down> arrow keys work.
/ Allow :source to read from filters. That would be handy for programs that
generate ex commands, such as the one used by the rcssince alias.
/ Describe the :load scripts in the Tips chapter.
/ The HTML tag <hr/> shows as "---->" instead of just "----". More generally,
it seems that some XML/HTML editors generate <tag/> instead of <tag> when
there is no closing </tag>. Elvis should handle this.
/ Many problems with the data/scripts/augz.ex script.
/ When elvis sends the gzipped text out to the gunzip filter program,
it appends a newline. There's no way around this, but it has the
side-effect of making gunzip output an "unexpected end of input"
Idea: If "partiallastline" is set, then omit the last newline
when writing to the filter. When reading back, if there is a
final newline then clean up the "partiallastline" situation
(delete the bogus newline and turn off "partiallastline").
/ After gunzipping, the display mode and other options aren't set
to reflect the file's uncompressed contents. For example, editing
a gzipped man page will leave the screen in "hex" display mode
instead of "man" display mode.
This can be solved by temporarily changing the filename option
and then running the "elvis.arf" script. The only problem:
the filename option is locked. You can change it via the
:file command, but that command produces output. Maybe extend
it so :file! (with ! suffix) produces no output?
/ Create a set of HTML buttons, loadable via ":load html".
/ The :eval command can get confused if the command that it runs also performs
any calculations. :eval should make a copy of the value returned by
calculate(), and pass the copy to exstring().
/ At the end of an alias, elvis generates an AliasEnter event instead of
an AliasLeave.
/ Backslash processing isn't quite right, in "simpler syntax" expressions.
This is a little tricky because it is used for Windows file names,
where backslashes are literal text. The best compromise I could
think of is to say \(, \), \$, and \\ are quoted characters anywhere
except that at the front of the string \\ is two literal backslashes
so that \\machine\dir\file names work.
/ The :suspend command doesn't work. "Bad command name suspend". Also,
the shortest abbreviation should be ":su" according to POSIX, but Elvis
requires ":sus".
/ After ":load since" and ":mkexrc", loading a file that has been changed
since the last RCS checkin should have the changed lines highlighted, but
they aren't always. Similarly, ":au BufRead * 1d" fails on the first file,
but works on any later files (loaded via ":e").
This is due to the rcssince alias using some commands that aren't
allowed during initialization. The initialization is actually
complete by the time BufRead events are executed, but ex.c doesn't
know that because it detects initialization phase by testing for
the existence of at least one window.
The cleanest way to fix it is to add a new "initializing" option,
which is set during initialization and and cleared when an edit
buffer is created for the first text file. ex.c should check that
instead of the existence of a window.
/ The hlobject option should allow commas between object names.
/ In Unix, dirperm() doesn't return "directory" on directories.
':calc dirperm(".")' returns "readonly".
This turned out to be due to the addition of the "dir:" pseudo-
protocol, which was created so you could use ":alias readDIR ..."
to create a directory browser. Easy to fix.
/ The "ax" text object doesn't allow tag names to contain hyphens or colons.
It should.
/ In security=safer mode, ":wq" fails even when invoked without a filename.
According to the manual, ":wq" should be allowed.
This is apparently because :wquit (and :edit and :ex) use the d_File
flag so they always get the current file name by default.
The :write command has special logic for this, but probably shouldn't.
/ The current security for ":e name" and ":sp name" is too strict -- even
"elvis -client foo.c" fails. I need to allow ":e name" from clients,
without allowing ":w" from clients. Is this yet another security level?
security=client is exactly like security=normal except that all writing
and !cmd is disabled.
There are four things that must be avoided to maintain security:
1) You shouldn't be able to run external programs.
2) You shouldn't be able to write over any arbitrary file.
3) You shouldn't be able to load any arbitrary file, modify it, and
write it.
4) You shouldn't be able to create maps or aliases which trick the
user into doing any of the above.
Items 1, 2, and 4 are pretty easy. Item 3 requires some compromise
and that's why there are two different secure modes. "safer" allows
you to load any file, and modify it, but not write it; this makes
"safer" useless for interactive work. "restricted" only allows you
to load files named on the command line, but you can modify them
and write them (back over the old version of the file, not out to
any random file).
So using "-S" to set security=safer is pointless; "-S" should set
Some of the standard scripts in data/ need to be tweaked to work
correctly with -S.
/ In "html" display mode, <li><p> looks ugly in Elvis, but many documents
use that as a way to get gaps between list items. Elvis should handle it
/ Running :mkexrc in one GUI can clobber options for another GUI. For example,
if you're running -Gtermcap and have some x11 options set, then :mkexrc will
loose the x11 options.
Just "store & ignore" options with unknown domains. The :color command
already does that, and it works well. Basically, if ":set" detects
that its args start with "gui." where "gui" is anything other than the
current user interface, then it should store the args but not do
anything else with them. For the current user interface, "gui."
should be skipped and the remainder processed normally. Most of this
logic is only needed if FEATURE_MKEXRC is defined.
/ Change the name of the termcap GUI's options from "tcap" to "termcap"
/ Some GUIs have window-specific options. Although these are in the
"guiwin" domain (regardless of the GUI's name), they should still
be stored by :mkexrc as gui.option (where "gui" is the GUI's name).
/ The default "elvis.ini" creates some maps for keypad keys, without the
"nosave" flag. This means if you run ":mkexrc" while running in an xterm,
you'll create maps which exist every time you run elvis. Must add "nosave"!
/ <Shift-Tab> doesn't work in "x11" anymore. The switch to ^S instead of
^K as the prefix character is tripping it up. Also, <S-keyname> isn't
recognized, or generated, and neither is #1s for shift-F1.
/ The shift+tab key combination returns <S-ISO_Left_Tab>, not <S-Tab>
or <ISO_Left_Tab>. Since <ISO_Left_Tab> is hard to type, Elvis
should standardize on using <S-Tab>.
/ Function key labels in #x format can't use 'c' or 's' modifiers.
/ Maps defined for function & cursor keys don't show any label.
/ :mkexrc adds a bunch of flags to :map commands with the "visual"
/ :%j only joins two lines, but :1,$j works correctly.
/ Sometimes ":%unr" doesn't remove all regions. In particular, sometimes
writing a file won't cause "unsaved" regions to become normal. Going to
the line and running ":unr" works though. This also affects the :chregion
/ The :man alias doesn't handle backslashes in the man-page correctly.
They interfere with the handling of \fX sequences. See "man groff_man".
Probably the simplest way to handle this is to change all backslashes
into some harmless control character, such as ^\. Then do the other
stuff, and then go back and convert ^\ into a "\\" pair.
/ When a command is misspelled, the error message should give the whole name,
not just the portion that had to be parsed for it to be recognized as bad.
/ When listing, I need to find a better way to distinguish between
automatically installed keys and user-defined keys. Maybe MAP_NOSAVE?
/ Make the "spellautoload" option be on by default. It is harmless unless
you use spell-checking, and in that case you almost certainly want it on.
/ The :map command needs to support a "noselect" keyword, which selects all
of the command map states except "select". Currently this is simply
"command motion" but eventually I plan to implement "operator" and maybe
others too.
/ The manual still shows ":gui icon" as the way to control elvis' icon.
It should describe the "iconimage" option.
/ The :chregion command should not change the comment, unless either a new
comment is supplied, or the old comment was identical to the old face.
In the latter case, the comment should be changed to the new face name
(which is what it does now).
Done. Also fixed a bug: The first char of the new comment was being
/ Near the end of the elvtags man-page, "Other versions of elvtags" should
read "Other versions of ctags".
The elvtags man-page is generated from the ctags man page. Apparently
the conversion rules aren't quite as smart as they should be.
/ The ":e +line file" command truly does limit the + argument to being a
line address, not a real command. That's bad!
/ Trouble entering the ^ character with a Norwegian keyboard in Windows.
/ ".IP \(bu 4" has a larger-than-expected indentation. Is this because the
indentation number has no suffix? "4n" looks okay.
/ The command ":normal cwFOO^[" doesn't work. Apparently the c operator
doesn't work in a :normal command.
This turns out to be due to the way the "c" operator is implemented
in oper(). It calls inputchange() to create the input state, but
inputchange() doesn't create unless the state stack contains only
a single vi command state. During execution of a :normal command,
there are at least 2 states (both vi command states) on the stack.
The solution: Make inputchange() be smarter about when to reuse an
existing input state.
/ When setting up a map in "x11", <b> is converted to ^K0062. Single-letter
names in brackets should always be left unchanged. In fact, if the
resulting string is a single ASCII character then the X11 name should
be ignored; as it is now, you can't even use <less> to get the < character.
(Though <lt> works.)
/ If you use ":e dirname" to edit the directory "dirname", then the links
in the generated HTML aren't interpreted as being relative to dirname.
They're treated as being relative to the current directory.
A directory's filename should end with "/". If the user gives a
name without a "/" then elvis should add one.
/ The :dict alias (after ":load dict") doesn't handle single words correctly.
/ At ex.c:1605, the third argument to calculate() should be cast to
CALCRULE, not ELVFNR. Why doesn't GCC complain about that?
/ The :put command doesn't accept a cut buffer name.
/ In a file full of blank lines, "d)" causes a core dump. So does ")".
/ Lots of little changes to the OS/2 port. This doesn't affect other ports.
/ Implement timeouts in -Gx11.
Actually, timeouts were implemented for "usertime" (and aren't needed
for "keytime"). The bug turned out to be that after a timeout, Elvis
wasn't setting the flag that made it update the screen, so the screen
would only be updated after another command or something like losing
and regaining input focus. I've fixed it so it sets the flag.
/ In visual command mode, <Esc> no longer generates a beep. This is a change.
Why was it changed? Some people need to hear that beep.
The behavior changed accidentally when I added <Esc> as a way to
cancel visible selections for vim compatibility. The selection
cancelling function should fail for <Esc> if there is no selection
/ In HTML mode, the default strings for <input type=submit> and
<input type=reset> should be "Submit" and "Reset" respectively. As it is
now, those buttons disappear unless you supply an explcit value=... string.
/ In HTTP requests, elvis should send a User-Agent: header line. Some web
sites demand this.
/ The addition of filenamerules apparently broke the handling of newlines
in the filename string. They aren't treated as name delimiters anymore.
This causes problems for things like ":n `grep -lw somesymbol *.c`"
See line 1943 of ex.c.
/ The :andale alias was using the "luxi mono" font instead of "andale mono".
(This alias is only defined for the "x11" user interface.)
/ Sometimes it would be nice if there was a way to set the application mode.
For example, the GDB interface could use it to indicate whether the program
was currently running or not.
Maybe just a simple "state" option with no preset meaning, and a
new "state" keyword in the "show" option which displays the state.
/ Implement an "elvgdb" program to act as a wrapper around the read GDB
program. Elvgdb will parse the output of GDB and send important information
to Elvis.
/ Write a set of aliases to work eith "elvgdb".
/ Extend "elvgdb" to allow Elvis to send commands to GDB. This is important
because GDB doesn't output stack information unless you ask for it.
/ Add <F11> and <F12> to tinytcap.c entries.
/ The termcap interface should allow terminfo-emulating-termcap's key codes
for shift-Fn and control-Fn keys. Assume 12 keys so the 13th function key
is really shift-F1, and the 25th function key is really control-F1.
Terminfo-emulating-termcap uses :F1=: for <F11>, :F2=: for <F12>,
and then continues through :F9=: for <F19> or <S-F7>, and then
:FA=: for <F20> or <S-F8>, and continuing on through the letters.
/ You can compute a target buffer name by giving (=expression) in the
address, but there's no easy way to compute a line number. In aliases,
it would often be nice if you could use something like =expression to
compute a line number.
Problem: How would the parser know where the line number ends and
the command begins? I'm tempted to use (expression) but that would
look too much like a buffer name.
Maybe just say =option fetches the value of the named option, and
not allow expressions? Or =(expr) for expressions?
/ It's almost impossible to combine the use of visual text selections and
the :normal command. This is important because it means you can't create
a [Bold] GUI button which does ":normal cw<b>^P</b>" to embolden text.
Created a new notation. In :gui commands, you can now use
":gui [label]" to create a button named "label" which, when pushed,
causes the square brackets and label to be sent as though typed.
You can then :map this to something useful.
/ Add a :phelp command, which is like :help except that it doesn't
split. Alternatively, add a help() function which returns the URL for
the help for a given topic; then ":alias phelp push (help("!*"))" would
achieve the same effect.
/ This is probably a good time to add the GuiEnter event.
/ Add persistent information, for storing the cursor position and maybe other
information. Add a "persistfile" option to store the filename, and a
"persist" option to control what gets stored/loaded there.
cursor Move the cursor to its previous location
change Move the cursor to the previous change; if both
"cursor" and "change" then "cursor" rules, and ''
mark is set to "change".
hours:hours If entry is more than "hours" old, then don't move
the cursor; instead, set '' to location where cursor
would have gone.
marks Restore named marks that were in file.
folds Restore folds (and unfolds)
regions Restore highlight regions.
search:lines Save regexp history and current search
ex:lines Save ex history
max:bytes Approximate size limit on persistent information
args Default filenames
/ Need a way to remove folds. This is different from merely unfolding, which
remembers the attributes of the fold. Add a :nofold command.
/ Add support for %< and #< to remove the extension from the current file name
or alternate file name, respectively. Vim has a similar feature. (This is
separate from Vim's fnamemodify() feature.)
* Aliases shouldn't change the 'alternate file' (i.e., previousfile option).
* Add a real "note" facility. Allow each note to have an icon, which is
displayed in the left margin. On text systems, a text symbol would be
displayed instead. The :note command would always use the text version.
A separate command could be used to associate icon images with names.
Use :note to associate a note with a given line, and :icon to
associate an icon image with a name. Splitting the association
like this is good for themes.
This could tie in nicely with the toolbar buttons. If I work it
right, toolbars could get icons at very little cost. The names
could correspond to the button names.
Should a single line support multiple notes? If :gdb uses notes to
mark breakpoints and the current line, then what if the current line
is a breakpoint?
Maybe notes should be accessible via '"label" and definable via
m"label" or m"label:comment". Search via '">label" (or '">" for
any symbol). Notes would be drawn on the screen at their exact
location, under the text. On non-graphic GUIs, the notes would be
revealed sort of like tags in showmarkup mode.
* The data/elvis.clr script should be able to use ":color!" (with a !) but
can't because some of the compiled-in defaults are executed after that script
is sourced, so the compiled-in defaults override ":color!".
* Idea for a trivial way to color herefiles: Use a :%s///x command to find
them, and a region to highlight them.
:color herefile black italic on white
:try %s#<<\\\?\(\S\+\)#+,/^\s*\1$/-region herefile \1#x
The elvis.syn file already supports color lines. It doesn't allow
you to run any ex commands, but maybe it should. The above line
should work perfectly well with security=safer and locked set.
* Maybe do something to control cursor motion around newlines. Vim has
an ugly 'whichwrap' option.
* In Windows, elvis.exe can accept filenames with spaces in them,
but vi.exe can't.
This sounds like a bug in the _spawnvp() system call. Should
32-bit programs even be calling _spawnvp()?
This won't be fixed in time for 2.2. If that's a problem for you,
then copy elvis.exe to vi.exe.
* Sometimes it would be nice if there was a "flat" pseudocolor that was the
average color of the background pixmap, after tinting. Elvis already knows
this color; it is used to find the best contrasting foreground color.
* When you give a command like ":dis s c++", elvis stores exactly that as
the value of the display option. This can confuse x11's toolbar buttons.
The [Syntax] button will not be drawn pushed it, because it expects "syntax".
* See Luigi Mastrangelo's mail for some WinElvis bugs.
* If :make encounters a large number of errors, then WinElvis can get stuck
in an infinite loop. This didn't happen in 2.1_4.
* "WinElvis test*" will, if there is no file with the prefix "test", display
an alias on the last line.
I tried to reproduce this one. For me, it's working correctly.
I've cleaned up the wildcard matching code a lot since 2.2i (which
he's using), so maybe that explains it. I hope so.
* How about a gM operator command which stores the endpoints of the affected
area and its paste-type, and a gA command which recalls that region as a
visual selection (char or line style, as appropriate).
Vim always remembers visual selections, and can use gv to recall them.
But I want to support motion commands too, such as gM} to select text
to the end of the current paragraph. I believe this will be more
useful in maps.
* If there was periodic autocmd event, then Elvis could use it to detect
changes in files by other external programs, and reload the file. This
would be handy for a "more" program.
* I'm not sure, but I think that if you request the same URL with different
parameters, elvis just uses the same copy every time. The resource name
is the same either way so they'd both be stored in the same buffer, and
that's probably the cause of the problem.
This isn't likely to be a problem very often since Elvis' forms are
only cosmetic, not functional. But it is possible to embed parameters
in a link, and that's what triggers this problem.
But there are other types of URLs which shouldn't be cached.
Ideally Elvis should look at the reply header to detect these, and
... maybe set a "nocacheable" option?
* Alias debugger would be nice -- maybe ":break alias foo" to stop at the
:foo alias. Note that :break already parses prefixes used by :map, so
this would just need another prefix. Plus code to make the prefix actually
do something, of course.
* For "inputtab=identifier", the normal tag search doesn't look for tags
in elvispath, so it doesn't find library functions. Is that a good thing
or a bad thing?
* MAYBE support "or color" for backgrounds. Try to minimize the contrast with
the normal background, instead of maximizing it, so the foreground colors
still look good. The "or color" backgrounds don't need to support images.
* In "man" mode, when markups are displayed the ^J is shown with a black ^
and a highlighted (as "markup") J.
* Implement vim's "startofline" option.
* The showmatch option currently doesn't use matchchars. Should it?
Actually, it does use it to determine whether XML tag pairs should
be highlighted by showmatch, but that's all.
* In "man" display mode, the .TS and .TE commands should not cause a blank
line to be output. If the user wants blank lines around a table, then
he/she should add .PP commands before .TS and after .TE.
Actually, there seems to be a bug in the way multiple line breaks
are handled. .TS and .TE try to do just a line break, but if you
use any macro that does a line break at the start of a line, then
you get a blank line. Elvis *should* ignore the line break request
since the line has already been broken.
* The following doesn't look right in "html" display mode:
<input type=submit value="Next day-->">
* Add commands for storing/retrieving a count argument. This would be useful
in maps. For example, 33#! could store 33 in a register somewhere, and
later #? could retrieve it for use by another command.
##, #+ Add value to number
#- Subtract value from number
#* Multiply number by value
#/ Divide number by value
#= Set number to value
#< If number is greater than value, then set to value
#> If number is less than value, then set to value
#! Set internal option to value
#? Retrieve internal option, use as count for next cmd.
Alternatively, #a could store the value in cut buffer a, and then
@a would naturally retrieve the value.
/ The tag stack doesn't seem to work right for user-defined protocols.
Directories (the "readDIR" alias) fail completely when you hit ^T, and
others such as readDICT move the cursor to the wrong place.
* Name completion for aliases isn't perfect. If an alias has the same name
as a built-in command, then Elvis counts both versions as being different
possible completions.
* Move source into a src/ subdirectory. This includes just about everything
except data/, doc/, README.html, COPYING, INSTALL, HISTORY, and parts of
configure and
* The "e2" script would also need to be changed.
* In URLs passed on the command line, anchors aren't handled correctly.
Try "elvis 'README.html#2.2i'". The same is also true of URLs passed to
an ex command that expects a file name, such as ":e README.html#2.2i".
There's a difference between URLs and filenames. When elvis knows
it is processing a URL it can be very smart about it. But when given
a local file name which happens to contain "#" how can elvis know if
the "#" is part of the name, or an anchor? And if it is an anchor,
how can the generalized file loading code remember that it is supposed
to search for that anchor?
When following a link from another HTML file, URLs are handled like
tags. This won't work for URLs given on the command line, though,
because there's no source document for the URL to be relative to,
and also because the tags aren't going to be processed in "html"
* Add support for vim-style jump lists.
Jump lists are like the `` command, except that it maintains a history
of jump locations. Vim uses ^O to move backward through the jump list
and <Tab> to move forward. ^O is deliberately ignored in elvis because
<Alt>+key and ":map visual" can both insert superfluous ^O keys before
vi command keys. The <Tab> key is used for moving to the next
hypertext link in "html" mode, or for folding/unfolding text in
"normal" and "syntax" modes.
So elvis should use `+ to move forward and `- to move backward.
Users who want vim's keys can map them.
* Should Undo turn off the "modified" flag, if it reverts to the most recently
saved version?
This would be another attribute in each buffer's Undo list. Whenever
an undo/redo version is added with "modified" off, any other options
with "modified" off should be changed to show "modified" as being on.
(Or better: whenever the "modified" option is turned off, all undo/redo
versions should have their "modified" flag turned on.)
It seems like the "edited" flag should come into play here too.
* Elvis' CHAR data type may clash with some standard ones.
* Add a help: protocol (readHELP alias) which looks up terms via :help.
This way, the README.html file can have links into the manual.
Tricky! Too tricky for 2.2 at this late date.
* In syntax coloring mode, how about adding a text object for comments?
* For some users, the smartargs option is extremely slow and doesn't find
the function's arguments anyway. This has to be due to some quirk in
the user's configuration, but what?
An unsorted "tags" file? This could be in the current directory,
or any file or directory named in the "tags" or "elvispath" options.
Or maybe it is sorted differently. The "tags" file should always
be sorted by the characters' ordinal values, regardless of the locale.
Some versions of Exuberant Ctags use locale-specific sorting.
See messages from Merijn Brand
Would it be worth implementing the search code in elvis itself,
instead of invoking ref, just for the sake of removing ref & bash
from the scenario?
* Add a "rulerformat" option to control the appearance of the ruler.
Vim has a "rulerformat" option with a very weird syntax. I would
prefer to use "simpler syntax" expressions.
$1 current line number
$2 current column number
$3 offset from the beginning of the file
$4 offset from the beginning of the line
$5 the record/modify flag
$6 the decimal code for the character under the cursor
$7 the "list" version of the character under the cursor
So the default format is equivalent to "$1($5?$5:",")$2".
? simoN reports that he gets intermittant "file's timestamp has changed"
messages for no apparent reason.
? Sometimes "x11" doesn't refresh windows in response to an Expose event.
* If a visual selection is in effect and you use : to enter an ex command,
then non-visual maps don't work while entering the ex command. That's
wrong. This turned up as consequence of ":map! ^H ^OX" which should make
the backspace key erase text immediately. That mapping also has other
problems -- it can't delete the first character in a line, for example.
* The :gui commands should be saved by :mkexrc. Also, :gui! should make
changes which aren't saved; the standard initialization scripts should
use that.
* MAYBE add vim's glob(), globpath(), and expand() functions. fnamemodify()
* Add a function to search for tags. Its parameter string should be the
same as the args of the :tag command. It should return the tag as a
comma-delimited list of name:attribute pairs; if there's more than one
match then it should return a \n-delimited list.
:"List the structs which have a "next" field
:let t=tag("next")
:for i = 1 .. t["\n",0]
:do calc t["\n",i].struct
* Make the default array delimiter be '\n' if the string contains at least
one '\n', or whitespace otherwise. This will affect the :for command as
well as arrays. This will be handy when glob() is implemented.
How does this relate to the idea of using {} to delimit nested
arrays? I guess I'd need to do the {} test before the \n test.
One complication on the {} idea: The ex parser doesn't store the
{ itself in the command, or the closing } either. It does store
the newline after the { though. Maybe the parser could treat a
newline as an opening quote for a string that extends to the end
of the expression.
* Make the % operator concatenate strings with a newline between them.
This will also allow you to say a[%,0] instead of a["\n",0].
* In elvis.syn, the "config.sys" entry reveals a problem: If a language
has "ignorecase", and its keywords aren't given in lowercase, then
elvis can dump core.
I worked around this by changing those keywords to lowercase,
but I'm not satisfied with that. Elvis should never dump core.
* For the sake of vim compatibility, the X11 PRIMARY selection should be
named "* instead of "^. Also, it would be nice if "+ could be used to
access the X11 CLIPBOARD selection.
* Allow the @ command to accept a count. E.g., 42@x should run the
contents of cut buffer x, 42 times.
* Find a better way for :map to distinguish predefined maps from those that
should be saved by :mkexrc. Currently, it omits any maps for keys that
have a label, which isn't quite right.
* In Windows, the text-mode elvis doesn't switch screens anymore.
This may only be in WindowsNT/2K. There are some differences between
consoles in WinNT/2K and Win95/98/ME/XP.
* Allow the search commands to accept a count. E.g., 5/foo^M should
search forward for the fifth foo.
* There are some quirks in incremental searching. For example, the
word completion macros don't work with incrementalsearch set.
* Add an "UnknownCommand" autocmd event. It should be automatically
invoked if an unrecognized ex command name is given. After the autocmd
completes, elvis should check again to see if a new alias has been
defined with that name, and if so then no error is reported. This
will allow elvis to automatically load aliases as they're needed.
* Implement vim's "scrolloff" option. It would be handy in the ("Eel) buffer.
In vim this is a global option, but I'd like to make it a window option
instead. Also implement "sidescrolloff".
* Just a thought: If there was a "hidden" text attribute, then it could be
used in man pages for text between .de and .., so macro definitions wouldn't
be displayed. Also, <script>...</script> and <style>...</style> could
be hidden.
* If no normal background has been specified, or the background is set to
"transparent", then changing the "background" option should cause a
BgChanged event. It should also re-evaluate all colors to possibly
choose a different foreground.
* For smartargs, would it be possible to make the ',' character be overtyped
only by another ','? And maybe make any typed ',' delete text up to the
next ',' in the doomed text. That would be nice, because then as users
type arguments, one typed argument will replace one smartargs hint.
Modify syntax descriptions to store multiple function characters.
For example, the line "function (,)" would tell elvis that '(' starts
a function's args, ',' separates args, and ')' ends args. If only
two characters are given, assume the arg delimiter is space. If
only one is given, then don't treat any characters specially.
* Modelines set a buffer's options okay, but can't set the window's options
as part of a :sp command because that window hasn't been created yet.
* It would be nice if ex/xbuf.ex could leave the other toolbar buttons
unchanged. Maybe allow multiple toolbars?
I also want to support menu bars, and maybe a right-click menu.
Maybe elvis should support generic widgets which can have an
associated ex command (optionally with a form), and/or a list
of other widgets to be displayed as menu items or toolbar buttons.
The only difference between a menubar and toolbar would be their
appearance -- the menu bar doesn't show icons.
Widgets wouldn't necessarily be displayed anywhere. You could
define a large number of widgets that people *might* want to use,
and then choose which ones serve as menu bars or tool bars, and
which ones appear as menu items or toolbar buttons in those.
New options would list the top-level menues, toolbars, and a
right-click menu; some of those options could be buffer-dependent.
Each widget should have the following attributes:
* Label - the string used to identify it in elvis' config files.
* Short - a text description of the item used in menus or button
labels. This defaults to the same as the label, with
"_" changed to " ".
* Long - a text description, displayed on the status line and in
the dialog (if there is a dialog). The default is the
same as Short.
* Sensitive - an expression which is TRUE if the widget can be
clicked. The default is TRUE.
* Chosen - an expression which is TRUE if the widget should be
shown as being chosen (i.e., a pushed-in button, or a
checked menu item). The default is FALSE.
* Command - an ex command line to execute when clicked.
* Dialog - A description of the dialog window to be created when
the widget is clicked. If the widget also has a Command
then the Command is only executed when the Dialog's
[Okay] or [Apply] button is clicked.
* Menu - a list of widget labels, specifying the contents of a
window to pop-up when the widget is clicked. If there
is also a Dialog and/or Command for this widget, then
Dialog/Command is used for short clicks, and the Menu is
used for longer clicks (or right-clicks).
* Icon - a small image to use in toolbar buttons. There is no
default; the widget's short name is displayed instead.
* Implement the "redraw" option?
* If a URL contains percent signs or hash marks, it is hard to enter because
elvis wants to replace those characters with the name of the current and
alternate files, respectively. At least, this is true with user-defined
* Make the ex/info.ex script use the "dir" page.
See ex/info2.ex
* Traditionally, "-" has been a synonym for the "-s" flag, for running scripts.
This is still part of POSIX, though is marked as being "obsolete" there.
To make "-" be treated as a file name, you must give "--" before it, as in
"elvis -- -". Can I make elvis smarter about that?
Maybe I could make "-" act like "-s" when stdin is a file, and read
text from stdin otherwise? Users could still use an explicit
"-- -" to force the read-text behavior, or "-s" to force the script
Sadly, there is no 100% portable way to detect whether stdin is a
file or not. The test would have to be done in an OS-dependent way.
The isatty() function tests for character devices, not files. The
fstat() function uses funky names in Windows, and might not always
work on non-files.
* Implement support for vim's CursorHold event. (This occurs when the
user doesn't cause any input events for a configurable amount of time,
under control of the "updatetime" option, expressed in milliseconds.)
* htmltagatcursor() is still too slow in some contexts.
* For the sake of speed, dmmuadjust should probably not do any adjusting
until the buffer is displayed. That way, if there are *MANY* changes,
we only need to adjust the display list once.
Idea: Only regenerate when needed -- which mostly means while drawing
a window. For each window, keep track of the last offset that has
been generated. If a buffer is modified before that point, then
reduce the window's offset to the changed point, and discard any
saved formatting information after that. When regenerating a window,
start at the last saved point before-or-at the top of the screen,
and work forward until the window is filled, saving points as they're
This should be at least as fast as the current method -- probably
much faster. More reliable too.
The save points could either be the start of every line (which would
make the points be dependent on the width of the window) or some
specific tags which mostly force a new line to start (which would
*NOT* depend on a window's attributes). The "every line" method
sounds simpler, but I'll need to remember to clobber all of the
saved info if the display mode changes, or the width changes.
Important comment:
/* Start on the line BEFORE the one where changes begin.
* This is because if we insert a small word at the front of
* a line, it might fit at the end of the preceding line.
* The "syntax sh" display mode doesn't highlight very well. I
think this is because dmsyntax.c:setup() allows strings to start at the
end of a line. If a string punctuation occurs at the end of a line, it is
much more likely to be the *end* of a string.
* Make "x11" support a real bold+italic font.
* In X11, maybe use XTranslateCoordinates() to choose position of dialog window.
* Add a urlencode() function. And maybe urldecode() too.
* Need a way to check options of other buffers. For example, it would be
nice if the toolbar in ex/xbuf.ex could test each buffer's "modified"
Maybe use the -> operator. The lhs would be a string identifying
the buffer, and the rhs would be the label of an option to fetch.
It would work by *TEMPORARILY* changing the bufoption value.
This is mostly needed only in expressions, not the lhs of a :let
command, because there you can use (bufname) to get a similar effect.
local b
let b = newbuffer()
(=b) let bufdisplay = "syntax sh"
calc b->bufdisplay
* It might be nice if the :man alias could search for the man source text,
instead of recreating it from the nroff output. Ideally, this would use
a "manpath" global option (or just use $MANPATH, I guess) and a buffer-
specific "mansection" option to store a list of sections and extensions.
The mansection option is intended to address the problem of looking up
write() in a C program -- it tends to find either the write(1) program,
or the Python equivalent of the system call.
* Add an event when marks are set/reset. This way users could...
:au MarkSet * '[,']region marked '(aufile)
:au MarkUnset * '[,']unregion marked
... to highlight the marked line. Or maybe a generic "Normal" event
which is triggered whenever a vi command is executed? See vi.c:1089,
and add a TWEAK flag to indicate which commands trigger events.
:auevent MarkSet
:au Normal m* '[,'] doau Markset
I guess this would also require the :doau command to be extended to
accept an address range. That sounds useful all by itself!
* It would be nice if there was a way to stuff data into a cut buffer. One
example: Use it to copy the current file name into the display's selection.
Vim uses @x for this... and even uses the :let command!
:let "^ = current("file")
* Add stubs files for X extensions, OpenGL, etc.
* Maybe reimplement :g to work in two passes, like the real ex/vi.
* Add a buffer option for controlling the default face. In addition to
"normal" and "idle", some candidates would be "readonly" and "web".
* The '' command (go back to previous location) doesn't seem to work as well
as it used to, especially after :s/// commands. In Vim, ":help jumplist"
says which Vim commands affect '', though I suspect that list is incomplete.
It doesn't include "gD" for example.
It would also be nice to support something like vim's jumplist,
albeit with different commands. (Vim uses ^O and ^I. I prefer
Elvis' use for those keys.) Maybe '+ to move forward through
the jumplist and '- to move backward. Maybe do something like
viminfo to remember those marks between Elvis edit sessions.
Some other useful marks: '< and '> for the ends of the current
visible selection; '. for the position where the last change was
make; [' and ]' to move to the previous/next line with a letter
* Maybe implement something like viminfo. It should store all the stuff
that :mkexrc doesn't. It should only be updated when a buffer is freed
(which should certainly occur when Elvis is exiting, and maybe before
that too). At a minimum, it should store the most recent line number.
It should ideally also store regions and folds.
This might be possible with autocmds and scripts. No changes
to elvis necessary. Check it out. I know regions could be
done this way. Folds could be trickier, since they can nest.
* An idea: Support "invalidated" buffers. Give each buffer a "valid" option.
If it is invalid, then the next time that it is accessed, a BufInvalid
event is generated, which should update the buffer. This could be used
(with a little extra magic, like a :internalsave command and :invalidate
command) to update the "Elvis custom initalization" buffer.
This is probably more trouble than it's worth. My original goal
was to provide a way to efficiently update the file-specific
information for viminfo. Then I tried to make it generic since
:mkexrc's "Elvis custom initialization" buffer works in a similar
way. But this is all low-level stuff that doesn't really correspond
to ex commands; it would be a forced fit, not a natural fit.
* Apparently "elvis -Gx11" doesn't always exit when X does -- it can get
stuck in a loop where it uses all available CPU.
Xlib normally kills the application when the connection to the server
goes down unexpectedly. Elvis will sometimes disable that behavior
during initialization -- perhaps it doesn't enable it afterward?
* Can the new "prefix" keyword thing be extended to denote comments?
And the %rX...X regular expressions in ruby? Maybe recognize the start
of a comment/regex as a prefix token, and associate a terminator string
and font with it. Maybe it could even handle preprocessor directives!
* Windows problems:
* In Options->Font, the "Font style" is ignored -- can we remove it?
? WinElvis died one time while resizing, when it tried to refresh the screen.
I haven't been able to reproduce this.
? Is there a bug in Windows reading the initialization scripts? In particular
maps that use the ^M character?
I can't reproduce this. It works correctly for me.
* Potential for some minor problems with parsing regular expressions, when
magicchar is set to something weird. Specifically, some parts of regbuild()
and gettoken() assume that '[', '^', and '$' are always in magicchar. If
they aren't, then odd (though non-fatal) things will happen.
* Add support for vim's \= in replacement text. It treats the rest of the
replacement text as an expression, evaluates it, and uses the result as
literal replacement text. E.g., :$s/^/\=current("line")/ inserts a line
number at the start of every line. Maybe use $1 - $9 for \1 - \9, but
how to handle & ?
* Some of the special characters in "man" should be graphic, but aren't.
This is somewhat improved in 2.2h, but still needs work.
* Add a "regexp" (or "magicsyntax" ?) option which has no built-in purpose
but can be used with ":autocmd OptChanged regexp ..." to automatically
adjust the syntax.
auevent RegexpChanged
au OptChanged regexp eval doau RegexpChanged (regexp)
au RegexpChanged perl set magicchar=^$.[*+?(){\| magicname magicperl
au RegexpChanged vi set magicchar=^$.[* nomagicname nomagicperl
Actually, it might make more sense to allow users to create their
own options. "regexp" could be an instance of that.
* In regular expressions, maybe allow all of the \letter combinations
have configurable meanings.
One way to do this would be via 52 magic<letter> options, with the
value of the option being substituted for any \<letter> sequence
used in a regular expression.
This could interfere with the use of \Q, \V, and \E. I should
leave those hardcoded, with \E selecting the enhanced mode that
is sensitive the the magic<letter> options.
If I'm going to do all this, then the regular expression options
should probably all be collected into a "regexp" group. There will
be a lot of them!
* In regular expressions, allow [[:startword:]] and [[:inword:]] to be used
for accessing the syntax-coloring concept of "word".
* Maybe add a way to prevent :w from saving some types of regions. This would
be handy for a visual diff -- you could show both the old and new versions
of lines mixed in the same buffer, and then save only the new text.
This could be done via a macro, but I'm worried that it'd be too easy
to accidentally bypass the macro, causing the mixture of both versions
to be written to the file.
Also, it might be nice if the "no save" lines could be hidden by
setting an option.
I wonder... would it be adequate if I simply made elvis sensitive
to the special face name "nosave"?
* When editing the source-code for man pages, there is a bug in the handling
of { and } paragraph commands, which affects the "ap" and "ip" text objects:
If the cursor is on the '.' of a .PP or .SH command, then the paragraph seems
to include the PRECEDING text instead of the CURRENT AND FOLLOWING text.
* Compatibility issue: The `m command should move the cursor back to the
same column, not the same character. I.e., it shouldn't care whether any
text has been inserted or deleted on that line before the mark. To test,
go onto a long line and type 40|mm20|10x`m -- this should leave the cursor
in column 40, but elvis moves to column 30.
* :10,20s/foo/bar/3 should change lines 20 through 22 -- i.e., 3 lines starting
at the last line in the range. Elvis ignores the count when given a range,
which is wrong.
* :g/^/j should join pairs of lines (it does in the real vi and in vim), but
instead it joins all lines together into a single line.
* The S command looses the last indentation character when autoindent is set.
Also, c_ (which is what S does) works the first time, but . doesn't, if the
new text was empty. If the new text was not empty, then . looses indent.
* When pasting rectangles at the ends of lines, elvis doesn't try to pad
the lines so the rectangle keeps its shape. Vim does.
* <img src=...> tags don't work except in HTTP: URLs?
* If multiple <img src=...> tags occur in a line, *not* as a menu, then
elvis should load the image when ^] is pressed on one of them. Instead,
it always seems to load the first image in the line. (Though I'm not 100%
sure I understand what's really happening.)
* Change the meanings of some commands when a visual selection is pending:
* s Like c (rect repeats the change for each line)
* C Change whole lines (except rect changes from left edge)
* S Change whole lines
* D Delete whole lines (except rect deletes from left edge)
* X Delete whole lines [:map select X :d^M -- but cut buffers?]
* Y Yank whole lines [:map select Y :y^M -- but cut buffers?]
* I Insert at left edge (for rect, do it to each line)
* A Append at right edge (for rect, do it to each line)
* Some useful 'g' commands that elvis doesn't support yet:
* gv reselect previously highlighted text
* ge go backward to end of previous word.
* gE go backward to end of previous WORD
* Some useful 'z' commands that elvis doesn't support yet:
* zh sidescroll leftward. If cursor forced off right edge, move it.
* zl sidescroll rightward. If cursor forced off left edge, move it.
* zs sidescroll to move cursor's column to left edge
* ze sidescroll to move cursor's column to right edge
* The :fold command seems to confuse the :g command, perhaps because :fold
changes the meaning of "line". The :unfold command is okay, though. In
particular, this means you can't do this...
:g/^{/,/^}/fold (current("tag"))
... but this works...
:g/^{/,/^}/unfold (current("tag"))
? The spell option should probably look for tags in more places. Currently
it doesn't seem to check any tags file except the current directory.
Actually, it was apparently checking only the directories listed in
the "tags" option. Perhaps it should also check "elvispath"?
If there is no "tags" file in the current directory, then it doesn't
look in other tags either. I remember this was a design decision,
to speed things up in non-source directories. I might want to make
this an option, or make it sensitive to knownsyntax(), or something.
NEWSFLASH: I think this issue is moot, since the new taglibrary
option was created.
* Extend the "ref" program to limit itself to looking at tags that are
callable from a specific source file, by checking the extensions against
the "extensions" or "foreign" set, just like tagkind/taglibrary.
* Make elvis give a higher priority to tags that are callable by the current
source file, using the same filename sensitivity.
This would be a little tricky, since the list of extensions is
currently stored in a static variable in descr.c.
* Make "tagkind" option store a separate tag/keyword dictionary for each
buffer. This will handle static tags, and also allow the keywords to be
reloaded when the "tags" file changes. (As currently implemented, tagkind
adds tags to the language's shared keyword dictionary.)
One big challenge: Currently, the list of filename extensions which
are callable by the language is stored in a static variable in descr.c
This works when the search only takes place as a language is loaded,
but if we need to reload later, then we'll need to store that list
somewhere -- probably attached to the language description in descr.c
* When lpcolumns!=columns, printing will often use the wrong font attributes
when printing text in a markup display mode. Apparently the array of
line attributes is tripping it up. NEWSFLASH: It can cause core dumps too.
Try setting lpcolumns=300, for example. This is especially true when using
antialiased fonts in "x11".
This should go away with the new markup code (when written).
Until then, just be sure to ":let lpcolumns=columns" before printing.
* Maybe implement a multi-level progress bar. Search/replace commands would
use it, as would network I/O. Aliases could also use it via a ":progress
name=percent" command. The progress is reset (goes away) whenever elvis
is idle, or when the progress hits 100%. While reset, the first named
progress grabs it, and holds it until reset again.
This should probably wait until window-at-a-time idle is supported.
* hlsearch doesn't mark all matches within a markup display mode. Its
behavior is very consistent, in that it fails to highlight the same
instances each time.
This would be hard to fix -- probably not worth the effort at this
time. The ideal solution would involve modifying regexec() to search
across line boundaries. The problem is caused by the fact that
markup display modes have a different definition of "end of line"
than the regexp matcher, so any text between a newline character
and the end of the "markup" line is unchecked.
* Giving too many "Hit <Enter> to continue" prompts.
* "spellsuffix" doesn't always work. It seems to skip looking for base words
defined via :words -- it only checks the "spelldict" dictionary. Example:
"GUI" is added via :words, and spellsuffix contains "'s", but "GUI's"
is still flagged as an error.
I believe there are two things happening here. First, it doesn't
look for the root word in the tags dictionary; this allows lowercase
"digraphs" to be flagged as an error even though "digraph" is accepted
because it is a tag. This is not a bug.
The second thing is that it looks up the root word in a case-
insensitive way (converting it to lowercase) so it doesn't find
the uppercase "GUI" when trying to check "GUI's". This is a bug...
how to fix?
? From Stephane Billiart:
There is a bug in the "configure" script -- it doesn't know that the
internet files are required even if the network protocols are not
used, with the "x11" interface. Here's a patch that fixes it for Solaris...
< why " to ensure that 'const' is ignored. Also, if X11 is to be supported then"
< why " we also need -lsocket -lnsl. A -R flag may also be added so the X11"
< why " shared libraries can be found at run time."
> why " to ensure that 'const' is ignored."
> why "For Solaris2, X11 requires -lsocket -lnsl. A -R flag may also"
> why " be added so the X11 shared libraries can be found at run time."
> elif [ X"$inet" != X ]
> then
> why "For Solaris2, any network access needs -lsocket -lnsl"
> TLIBS="$TLIBS -lsocket -lnsl"
Okay, here's my question: How could the network files be present but not
used? The "configure" script always uses HTTP and FTP if the network files
are present, so that should always cause those files to be included under
Solaris, right? Or does Solaris sometimes have the libraries but not the
header files?
FIXED BETWEEN 2.2j and the official 2.2.0 release
/ Use x11's colors as the defaults for WinElvis too.
Actually there are no defaults for XElvis either. I should probably
add a data/elvis.clr script which sets up default colors for both
graphical elvis and text-mode elvis. The ~/.elvisrc file can be a
good starting point.
/ The data/stubs/unixstub.c file seems to be very incomplete.
/ "make install" should be forgiving about the /etc/elvis directory.
If a user runs "configure --prefix=$HOME" and installs elvis as themselves
(not "root"), then "make install" shouldn't fail because it can't write to
the /etc directory.
/ The readDIR alias loads the new buffer into the old window. This causes
problems with the stack, or with :sp commands.
This is similar to the problem I had earlier with the rcssince
alias, which was run via an autocmd event. I solved that by adding
a rule that autocmd events can never switch buffers. The same
solution would probably work pretty well for protocol aliases.
/ In Windows, the standard COMMAND.COM shell does not expand wildcards,
but Cygwin's bash.exe does. Elvis shouldn't expand wildcards if they've
already been expanded.
Obviously elvis will need some way to tell the difference --
perhaps by checking for a SHELL environment variable. See the
/ Wildcard expansion is closely tied to handling of parentheses. It would
be nice if, during wildcard expansion of command-line arguments from the
shell, we could skip that stage. Maybe create a new option? Set it during
processing of the command-line args, and then turn it off before processing
the configuration scripts. This would also prevent parentheses from being
eaten in file names such as "file (2).txt".
A more general option might be nice -- one that lets you control
the aspects of filename handling in detail. Its value could be a
subset of "tilde,dollar,paren,wildcard,special,space". "special"
allows interpretation of %, #, and (if supported) <word>, as well
as the :x modifiers that can follow those symbols. "space" indicates
that commands which accept multiple names should divide the name at
any unquoted space; without that, you could only separate the names
with <tab> characters. Call the option "filenamerules".
So, for Unix/Linux, the command line args would be interpreted using
filenamerules="". For Windows arguments (without $SHELL)
filenamerules="tilde,dollar,wildcard". After that, the default is
always filenamerules="tilde,dollar,paren,wildcard,special,space" --
the full set -- but you can change it in ~/.elvisrc. Windows users
might want to take out "space".
Name completion should insert a tab after a complete name instead of
a space, if the "space" flag isn't given.
/ If the user tries to get help for an alias defined with a '!' then look
in the elvistip.html file. Otherwise just say it is an alias.
/ When told to read a directory, elvis should pretend it was told to read
using the "dir:" protocol. Users can define a readDIR alias to allow
directory browsing.
/ In X11, :mkexrc can save italicfont="". It shouldn't.
/ Elvis' BOOLEAN and data type may clash with a standard one. Change its
name, and the names of the True and False values.
/ Elvis' ctype macros clash with the standard ones. This is a problem in
some GUIs because they use headers which #include <ctype.h>. Change the
names of elvis' ctype macros.
/ In "x11", <Shift-Insert> adds ^Sff63. Is this a general problem?
<Ctrl-V><Shift-Arrow> starts marking in addition to sending ^Sff51.
(It is normal for <Shift-Arrow> to start marking text.) Probably
<Shift-Arrow> shouldn't send anything. Even weirder: It starts
marking in the main buffer even if you type <Ctrl-V><Shift-Arrow>
in an ex command line.
/ Use <key> notation for maps in elvis.ini, and :mkexrc. Not only is this
more readable, but it also avoids fileeol() confusion when reading maps
that end with ^M.
/ I think the region bug may not be completely fixed. The "since.ex"
script eventually causes problems, sometimes, when it tries to add a
region for the current line when the line is changed.
I think this is related to "undo", which can move marks.
It could leave regions unsorted.
To reproduce it: Make the second paragraph if this file be a
region. Delete the its last line. Hit <Undo>. Hit <Shift-O>
to insert a line above the last line. Wham!
/ With "matchchar=ax showmatch", an empty tag pair does not get highlighted
because the ix object would have zero length.
A general solution for this might not be possible. If matchchar=ab
then typing {} won't cause the { to be highlighted either, for the
same reason. Is it worth implementing a special case just for ax?
/ Draw the screen-filling '~' lines in the "nontext" face.
/ In doc/elvistip.html, the old "spelltags" option is mentioned. Update
description there to say what elvis really uses now ("spell").
/ The :autocmd system's DisplayEnter and DisplayLeave events are quirky.
If you use DisplayEnter to adjust the "list" option for various display
modes, then sometimes the screen is refreshed before the option is
changed, so the screen is wrong until you hit a key.
The audisplay() function detects this type of change. As
currently implemented, the DisplayEnter/DisplayLeave events
are oriented toward adjusting maps in a display-dependent way,
so audisplay() is called before processing keystrokes, and
detects global changes to the display mode, not changes to a
specific window. This is useful, but doesn't work well for
adjusting options that affect the way text is displayed.
/ Rename the current DisplayEnter and DisplayLeave to DispMapEnter
and DispMapLeave. Also rename the audisplay() function that is
used to trigger it.
/ Create new DisplayEnter and DisplayLeave events that are triggered
when a window's display mode changes. The DisplayEnter event
should also be triggered when the window is first created. Basically
this should be triggered when win.display is changed.
/ Extend the listchars option to support a "markup" flag which allows
"list" to display markups. The presense of "markup" indicates that
markups should be listed; its absence indicates that markups should
be hidden by "list".
/ Making :s always succeed in a :g turns out to have been a bad idea.
Some scripts and aliases, such as :makehtml, depend on errors from
:s when there is no match. I should implement vim's "e" flag.
/ Need a good way to display sets. Write a :wrapset alias to do that.
/ Modify name subscripts to support sets. and L["name"] should
return "True" if L contains name without a value; else it should return
the value. For missing names it should return "", which is a false value.
When assigning to, always store name:value, never just name.
If the option contains the name without a value, then the name should
be deleted from the value.
/ Add set operators that act on comma-delimited lists of names.
L & R Return the names that appear in both sets. If values are
preset, then keep the value from R.
L | R For each name in b, add it to a if it isn't already in a.
If values are present, then keep the value from R.
When adding values, try to insert them to keep the a sorted.
L ^ R Remove items from a if they appear in R. (Can't use L&~R
because there is no way to implement ~R. Can't use L-R
because we need ""-R as a way to handle negation.)
/ How about adding support for ":let <option> <operator>= <expr>" be
interpreted as ":let <option> = <option> <operator> (<expr>)" ?
/ In :autocmd, the file pattern field can't be a comma-delimited list of
patterns anymore. I think I broke this when I modified it to use the
more versatile OS-specific wildcard functions.
/ Allow dirperm() to return DIR_DIRECTORY for directories. This should go
between DIR_NOTFILE and DIR_NEW.
/ With ":set list listchars=trail:_", the trailing space thing looks
really distracting while you're entering text. If the cursor is
located in the trailing space or at the end of the line, then the
spaces before the cursor should not be highlighted.
/ Now that "html" hides comments better, it can't handle <!DOCTYPE>.
It mistakes the <! for the start of a comment, which extends to the
end of the file if there is no ->.
/ In WinElvis, f[/,2...] doesn't strip off the leading \ character as it
should. As a simpler case, ":calc /" returns "/" in Linux, but "" in
Windows. I think this is a bug in dirpath().
/ There's another bug in WinElvis which is triggered by ":e theme:".
Something is converting the forward slashes into backslashes, which is
The backslash conversion is being done by dirnormalize() and
dirpath(). Unfortunately, external commands MUST use backslashes
and protocols MUST use forward slashes. Elvis' built-in file
operations can use either style.
If I try to make dirnormalize() and dirpath() be smart about when
to use slashes or backslashes, I'm going to run into problems.
In scripts, if nowhere else. The readTHEME alias, for example,
modifies the resource name, which doesn't look like a URL so it
could easily be converted to use backslashes, accidentally.
Probably URLs should accept either normal slashes or backslashes,
by converting backslashes to slashes at a very low level. The
dirXXX() functions should recognize either type of slash, and output
/ The readTHEME alias doesn't work because dirperm() and related functions
don't recognize a leading ~.
I modified the alias to explicitly convert a leading ~ into the
value of the home option.
/ Add an option to make <backspace> get rid of backspaced-over text.
I did. It is named "cleantext", and allows a large degree of control
over when elvis erases old text.
/ Is it time to add a substitution (or general ex command) function?
For a PERL-like syntax, using "=~" instead of just "=" with a :let
command should perform the ex command. So we could replace a leading
~ with the user's home directory like this:
local magicname
let a = elvispath[:,1]
let a =~ s/^~/${home}/
Note that applying an ex command to a value is a separate step,
not part of the normal expression. I'm not sure I like that, but
it doesn't seem to have held Perl back.
Fixed in 2.2j-beta:
/ In "x11", if you have two windows, with one iconified, and you close the
non-iconified one, then elvis dies with an X11 error: BadDrawable for an
XCopyArea call while trying to change the cursor in the iconified window.
/ In the "Tips" chapter, the URL for vile is out of date.
/ Clean up data/elvis.rc -- in particular the "maroon" thing.
/ is no longer mirroring The README.html
file shouldn't mention it.
/ Implement text objects for XML: ax/ix.
/ Make "showmatch" match up XML tags.
/ Weirdness: If you edit a file with [a-z] at the end of the name, then one
character is often highlighted until you make the first change to the file.
Starting a visible selection also makes it go a way; canceling the selection
makes it come back. This doesn't seem to happen when you give the whole name
without [a-z], or use [a-z] elsewhere in the name.
This seems to happen only when showmatch is enabled. I think elvis
is computing offset of the [ that matches the ], and storing its
highlight offset for the window.
/ ":themes" with no argument can't list themes in Windows.
It's probably because shell("echo *.ex") doesn't expand filenames
in Windows. The quickest solution would be to make "for i in *.ex"
smart enough to treat each match as a separate value, instead of
evaluating an expression.
/ If a filename pattern ends with [a-z] then there is no NUL character to
mark the end of it, so garbage is appended to the end of the name. This
happens under both Windows and Linux.
This turned out to be a bug in the expression evaluator, not the
wildcard matcher. In calc.c, the simpler syntax version of ']'
wasn't being handled correctly.
/ Support Vim's <key> notation in maps. (But not in the :normal command?)
This is now mostly implemented. the GUI-specific key name translation
need more work.
/ Increase the whitespace around printouts when lptype=ps.
/ Extend matchchars to support text objects. For example, if matchchars
contains "ax" then % should bounce between the endpoints of an XML tag pair.
First, handle the #if/#else/#endif case. This doesn't use matchchars.
Then, prescan the matchchars value, looking for any text objects.
If any are found, find their endpoints by calling vitextobj().
Remember the one that has an end point with the lowest offset.
Collect the non-textobject pairs in a different string.
Then scan forward for a matchchar, as usual. The only difference
is that if our scan reaches the end of the text object without
finding a matchchar, then we'll use the object instead.
When using an object, the cursor should move to start point,
unless it was already at the start point in which case it should
move to the character before the endpoint.
/ Replace lppaper with a more general lpoptions option. Its value is a
comma-delimited list of name:value pairs. For lptype=ps and lptype=ps2
(the only lptypes that use lppaper), the values are used to insert some
definitions into the PostScript output. Perhaps other drivers can benefit
from it too.
/ Add a generic option to both "buf" and "win". Describe how to use
subscripts and field names, as a cheap way to store extra buffer-specific
and window-specific options. Maybe use "b" and "w"? Or "B" and "W"?
Or "bb" and "ww"?
/ Mark the "initialstate" option as having no default, so it won't be saved
by :mkexrc.
/ The "html" display mode should do a better job of parsing comments. HTML
comments are often used to temporarily hide text which may include other
HTML tags.
This is now improved in "html" mode, but not "syntax html" mode.
/ Sometimes the :sp command loads the new file into both the new window
and the old one. The old window's previous buffer is hidden but not
destroyed; you can use the :buffer command to switch that window back
to the original buffer.
This is known to happen when the "rcssince" alias is run automatically
via ":au BufReadPost * rcssince". Maybe not always, though. I can't
see anything in the rcssince alias that would change buffers. Maybe
it is some other autocmd command?
Specifically, if you split to a file that has an RCS "*,v" file,
but hasn't been modified since its last checkin, then the rcssince
alias will execute an empty list of :region commands. An empty
list is treated like a :goto command to the current buffer and line.
But the current buffer is the new buffer, in the old window, and
that's where the problems happen.
New rule: autocmd commands can never switch buffers.
/ Regions can cause core dumps. Either a region struct with bogus data is
added somehow, or a good region struct is overwritten with garbage.
I have also seen instances where regions near the end of the file
are freed or truncated when they shouldn't be. Maybe the bogus
region struct is really one whose struct has been freed but not
removed from the struct list?
Fixed! There were some problems in :chregion, but I think the
biggie was in an argumentless :region command which could overrun
an output buffer, clobbering the "r" variable that it used for
/ Sometimes elvis fails to find tags, even though the tags clearly are in
the "tags" file. Try searching for colorfind() from within region.c.
This turned out to be a bug in the dmsyntax.c:tagatcursor() function.
/ Allow hllayers to be set to higher values. Note that it already is smart
enough to recycle the "hllayers<n>" fonts.
/ Improve wildcard matching in :au commands. Move the wildcard matcher into
os*/osprg.c, so it can be OS-specific. Note that the unix version already
contains a wildcard matcher.
/ The [] wildcard matcher is slightly improved. It now supports negation
and ranges. For example, [^0-9] matches anything but a digit.
/ This also allows Windows to support the [] wildcard.
/ Make name completion work for aliases.
/ Add and win.ww options. These should be generic string options
with no hardcoded meaning. Users can pack multiple values into them
using named subscripts.
/ Modify the named subscript notation to use a comma-delimited list of
name:value pairs instead of a space-delimited list of of name=value pairs.
This will make elvis' named subscript notation work well with vim-style
multivalued options such as listchars.
/ When assigning a value via a named subscript, if the value doesn't exist
then append it using a comma separator.
/ Add vim's listchars option. This affects the appearance of both the "list"
and "wrap" options.
/ The exists(filename) function assumes that any filename with a protocol
already exists. This confuses the rcssince alias.
/ The "inputtab=identifier" feature (for tag name completion while editing
source code) doesn't seem to work.
This appears to have something to do with storing the names of
library functions and tags as pseudo keywords, for the sake of
highlighting. Anyway, the dictionary seems to contain a lot of
words that it shouldn't, and that's a problem.
I fixed something extremely similar between revisions 2.91 and 2.92
of dmsyntax.c. This is what made me add the ISKEYWORD flag. This
fix affected smartargs, not inputtab=identifier.
/ Patch "configure" for NetBSD. See message from Peter Bex.
/ Remove the :safer command. It can be emulated via ":safely source".
Add an alias to do that, to maintain backward compatibility.
/ Replace "safer" and "safest" with a single "security" option which
can be set to multiple levels: normal, safer, restricted.
/ Split the "lib" directory into two separate directories: "doc" for
documentation including the help files, and "data" for other runtime
support files.
/ Move the files and delete "lib".
/ Edit "configure" to support --docdir=DIR, and to make the default
elvispath include both the datadir and the docdir, and also /etc/elvis.
/ Edit "" to look for doc and data files in the appropriate
directories, and to install them into the right directories. Also,
"make install" should create /etc/elvis if it doesn't exist already.
/ Edit as necessary. In the RPM worldview, online help
files are like data files, so "doc" is merely a subdirectory of "data",
which limits the changes. Also add /etc/elvis to the list of files
owned by elvis.
/ Modify the "e2" script to set ELVISPATH=data:doc instead of just lib.
/ Update the manual
This is basically done, except that the RPM package should ideally
install the contents of the doc/ directory into RPM's standard
location for documentation, and the default ELVISPATH should be
adjusted accordingly. How can I do that?
/ Rename data/ex to data/scripts. I considered renaming the :load alias to
:runtime, but decided against it since it really isn't like vim's :runtime.
/ Clean up the icons.
/ Move the XPM icons from guix11/ to data/icons.
/ Remove the "" script.
/ Make Xelvis search for icons in data/icons.
/ Create an "iconimage" option for specifying the option image, instead of
":gui icon filename". This is because options are stored by :mkexrc
but :gui commands aren't.
/ Make WinElvis support XPM icons too, via the "iconimage" option.
/ For the Windows and OS/2 binary distributions, convert the XPM icons
to ICO format.
/ Convert the "Gray Presley" Windows icon to an XPM file. Don't compile it
into WinElvis anymore. Remove instructions for switching between icons.
/ Using "-c'1d|wq'" doesn't exit until you hit a keystroke.
Most of the user interfaces are pretty dumb about "quit" commands
during initialization. They should be smarter. The problem is
that "quit" commands don't really quit the editor -- they merely
close the window. This shouldn't be an insurmountable problem,
though, since the "-c" commands are executed after the window has
been created.
/ The "lpcontrast" option doesn't affect ptype=html or ptype=ansi output.
This is a good thing since elvis doesn't know what the background color
will be, but the manual should explain this.
/ The > operator and :> command should not affect preprocessor lines.
/ In syntax display mode, strings should have a configurable quote character.
It isn't always backslash! Some don't have one at all.
/ Make syntax description lookups be less case-sensitive. They should first
look for a case-sensitive match, and if that fails then try converting the
filename to lowercase and repeating the search. This way, "extension .sys"
would work for the CONFIG.SYS file.
This turned out to be trickier than I expected, because elvis stores
previously used descriptions in a cache. (The cache allows you to
bounce between two C source files without reloading the C syntax
each time.) If this was case insensitive then the c syntax would
be reused for ".C" files, which are really c++ source code.
Also, reading the file twice would have been difficult, so I
simply read it once, and arranged for the c++ entry to appear
before the c entry, so ".C" will always use the C++ syntax.
All extensions in the elvis.syn file should now be lowercase,
unless an uppercase version is intended to be different from the
lowercase version (as with .c for c source and .C for c++ source);
in that situation, the extension should be given in uppercase form
and its language should be described before any language with a
lowercase version of the same extension.
/ If the spell option is off but the show option contains "spell", then
the statusline just shows "?" for any tagged word in source files.
The manual should warn people about this.
/ Implement a "scrollbgimage" option, which allows the background image to
scroll in XElvis and WinElvis.
/ Move the "BUGS" file into doc/bugs.txt. Check for any reference to "BUGS"
in the manual or README.html.
/ Change the user-specific config directory from "~/.elvislib/" to "~/.elvis/".
/ Edit the "configure" script.
/ Edit the Win32, MSDOS, and OS/2 osconfig.h files to use "dotelvis" instead
of "elvislib".
/ Edit the aliases in data/elvis.ali and data/ex/* to use the new directory.
/ Update the manual.
/ Modify the :mktheme alias to store the scrollbgimage option.
/ When recognizing HTML documents, elvis should allow whitespace before the
"<". This is easy for spaces and tabs, but could be a problem for newlines.
/ The :display command should strip trailing whitespace. The way it is now,
elvis -c 'dis s email | se bd="syntax email"' doesn't work because of the
space before the '|'.
/ Add a "safest" option. Just plain "safer" is good for protecting against
malicious writing by a Trojan horse, but not against malicious reading by a
hacker. On the command line, -SS should set both options. If both "safer"
and "safest" are set, then...
/ The :read, :source, :safer, commands should fail
/ The :errlist and :wordfile commands should refuse a filename argument.
/ Filename completion should be disabled
/ Any :calc functions that examine files should be disabled. This includes
dirperm(), exists(), fileeol(), and time(filename). In addition, the
shell() function might as well be disabled so we can get a better error
/ User-specific set up files should be skipped. In particular, elvispath
should remove any element that starts with "~", and the elvis.ini script
should skip $EXINIT and all the .exrc files.
/ The "safer" option should disable more...
/ The wordfile option should be locked.
/ Suspending via ^Z should be disabled.
/ The :snext, :split, :visual, :open, :push, :wquit, :xit commands should
refuse any filename argument.
/ The :ex, :edit, and :file commands were disabled by safer, but should now
only refuse an filename argument. ":f" and ":e!" should work.
No, ":e filename" should work too. It's too useful! Disable it
in the paranoid version though.
/ The elvis.ini script should be run with "safer" turned off temporarily,
even if "-S" is given on the command line.
/ HTML display mode should handle &euro;
/ The "timeout" option isn't documented.
/ "configure" still isn't setting elvispath correctly. It has $(PREFIX)
in the literal string.
/ Modify to incorporate $VERSION into the documentation files.
/ In "html" display mode, comments should allow ">" in the comment, and
only end the comment at "-->". Also, if the comment is too long to fit
in the tag buffer then the comment contents should be clipped but the
whole comment should still be skipped.
Fixed in 2.2i-beta:
/ Bug in syntax highlighting: In Pascal code, if { comment } is a line
two lines above the top of the screen, then the whole screen is formatted
as a comment.
/ Add a typical ~/.elvisrc file to the distribution.
Added it, as lib/elvis.rc
/ For WinElvis, offer an alternative title format -- the current hard-coded
format is "WinElvis - [filename.ext]", which doesn't look so great in
the task bar.
I added a "titleformat" option. I still need to test this,
and if it works then I should document it too.
/ The MS "nmake" program allows forward slashes in filenames, which is nice,
but if there's an error then the compiler will output the character as /\
instead of just / or \, and that can confuse elvis.
/ In guitcap.c, allow colors to be used if :up=\E[A: *or* :AF=\E[3%dm:
This is necessary for the "screen" program to get colors.
/ The -= operator doesn't work right in :color commands.
/ Make the "warpto" option move the pointer when a window is created. This,
together with "warpback", should avoid the focusing bug.
/ Elvis/x11 shouldn't always raise the window when changing focus.
In particular, when [un]mapping windows. This is important because some
window managers (such as IceWM) iconify all windows when switching to
a different workspace and then deiconify all of them when switching back.
It seems like this should be related to the xw->warp flag --
If a window shouldn't be raised, then the cursor shouldn't
be warped to it either.
/ In the "termcap" interface, when scrolling forward the showmode box is
highlighted; when scrolling backward it is not highlighted.
I fixed this by adding a new "showmode" face, and using it to draw
the showmode value. You can now use ":color showmode green boxed"
to change its attributes.
While I was at it, I also added a new "ruler" face for changing the
color of the ruler.
/ In input mode, make ^X^X lock hex input mode until the next non-hex. If
the non-hex is ^X then it should be ignored; any other character should
be interpreted normally. Or maybe Backspace should remain in hex mode?
/ Rename the :w alias to :ww, so people who don't use RCS aren't baffled
by unexpected error messages.
/ The smartcase option can break some aliases. To get around it: add
"local noignorecase" to the alias.
/ Blended fonts aren't always right. In particular, a :region's font
isn't combined with non-default fonts correctly.
/ Make WinElvis support background images.
/ WinElvis has some resource leaks. This shows when you resize the window
or do a lot of scrolling.
/ The "ref" program doesn't like it when text files have CR-LF newlines on
a Unix system.
/ The "x11" interface could do a better job of compressing expose events in
the text window. This matters more for "html" display mode than for
"normal". Try opening multiple help windows, and then dragging some other
window over them.
/ The BufDelete event can cause core dumps while exiting. Try the ex/xbuf.ex
script, for example.
/ If tagprg is unset, and an alias uses "local tagprg=foo", then when tagprg
is restored at the end of the alias, it is restored to "" instead of NULL.
This breaks tag expansion via the <Tab> key. Doubtless other things are
broken for other options, too.
/ When wrapscan occurs, the "wrapped" message doesn't show.
Apparently the behavior of MSG_STATUS messages has changed. Those
messages go away after the screen updates. I changed the "wrapped"
message to use MSG_INFO instead.
One problem: Attempting to XSetInputFocus() to an iconified window
causes a BadMatch X protocol error.
/ Somehow the hllayers option has become "locked".
/ If ~/.netrc contains a "default" entry, then anonymous logins don't work.
/ Add a dummy "lisp" option. Also, make sure elvisopt.html mentions the
use of autocmd for making these dummy options do useful things.
/ In x11, ":se notoolbar" causes an X error in XCreateWindow.
/ It would be nice if 'b' or 'i' could be appended to a font name such as
"courier*18" to select the bold/italic version of that font. Italic
versions are tough because they may be designated by -o- or -i- in the
long font name.
/ It would also be nice if there was an option to specify a list of
registry-encodings to try. The default list should be iso8859-15,
iso8859-1, *-*. The list should probably be comma-delimited, like tabs.
How are encodings handled in Xft? There's a XFT_ENCODING parameter,
but no XFT_REGISTRY. My best guess after searching the web for
example source code: The value combines both the registry and the
encoding, with a hyphen between them -- which happens to be exactly
like I intend to use for Xlib calls!
/ In a :g/re1/s/re2/text/ command, if the s/re2/text/ fails then the :g/re1/
should still continue to look for other strings. It appears that it is
currently stopping on the first failed substitution.
/ The default value of the "background" option is often wrong. That should
be fixed, and even then it would be nice if $ELVISBG could override it.
/ Support an ELVISGUI environment variable, for specifying the default
user interface.
/ Now that the "x11" GUI can read XPM files, maybe it's time to add support
for color icons.
/ In some "x11" themes, the note in the [Save as] dialog is hard to read.
It should be drawn in the toolbar fg color, not the tool fg color.
/ The 'c' flag for substitutions highlights the first match incorrectly.
Also, after the last match it doesn't tell you how many changes occurred,
which makes it hard for the user to recognize that they're back in normal
command mode.
Actually, it did report the number of changes if it exceeded the
"report" option. But since this is a slow interactive process
anyway, and the user needs feedback more than usual, I think it
should override "report" in this case.
/ The "syntax" display mode allows spaces between a function name and '(',
which is good. But it also allows tabs, which is bad because it makes
some many macro definitions look odd.
/ Text selected in Elvis can't be pasted into Netscape's email composer.
/ Allow the "x11" user inferface to use color icons, if FEATURE_IMAGE is
defined. Maybe use ":gui icon filename.xpm" to load the icon.
/ ":safer ()" goes into an endless loop.
Actually, I think it is reading from stdin, but that's still a
bug. The code has been treating missing or zero-length file names
as synonyms for stdin, and that's wrong.
/ The BUGS file should specifically mention the names of the removed options,
so that users can grep for the names when their .elvisrc scripts stop working.
Relative to version 2.1_4, the following are replaced by the "show"
option: showname, showtag, showcmd
Relative to 2.1_4, the following are deleted: showstack, normalfont,
otherfont, prepfont, keywordfont, functionfont, commentfont,
normalstyle, boldstyle, italicstyle, fixedstyle, emphasizedstyle,
/ Add .ZN to the "man" display mode. It switches between fixed & normal
fonts, in exactly the same way that .BR switches between bold & normal.
/ The .IP command should support an indentation parameter. This is important
when used for bullet lists.
/ Sometimes tag searches fail when they should succeed. In at least some
of these cases, the problem goes away if switch from "syntax" to "normal"
display mode.
This was failing for "smartargs" argument hints. That bug is now
fixed. Were there others?
/ elvtags sometimes makes tags for reserved words such as for(). And what's
worse is, elvis' smartargs is too stupid to realize that "for" is a keyword
even though I specifically remember coding that test.
/ There appears to be a bug in the way subscripts are parsed by the built-in
calculator. ":calc a[1] a[2]" returns only a[1], but ":calc (a[1]) a[2]"
works correctly. I think the version without parentheses is using the value
of a[2] as an index into a[1].
/ The :error command sometimes adds garbage to the end of the message.
The following alias demonstrates this, when invoked without args.
alias grep {
local b="this is a test"
if "!*" == ""
then error usage: grep text files...
Fixed! It bug was in the handling of the "." operator, in simpler
syntax (used for messages), outside of parentheses at the end of text.
/ The :local command can't restore buffer options if you switch buffers.
This makes ":local ccprg=..." useless.
/ "make uninstall" chokes on the "themes" subdirectory.
/ Make ^W^W toggle between two windows, instead of cycling through all of them.
Make ^Ww cycle through them all instead, and allow users who prefer the old
behavior to :map ^W^W ^Ww
Add a win.winsequence option, locked, which is set to an internal
event counter whenever a window is created or receives a keyboard
or mouse click event. Make ^W^W go to the window with the highest
value, other than the current window.
/ Don't spellcheck the library words (e.g., :check -lib libt libf libd libv)
/ Can't do tag searches on #include "file.h". It works fine on <file.h> though.
/ Maybe make the rand() function take a space-delimited list, instead of a
comma-delimited list? That would be more consistent with the way arrays
are handled. Alternatively, maybe make "?" in a subscript refer to a
random item in the array.
I decided to support "?" as a subscript. That seemed like the
more versatile way to go. It was also easier to implement.
/ "HOME=foo ELVISPATH=foo elvis -Gx11 -mono" starts with black-on-black text.
In general, there are some weird things happening when -mono is used.
/ Cut/paste between elvis and KDE3 applications is broken.
KDE3 no longer checks for the standard XA_STRING target format.
Instead, it used COMPOUND_TEXT. I fixed this by modifying elvis
to support COMPOUND_TEXT.
/ In the "x11" interface, if no background color is specified for the cursor
then the cursor should probably always show the foreground color. (The
cursor is normally displayed in the background color if elvis owns the
current X selection, and the foreground otherwise.)
/ The prefersyntax option is interfering with protocol aliases' ability to
choose a markup display mode.
Probably elvis.arf should be skipped for user-defined protocols.
If they want to run elvis.arf, then can run it themselves via an
explicit "source (elvispath("elvis.arf"))" command.
Fixed: I added a "userprotocol" buffer option, and made elvis.arf
test it before doing anything that would interfere with a readPROTO
/ The :info alias (ex/info.ex) replaces the current buffer with the info page
buffer, if the current buffer has no name. The window title is not updated.
This was a bug in the :g function, now fixed. (exedit.c, line 100)
/ Make the "configure" script support the --prefix flag. It changes the
default BINDIR and LIBDIR values to $prefix/bin and $prefix/lib/elvis,
but they can still be overridden by --bindir and --datadir. (Note that
man pages are usually installed relative to the BINDIR, so the prefix will
affect them too.)
/ Bug in "configure" script: For Solaris, "configure --without-x" will omit
the TCP/IP libraries ("-lsocket -lnsl") but they're still needed for the
HTTP and FTP protocols.
/ In elvis.syn, is "anchor ^" broken? Ex scripts look bad, because all
doublequote characters are interpreted as the start of a comment.
/ When parsing argv[], elvis should support the use "--" to mark the end of
/ Add support for reading from stdin, when "-" is given as a file name.
/ Make the termcap interface smart enough to read from keyboard even if
stdin is a file. Verify that other interfaces don't care about stdin.
/ Make elvis smart about what it sends to stdout. Again, this is mostly
a change to the termcap interface.
/ Added a "ex/info.ex" script, which lets users view info pages in elvis.
/ For the "x11" interface, make <Shift-Insert> paste from the X selection.
/ Add stubs for the new Xft library.
/ Maybe make the "x11" interface support antialiased text, via the Xft
library in XFree86.
/ ctags doesn't generate an entry for the last name in an enum list.
Actually, it is scanning the comments, and generating tags for the
last word in the last comment. Other comment words get tags too,
if they happen to be followed by a comma or semicolon.
/ ctags/elvtags doesn't handle "extern struct structname varname" correctly
-- it treats varname as a typedef, not an extern variable.
/ The recent change to ctags regarding duplicate typedef tags is buggy.
It can cause core dumps.
/ There's a bug in the "syntax" display mode, with column-sensitive keywords.
They can be *EXREMELY* slow.
/ The :local command should not be allowed to use locked options such as
bufchars. Restoring such an option could cause a core dump.
/ When a buffer is modified for the first time, the equivalent of
":doau OptSet modified" should be run. Also, the fact that internal
changes like this don't always cause OptSet or OptChanged events
should be documented.
/ Use the "Clarified" Artistic License.
/ The :lpr page header for "normal" and "syntax" display modes will be
malformed, if the file name is too long to fit across the top of the page.
/ What font is used for the .IP tags?
It was using font code 0 -- either "normal" or "idle". I have
changed it to use "formatted" instead.
/ In the "man" display mode, special characters such as \(bu aren't handled
properly in argument of a .IP command.
This is only fixed for \(bu, because the others just didn't seem
worth the trouble. Bullets are likely to be used as paragraph
tags fairly often, but how often will anybody want to use a copyright
symbol there?
/ In "man" .IP arguments, \sSIZE strings aren't being igored correctly.
Part of the size is still displayed.
/ In man pages, unformatted text should be displayed in the "fixed" font.
Fixed in 2.2h-beta:
/ Windows problems:
/ The "idle" color isn't used for the last elvis window when focus shifts
to some other application. My guess is that it handles WM_SETFOCUS but
/ Whenever a new window is created the GUI should call eventfocus() for it,
because Windows does give it input focus but doesn't send WM_SETFOCUS.
/ Until the first window is opened, any error messages should probably be
written to stderr. (I think it already does this for status & fatal
messages, but not plain old errors.)
Okay, they're written out but the script name/line number aren't.
/ Trouble in second "Normal" line, in samples/sample.tex
Fixed. This one could have caused problems for the start of any
line in any of the markup display modes.
/ The "man" display mode can't parse/ignore relative sizes such as \s'-2'.
It can handle size changes without quotes. I just need to make it
smart enough to handle quoted sizes too.
/ In man pages, \c should act sort of like a comment -- ignore everything
up to the next newline -- but \c eats the newline while \" does not, in .nf
/ Make sure the syntax description handles special chars such as \(bu and
similar... and maybe show it correctly in "man" format.
/ Rename the "hlspell" color & option to "spell". The similarity between
"hlspell" and "hlsearch" makes both of those words hard to type in, even
with the help of word completion.
/ After :lpr, the "# pages" message goes away too fast. This only happens
when printing to a pipe, not a file.
/ ":au OptChanged lines,columns" should work -- it'll allow users to define
events that are sensitive to changes in window size.
Hey! I could delete the hard-coded message that shows the size of
the window, and instead use...
:au OptChanged lines,columns message (columns)x(lines)
/ After a search, the "/" remains on the bottom line, but the statusbar's
text is hidden until the next keystroke. The "/" doesn't go away until
some other text comes along to replace it.
It's worse than that. If there's a statusbar then it clears the
status text too. So you can't see the results of the "show" option
(e.g., the name of the function where the search succeeded).
/ Make syntax coloring keywords be more flexible. For example, \fB should
be a keyword in troff source, even if it is immediately followed by another
alphanumeric character.
Not all keywords should allow trailing alphanumerics, of course.
Probably a new "prefix" syntax line should be used for marking the
keywords that do allow trailing alphanumerics.
The biggest challenge here will be rewriting the word classifier
to do its work incrementally. (Until now, it has worked by collecting
the characters of the word and then looking it up.)
/ Almost done! Now if I can just get it to handle .\" comments...
/ Remove FIRSTPUNCT and SECONDPUNCT. They aren't needed anymore.
/ Previously, punctuation keywords were always treated like prefix
keywords, I think. This was handled when drawing the line image,
but now it should be handled by setting the ISPREFIX bit during
/ There's a bug in tab expansion after a keyword. Apparently the
keyword's width isn't included in the column count.
/ Document it! Also, relocate the "set" description.
/ Modify the Makefile to allow MSDOS & Windows executables to have uppercase
names, somehow. Otherwise there's too strong of a chance of omitting the
"*.EXE" files, when we go looking for "*.exe".
/ Don't spell-check :man pages. They often contain valid words that become
hyphenated at the end of a line, and elvis' spell-checker doesn't understand
Done! And I also made the bold/underline conversion be more
forgiving, so it'll now handle Perl's quadruple-emboldened text.
/ Some fatal error messages don't shut down the user interface. When using
the "termcap" interface, this means the terminal is left in raw mode.
/ "elvis -r" can hang if there are no old session files waiting to be recovered.
/ Allow <Alt+Mouse1> to be used for selecting rectangles, at least under
Windows. Many other Windows editors use this convention.
/ After ":help :sbrowse", clicking on ":browse" follows the wrong link. This
is a bug in the htmltagatcursor() function.
/ The :for command kills elvis if given a loop expression which can't be
/ Support at least two types of string quotes. See Wim Delvaux's email.
I started with Wim's patch, and tweaked it to treat the quotes
as being distinct so a string can't start with " and end with '.
This still isn't perfect -- sometimes it has a hard time figuring
out whether the top line of the screen is a continuation of a string
or not, which causes most of the screen to flash. But for the
particular case of sh syntax, it works good enough.
/ When a :local option reverts to its earlier value, this should trigger an
OptChanged autocmd event. Does it?
/ If <X11/xpm.h> can't be found, then FEATURE_IMAGE should be #undef'ed.
(On a computer without the full development system installed, it's possible
to have the library but not the header.)
/ The "config" alias is renamed to "features".
/ elvtags doesn't understand `extern "C"'. Ideally, the contents of the
block should be parsed normally.
/ elvtags should be smarter about typedef tags. If a tag is known to be of
kind:t then probably any duplicate tag is the result of a parsing error,
and hence should not be stored. (Unless in a different source file?)
This works two ways: When adding a tag of kind:t, it should delete
any existing tags. And when adding a tag of any other kind, it
should skip it if there's already one of kind:t. (It helps that
in the latter case, the kind:t tag will be the *only* tag with that
name.) This logic should be implemented in ctags.c, not the
lower-level source files since we don't want to make elvis do this.
/ Running "configure --without-x" omits the word "undef" from FEATURE_IMAGE,
so the file contains "# FEATURE_IMAGE".
/ In elvis.syn, "anchor ^ keyword..." doesn't work anymore. Comments in ex
scripts aren't highlighted as such.
/ Proofread the "howto" chapter. It has some old information.
/ Modify :theme to run the scripts via :safer instead of :source.
/ Modify dmsyntax to use a spelling dictionary for storing keywords.
/ The :bb command lists buffer names, which are now full pathnames. It
should list filenames, which are what the user actually entered, because
the full pathnames are often too long.
/ Sometimes :mkexrc saves the bufdisplay option? That should never happen!
/ When printing HTML, the page header shows the full pathname of the file/URL,
I.e. the bufname. It should probably show the filename instead, if there
is one.
/ Aliases quit after running :lpr. Apparently :lpr always returns an error
code, even if it runs successfully.
/ Add support for a "make elvis.rpm" target.
/ Would it be possible to parse the tags file in a way that allows typedefs
and functions to be highlighted as such, without modifying the syntax file?
Maybe by checking the "kind:" attribute.
I've added "taglibrary" and "tagkind" options. If set, then when
elvis loads a syntax description (first time only, thanks to syntax
caching), it scans all tags files in elvispath for any tag which is
defined in a file whose extension matches that language. For each
tag of kind "XXX", elvis adds the tag name as a keyword in font
"kindXXX" or "libXXX".
It is important to remember that C++ can call C functions, and that
*.h files can be either C or C++. Languages should be able to specify
which extensions are callable as foreign functions; e.g., C++ can
call "*.c" functions. This will require adding a new line to the
elvis.syn file.
/ When running "make install", hide the error message from "cp lib/* ...." so
the user doesn't freak out when they see the message about lib/themes/.
/ In NT, the console doesn't get restored when elvis exits. Also, while
running elvis the ex history is displayed incorrectly.
NT's console sucks. Probably I should modify the tinytcap.c
entry for the Windows console to make it move the cursor to the
bottom of the screen and then clear that line, before trying to
switch back to the original screen. This would reduce the impact
of Microsoft's bug.
Actually it might be better to hard-code this into the Win32 version
of tcaphelp.c, since finding the last line requires some math.
/ I've been told that Cygwin has changed the way it stores mount points.
I should modify elvis to mimic the new behavior. (I don't want to use
Cygwin's libraries, because I want users to be able to run elvis without
The new method still stores SOME of the mounts in the registry, but
some others appears to be hardcoded. The only reliable way to get
them will probably be to parse the output of Cygwin's "mount" command.
/ Using ex history to re-execute the command :("a generates an error
message, apparently because it eats the newline after it.
/ Problem: The :au command doesn't work well with {...} notation, since the
{ doesn't appear at the start of the RHS. Perhaps it should be modified
to allow leading text.
:au Edit * {
if !modified && readonly
then doau FileChangedRO
NOTE: When the :autocmd command lists autocmds, it should detect the
presence of a newline in the command text, and add {...} around it.
Perhaps it could borrow code from :alias?
/ elvtags can generate tags for numbers. It shouldn't!
/ "make install" seems to mess up permissions on the "themes" directory.
That directory must have execute permission!
/ elvtags doesn't find enum values that are set to explicit expressions,
such as GDK_MOD1_MASK in lib/gdkstub.h
/ Something's wrong with ^] on #include files. Try using ^] on "elvis.h"
in an elvis source file.
/ In the stub files (lib/*.c), any typedefs are being marked as static, which
prevents them from being found when they should be.
Fixed by adding a "-g" flag to disable the "file:" hint. This flag
is now used during "make install".
/ "make install" uses ctags instead of elvtags, because of root's PATH.
It should use elvtags, because ref and elvis work best with it.
/ When you mark a rectangle via ^V, and then run an ex command on the
highlighted text, elvis should IDEALLY limit the changes to the highlighted
columns. This would be very difficult though, and it isn't at all clear
what some ex commands should do -- the ex command set is very line oriented.
How about this: Copy the rectangle into a temporary buffer, apply
the ex command to that buffer (all lines of it), and then go back
and replace the original rectangle with whatever the buffer has
become. (If the buffer is unchanged, the last step can be skipped.)
This still wouldn't be quite perfect -- cut text would be marked
as being "line" instead of "rectangle". But :s would work perfectly
and that's probably what matters most.
This wouldn't even be particularly hard. The temporary buffer could
be a cut buffer. The ex parser (or the : command) would cut the
rectangle into that buffer, make it be the default buffer for the
ex command, and then paste it afterward.
/ Elvis can dump core if you insert a hypertext reference into an HTML document
while in the "html" display mode. The partially-complete <a href=...> tag
causes the problems.
/ Attempting to write an untitled buffer will give the error message "No file
name for NULL". It should simply say "No file name". Or say the buffer
/ In X11, use "normalfont" as an alias for "font", for now. This will allow
users to update their configurations simply by starting elvis with their
old normalfont setting, and then running :mkexrc to save the old setting
under the new name.
/ For ANSI colors, add "default" which uses color 9 ("\E[39m" selects the
default foreground color).
/ Increase the range of legal values for scrollwheelspeed. It would be nice
if users could do things like ":let sws=scroll".
/ When editing HTML *in syntax mode*, the spacebar and enter keys should not
be mapped. The mapmode option can't handle this. Maybe add DisplayEnter
and DisplayLeave autocmd events, and use those to enable the maps when
entering/leaving "html" mode.
/ Add the events to autocmd.h and autocmd.c.
/ Write a new audisplay() function to test for changes. It should
examine the state of the current window. It should be sensitive
to the window's "display" option, and to the input state stack.
/ Call that function at the top of mapdo() so any changed maps take
effect before the keys are processed. Also call it again at the
top of each statekey() call, to react to maps that change the mode.
/ Replace the current mapmode maps with autocmd maps, in elvis.ini.
/ Some bugs in Perl's POD lines (in syntax mode):
/ POD lines are followed by empty lines; i.e., the formatting lines
are displayed with two newlines at the end instead of one.
/ Sometimes POD lines cause elvis to dump core.
/ 'elvtags -x *.c' dumps core at the end of the list.
/ Need a way to prevent temporary maps from being saved by :mkexrc. E.g.,
HTML's <space> and <enter> maps should not be copied into ~/.elvisrc.
/ When generating "" from "", protect the phrase
"'exuberant' ctags".
/ The :augroup command doesn't accept the '!' suffix.
/ The ^Wd command doesn't work on samples/
This is probably because bufdisplay="syntax perl" instead of merely
/ More vim autocmd events: BufAdd (synonym for BufCreate), BufNew, BufReadCmd,
BufWinEnter, BufWinLeave, BufWipeout, BufWriteCmd, CmdWinEnter, CmdWinLeave,
EncodingChanged, FileAppendCmd, FileChangedRO, FileReadCmd, FileWriteCmd,
FuncUndefined, RemoteReply, TermResponse
Most of these aren't worth implementing. Just BufAdd, and maybe
FileChangedRO. Some of the others should probably be recognized,
just so users can use :doau on them. Maybe I should add a command
for adding user-defined events?
Fixed in 2.2g-beta:
/ The spell-checker didn't like words that start with '_', even though
tag names often do.
/ Maybe allow lpheader font to be controlled via ":color header" ? Still
make it default to "fixed underlined", but some users might prefer boxed.
Actually, it was already doing that for non-markup modes. I tweaked
the markup modes to do the same, and documented it.
/ Gnome patches from Klaus Elsbernd, needed for compiling the gnome interface
with a non-GCC compiler, and run in SunOS
/ ctags *needs* support for "enum". And probably "class" wouldn't be too hard.
/ ctags needs to reset the class hint when switching from one file to another.
/ The show=link option is slow if there are no <a ...> tags shortly before
the cursor position. It should probably stop looking if it sees a tag
which is a paragraph/section marker.
I thought I had this one fixed, but apparently the fix wasn't good
/ ":map" doesn't list cursor key maps, and even some user maps such as "gw".
Actually, I kind of like the fact that it omits cursor keys since the user
probably already knows what they're mapped to, and it's nice to avoid clutter.
But there should be *SOME* way to see them.
Fixed. Also made ":map" list non-cursor keys, while ":map all" lists
all maps including cursor keys.
/ Use mapmode to make <Enter> follow a link in HTML. Maybe also use <space>
to page forward.
/ "map mode=html ^V ^F" isn't saved correctly.
/ Don't set hlspell for the help files. Why embarrass myself?
/ Elvis dumps core in a C++ file (or C header file) that starts with a comment
if the "showlink" option is set.
/ "show=link" shouldn't affect any display modes other than "html".
/ The :r command displays the number of lines read, even if report=0
/ In "hex" mode, the line before the column headings is in a funny font.
This only shows up when you do a ":sp file.bin" on a binary file; as soon
as any event causes the screen to be redrawn, it looks okay.
/ The "modified, not saved" message uses filename, should show bufname.
/ There's a bug which causes a core dump when "theme:parchment" is loaded.
Apparently this is in the "1;/^BEGIN /,$d" command, which deletes
everything but the initial comment. I suspect that it is failing
because the last block is deleted, in a buffer which requires
multiple blklist blocks. (The "parchment" theme is the biggest
If I run that command manually it doesn't dump core... until the
third time! This suggests that buffer cloning may be involved.
SOLVED! It took six hours, but I finally found bug in lowbuf.c's
delblock() function, when a buffer is big enough to require a chain
of BLKLIST blocks. To delete a CHARS block in the n'th BLKLIST block,
it was copying the first item from the n+1'th BLKLIST block and then
recursively calling delblock() to shift the n+1'th block (and any later
ones, the same way). But delblock() frees the deleted CHARS block,
/ For the termcap interface, the "italic" attribute can interfere with
colors. It is implemented as "half brightness", which Linux's console,
for one, can't do in color.
Added a "ttyitalic" option, similar to "ttyunderline".
/ Changing the 'background' option should cause colors to be reevaluated,
if the actual background color is unknown. This would mostly benefit
the "termcap" interface, since the GUI interfaces always know exactly
which background color they're using.
Basically, this action could be done by calling recolor() for any
font which has no "like" clause. (The "like" fonts will automatically
be reevaluated when the font that they're like is reevaluated.)
Triggering this action will require writing a custom option-setting
/ The MS-DOS version has a hard time using bright colors for "normal" plus
other things: color normal yellow|color comment bright green.
/ Modelines don't work?
This was because the first "1,5s/ex:\(.*\):/\1/x" was failing, which
prevented the elvis.arf script from continuing with the second
"$-4,$s/ex:\(.*\):/\1/x" command.
/ "safer" mode is too strict. Disallowing :alias and :autocmd causes problems
in the initialization scripts.
/ Make elvis.ini check "safer" before running elvis.ali
/ Make :augroup be unsafe, so the script generated by :mkexrc will work
whether safer is on or not.
/ Weird problem with PERL doc lines. See Merijn's example.
This was caused by a scanalloc() call without a matching scanfree(),
in dmsyntax.c. Each screen update left one more scan context lying
around, and that caused elvis' buffer functions to get confused --
there should never be any scan contexts active when the buffer is
changed. There are assert() statements to verify this, but those
are normally disabled, so that's why this looked subtle.
/ Shouldn't draw guide lines on ex scrolled rows at bottom of window.
Fixed, in an interesting way. I added a new text face, "bottom",
and made it immune to guide lines. All ex commands and their output
are drawn in this font, so they don't get guide lines.
/ Make "smartargs" be a buffer option? Sometimes there will never be tags
for functions; e.g., in HTML source where "functions" are really tag
parameters. Searching for a nonexistent tag can take a while!
Done. Also modified "elvis.arf" to turn off smartargs for html.
/ If you delete the last character from "boxed" text, the right edge of the
box is not redrawn in its new location. The box appears to be open-ended.
/ Add a BgChanged event for :autocmd.
/ add a "showface" option, which shows the name of the current font. Maybe
also add a current("face") function which returns the name of the face at
the current cursor position. If the face is a combination, then return "".
Replaced many showXXX options with a single versatile "show" option.
file, tag, cmd, face, link, spell, region
/ The 'x' flag of the :s command should move the cursor to the current line
before evaluating the command. This affects the readTHEME alias.
This is very quirky. The bug mostly resides in parsewindowid(), but
really it is just a manifestation of the fact that my ex parser doesn't
allow ex commands to specify a cursor position -- it tries to use the
window's cursor, or the top of bufdefault. I think in readTHEME, it
is using the latter.
Fixed! I just made sure that x's quirks matched parsewindowid()'s.
/ Some easy ideas for background images in X11:
/ Allow background color names to contain either a simple color name, or
the name of an image file, or both. When both are given, use the simple
color to "tint" the image. Return a pseudo-colorcode. Also return the
average RGB value of the image, so contrasting foregrounds can be chosen.
/ When an unscrollable image is being used, GUI->scroll() should always fail.
/ problems with partially specifying the "normal" color, and probably
any of the special colors -- When you run :mkexrc it only remembers the
most recent partial color specification.
/ The "or color" clause can be chosen before the background is set. E.g.,
":color normal black or white on black" chooses the new foreground based
on the old background.
Note that this is related to the "partial specify" problem -- the
only reason for specifying "or" colors with the background is so
that you'll be prepared when the next foregroundless :color command.
Possible combined solution: Write a parser which returns the foreground
and background colors AS STRINGS. When doing this, treat the "or"
word as plain text, so it is included in the foreground string for
later processing. Other attributes are returned as flags. When
doing a partial specification, parse both the old & new attribute
strings; if the new one omitted a foreground or background, then
use the foreground or background from the old string. Process the
background first, so the proper "or" color can be chosen. Regenerate
the combined text by using the foreground & background strings,
with flags generated from the attribute bits.
/ In "x11", a bold 'm' leaves bits to the left it its character cell --
maybe clip the cell? It would make scrolling look better. However,
italic characters often slop to the right, which apparently produces far
fewer problems, so the clipping should only be on the left.
/ Make WinElvis read its color names from a file, preferably in the same
format as /usr/X11R6/lib/X11/rgb.txt
/ ":help ex" fails. It tries to load "elvisex.html" in the current directory.
/ Describe the meaning of ";" in ex addresses.
/ The postscript print driver uses the video colors, not the carefully chosen
lp colors.
/ It is so tempting to give only one foreground color, I really should add an
"lpcontrast" option.
/ For the sake of uniformity, x11's "normalfont" option should be renamed to
just plain "font", like in Windows.
/ ":help set ttyunderline" doesn't go to the ttyunderline message, unless
you're using the "termcap" interface. I wouldn't expect name completion
to work, but you should at least be able to give the full name and find it.
/ "nottyunderline" shouldn't completely disable the use of underline --
still try to use it if no background color has been set. This will allow
the window separator to be red.
Actually, this is more of a personal preference. But users who
prefer to have no redness in their window borders could just say
"color normal on black" so no harm is done.
/ Can't use "bold" attribute to distinguish between normal/idle. Elvis
appears to only be sensitive to the colors, not other attributes.
/ Windows problems:
/ The Options->Gui dialog can't change colors, and doesn't display the
colors of that have been set elsewhere.
/ Text type names aren't sorted, and the label should probably be "face"
instead of "text type" anyway.
/ Combo boxes should show more items.
/ The Options->Syntax menu item crashes elvis. It is obsolete anyway,
and should be deleted.
/ The :let command never triggers an OptChanged or OptSet autocmd event.
/ Add "kvt" to the list of terminals recognized by -Gx11. Also, the termcap
interface should assume "kvt" has a light background.
/ "make install" should create the /usr/local/lib/elvis/tags file.
/ The smartargs option doesn't allow a space before '('.
/ Make the toolbar's colors be configurable via resources (instead of the
scrollbar), and then make the default settings of the scrollbar and
statusbar be "like toolbar".
/ In the Windows, OS/2, and MS-DOS binary distributions, make the contents
of the "lib" directory be read-only. This is important for making
":set prefersyntax=writable" work right.
/ Writing an anonymous file should never change the name of an INTERNAL buffer.
Currently, :mkexrc seems to do that.
/ The "elvis untitled #n" buffer names should correspond to bufid numbers.
It's less confusing that way.
/ In "termcap" interface, sometimes the hlsearch highlighting doesn't show
everything that it should. This seems to depend on color settings. See
samples/hlsearch.cpp for an example.
Not a bug. This is due to the interaction of "bold white" text and
"bright red" highlighting. In the termcap interface, bold+bright
always results in bright white, regardless of whatever color you're
trying to use.
/ For HP, the default level of optimization doesn't work in elvis. Need to
make "configure" drop it to +O2.
I tried changing the "configure" script to handle this, but I can't
test it myself.
Merijn Brand reports that it does indeed work.
/ Sometimes the cursor gets stuck at the bottom of the screen (not the status
line where ex commands are entered, but the last one normally used in visual
mode). Hitting zz fixes this condition.
This may be related to the "calling delimage() endlessly" bug, which
is now fixed. The "stuck at bottom" bug hasn't occurred since that
Fixed in 2.2f-beta:
/ Changing the "normal" background should cause all colors to be reevaluated,
so that "or color" can be chosen properly. Merely switching a window from
"idle" to "normal" shouldn't do this -- only a ":color normal" command should.
/ Hey! ":color normal gray" changes the background to black, in -Gx11?
It should leave the color unchanged.
/ Need a way to make maps that only apply in certain display modes, or
possibly some other factor. Maybe add a "map=XXXX" flag, and a "map"
buffer option? Or a generic "option=value" flag? Maybe add a :mapgroup
command, like autocmd, and allow groups to be selectively enabled/disabled.
I implemented this as a "mode=XXXX" flag, and a "mapmode" option.
/ After running an external command, the termcap interface restores colors
BEFORE switching back to the edit screen, so the original screen colors
are clobbered.
/ Make :alias list the user aliases, and :alias! list the system aliases.
/ Make :alias indent aliases to reflect the control flow.
/ Need a way for aliases to access the tail of a command. The csh way to
do this would be to put a * after the digit, as in !:2* to access everything
except the first word.
/ Can the Edit autocmd event be partially dependent on bufdo()? Should it be?
This is desirable because it would reduce the number of events, but what if
somebody "moves" the cursor while in input mode?
Actually, moving while in input mode should probably call bufdo()
anyway, so that individual changes can be undone.
A more complex problem: global changes, via either :g or :%s. There
should probably be flag added to each buffer, to indicate that Edit
events should occur more often than "undo" saves.
/ Make the window title show the filename if there is one; else the buffer name.
/ Add a way to mark regions.
/ With "optimize" turned off, the : command causes hlobject text to be
highlighted weirdly. I think this happens only when there are multiple
windows. It tries to recolor the current window, using the temporary
fonts from the other window.
Exposure events can be similarly weird, regardless of optimization.
This might be solvable by comparing the color number against the
npermanent. If >= then allocate a new temporary color with the
required attributes... BUT WHY SHOULD THAT BE NECESSARY?
/ Make :mkexrc generate a script that uses :try instead of :if. This is
important if FEATURE_CALC is turned off.
/ Allow more features to be disabled via FEATURE_XXXX -- tags, regexp, etc.
/ Modify the [[ and ]] commands to recognize functions that start with '{'
at the end of the function header line, instead of in column 1 of the
following line. Assume function header lines are either unindented.
This notation is standard in GNU source code, Perl, and (oddly enough)
in elvis' own alias notation. This should also affect the gd command.
Done. Also added "tweaksection" option to control it.
/ The "locked" and "readonly" option should never be saved in ~/.elvisrc
Maybe other options too.
/ Adding "tag=" to the status line had the unintended side-effect of adding
it to the result of current("tag") too. And it looks uglier than I expected
anyway. Since the real source of confusion is when both "showtag" and
"showspell" are set, it would probably be better to add numbers before
the showspell words. This makes them distinctive, and also makes the gs
command easier to use.
/ Add link anchors to example aliases in lib/elvistip.html. Refer to them
in other parts of the manual.
/ Bug in suffixes -- it searches random memory past the end of the suffix
/ Something is wrong with subscripts. Try :calc "foo"[,2...];"ps".
There were two bugs: The precedence of [] was too low, and non-numeric
arguments were being interpreted as an infinite list of 0's.
/ The "x11" user interface dumps core. Try "e2 exmake.c", ":sp ex.c", resize
the ex.c window to be 4 lines high, run ":window" or ":set". This does not
dump core in the "termcap" interface. It may be related to spell checking.
I suspect this has something to do with static variables being set
with the expectation that one window will be used next, and then the
other one is winds up being used instead. I say this because in at
least one occasion, the status line (below the text window) showed
the same tag name for both windows even though they were for different
Unfortunately, one side-effect of this is typically that the stack
is clobbered, so it is difficult to tell what's going wrong.
FIXED! It turns out that some important variables were being left
unset by drawopenedit(). The variables are normally set by the
drawupdate() function which calls updateimage(). But drawopenedit()
also calls updateimage(), so it had to set those variables too.
/ It would be nice if ":make" didn't switch buffers if there's already a
buffer showing the erroneous file.
/ There should be a way to disable spelling for each buffer. This is partially
dependent upon whether the window is readonly or not, but it should be more
versatile than that. Maybe replace the spelltags option.
I simply made "hlspell" be a buffer option instead of a global one.
I also deleted the "spelltags" option since I no longer consider it
to be useful... or not useful enough to justify making users read
about it and understand it.
/ Sometimes elvis gets stuck calling delimage() endlessly. In the "termcap"
interface, if you start on an HTML file and then use :sp to load some other
file, then elvis gets stuck in an endless loop trying to update the HTML
Fixed! This was happening because eventfocus() was calling draw()
for the original window, which in turn tried to draw it using the
"html" functions -- even though the cursor was still in the ex history
buffer at the time.
/ Make the absolute() function be smart about ".." in path names.
/ Elvis should recognize different paths to the same file. This is important
because some compilers mess up names (javac, for one).
The best solution here is probably related to the idea of giving each
window its own virtual current working directory. But that's more
than I was planning to do for 2.2. Instead, I can just make the bufname
option store the full pathname; then buffind() will find the existing
version of a buffer no matter how you express its filename.
/ Add g<Tab> -- move backward to previous link. Make GUIs map <Shift-Tab>
to g<Tab> if possible.
/ Include /usr/dict/words in the windows binary distribution.
/ Perl scripts aren't being recognized if they have no extension?
Merijn Brand tells me this is due to the fact that he sets the
magicchar and magicperl options to make elvis use Perl-like regexps,
but the default elvis.arf script file tries to recognize Perl scripts
by using traditional vi regexps.
There are two ways to solve this. One is by resetting the magicchar
and magicperl options to their defaults at the start of each script
or alias -- either hardcode the equivalent of ":lo mac=^$.[* nomap"
or add a new OptLocal autocmd event to make it configurable.
The other way is to add a special metacharacter which forces the
remainder of the regexp to be parsed using traditional syntax, and
then add that metacharacter to the start of the regexps in elvis.arf.
I'm thinking \V would be nice. Maybe also support \Q...\E quoting?
/ When pasting chars into an empty buffer, add a newline first. This is
particularly important when pasting via the GUI, but it may also be
important for pasting between buffers.
/ When searching for tags: if there are both a macro and a function with the
same tag name, use the function first. This should probably be both an
optional flag in ctags, and the sorting behavior or :tag and the ref program.
What if I just initialize the heuristic tables with a higher
preference for functions initially? I'd need to do this in both
"ref" and "elvis".
/ Add "color emphasized like bold" somewhere, for the benefit of syntax
Fixed a different way: Since syntax coloring fonts should be given
names that reflect their intended purpose, I modified elvis.syn to
use other font names, and then added "color" lines to define the
default appearance of those fonts.
/ Termcap "transparent" background doesn't work with Eterm. If some text
uses a different background, then the display code doesn't switch back
to normal afterward.
Fixed in 2.2d-alpha:
/ The "howto.html" file doesn't look good in Netscape. This is due to the
ugliness of the non-elvis <dt><dd> list.
/ The "showspell" option shouldn't suggest natural words where only tags are
allowed. For example, when editing source code, it shouldn't suggest natural
words when the cursor is on a variable.
/ The newbuffer() function and :file command can both create different buffers
with the same bufname. So can writing an anonymous buffer out to a file.
/ Change the "showname" and "showtag" options' display formats to prefix
their value with "file=" or "tag=" -- there are so many different things
that can be shown down there that it can get confusing. Oh, and maybe
rename "showname" to "showfile".
/ Make :mkexrc save aliases.
? Occasionally, elvis will mess up the session file. When this happens, the
screen looks normal but the cursor doesn't move correctly. I think this is
a recent bug -- added after 2.2d.
Maybe this has something to do with the message queue? Elvis doesn't
allow buffers to be modified while a scan operation is pending. The
(Elvis message queue) buffer is used for queuing messages, so it is
modified each time a message is generated.
FIXED? There was a bug in the indentation code, used by the shift commands
and autoindent, among other things. It was mixing scan operations
with changes. Also, wordatcursor(), used by the spell checker among
other things, was sometimes neglecting to free a scan context when
it was done, which eventually caused large numbers of scan contexts
to accumulate.
/ Need a way to fire off commands when certain events happen. Maybe vim's
":au" command, or something related to the :gui command which already runs
events for GUI events. Combine them somehow? The immediate goal is to
provide a way for a [buffer] menu to change when buffers are created or
/ In XFree86 4.0, the "x11" interface's toolbar hints have an extra character
on the end -- maybe not trimming newline?
/ Maybe add "transparent" as a termcap background color -- it will just
reset the colors via \E[m and then not set a background. This will allow
you to specify some background colors while still leaving others set to
the default. It won't always look good, but it is another option.
/ Under XFree86 4.0.3, the image under the cursor doesn't appear to be saved
before the cursor is drawn. On the next blink, it get screwed up sometimes.
This also affects selections.
/ If multiple tags are found with equal sorting values, then sort them by
the timestamp of the file where the tag is defined. Do this in ref, in
addition to the built-in tags searcher. Use dirtime() to find the
timestamp... but will that cause problems in ref?
/ osunix/osblock.c shouldn't trust the access() function, because broken
links look like nonexistent files to it. It should instead try calling
open(..., O_RDWR|O_EXCL). Also, think about what happens when blkopen()
fails, because currently it leaves the tty in "raw" mode.
/ Windows patch from Mauro Persano: Use GetModuleFileName() to get the full
pathname of the winelvis.exe file, if possible. This should be more
reliable than explicitly searching the path (though it will still search
the path if GetModuleFileName() fails).
/ Spelling bug: If a word is known to be bad or incomplete, then any words
that can be derived from it via suffixes will be considered good. I.e.,
the suffix test only checks whether the base word is known, not whether it
is good.
/ The showspell option doesn't update the status line correctly when running
in the termcap user interface. It isn't updated as often as it should be.
Specifically, it is only changed from empty to suggestions. (Scrolling
causes it to be empty, briefly.)
This is exactly the way other status messages work, but other status
messages aren't sensitive to the cursor position. The genlastrow()
function will need to be extended to clear the last row before the
next update, if it is displaying alternative spellings.
/ The "gs" command complains about words that start with digits.
/ Spell checker bombs on words longer than 100 characters. Any word that
long should be assumed to be misspelled, and not have any suggested
/ With incsearch set, elvis could dump code on some partially-entered
regular expressions, such as "/[^[".
/ In expressions, allow $_ to be used as a synonym for line(). Allow $ before
options, too. This would make Perl users happy.
/ Can't yank from a locked buffer?
/ Change the description of makeprg and ccprg, to include a description of
how to add double-quotes around $2.
/ Odd things happen when you edit a filename that looks like a file number.
E.g., ":e 1". It can clobber an existing buffer.
/ d/regexp/+0 retains the line containing regexp, but should delete it.
/ Spelling gives false errors when sidescrolling is enabled -- partial words
along the left edge of the screen are flagged as being incorrect.
/ Speller should skip over words that begin with a digit.
/ Could incremental searches be smart enough to skip searching if more
keys are in the type-ahead buffer? That might avoid some useless search
? How to dump core: 1) start editing an existing file, 2) run ":make",
3) run ":("Eel)sp", 4) run ":!ref ...".
? The :configure alias doesn't work when there are spaces in the
directory names.
/ Create a script that map's vim's commands to the corresponding elvis commands
including the following:
rX changes each non-newline to X [:map select r g=]
x Delete (like d) [:map select x d]
U make uppercase [:map select U gU]
u make lowercase [:map select u gu]
~ toggle case [:map select ~ g~]
J Join whole lines (like :join) [:map select :j^M]
^] Tag search, for highlighted text [:map select ^] y:ta ^P^M]
R Change whole lines (same as S)
o Go to other end
O go to other edge of rectangle
/ Allow v/V/^V to change the type of a pending selection.
/ When a rectangular selection is pending, $ should cause it to extend all
the way to the end of each line.
/ New motions for v/V/^V selections:
g% go to other end of selection (same as vim's o)
g^V go to other vertical edge of rectangular selection (vim's O)
/ :>> doesn't shift twice, but should.
/ The :join command doesn't work correctly when multiple lines are visually
selected -- it still joins just the current line & following line.
/ Wasn't there a window() function? There should be!
/ Describe why "-Gx11" is needed when adding elvis to an X start menu in Linux.
/ ":help ^Wd" doesn't work. Apparently multi-key vi commands aren't
recognized by the viname() function.
/ Speller dumps core if a spell_t node has a max=255. That's a valid Latin-1
letter, but it messes up some loops that use a CHAR as a counter, since
the counter can never be incremented past 255.
/ Support keyboard timeouts (the usertime option) in the "x11" user interface.
/ If the "find next misspelled word" command is used with a count, and the
cursor is on a misspelled word, then use the count'th corrected spelling.
For example, ^K moves to a misspelled word, and 1^K uses the first
suggested correction.
/ Need to support 'g' commands, so we can standardize keystrokes for spelling.
/ g0 go to leftmost char in current row (for wrapped lines)
/ g^ go to first non-whitespace char in current row (for wrapped)
/ g$ go to rightmost char in current row (for wrapped lines)
/ gj move down to same column of next row (next line, or next row
of a long wrapped line)
/ gk move up to same column of previous row.
/ gd go to local definition of word that the cursor's on (first
mention within the current function).
/ gD go to global definition of word that the cursor's on (first
mention in the current file).
/ gI like "0i"
/ gJ join lines without space, like ":join!"
/ gU operator, makes text uppercase
/ gu operator, makes text lowercase
/ g~ operator, makes text lowercase
/ ga show ascii code of current char in ascii, decimal, hex, octal
/ gh move left, skipping hidden characters (for markup modes)
/ gl move right, skipping hidden characters (for markup modes)
/ g=X operator, replaces text characters with X
/ gs go to next misspelled word. If given a count, then before
moving, replace the current word with the count'th alternative
/ gS go to end of current spelling word. (Useful for cgS, if none
of the alternative spellings are correct.)
The first task is to create a means by which these commands can be parsed.
Probably this should be a second table, similar to the vikeys[] array in
vi.c. An extra BOOLEAN flag in the vi input state will indicate whether
the main table should be used, or the g table.
Then I can start implementing the actual G commands. Some will be easier
than others, but none should be terribly hard... except gv.
/ Make sure invalid g commands are rejected safely.
/ Make sure valid ones are recognized.
/ Make sure ":help gs" works.
/ For operators, make sure "g~g~" and "g~~" both change the whole line.
/ Verify that g=x works for motions, text objects, and selections.
/ Verify that other operators work for motions, text objects, and selections.
/ Make sure changes can be undone.
/ Make sure . can repeat all of the commands that change text.
/ Elvis hangs on :%s/\( ,\)\+//g
This turned out to be due to a recently introduced bug in non-greedy
closure operators: They weren't checking the minimum number of
/ When incsearch is set, ":map! >^[?<^Mye" dumps core.
For backward incremental searches, the regexp's leavep field wasn't
being saved.
/ Elvis hangs when hlsearch is set, for any regular expression which could
match a zero-length string.
/ WinElvis doesn't update the screen correctly if it scrolls while part of
the window is off-screen.
/ Allow :map to support more flags, in addition to "visual". Some specific
words that would be handy are:
command Map works in command mode
input Map works in input mode on a normal buffer
history Map works in ex and regexp history buffers
motion Map works when a motion is expected after an operator
select Map works when a visible selection is pending
noremap Don't expand maps in in rhs
:map doesn't imply any of the "Map works..." modes, but if no modes are
specified then it'll default to "command history motion". :map! implies
"input history". Note that these are compatible with traditional vi,
and aliases can be used to make :map act like vim's mode-specific mapping
To keep the map table clean, there are two ways a new entry can affect
an existing entry:
1.If the LHS matches an existing entry and some of the contexts are the
same, then the existing entry should have those contexts removed. If
this means the existing map doesn't have any contexts left, then it
should be deleted.
2.If the LHS matches an existing entry, and the RHS also matches, then
the existing entry's contexts should be merged into the new entry's
contexts, and the existing entry should be deleted.
The new entry is always added, regardless.
Also, make sure that if the rhs starts with the lhs, then that portion
is never subjected to remapping.
The keywords should be allowed before either the lhs or the rhs. Elvis
has always supported "visual" before the rhs, but putting these before
the lhs is more convenient in an alias. To support this, the :map command
can't depend on the ex parser to separate the lhs from the rhs, which seems
Abbreviations are similar to maps. Although the flags used with maps
don't really apply to abbreviations, there is a chance that the map changes
could break the abbreviation table, so abbreviations should be tested too.
Fixed in 2.2c-alpha:
/ The command ":map! X visual J" doesn't work. ":map! X visual :normal J^M"
sort of works, but it looses the whitespace.
The first map should work now, but it'll work exactly like the
second one -- without any whitespace between them. I figure
that's probably close enough.
/ One user reported that ^V{motion}d deletes text okay, but then pastes it
all on one line.
This happens when you're near the end of the buffer. The pasted rows
from a rectangle can only be pasted into existing lines.
/ Either the "fold" color or "spell" color isn't being allocated correctly.
Elvis mixes them up.
The "fold" color was being allocated the first time a fold was
displayed -- which could be after some spelling errors have been
highlighted via a temporary color, hence the confusion.
/ Should autowrite write files before :make, like vim does? Yeah, I guess so.
/ Allow text object to work with the V/v/^V commands. This is important!
For example, "Va{d" deletes a block using whole-lines. There is no other
way to do that; "da{" and "%d%" both do character deletions, not line
/ Modify the behavior of ":set! option=value" so it changes the default value.
I.e., store the new value as the default, and ONLY if the options wasn't
explicitly set before it should change the actual value. This should never
set the option's OPT_SET flag, but may reset it if the new default is the
same as the current actual value.
This is about half-done now. In its present state, there is a
bug in the way it decides which options to specify in .elvisrc.
Keep the desc->dflt pointer. Leave it NULL for most options,
indicating that they've never been set. When an option is set
via ":set" (no !) then store the old version as desc->dflt. When
set via ":set!", then store the new version as desc->dflt. There
is never any time when we take a snapshot of all options' values
and call those the default.
/ In html mode, $ moves to the start of the following line, but looks like
the start of the current line. BOTH ARE WRONG! It should move to the
last character on the current line.
/ In visual mode, typing :<enter> should do nothing. Currently it prints
the line and advances. (Patch supplied by Derek Peschel.)
/ ":vi +line" ignores the line when there's no filename.
/ Regexp changes:
/ Add a new "magicchar" option which lists the chars that don't need to
be preceded by a backslash in order to be considered metacharacters.
/ Modify the !\x notation (backslash in an alias parameter) to support
the new magicchar option.
/ Make the regexp error messages use \ only where needed.
/ Add support for alternation, the \| metacharacter.
/ Add support for using closure on complex subexpressions.
/ Add metacharacters for edge of a word: \B for not-an-edge, and either
\b or \h for edge.
/ Add an option to choose the meaning of \b. And eventually \uXXXX.
/ Add an option that disables Perl-style $name substitution.
/ Support $name substitution in replacement text of :s/re/text/ command.
/ There should be a way to handle Perl POD text as formatted text. Basically
this would require everything from =head1 through =cut to be treated as a
big comment in the "documentation" font. It probably isn't worth the effort
to do anything special with markups within POD text, since elvis won't be
used as the formatter, just the editor. There should be a line in the
elvis.syn file to indicate that the language uses POD, and what starts &
ends it -- "documentation =cut", where "=cut" ends it, and anything that
starts with "=" starts it.
/ Modify PostScript to automatically detect size of paper.
Use "clippath pathbbox" to obtain the drawing boundaries.
/ Link error when config.h contains "#undef FEATURE_TEXTOBJ"
This is because it also used "#define FEATURE_HLOBJECT", which
requires text objects. I fixed it by making "elvis.h" define
/ Allow <Shift-Arrow> to select text, like in most Windows programs.
/ For WinElvis
/ For XElvis
/ Need a way to distinguish between variable names and other unclassified
text, in a syntax-colored buffer. Perhaps this is another use of the
"initialtoken" option. Or a "mostly" option, which allows individual
languages to be configured to use something other than "variable" for
unclassified words.
This is more important now, because spell-checking of variables is normally
disabled, but in "syntax html" mode all words look like variable names.
/ The "syntax" display mode allows single characters to be declared as
keywords (for example, to change their font), but if you do that and also
use the character in a "useregexp" list, then the *character* is marked as
preceding regexps, but the *keyword* is not.
/ The "showlink" option has the weird side-effect of making the current word
be displayed on the status line, while in "man" display mode. Harmless,
but very odd.
/ The :browse and :sbrowse commands are broken -- the links don't work.
This also affects the :kwic alias. Apparently, somehow elvis lost the
ability to handle file:...?command URLs.
/ Can't use incsearch as the target of an operator.
Maybe disable "incsearch" when searching is used as the target of
an operator. That should be easy to do, and would probably be
satisfactory to most users.
/ Incsearch doesn't set "wantcol" -- after a successful search, hitting j or k
will cause the cursor to jump to its previous column, instead of staying in
the same column.
/ In incsearch mode, the new $name variable interpolation doesn't work.
The fix for this will probably involve calling regbuild() function,
since that's where $name is implemented. And if we're going to be
calling that, then we might as well support the search flags too.
/ The visual command "/$" moves the cursor to the newline character, instead
of the last character in the line.
/ Need a clean way to allow HTML files to be displayed initially in either
"syntax" or "html" mode (whichever the user prefers). Currently, all the
user can do is modify elvis.arf to set bufdisplay differently. This isn't
good enough because setting it to "syntax" inhibits the ^Wd command, and
may also affect some other commands.
Added an "initialsyntax" buffer option, and a global "prefersyntax"
option which is used to set "initialsyntax" automatically via the
elvis.arf script.
/ Maybe add a "mkexrcfile" option. String, defaults to "". If set to some
other value, then that's where :mkexrc writes by default, and :mkexrc is
allowed to overwrite that file if it exists. Whenever :mkexrc writes a
file anywhere, it first sets mkexrcfile to the file name, so that the same
file can be overwritten easily.
The :cd command makes this dangerous.
/ In incsearch, ^V can't be used to escape control characters.
/ "hlsearch" and "selection" fonts don't mix well. The foreground color
is lost, at least with the "x11" interface.
/ Change the way "Elvis custom initialization" (for :mkexrc) is updated.
Only consider updating it if the event counter has changed, so that complex
initialization scripts only update it once. The :mkexrc command regenerates
the buffer before writing, just to be sure it is up to date.
Ideally, it should be updated from event.c, near the end of each event
handler function. The ex.c file should simply set a flag indicating that
the update is needed.
/ Need an easy way to store regexp text in variables. Suggest Perl's $name
or ${name} notation.
/ In expressions, make ":" operator concatenate path elements, using the
OS-specific path delimiter (either ":" or ";"). This shouldn't interfere
with its use in the "?:" ternary operator.
/ The :normal command has a bug. The second invocation causes a core dump,
at least when used inside an alias. This prevents the :spell alias from
/ Modify the "x11" gui to support font names of the form "font*size", like
the "windows" gui already does. Rename "normalfont" to "font".
/ The cfmt alias is broken. It seems to think all comments are C++ comments.
Perhaps the error status of :s/// has changed? I know I fixed the :g//s///
behavior recently.
/ Folding interferes with <PgUp>/<PgDn>.
This is probably because the dmnormal.move() function doesn't
handle folds when the absolute value of the linedelta is > 1.
/ The :help command should allow = at the end of n option name.
/ It would be nice if the "aL" text object ignored preprocessor lines, the
same way that it ignores blank lines.
/ In arithmetic expressions, using a regular expression as a function argument
sometimes causes core dumps.
/ In incsearch, /<Enter> and ?<Enter> don't repeat the previous search.
/ The "autoselect" option was recently broken.
/ hlobject updates are too optimized. If multiple windows, it won't always
update the highlight range even after the cursor has moved outside of the
highlight region. Setting nooptimize hides this bug. It seems to go
away if there is only one window. Maybe it is confused about the "current
Serious quirks in screen updates while editing, too.
/ Add an error message when a script contains an unterminated {...} block.
Also, warn users to enclose the hlobject value in quotes so "a{" doesn't
cause the parser to become confused.
/ Does hlobject sometimes cause foreground colors to be lost?
Merijn Brand:
If hlo/hll is on and the block (on the first level) is rather
large, the block is backgrounded with the appropriate color, but
the syntax highlighting of the bottom half of the screen
disappears. I realize this a weak which is rather
hard to verify, but I've not come up yet with a
Here's one way to reproduce it: ":man pcre".
This is almost certainly an example of using up all of the colors,
so any attempt to merge two fonts returns just one -- the hlobject<N>
font. Why are so many fonts being used, in such simple contexts?
/ <Enter> doesn't advance the cursor.
/ In incsearch, /\ will hang elvis.
/ After an incsearch is cancelled, hide the status info.
/ To support highlighting of whole lines, allow the hlobject value to use
a 'V' prefix, as in `:set hlobject="Va{"'
/ Some objects cause core dumps, if the buffer is empty. This is most critical
when you have "set hlobject=a{" in your .exrc file.
/ Shouldn't draw guide lines on ~ rows after last line of file.
Fixed in 2.2c-alpha:
/ Still need to implement "boxed" text in "windows" printer. Also, the screen
needs to support COLOR_LEFTBOX and COLOR_RIGHTBOX, plus the "guide" color.
/ :g/re1/ s/re2/text/ stops at the first line which contains re1 but not re2.
/ Syntax descriptions aren't being cached correctly.
/ "/\@" only looks for the first letter (anywhere in the found word), even
though ^A still searches for the whole word.
/ Add vim's :normal command. When invoked without arguments, it can still
switch to "normal" mode for backward compatibility.
/ The "syntax" display mode should allow tabs between the function name
and the ( character.
/ Here's a weird bug: When running "elvis +make", sometimes the screen
is cleared to a funny color during compilation, and then when the cursor
has moved to the first error and is responding to keystrokes, it is
stuck on the second-to-last line (just above the status line). This is
*not* open mode -- Hitting <z><z> fixes the scrolling. One big clue: screen
updates are very slow, as though it was redrawing the whole buffer from the
top each time.
/ ":color selection" can only set attributes, not colors.
/ In the manual, the <title> sections all say "Elvis 2.1".
/ Backspacing while in indentation with autoindent is very quirky. Apparently
it moves the cursor back too far, when the shifting operation doesn't delete
as much as it might in some other context. It only occurs when smarttab is
/ The showlink option is slow if there are no <a ...> tags shortly before
the cursor position. It should probably stop looking if it sees a tag
which is a paragraph/section marker.
/ Many web pages uses non-Latin1 characters for quote marks and such. Perhaps
":set nonascii=hack" should translate the illegal characters into legal
ones. It might also be nice if nonascii characters could be flagged with
a distinctive font, too.
0x85 :
0x91 `
0x92 '
0x93 "
0x94 "
0x96 -
/ The command "/[[:space]]" (without the second ":") causes a core dump.
/ The "termcap" interface's graphic chars don't work? Since when?
Actually, it works but rxvt doesn't support graphic characters when
using the Sony "12x24" font, because that font doesn't have graphic
characters in the usual places. xterm works around that, but rxvt
apparently does not.
/ Regular expressions should support \x notation inside character lists
(the [] notation).
/ Revise the way the "draw.c" module compares the old screen image to the
new one. Instead of storing the old font code, it should store the old
font's attributes: foreground RGB, background RGB, and bits. The new
screen image should continue to store the font code though; we need it
to find the color code for the RGB values. This solves the following
o Temporary font codes are recycled after the screen image has been
updated, so we don't know what attributes it had.
o Some attributes (such as guides and box-ends) are synthesized inside
"draw.c", and are not stored in any font code (temporary or permanent).
Synthesizing them this way requires code to be scattered throughout
"draw.c" instead of collected in reasonable places, and it also limits
the efficiency of updates.
This requires replacing the di->curfont array or 1-byte codes with a
di->curattr array of 8-byte attribute bundles. It also requires some
changes inside draw.c, because the way fonts are stored and compared
will be changed.
display modes store the font code of the start of each line. That code
could be temporary. A separate solution should be found for that.
/ Another good idea: Add guide lines -- vertical lines superimposed at
certain column numbers, configurable for each window (or for each buffer?).
Multiple guide lines should be supported.
This should be implemented as a new "guide" option, whose value is a
comma-delimited list of widths. Ideally, the "tabstop" and "shiftwidth"
options should be modified to use the same type of values.
/ Modify the way "boxed" text is drawn. In addition to the basic "boxed"
attribute, it should also pass bits indicating whether the top, bottom,
left, and right edges should be drawn.
This would be more complicated than it sounds. Characters could
be forced to be redrawn even if they haven't changed. Strings of
characters that are all in the same font could be forced to be
drawn in different gui->text() calls, because some use the top/bottom
edges and some don't.
A simpler alternative might be to pass in separate bits for the
left & right edges (of the entire chunk of text, not each character),
but always draw the top & bottom whenever boxed text is drawn. This
would also give an easy, portable way to draw the guide lines.
/ Extend the :color command to support an "or <colorname>" clause. If the
<colorname> has a higher contrast against the background than the current
color, then then use it; else ignore it. This would allow commands such
as ":color prep light green or dark green" -- if the background is light,
preprocessor directives would be dark green; if the background is dark,
they'll be light green.
This *might* not need to store the color that isn't used; the command
string would be enough. The only time this would cause problems would
be if the foreground was inherited but the background was specified, and
the specified background happened to be close to the foreground. Elvis
couldn't choose the alternate color then, because it would have forgotten
what it is. Perhaps that's a good thing though -- easier to understand.
Storing only the chosen foreground and background would also allow more
than one alternate foreground to be specified. For example, on a green
background, "light green or dark green or pink" would select pink.
This would work best if the background color was always parsed first, so
"white or black on white" would always resolve to black on white, even if
the inherited background would have been black. THIS PROBABLY ISN'T
IMPORTANT since the "or <colorname>" clause is unnecessary if you're
forcing it to use a known background anyway.
The :lpr command would always choose colors with the assumption that the
background is white. This is actually trickier than it sounds -- colors
are only selected when a :color command is given, not when some other
factor causes backgrounds to change. So :color would need to compute
both the video foreground and the lpr background, and store them both.
/ "ref write" hangs.
/ The guimoveto() function calls (*gui->moveto)() even if it is NULL.
/ The readeol option is recalculated by lib/elvis.brf even if the buffer
already exists. That's wrong; it should leave the option unchanged.
Also, maybe make -b force binary I/O. Suggested by Alexandros M Manoussakis
/ Some changes to :color
/ Allow "+=" to merge new attributes into old attributes.
/ Maybe allow "-=" to support removal of attributes. This is a little
tricky for colors and fixed/proportional.
/ After "+=" or "-=", synthesize a new string which configures all of
the set attributes in a single statement. This is required for :mkexrc
to work reliably, and for ":color" to list complete attributes. Doing
this will require foreground & background color names to be stored.
/ "3ofoo^[" will insert 3 foo's, but they'll all be on the same line. They
should each be on a separate line. (This also affects the . command.)
Actually, the standard "o" command doesn't accept a count. But if
elvis' version does, its behavior should be more intuitive that it
currently is.
/ When :a or :i has text on the command line (instead of following), it
leaves the cursor on the line below the inserted text, instead of on the
last line of the inserted text.
/ Create a "showlink" option which displays (on the status line) the value
that tagatcursor() returns. This would be nice in "html" mode but a pain
in normal mode, so perhaps it should be a display option. Either that, or
make it sensitive to the same thing that changes the <Enter> key's behavior.
This option would be tested in the draw.c module, so making it a
display option would be awkward. Make it global and check for the
<Enter> key thing (i.e., check whether display->tagnext is defined).
Fixed in 2.2b-alpha:
/ In "man" display mode, any blank lines before a .P or similar command will
confuse elvis, preventing you from moving the cursor upward over a paragraph
/ The :browse and :sbrowse commands need to be tweaked. They contain a
work-around for a minor bug in the "html" display mode, but that bug has
now been fixed, so the workaround (an extra space after <pre graphic>)
should be removed.
/ Modify lowline() and lowoffset() so that if looking for a line near the end
of a block, the newlines are counted from the end of the block instead of
the beginning. That should be faster.
/ Add an "%%Orientation: Landscape" comment to ps2 output after "%%CreationDate"
/ UNC ("\\host\dir\file") names still don't work correctly under Windows.
This turned out to be due to a bug in the way elvis was checking
Cygwin's mount table. The bug only affected Cygwin users who had
something mounted as "/". For example, if "C:\" was mounted as "/"
then "\\host\dir\file" was being interpreted as "C:\host\dir\file."
/ On terminals with "brain damaged newlines" (the :xn: termcap flag),
modifying the last column on a line would have unpredictable results.
/ Add color support to the "html" lptype. <font color="#rrggbb">...</font>
/ Can't print HTML documents via "-c" anymore? It dumps core.
/ lptype=html produces bad output. ">" is output as "&gt" without a ";".
Also, since 2.2a-alpha, it has been changing the font for each character,
instead of only between fonts.
/ Bug: Can't interrupt elvis with ^C or anything else, with any interface.
/ New features for searches:
/ 'i' flag for ignorecase, 'c' for noignorecase, 's' for smartcase.
/ 'w' flag to imply \< \> around regexp.
/ 'x' flag to imply ^ $ around regexp.
/ Vim's smartcase. Regexps that contain any uppercase letters force off
the "ignorecase" option temporarily.
/ Support for \i and \I character classes. \I is any char that can start
an identifier, and \i is any character that can appear later in an
/ Vim's hlsearch option -- highlight *ALL* matches, without selecting them.
/ From Merijn Brand:
Something is broke in syntax highlighting. Try this on an excerpt from
the ColourChooser module [using ":display syntax perl"]:
$colour[1] =~ s/\s+//g ; # Colourname
$colour[2] = lc $colour ; # colour name
$colour[3] = $colour[2] ;
$colour[3] =~ s/\b(\w)/\u$1/g ; # Colour Name
$colour[4] = $colour[3] ;
$colour[4] =~ s/\s+//g ; # ColourName
for my $i ( 5..9 ) {
$colour[$i] =~ s/\d+$// ; # Remove trailing digits
and see what happens :-( to the first line.
now change the s/\s+//g to s/\d+//g. Ooooops!
/ ":color role1 like roll2 etc" includes all following text in the "roll2"
name. The "roll2" name *SHOULD* be exactly one word long every time.
/ On last line of a file, do "$v^=" to evaluate an expression. The expression
is stored on the last line, but the final newline is missing.
/ Add a :safely command. It temporarily sets the safer flag (like :safer)
while executing the rest of the line as an ex command (like :try or :then).
This would be handy if the "ex" protocol was implemented via a :readex
alias -- the alias could be smart enough to make "ex" links safe.
/ Add the :push command already! Like :e, except that it saves previous
position on the tag stack.
/ In "windows" GUI, after ":set number" you can't highlight whole lines via
the mouse. (The strip along the left edge of the window goes away?)
/ In "x11", the scrollwheel only works right in the text area. Other windows
treat it like any other mouse click. All wheel events should be treated
as though they occurred in the text area.
Fixed... but the statusbar never requests mouse events, so that area
is dead to scrollwheel events too. That's okay. I mostly wanted
to make sure scrollwheel events wouldn't do anything disastrous in
the toolbar.
/ Add a new() function, which creates a buffer but not a window, and returns
the name of the buffer. Optional argument is a desired buffer name, else
it uses "Elvis untitled %d".
This is the first time that functions will have side-effects. If you want
to evaluate an expression without displaying the result, just to get the
side-effect, then you could use the :if command without a :then.
/ "make clean" should remove the executables.
Fixed in 2.2a-alpha:
/ Font/color changes:
/ Support the new :color syntax
/ :color can add other attributes: bold, italic, underlined, boxed, fixed.
/ This only specifies *CHANGES* to colors or attributes. Unspecified
colors are retained from previous font. Attributes are ORed.
/ Limits: 128 font names (so we can have standout versions).
/ Each font is stored as a struct containing a pointer to its name,
fgcolor index, bgcolor index, attribute bitmap. The name-to-index
conversion can be slow -- it is only used when a display mode initializes
/ When constructing a new screen image, for each character we store a font
index, optionally with a bit set to indicate a selection. This is compact
and should be good enough when comparing images.
/ After an image is generated, it is combined with the "normal" font to
inherit from it any colors/attributes which are not explicitly set.
elsewhere. The can also be an "idle" font.
/ Change all display modes to use new font convention.
/ Change all GUIs to use new font convention.
(Except "vio", for now.)
/ Change all printer drivers to use new font convention.
(Except "windows" is untested.)
/ Update the manual.
/ In input mode, make ^Z move rightward across any backspaced text, keeping
it instead of deleting it.
/ Change the version number to 2.2a-alpha
/ Add smartargs option for displaying a function's arguments.
/ Modify "ref" to look through elvispath. Put a file of ANSI C stubs into
elvis' lib directory and generate a "tags" file from it. This will allow
"ref" to act as a reference for the standard library.
Jump to Line
Something went wrong with that request. Please try again.