]> granicus.if.org Git - vim/commitdiff
patch 8.1.0020: cannot tell whether a register is executing or recording v8.1.0020
authorBram Moolenaar <Bram@vim.org>
Tue, 22 May 2018 18:35:17 +0000 (20:35 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 22 May 2018 18:35:17 +0000 (20:35 +0200)
Problem:    Cannot tell whether a register is being used for executing or
            recording.
Solution:   Add reg_executing() and reg_recording(). (Hirohito Higashi,
            closes #2745)  Rename the global variables for consistency.  Store
            the register name in reg_executing.

13 files changed:
runtime/doc/eval.txt
runtime/doc/usr_41.txt
src/edit.c
src/evalfunc.c
src/fileio.c
src/getchar.c
src/globals.h
src/message.c
src/normal.c
src/ops.c
src/screen.c
src/testdir/test_functions.vim
src/version.c

index de4bb0260d4259487522a128e2214580f6faf16c..905074c8b99943e484007c19cdebc00032be1a6b 100644 (file)
@@ -2302,6 +2302,8 @@ range({expr} [, {max} [, {stride}]])
                                List    items from {expr} to {max}
 readfile({fname} [, {binary} [, {max}]])
                                List    get list of lines from file {fname}
+reg_executing()                        Number  get the executing register name
+reg_recording()                        String  get the recording register name
 reltime([{start} [, {end}]])   List    get time value
 reltimefloat({time})           Float   turn the time value into a Float
 reltimestr({time})             String  turn time value into a String
@@ -6558,6 +6560,15 @@ readfile({fname} [, {binary} [, {max}]])
                the result is an empty list.
                Also see |writefile()|.
 
+reg_executing()                                                *reg_executing()*
+               Returns the single letter name of the register being executed.
+               Returns an empty string when no register is being executed.
+               See |@|.
+
+reg_recording()                                                *reg_recording()*
+               Returns the single letter name of the register being recorded.
+               Returns an empty string string when not recording.  See |q|.
+
 reltime([{start} [, {end}]])                           *reltime()*
                Return an item that represents a time value.  The format of
                the item depends on the system.  It can be passed to
index 279dd20c7b74c466b8a8e3805b79db0ada067061..f891f441cfcb4cbbf502ac19d2f94401840efec2 100644 (file)
@@ -1018,6 +1018,8 @@ Various:                                  *various-functions*
        getreg()                get contents of a register
        getregtype()            get type of a register
        setreg()                set contents and type of a register
+       reg_executing()         return the name of the register being executed
+       reg_recording()         return the name of the register being recorded
 
        shiftwidth()            effective value of 'shiftwidth'
 
index ef4c98d29be131f0df90e788090c1de26eb06744..1ae8e2db44395878112631b4540b2e6250be88fd 100644 (file)
@@ -8698,7 +8698,7 @@ ins_esc(
      * When recording or for CTRL-O, need to display the new mode.
      * Otherwise remove the mode message.
      */
-    if (Recording || restart_edit != NUL)
+    if (reg_recording != 0 || restart_edit != NUL)
        showmode();
     else if (p_smd)
        MSG("");
index 46e55b3fd202eb08eca16fc46ec1a0f15f8d2559..90aa2efd50e1b08683d8ea62b27a2e4e0dd001a8 100644 (file)
@@ -306,6 +306,8 @@ static void f_pyxeval(typval_T *argvars, typval_T *rettv);
 #endif
 static void f_range(typval_T *argvars, typval_T *rettv);
 static void f_readfile(typval_T *argvars, typval_T *rettv);
+static void f_reg_executing(typval_T *argvars, typval_T *rettv);
+static void f_reg_recording(typval_T *argvars, typval_T *rettv);
 static void f_reltime(typval_T *argvars, typval_T *rettv);
 #ifdef FEAT_FLOAT
 static void f_reltimefloat(typval_T *argvars, typval_T *rettv);
@@ -754,6 +756,8 @@ static struct fst
 #endif
     {"range",          1, 3, f_range},
     {"readfile",       1, 3, f_readfile},
+    {"reg_executing",  0, 0, f_reg_executing},
+    {"reg_recording",  0, 0, f_reg_recording},
     {"reltime",                0, 2, f_reltime},
 #ifdef FEAT_FLOAT
     {"reltimefloat",   1, 1, f_reltimefloat},
@@ -8697,6 +8701,34 @@ f_readfile(typval_T *argvars, typval_T *rettv)
     fclose(fd);
 }
 
+    static void
+return_register(int regname, typval_T *rettv)
+{
+    char_u buf[2] = {0, 0};
+
+    buf[0] = (char_u)regname;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = vim_strsave(buf);
+}
+
+/*
+ * "reg_executing()" function
+ */
+    static void
+f_reg_executing(typval_T *argvars UNUSED, typval_T *rettv)
+{
+    return_register(reg_executing, rettv);
+}
+
+/*
+ * "reg_recording()" function
+ */
+    static void
+f_reg_recording(typval_T *argvars UNUSED, typval_T *rettv)
+{
+    return_register(reg_recording, rettv);
+}
+
 #if defined(FEAT_RELTIME)
 static int list2proftime(typval_T *arg, proftime_T *tm);
 
index d34605ca78e9b6241946318e59427b0e906020d2..428e40824935e5923123706cf2ed8fc8b4818a75 100644 (file)
@@ -9274,7 +9274,7 @@ trigger_cursorhold(void)
 
     if (!did_cursorhold
            && has_cursorhold()
-           && !Recording
+           && reg_recording == 0
            && typebuf.tb_len == 0
 #ifdef FEAT_INS_EXPAND
            && !ins_compl_active()
index 1f7c7d1be62008a2edf174af0e08ad0d92675c39..ddb23dd5c1465981db34f7586365b209ea4ae263 100644 (file)
@@ -1244,7 +1244,7 @@ gotchars(char_u *chars, int len)
     int                todo = len;
 
     /* remember how many chars were last recorded */
-    if (Recording)
+    if (reg_recording != 0)
        last_recorded_len += len;
 
     buf[1] = NUL;
@@ -1254,7 +1254,7 @@ gotchars(char_u *chars, int len)
        c = *s++;
        updatescript(c);
 
-       if (Recording)
+       if (reg_recording != 0)
        {
            buf[0] = c;
            add_buff(&recordbuff, buf, 1L);
@@ -2007,7 +2007,7 @@ vgetorpeek(int advance)
     init_typebuf();
     start_stuff();
     if (advance && typebuf.tb_maplen == 0)
-       Exec_reg = FALSE;
+       reg_executing = 0;
     do
     {
 /*
index d5320d7272dd6801bcdc36d0c73e836579fae96b..22199c90a6f60f394f1dd19ccaa50f6c4145ae28 100644 (file)
@@ -933,8 +933,8 @@ EXTERN long opcount INIT(= 0);      /* count for pending operator */
 EXTERN int exmode_active INIT(= 0);    /* zero, EXMODE_NORMAL or EXMODE_VIM */
 EXTERN int ex_no_reprint INIT(= FALSE); /* no need to print after z or p */
 
-EXTERN int Recording INIT(= FALSE);    /* TRUE when recording into a reg. */
-EXTERN int Exec_reg INIT(= FALSE);     /* TRUE when executing a register */
+EXTERN int reg_recording INIT(= 0);    /* register for recording  or zero */
+EXTERN int reg_executing INIT(= 0);    /* register being executed or zero */
 
 EXTERN int no_mapping INIT(= FALSE);   /* currently no mapping allowed */
 EXTERN int no_zero_mapping INIT(= 0);  /* mapping zero not allowed */
index f9ae0e91f06a4203ee8a81d10ed0a54b69424b2a..9384aa623380bd09b8f53c006196b98e8287d1de 100644 (file)
@@ -1025,7 +1025,7 @@ wait_return(int redraw)
     int                oldState;
     int                tmpState;
     int                had_got_int;
-    int                save_Recording;
+    int                save_reg_recording;
     FILE       *save_scriptout;
 
     if (redraw == TRUE)
@@ -1103,16 +1103,16 @@ wait_return(int redraw)
            /* Temporarily disable Recording. If Recording is active, the
             * character will be recorded later, since it will be added to the
             * typebuf after the loop */
-           save_Recording = Recording;
+           save_reg_recording = reg_recording;
            save_scriptout = scriptout;
-           Recording = FALSE;
+           reg_recording = 0;
            scriptout = NULL;
            c = safe_vgetc();
            if (had_got_int && !global_busy)
                got_int = FALSE;
            --no_mapping;
            --allow_keys;
-           Recording = save_Recording;
+           reg_recording = save_reg_recording;
            scriptout = save_scriptout;
 
 #ifdef FEAT_CLIPBOARD
index 3b958a5b59abd81d9a8938ac9afb8fd1397941e2..58f7a7a9657065931c7e54833b0a54af56e0cb77 100644 (file)
@@ -871,8 +871,8 @@ getcount:
                || (nv_cmds[idx].cmd_flags & NV_NCH_ALW) == NV_NCH_ALW
                || (ca.cmdchar == 'q'
                    && oap->op_type == OP_NOP
-                   && !Recording
-                   && !Exec_reg)
+                   && reg_recording == 0
+                   && reg_executing == 0)
                || ((ca.cmdchar == 'a' || ca.cmdchar == 'i')
                    && (oap->op_type != OP_NOP || VIsual_active))))
     {
@@ -9324,7 +9324,7 @@ nv_record(cmdarg_T *cap)
 #endif
            /* (stop) recording into a named register, unless executing a
             * register */
-           if (!Exec_reg && do_record(cap->nchar) == FAIL)
+           if (reg_executing == 0 && do_record(cap->nchar) == FAIL)
                clearopbeep(cap->oap);
     }
 }
index 9af466b3f31a8a728746e007f37e197744270e25..1bc51d84809ab17b8e40dcfbd54f3578c95e9305 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -1091,14 +1091,14 @@ do_record(int c)
     yankreg_T      *old_y_previous, *old_y_current;
     int                    retval;
 
-    if (Recording == FALSE)        /* start recording */
+    if (reg_recording == 0)        /* start recording */
     {
        /* registers 0-9, a-z and " are allowed */
        if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
            retval = FAIL;
        else
        {
-           Recording = c;
+           reg_recording = c;
            showmode();
            regname = c;
            retval = OK;
@@ -1111,7 +1111,7 @@ do_record(int c)
         * needs to be removed again to put it in a register.  exec_reg then
         * adds the escaping back later.
         */
-       Recording = FALSE;
+       reg_recording = 0;
        MSG("");
        p = get_recorded();
        if (p == NULL)
@@ -1318,7 +1318,7 @@ do_execreg(
                                                                      == FAIL)
                return FAIL;
        }
-       Exec_reg = TRUE;        /* disable the 'q' command */
+       reg_executing = regname == 0 ? '"' : regname; // disable "q" command
     }
     return retval;
 }
