Hi,

On 5/23/07, Michael Henry <[EMAIL PROTECTED]> wrote:
Tim Chase wrote:
> I think given those conditions (autowrite and nohidden), there seems to
> be no such way from my experimenting.  However, if you switch to using
> hidden instead of nohidden, you can do
>
>     :argdo u
>
> which will undo the last action in each argument.

I've been casually looking for such a feature, but so far I've come up a
little short.  After a multi-file search-and-replace, I'd like to be
able to undo the replace across the files.  The `:argdo u` command
almost does what I want, but I can't think how to restrict the undo
operation to changes made only by the replace operation.  For example,
suppose I create two files and edit them together:

     echo "first file" > first.txt
     echo "second file" > second.txt
     gvim first.txt second.txt

Suppose in first.txt I edit `first` to become `1st` using Vim editing
commands:

     cw1st<Escape>

Now I perform a search-and-replace to change `second` to `2nd`:

     :argdo %s/second/2nd/ge


Now I try to undo my most recent replace operation:

     :argdo u

I'd like this to undo only the change(s) made by the s/// command, but
it also changes `1st` back to `first`. Since the `u` is performed
indiscriminately in all arguments regardless of whether the s/// command
made changes there, I can't blindly use the undo trick to reverse an
arbitrary replace operation.

I've tried saving all buffers before doing the replace operation, but
`:argdo u` undoes past the save (which generally pleases me greatly, but
is unfortunate in this case :-)).

I searched for "replace undo" in Vim's plugins and tips, but came up
empty. Does anyone have a pointer to a plugin or other resource to allow
blind undoing of multi-file replace operations?


You can try using the gReplace Vim plugin:

http://vim.sourceforge.net/scripts/script.php?script_id=1813

Even though this plugin doesn't provide the "undo" operation across
multiple buffers, it allows you to interactively change a pattern
across multiple buffers/files and you can abandon the changes before
the buffers are updated with the change.

For example, to replace a pattern across multiple buffers, you can do
the following:

1. Execute the ":Gbuffersearch <pattern>" command. This will open
   a buffer with all the lines containing <pattern> in all the open
   buffers.
2. You can edit this buffer using the usual Vim editing commands.
3. Now you can execute the ":Greplace" command to incorporate
   all the changes made in the replace buffer back to the
   corresponding buffers.
4. To abandon making the changes, you can just close the replace
   buffer.

- Yegappan

Reply via email to