Vi/Ex: command line editor? - Yes!

Ian Phillipps ian at unipalm.uucp
Thu Mar 7 00:55:34 AEST 1991


hansm at cs.kun.nl (Hans Mulder) writes:

>In article <5104 at lure.latrobe.edu.au> ECSGRT at lure.latrobe.edu.au (GEOFFREY TOBIN, ELECTRONIC ENGINEERING) writes:
>>  :.,.+3s/some long expression/another long expression/g...
>>    OOPS!  I mistyped something.
>>  :BORING REPETITION WITH A ONE-CHARACTER CORRECTION
>>Command line editing for ex?

>Would be a great idea.  Definitely.

The following works with the C-shell. It was posted about two years ago
on Usenet, and the poster then said that its origin was lost in the
mists of time. Here goes:

You need an alias in your normal setup, thuswise:

	alias r source ~/cmd/redo

Type "r" and you'll be in "vi" open mode, editing the last command. You can
use any vi/ex commands (even go into visual mode): when you hit Return, the
current line will be executed by the C shell.

The "redo" file is as follows. **IMPORTANT NOTE** To avoid mangling in
the posting, I've replaced a Carriage Return with "^M" and an ESC with "^["
in ex's "map" command:

----cut here and replace control characters---
# Edit history list at line containing last command (open mode).
# Get up to 22 most recent commands.
# To work properly, put in .login:  alias r source /usr/local/bin/redo
# Author unknown.
history -h 22 >! /tmp/redo.$$

# Make CR map to :wq! and start ex quietly at 2nd to last line in open mode.
ex - '+map ^M :.wq\!^[|set redraw|$-1 open' /tmp/redo.$$

# Insert into history without executing.
source -h /tmp/redo.$$

# Clear out temporaries.
/bin/rm -f /tmp/redo.$$

# If thing chosen to redo is the redo alias itself then DON'T redo it.
if (!-2:0 != !!:0) !!
----cut here----

This works quite well with Sun's csh (which presumably is the original,
given who wrote csh :-) but doesn't quite manage it with some imitiations,
e.g. Interactive Unix V.3 . Even on the Sun it exposes a csh bug: if the
redone command is an alias, csh will moan that it can't find the command.
Doing a manual "!!" after that will work fine.

Method (2): using "vi" as a command shell:

My copy of vi will accept a map entry of the form:
	:map #n ms"syy at s`s
This will cause the current line to be read as a "vi" command: if that
command is ":r! ...", then you'll read in a unix command. I have this as a
permanent map entry!

Ian
--- What *is* a .signature file?



More information about the Alt.sources mailing list