index e26bb44ee2b97b9f3cdf0147cca1736ad3eff7f6..f2c58bee78ac15bb67cb70a2349cc98fac130af8 100644 (file)
@@ -10255,7 +10255,7 @@ showmode(void)
            && ((State & INSERT)
                || restart_edit
                || VIsual_active));
-    if (do_mode || Recording)
+    if (do_mode || reg_recording != 0)
     {
        /*
         * Don't show mode right now, when not redrawing or inside a mapping.
@@ -10414,7 +10414,7 @@ showmode(void)
 
            need_clear = TRUE;
        }
-       if (Recording
+       if (reg_recording != 0
 #ifdef FEAT_INS_EXPAND
                && edit_submode == NULL     /* otherwise it gets too long */
 #endif
@@ -10489,7 +10489,7 @@ clearmode(void)
     int save_msg_col = msg_col;
 
     msg_pos_mode();
-    if (Recording)
+    if (reg_recording != 0)
        recording_mode(HL_ATTR(HLF_CM));
     msg_clr_eos();
 
@@ -10504,7 +10504,7 @@ recording_mode(int attr)
     if (!shortmess(SHM_RECORDING))
     {
        char_u s[4];
-       sprintf((char *)s, " @%c", Recording);
+       sprintf((char *)s, " @%c", reg_recording);
        MSG_PUTS_ATTR(s, attr);
     }
 }
