Long time no see
Friday, October 28th, 2005I’ve been swamped with work in the past few days, so I didn’t have any time to blog. But just yesterday I made available the first alpha version of ViEmu 1.3, which provides a single star feature: regular expressions and ex command line emulation. This means my regular expression engine is working nicely (on top of my encoding-independent C++ string template class!). And that ViEmu is starting to bring the full power of vi/vim to Visual Studio. I hope to iron out the remaining bugs and release it to the public around next week.
I think I will have be having more time to blog starting next week, and I have a line up of stuff I want to blog about. Part of it thanks to Baruch Even who’s started the very nice Planet uISV blog aggregator (be sure to check it out if you’re interested in other small software shops and start-ups!).
Visual Studio 2005 has just been released (finally!) and I’m downloading it through msdn subscriptions, but I already have news from some customer that the build I provide for VS2005-beta-2 seems to work nicely with it. I will finally prepare a version of ViEmu that installs dually to both VS.NET 2003 and VS2005. Some customers were already using ViEmu with VS2005 beta versions quite happily, but I had some “false positives” on ViEmu problems where VS2005 was actually the culprit – I hope everything of importance will be fixed now and I’ll be able to release ViEmu for VS2005 “officially”.
To finish this post, I’ll extract the information on what ViEmu 1.3 brings – be warned, it is for heavy vi users and regex experts, so skip it as soon as you have a doubt whether you’re interested in it.
Summary of what's contained in ViEmu 1.3-a-1: - Regular expression support for '/' and '?' searches - Command line editing, with command history (use the cursor arrows, BACKSPACE and DEL) - '< , '> marks for the last active visual selection - gv normal mode command to restore the last visual selection - The following ex commands: - :set - basic implementation allowing [no]ig[norecase]/[no]ic, [no]sm[artcase]/[no]sc, and [no]ma[gic] - :d - :[range]d[elete] [x] [count] to delete (x is the register) - :y - :[range]y[ank] [x] [count] to yank (x is the register) - :j - :[range]j[oin][!] to join the lines in the range, or default to the given line (or cursor line) and the next - :pu - :[range]pu[t][!] [dest] to paste after (!=before) the given address - :co - :[range]co[py] [dest] to copy the lines in range to the destination address (:t is a synonim for this) - :m - :[range]m[ove] [dest] to move the lines in range to the destination address - :p - :[range]p[rint] [count] to print the lines (send them to the output window) (:P is a synonim for this) - :nu - :[range]nu[mber] [count] to print the lines (send them to the output window), w/line number (:# is a synonim for this) - :s - :[range]s[ubstitute]/re/sub/[g] to substitute matches for the given regex with sub (do not give 'g' for only 1st match on each line) - :g - :[range]g[lobal][!]/re/cmd to run ':cmd' on all lines matching the given regex (! = *not* matching) - :v - :[range]v[global]/re/cmd to run ':cmd' on all lines *not* matching the given regex You can now use :g/^/m0 to invert the file, :g/^$/d to remove all empty lines, :%s/\s\+$// to remove all trailing whitespace, and use many of your favorite vi/vim tricks. In implementing the regular expression engine, I've gone through vim documentation and implemented everything there. There are a few things not implemented yet - I plan to add them later on. This is a summary of the implemented features (for now, you can look at vim's documentation for detail): - Regular matching characters - '.' for any character - Sets (full vim syntax): [abc], [^1-9a-z], [ab[:digit:]], ... (including '\_[' to include newline) - Standard repetitions: * for 0-or-more, \+ for 1-or-more, \= or \? for 0 or 1 - Counted repetitions: {1,2} for 1-to-2 repetitions, {1,} for 1-to-any, {,5} for 5 or less, {-1,} for non-greedy versions - Branches: foo\|bar matches either "foo" or "bar" - Concats: foobar\|.. matches the first two characters where 'foobar' matched - Subexpressions: \( and \) to delimit them ('\%(' to make them non-numbered) - ^ and $ for start- and end-of-line. (See the note on the limitation below) - \_^ and \_$ for s-o-l and eol anywhere in the pattern - \_. for any character including newline - \zs and \ze to mark the match boundaries - \< and \> for beg and end of word - Character classes: \s for space, \d for digit, \S for non-space, etc... and '\_x' for the '\x' class plus newline (all of them work) - Special chars: \n for newline, \e, \t, \r, \b - \1..\9 repeat matches - Regex control: \c to forece ignore chase, \C to force check case, \m for magic, \M for nomagic, \v for verymagic, \V for verynomagic Full [very][no]magic is supported. These are the vim regular expression features not yet implemented by ViEmu: - ~ to match last substitute string - \@>, \@=, \@!, \@< = and |@<! zero-width and dependent matches/non-matches - \%^ (beg-of-file), \%$ (end-of-file), \%# (cursor-pos), \%23l (specific line), \%23c (col) and \%23v (vcol) - optional tail "wh\%[atever]" - *NO PROTECTION* for repetitions of possibly zero-width matches, be careful! \zs* or \(a*\)* MAY HANG VIEMU!!! - ^ and $ are only detected as special at the very beginning and very end of the regular expression string, use \_^ or \_$ - \Z (ignore differences in unicode combining chars) Other limitations: - The :s replacement string does not yet understand the full vi/vim options, and cannot insert multi-line text. Only & and \1..\9 are recognized as special, and if some of them matched a multi-line range, only the regular characters will be inserted. You can't insert new line breaks by using \r either. - After-regular-expression displacement strings are not implemented ('/abc/+1' to go to the line after the match). - Ex-ranges accept everything (%, *, ., $, marks, searches) but not references to previous searches (\/, \?, \&) or +n/-n arithmetics. - The command line editing at the status bar looks a bit crude, with that improvised cursor, but it should make the ex emulation very usable. - :p and :# output is sent to a "ViEmu" pane on the output window.