mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
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.
This commit is contained in:
parent
b4518563c7
commit
0b6d911e5d
@ -2302,6 +2302,8 @@ range({expr} [, {max} [, {stride}]])
|
|||||||
List items from {expr} to {max}
|
List items from {expr} to {max}
|
||||||
readfile({fname} [, {binary} [, {max}]])
|
readfile({fname} [, {binary} [, {max}]])
|
||||||
List get list of lines from file {fname}
|
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
|
reltime([{start} [, {end}]]) List get time value
|
||||||
reltimefloat({time}) Float turn the time value into a Float
|
reltimefloat({time}) Float turn the time value into a Float
|
||||||
reltimestr({time}) String turn time value into a String
|
reltimestr({time}) String turn time value into a String
|
||||||
@ -6558,6 +6560,15 @@ readfile({fname} [, {binary} [, {max}]])
|
|||||||
the result is an empty list.
|
the result is an empty list.
|
||||||
Also see |writefile()|.
|
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()*
|
reltime([{start} [, {end}]]) *reltime()*
|
||||||
Return an item that represents a time value. The format of
|
Return an item that represents a time value. The format of
|
||||||
the item depends on the system. It can be passed to
|
the item depends on the system. It can be passed to
|
||||||
|
@ -1018,6 +1018,8 @@ Various: *various-functions*
|
|||||||
getreg() get contents of a register
|
getreg() get contents of a register
|
||||||
getregtype() get type of a register
|
getregtype() get type of a register
|
||||||
setreg() set contents and 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'
|
shiftwidth() effective value of 'shiftwidth'
|
||||||
|
|
||||||
|
@ -8698,7 +8698,7 @@ ins_esc(
|
|||||||
* When recording or for CTRL-O, need to display the new mode.
|
* When recording or for CTRL-O, need to display the new mode.
|
||||||
* Otherwise remove the mode message.
|
* Otherwise remove the mode message.
|
||||||
*/
|
*/
|
||||||
if (Recording || restart_edit != NUL)
|
if (reg_recording != 0 || restart_edit != NUL)
|
||||||
showmode();
|
showmode();
|
||||||
else if (p_smd)
|
else if (p_smd)
|
||||||
MSG("");
|
MSG("");
|
||||||
|
@ -306,6 +306,8 @@ static void f_pyxeval(typval_T *argvars, typval_T *rettv);
|
|||||||
#endif
|
#endif
|
||||||
static void f_range(typval_T *argvars, typval_T *rettv);
|
static void f_range(typval_T *argvars, typval_T *rettv);
|
||||||
static void f_readfile(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);
|
static void f_reltime(typval_T *argvars, typval_T *rettv);
|
||||||
#ifdef FEAT_FLOAT
|
#ifdef FEAT_FLOAT
|
||||||
static void f_reltimefloat(typval_T *argvars, typval_T *rettv);
|
static void f_reltimefloat(typval_T *argvars, typval_T *rettv);
|
||||||
@ -754,6 +756,8 @@ static struct fst
|
|||||||
#endif
|
#endif
|
||||||
{"range", 1, 3, f_range},
|
{"range", 1, 3, f_range},
|
||||||
{"readfile", 1, 3, f_readfile},
|
{"readfile", 1, 3, f_readfile},
|
||||||
|
{"reg_executing", 0, 0, f_reg_executing},
|
||||||
|
{"reg_recording", 0, 0, f_reg_recording},
|
||||||
{"reltime", 0, 2, f_reltime},
|
{"reltime", 0, 2, f_reltime},
|
||||||
#ifdef FEAT_FLOAT
|
#ifdef FEAT_FLOAT
|
||||||
{"reltimefloat", 1, 1, f_reltimefloat},
|
{"reltimefloat", 1, 1, f_reltimefloat},
|
||||||
@ -8697,6 +8701,34 @@ f_readfile(typval_T *argvars, typval_T *rettv)
|
|||||||
fclose(fd);
|
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)
|
#if defined(FEAT_RELTIME)
|
||||||
static int list2proftime(typval_T *arg, proftime_T *tm);
|
static int list2proftime(typval_T *arg, proftime_T *tm);
|
||||||
|
|
||||||
|
@ -9274,7 +9274,7 @@ trigger_cursorhold(void)
|
|||||||
|
|
||||||
if (!did_cursorhold
|
if (!did_cursorhold
|
||||||
&& has_cursorhold()
|
&& has_cursorhold()
|
||||||
&& !Recording
|
&& reg_recording == 0
|
||||||
&& typebuf.tb_len == 0
|
&& typebuf.tb_len == 0
|
||||||
#ifdef FEAT_INS_EXPAND
|
#ifdef FEAT_INS_EXPAND
|
||||||
&& !ins_compl_active()
|
&& !ins_compl_active()
|
||||||
|
@ -1244,7 +1244,7 @@ gotchars(char_u *chars, int len)
|
|||||||
int todo = len;
|
int todo = len;
|
||||||
|
|
||||||
/* remember how many chars were last recorded */
|
/* remember how many chars were last recorded */
|
||||||
if (Recording)
|
if (reg_recording != 0)
|
||||||
last_recorded_len += len;
|
last_recorded_len += len;
|
||||||
|
|
||||||
buf[1] = NUL;
|
buf[1] = NUL;
|
||||||
@ -1254,7 +1254,7 @@ gotchars(char_u *chars, int len)
|
|||||||
c = *s++;
|
c = *s++;
|
||||||
updatescript(c);
|
updatescript(c);
|
||||||
|
|
||||||
if (Recording)
|
if (reg_recording != 0)
|
||||||
{
|
{
|
||||||
buf[0] = c;
|
buf[0] = c;
|
||||||
add_buff(&recordbuff, buf, 1L);
|
add_buff(&recordbuff, buf, 1L);
|
||||||
@ -2007,7 +2007,7 @@ vgetorpeek(int advance)
|
|||||||
init_typebuf();
|
init_typebuf();
|
||||||
start_stuff();
|
start_stuff();
|
||||||
if (advance && typebuf.tb_maplen == 0)
|
if (advance && typebuf.tb_maplen == 0)
|
||||||
Exec_reg = FALSE;
|
reg_executing = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -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 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 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 reg_recording INIT(= 0); /* register for recording or zero */
|
||||||
EXTERN int Exec_reg INIT(= FALSE); /* TRUE when executing a register */
|
EXTERN int reg_executing INIT(= 0); /* register being executed or zero */
|
||||||
|
|
||||||
EXTERN int no_mapping INIT(= FALSE); /* currently no mapping allowed */
|
EXTERN int no_mapping INIT(= FALSE); /* currently no mapping allowed */
|
||||||
EXTERN int no_zero_mapping INIT(= 0); /* mapping zero not allowed */
|
EXTERN int no_zero_mapping INIT(= 0); /* mapping zero not allowed */
|
||||||
|
@ -1025,7 +1025,7 @@ wait_return(int redraw)
|
|||||||
int oldState;
|
int oldState;
|
||||||
int tmpState;
|
int tmpState;
|
||||||
int had_got_int;
|
int had_got_int;
|
||||||
int save_Recording;
|
int save_reg_recording;
|
||||||
FILE *save_scriptout;
|
FILE *save_scriptout;
|
||||||
|
|
||||||
if (redraw == TRUE)
|
if (redraw == TRUE)
|
||||||
@ -1103,16 +1103,16 @@ wait_return(int redraw)
|
|||||||
/* Temporarily disable Recording. If Recording is active, the
|
/* Temporarily disable Recording. If Recording is active, the
|
||||||
* character will be recorded later, since it will be added to the
|
* character will be recorded later, since it will be added to the
|
||||||
* typebuf after the loop */
|
* typebuf after the loop */
|
||||||
save_Recording = Recording;
|
save_reg_recording = reg_recording;
|
||||||
save_scriptout = scriptout;
|
save_scriptout = scriptout;
|
||||||
Recording = FALSE;
|
reg_recording = 0;
|
||||||
scriptout = NULL;
|
scriptout = NULL;
|
||||||
c = safe_vgetc();
|
c = safe_vgetc();
|
||||||
if (had_got_int && !global_busy)
|
if (had_got_int && !global_busy)
|
||||||
got_int = FALSE;
|
got_int = FALSE;
|
||||||
--no_mapping;
|
--no_mapping;
|
||||||
--allow_keys;
|
--allow_keys;
|
||||||
Recording = save_Recording;
|
reg_recording = save_reg_recording;
|
||||||
scriptout = save_scriptout;
|
scriptout = save_scriptout;
|
||||||
|
|
||||||
#ifdef FEAT_CLIPBOARD
|
#ifdef FEAT_CLIPBOARD
|
||||||
|
@ -871,8 +871,8 @@ getcount:
|
|||||||
|| (nv_cmds[idx].cmd_flags & NV_NCH_ALW) == NV_NCH_ALW
|
|| (nv_cmds[idx].cmd_flags & NV_NCH_ALW) == NV_NCH_ALW
|
||||||
|| (ca.cmdchar == 'q'
|
|| (ca.cmdchar == 'q'
|
||||||
&& oap->op_type == OP_NOP
|
&& oap->op_type == OP_NOP
|
||||||
&& !Recording
|
&& reg_recording == 0
|
||||||
&& !Exec_reg)
|
&& reg_executing == 0)
|
||||||
|| ((ca.cmdchar == 'a' || ca.cmdchar == 'i')
|
|| ((ca.cmdchar == 'a' || ca.cmdchar == 'i')
|
||||||
&& (oap->op_type != OP_NOP || VIsual_active))))
|
&& (oap->op_type != OP_NOP || VIsual_active))))
|
||||||
{
|
{
|
||||||
@ -9324,7 +9324,7 @@ nv_record(cmdarg_T *cap)
|
|||||||
#endif
|
#endif
|
||||||
/* (stop) recording into a named register, unless executing a
|
/* (stop) recording into a named register, unless executing a
|
||||||
* register */
|
* register */
|
||||||
if (!Exec_reg && do_record(cap->nchar) == FAIL)
|
if (reg_executing == 0 && do_record(cap->nchar) == FAIL)
|
||||||
clearopbeep(cap->oap);
|
clearopbeep(cap->oap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1091,14 +1091,14 @@ do_record(int c)
|
|||||||
yankreg_T *old_y_previous, *old_y_current;
|
yankreg_T *old_y_previous, *old_y_current;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
if (Recording == FALSE) /* start recording */
|
if (reg_recording == 0) /* start recording */
|
||||||
{
|
{
|
||||||
/* registers 0-9, a-z and " are allowed */
|
/* registers 0-9, a-z and " are allowed */
|
||||||
if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
|
if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
|
||||||
retval = FAIL;
|
retval = FAIL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Recording = c;
|
reg_recording = c;
|
||||||
showmode();
|
showmode();
|
||||||
regname = c;
|
regname = c;
|
||||||
retval = OK;
|
retval = OK;
|
||||||
@ -1111,7 +1111,7 @@ do_record(int c)
|
|||||||
* needs to be removed again to put it in a register. exec_reg then
|
* needs to be removed again to put it in a register. exec_reg then
|
||||||
* adds the escaping back later.
|
* adds the escaping back later.
|
||||||
*/
|
*/
|
||||||
Recording = FALSE;
|
reg_recording = 0;
|
||||||
MSG("");
|
MSG("");
|
||||||
p = get_recorded();
|
p = get_recorded();
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
@ -1318,7 +1318,7 @@ do_execreg(
|
|||||||
== FAIL)
|
== FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
Exec_reg = TRUE; /* disable the 'q' command */
|
reg_executing = regname == 0 ? '"' : regname; // disable "q" command
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -10255,7 +10255,7 @@ showmode(void)
|
|||||||
&& ((State & INSERT)
|
&& ((State & INSERT)
|
||||||
|| restart_edit
|
|| restart_edit
|
||||||
|| VIsual_active));
|
|| 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.
|
* Don't show mode right now, when not redrawing or inside a mapping.
|
||||||
@ -10414,7 +10414,7 @@ showmode(void)
|
|||||||
|
|
||||||
need_clear = TRUE;
|
need_clear = TRUE;
|
||||||
}
|
}
|
||||||
if (Recording
|
if (reg_recording != 0
|
||||||
#ifdef FEAT_INS_EXPAND
|
#ifdef FEAT_INS_EXPAND
|
||||||
&& edit_submode == NULL /* otherwise it gets too long */
|
&& edit_submode == NULL /* otherwise it gets too long */
|
||||||
#endif
|
#endif
|
||||||
@ -10489,7 +10489,7 @@ clearmode(void)
|
|||||||
int save_msg_col = msg_col;
|
int save_msg_col = msg_col;
|
||||||
|
|
||||||
msg_pos_mode();
|
msg_pos_mode();
|
||||||
if (Recording)
|
if (reg_recording != 0)
|
||||||
recording_mode(HL_ATTR(HLF_CM));
|
recording_mode(HL_ATTR(HLF_CM));
|
||||||
msg_clr_eos();
|
msg_clr_eos();
|
||||||
|
|
||||||
@ -10504,7 +10504,7 @@ recording_mode(int attr)
|
|||||||
if (!shortmess(SHM_RECORDING))
|
if (!shortmess(SHM_RECORDING))
|
||||||
{
|
{
|
||||||
char_u s[4];
|
char_u s[4];
|
||||||
sprintf((char *)s, " @%c", Recording);
|
sprintf((char *)s, " @%c", reg_recording);
|
||||||
MSG_PUTS_ATTR(s, attr);
|
MSG_PUTS_ATTR(s, attr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -923,3 +923,28 @@ func Test_trim()
|
|||||||
let chars = join(map(range(1, 0x20) + [0xa0], {n -> nr2char(n)}), '')
|
let chars = join(map(range(1, 0x20) + [0xa0], {n -> nr2char(n)}), '')
|
||||||
call assert_equal("x", trim(chars . "x" . chars))
|
call assert_equal("x", trim(chars . "x" . chars))
|
||||||
endfunc
|
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
|
||||||
|
@ -761,6 +761,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
20,
|
||||||
/**/
|
/**/
|
||||||
19,
|
19,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user