index 97e7e234ad890186156477f56598fc0502d407d9..b76bc78e79dbb74e934f7f4e19e5ba146d6b26d7 100644 (file)
@@ -923,3 +923,28 @@ func Test_trim()
   let chars = join(map(range(1, 0x20) + [0xa0], {n -> nr2char(n)}), '')
   call assert_equal("x", trim(chars . "x" . chars))
 endfunc
+
+" Test for reg_recording() and reg_executing()
+func Test_reg_executing_and_recording()
+  let s:reg_stat = ''
+  func s:save_reg_stat()
+    let s:reg_stat = reg_recording() . ':' . reg_executing()
+    return ''
+  endfunc
+
+  new
+  call s:save_reg_stat()
+  call assert_equal(':', s:reg_stat)
+  call feedkeys("qa\"=s:save_reg_stat()\<CR>pq", 'xt')
+  call assert_equal('a:', s:reg_stat)
+  call feedkeys("@a", 'xt')
+  call assert_equal(':a', s:reg_stat)
+  call feedkeys("qb@aq", 'xt')
+  call assert_equal('b:a', s:reg_stat)
+  call feedkeys("q\"\"=s:save_reg_stat()\<CR>pq", 'xt')
+  call assert_equal('":', s:reg_stat)
+
+  bwipe!
+  delfunc s:save_reg_stat
+  unlet s:reg_stat
+endfunc
index b629933ff4781c607d5c74356efd872b02d0b268..616a169e5979a1851b41032b2b3b723d0b774caf 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    20,
 /**/
     19,
 /**/