> Sorry to piggyback on this one.
> Even though I do use macros and registers, sometimes I wish there was
> a way to copy the "last command" into a register after the fact. Is
> there?
> I also wish there was an easy way to edit my macros and registers.
> I've resorted to exiting vim, edit .viminfo, and resume editing the
> files again.
> Unfortunately (afaik) the last command is not saved in the .viminfo so
> I can't go and copy it to a register or just edit a long series of
> keystrokes.
Here is a patch to Vim that adds a , register which is basically access to Vim's
internal 'redo buffer' used when '.' is used. At a quick look, it seems to work.
You can thus save your '.' commands to another register and replay them later:
:let @a=@,
@a
I believe @, will have pretty much the same functionality as . except that it
won't automatically change the count or the register number like . does (nor
will
this happen if you save to another register, of course).
I wonder what Bram thinks about including this functionality in standard Vim? I
think it would be useful. What do others think?
Also, I haven't tested much. Testing and consequent feedback from others would
be
worthwhile. There may be issues with things not being escaped which should be,
etc.
Ben.
--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---
Index: runtime/doc/change.txt
===================================================================
--- runtime/doc/change.txt (revision 607)
+++ runtime/doc/change.txt (working copy)
@@ -1013,7 +1013,7 @@
2. 10 numbered registers "0 to "9
3. The small delete register "-
4. 26 named registers "a to "z or "A to "Z
-5. four read-only registers ":, "., "% and "#
+5. five read-only registers ":, "., ",, "% and "#
6. the expression register "=
7. The selection and drop registers "*, "+ and "~
8. The black hole register "_
@@ -1068,6 +1068,9 @@
doesn't work with CTRL-R on the command-line. It works a bit
differently, like inserting the text instead of putting it
('textwidth' and other options affect what is inserted).
+ *quote_,* *quote,*
+ ", Contains the commands that will be executed if the "." normal
+ command is used.
*quote_%* *quote%*
"% Contains the name of the current file.
*quote_#* *quote#*
Index: src/proto/ops.pro
===================================================================
--- src/proto/ops.pro (revision 607)
+++ src/proto/ops.pro (working copy)
@@ -18,7 +18,7 @@
int yank_register_mline __ARGS((int regname));
int do_record __ARGS((int c));
int do_execreg __ARGS((int regname, int colon, int addcr, int silent));
-int insert_reg __ARGS((int regname, int literally));
+int insert_reg __ARGS((int regname, int literally, int insert_mode));
int get_spec_reg __ARGS((int regname, char_u **argp, int *allocated, int
errmsg));
int cmdline_paste_reg __ARGS((int regname, int literally, int remcr));
void adjust_clip_reg __ARGS((int *rp));
Index: src/proto/getchar.pro
===================================================================
--- src/proto/getchar.pro (revision 607)
+++ src/proto/getchar.pro (working copy)
@@ -2,6 +2,7 @@
void free_buff __ARGS((struct buffheader *buf));
char_u *get_recorded __ARGS((void));
char_u *get_inserted __ARGS((void));
+char_u *get_old_inserted __ARGS((void));
int stuff_empty __ARGS((void));
void typeahead_noflush __ARGS((int c));
void flush_buffers __ARGS((int typeahead));
Index: src/getchar.c
===================================================================
--- src/getchar.c (revision 607)
+++ src/getchar.c (working copy)
@@ -225,6 +225,16 @@
}
/*
+ * Return the contents of the old redo buffer as a single string.
+ * K_SPECIAL and CSI in the returned string are escaped.
+ */
+ char_u *
+get_old_inserted()
+{
+ return(get_buffcont(&old_redobuff, FALSE));
+}
+
+/*
* Add string "s" after the current block of buffer "buf".
* K_SPECIAL and CSI should have been escaped already.
*/
Index: src/edit.c
===================================================================
--- src/edit.c (revision 607)
+++ src/edit.c (working copy)
@@ -7626,7 +7626,7 @@
do_put(regname, BACKWARD, 1L,
(literally == Ctrl_P ? PUT_FIXINDENT : 0) | PUT_CURSEND);
}
- else if (insert_reg(regname, literally) == FAIL)
+ else if (insert_reg(regname, literally, TRUE) == FAIL)
{
vim_beep();
need_redraw = TRUE; /* remove the '"' */
Index: src/normal.c
===================================================================
--- src/normal.c (revision 607)
+++ src/normal.c (working copy)
@@ -2427,7 +2427,7 @@
if ((State & INSERT) || !mouse_has(MOUSE_NORMAL))
{
if (regname == '.')
- insert_reg(regname, TRUE);
+ insert_reg(regname, TRUE, FALSE);
else
{
#ifdef FEAT_CLIPBOARD
@@ -2435,7 +2435,7 @@
regname = '*';
#endif
if ((State & REPLACE_FLAG) && !yank_register_mline(regname))
- insert_reg(regname, TRUE);
+ insert_reg(regname, TRUE, FALSE);
else
{
do_put(regname, BACKWARD, 1L, fixindent | PUT_CURSEND);
Index: src/ops.c
===================================================================
--- src/ops.c (revision 607)
+++ src/ops.c (working copy)
@@ -818,9 +818,9 @@
if ( (regname > 0 && ASCII_ISALNUM(regname))
|| (!writing && vim_strchr((char_u *)
#ifdef FEAT_EVAL
- "/.%#:="
+ "/.,%#:="
#else
- "/.%#:"
+ "/.,%#:"
#endif
, regname) != NULL)
|| regname == '"'
@@ -1313,9 +1313,10 @@
* return FAIL for failure, OK otherwise
*/
int
-insert_reg(regname, literally)
+insert_reg(regname, literally, insert_mode)
int regname;
int literally; /* insert literally, not as if typed */
+ int insert_mode; /* in insert mode; use old redo buffer
*/
{
long i;
int retval = OK;
@@ -1339,6 +1340,7 @@
regname = may_get_selection(regname);
#endif
+ if (insert_mode && regname == ',') regname = ';';
if (regname == '.') /* insert last inserted text */
retval = stuff_inserted(NUL, 1L, TRUE);
else if (get_spec_reg(regname, &arg, &allocated, TRUE))
@@ -1469,6 +1471,15 @@
EMSG(_(e_noinstext));
return TRUE;
+ case ',': /* redo buffer ('.' command) */
+ *argp = get_inserted();
+ return TRUE;
+
+ case ';': /* old redo buffer ('.' command),
+ * internal use only */
+ *argp = get_old_inserted();
+ return TRUE;
+
#ifdef FEAT_SEARCHPATH
case Ctrl_F: /* Filename under cursor */
case Ctrl_P: /* Path under cursor, expand via "path" */