Skip to content

Commit 0b6d911

Browse files
committed
patch 8.1.0020: cannot tell whether a register is executing or recording
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.
1 parent b451856 commit 0b6d911

File tree

13 files changed

+94
-22
lines changed

13 files changed

+94
-22
lines changed

runtime/doc/eval.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2302,6 +2302,8 @@ range({expr} [, {max} [, {stride}]])
23022302
List items from {expr} to {max}
23032303
readfile({fname} [, {binary} [, {max}]])
23042304
List get list of lines from file {fname}
2305+
reg_executing() Number get the executing register name
2306+
reg_recording() String get the recording register name
23052307
reltime([{start} [, {end}]]) List get time value
23062308
reltimefloat({time}) Float turn the time value into a Float
23072309
reltimestr({time}) String turn time value into a String
@@ -6558,6 +6560,15 @@ readfile({fname} [, {binary} [, {max}]])
65586560
the result is an empty list.
65596561
Also see |writefile()|.
65606562

6563+
reg_executing() *reg_executing()*
6564+
Returns the single letter name of the register being executed.
6565+
Returns an empty string when no register is being executed.
6566+
See |@|.
6567+
6568+
reg_recording() *reg_recording()*
6569+
Returns the single letter name of the register being recorded.
6570+
Returns an empty string string when not recording. See |q|.
6571+
65616572
reltime([{start} [, {end}]]) *reltime()*
65626573
Return an item that represents a time value. The format of
65636574
the item depends on the system. It can be passed to

runtime/doc/usr_41.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,6 +1018,8 @@ Various: *various-functions*
10181018
getreg() get contents of a register
10191019
getregtype() get type of a register
10201020
setreg() set contents and type of a register
1021+
reg_executing() return the name of the register being executed
1022+
reg_recording() return the name of the register being recorded
10211023

10221024
shiftwidth() effective value of 'shiftwidth'
10231025

src/edit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8698,7 +8698,7 @@ ins_esc(
86988698
* When recording or for CTRL-O, need to display the new mode.
86998699
* Otherwise remove the mode message.
87008700
*/
8701-
if (Recording || restart_edit != NUL)
8701+
if (reg_recording != 0 || restart_edit != NUL)
87028702
showmode();
87038703
else if (p_smd)
87048704
MSG("");

src/evalfunc.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,8 @@ static void f_pyxeval(typval_T *argvars, typval_T *rettv);
306306
#endif
307307
static void f_range(typval_T *argvars, typval_T *rettv);
308308
static void f_readfile(typval_T *argvars, typval_T *rettv);
309+
static void f_reg_executing(typval_T *argvars, typval_T *rettv);
310+
static void f_reg_recording(typval_T *argvars, typval_T *rettv);
309311
static void f_reltime(typval_T *argvars, typval_T *rettv);
310312
#ifdef FEAT_FLOAT
311313
static void f_reltimefloat(typval_T *argvars, typval_T *rettv);
@@ -754,6 +756,8 @@ static struct fst
754756
#endif
755757
{"range", 1, 3, f_range},
756758
{"readfile", 1, 3, f_readfile},
759+
{"reg_executing", 0, 0, f_reg_executing},
760+
{"reg_recording", 0, 0, f_reg_recording},
757761
{"reltime", 0, 2, f_reltime},
758762
#ifdef FEAT_FLOAT
759763
{"reltimefloat", 1, 1, f_reltimefloat},
@@ -8697,6 +8701,34 @@ f_readfile(typval_T *argvars, typval_T *rettv)
86978701
fclose(fd);
86988702
}
86998703

8704+
static void
8705+
return_register(int regname, typval_T *rettv)
8706+
{
8707+
char_u buf[2] = {0, 0};
8708+
8709+
buf[0] = (char_u)regname;
8710+
rettv->v_type = VAR_STRING;
8711+
rettv->vval.v_string = vim_strsave(buf);
8712+
}
8713+
8714+
/*
8715+
* "reg_executing()" function
8716+
*/
8717+
static void
8718+
f_reg_executing(typval_T *argvars UNUSED, typval_T *rettv)
8719+
{
8720+
return_register(reg_executing, rettv);
8721+
}
8722+
8723+
/*
8724+
* "reg_recording()" function
8725+
*/
8726+
static void
8727+
f_reg_recording(typval_T *argvars UNUSED, typval_T *rettv)
8728+
{
8729+
return_register(reg_recording, rettv);
8730+
}
8731+
87008732
#if defined(FEAT_RELTIME)
87018733
static int list2proftime(typval_T *arg, proftime_T *tm);
87028734

src/fileio.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9274,7 +9274,7 @@ trigger_cursorhold(void)
92749274

92759275
if (!did_cursorhold
92769276
&& has_cursorhold()
9277-
&& !Recording
9277+
&& reg_recording == 0
92789278
&& typebuf.tb_len == 0
92799279
#ifdef FEAT_INS_EXPAND
92809280
&& !ins_compl_active()

src/getchar.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,7 +1244,7 @@ gotchars(char_u *chars, int len)
12441244
int todo = len;
12451245

12461246
/* remember how many chars were last recorded */
1247-
if (Recording)
1247+
if (reg_recording != 0)
12481248
last_recorded_len += len;
12491249

12501250
buf[1] = NUL;
@@ -1254,7 +1254,7 @@ gotchars(char_u *chars, int len)
12541254
c = *s++;
12551255
updatescript(c);
12561256

1257-
if (Recording)
1257+
if (reg_recording != 0)
12581258
{
12591259
buf[0] = c;
12601260
add_buff(&recordbuff, buf, 1L);
@@ -2007,7 +2007,7 @@ vgetorpeek(int advance)
20072007
init_typebuf();
20082008
start_stuff();
20092009
if (advance && typebuf.tb_maplen == 0)
2010-
Exec_reg = FALSE;
2010+
reg_executing = 0;
20112011
do
20122012
{
20132013
/*

src/globals.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -933,8 +933,8 @@ EXTERN long opcount INIT(= 0); /* count for pending operator */
933933
EXTERN int exmode_active INIT(= 0); /* zero, EXMODE_NORMAL or EXMODE_VIM */
934934
EXTERN int ex_no_reprint INIT(= FALSE); /* no need to print after z or p */
935935

936-
EXTERN int Recording INIT(= FALSE); /* TRUE when recording into a reg. */
937-
EXTERN int Exec_reg INIT(= FALSE); /* TRUE when executing a register */
936+
EXTERN int reg_recording INIT(= 0); /* register for recording or zero */
937+
EXTERN int reg_executing INIT(= 0); /* register being executed or zero */
938938

939939
EXTERN int no_mapping INIT(= FALSE); /* currently no mapping allowed */
940940
EXTERN int no_zero_mapping INIT(= 0); /* mapping zero not allowed */

src/message.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,7 +1025,7 @@ wait_return(int redraw)
10251025
int oldState;
10261026
int tmpState;
10271027
int had_got_int;
1028-
int save_Recording;
1028+
int save_reg_recording;
10291029
FILE *save_scriptout;
10301030

10311031
if (redraw == TRUE)
@@ -1103,16 +1103,16 @@ wait_return(int redraw)
11031103
/* Temporarily disable Recording. If Recording is active, the
11041104
* character will be recorded later, since it will be added to the
11051105
* typebuf after the loop */
1106-
save_Recording = Recording;
1106+
save_reg_recording = reg_recording;
11071107
save_scriptout = scriptout;
1108-
Recording = FALSE;
1108+
reg_recording = 0;
11091109
scriptout = NULL;
11101110
c = safe_vgetc();
11111111
if (had_got_int && !global_busy)
11121112
got_int = FALSE;
11131113
--no_mapping;
11141114
--allow_keys;
1115-
Recording = save_Recording;
1115+
reg_recording = save_reg_recording;
11161116
scriptout = save_scriptout;
11171117

11181118
#ifdef FEAT_CLIPBOARD

src/normal.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -871,8 +871,8 @@ normal_cmd(
871871
|| (nv_cmds[idx].cmd_flags & NV_NCH_ALW) == NV_NCH_ALW
872872
|| (ca.cmdchar == 'q'
873873
&& oap->op_type == OP_NOP
874-
&& !Recording
875-
&& !Exec_reg)
874+
&& reg_recording == 0
875+
&& reg_executing == 0)
876876
|| ((ca.cmdchar == 'a' || ca.cmdchar == 'i')
877877
&& (oap->op_type != OP_NOP || VIsual_active))))
878878
{
@@ -9324,7 +9324,7 @@ nv_record(cmdarg_T *cap)
93249324
#endif
93259325
/* (stop) recording into a named register, unless executing a
93269326
* register */
9327-
if (!Exec_reg && do_record(cap->nchar) == FAIL)
9327+
if (reg_executing == 0 && do_record(cap->nchar) == FAIL)
93289328
clearopbeep(cap->oap);
93299329
}
93309330
}

src/ops.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,14 +1091,14 @@ do_record(int c)
10911091
yankreg_T *old_y_previous, *old_y_current;
10921092
int retval;
10931093

1094-
if (Recording == FALSE) /* start recording */
1094+
if (reg_recording == 0) /* start recording */
10951095
{
10961096
/* registers 0-9, a-z and " are allowed */
10971097
if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
10981098
retval = FAIL;
10991099
else
11001100
{
1101-
Recording = c;
1101+
reg_recording = c;
11021102
showmode();
11031103
regname = c;
11041104
retval = OK;
@@ -1111,7 +1111,7 @@ do_record(int c)
11111111
* needs to be removed again to put it in a register. exec_reg then
11121112
* adds the escaping back later.
11131113
*/
1114-
Recording = FALSE;
1114+
reg_recording = 0;
11151115
MSG("");
11161116
p = get_recorded();
11171117
if (p == NULL)
@@ -1318,7 +1318,7 @@ do_execreg(
13181318
== FAIL)
13191319
return FAIL;
13201320
}
1321-
Exec_reg = TRUE; /* disable the 'q' command */
1321+
reg_executing = regname == 0 ? '"' : regname; // disable "q" command
13221322
}
13231323
return retval;
13241324
}

0 commit comments

Comments
 (0)