To: vim_dev@googlegroups.com
Subject: Patch 8.1.0020
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 8.1.0020
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.
Files:	    runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
            src/testdir/test_functions.vim, src/getchar.c, src/normal.c,
            src/ops.c, src/globals.h, src/edit.c, src/fileio.c, src/message.c,
            src/screen.c


*** ../vim-8.1.0019/runtime/doc/eval.txt	2018-05-17 15:06:48.000000000 +0200
--- runtime/doc/eval.txt	2018-05-22 20:25:41.869831935 +0200
***************
*** 2302,2307 ****
--- 2302,2309 ----
  				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,6563 ****
--- 6562,6576 ----
  		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
*** ../vim-8.1.0019/runtime/doc/usr_41.txt	2018-05-17 13:42:03.000000000 +0200
--- runtime/doc/usr_41.txt	2018-05-22 20:26:30.025880034 +0200
***************
*** 1018,1023 ****
--- 1018,1025 ----
  	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'
  
*** ../vim-8.1.0019/src/evalfunc.c	2018-05-21 13:28:40.320041589 +0200
--- src/evalfunc.c	2018-05-22 20:32:33.566027870 +0200
***************
*** 306,311 ****
--- 306,313 ----
  #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,759 ****
--- 756,763 ----
  #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,8702 ****
--- 8701,8734 ----
      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);
  
*** ../vim-8.1.0019/src/testdir/test_functions.vim	2018-05-20 14:11:07.125342749 +0200
--- src/testdir/test_functions.vim	2018-05-22 20:27:42.625937524 +0200
***************
*** 923,925 ****
--- 923,950 ----
    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
*** ../vim-8.1.0019/src/getchar.c	2018-05-13 18:25:53.000000000 +0200
--- src/getchar.c	2018-05-22 20:21:55.241805765 +0200
***************
*** 1244,1250 ****
      int		todo = len;
  
      /* remember how many chars were last recorded */
!     if (Recording)
  	last_recorded_len += len;
  
      buf[1] = NUL;
--- 1244,1250 ----
      int		todo = len;
  
      /* remember how many chars were last recorded */
!     if (reg_recording != 0)
  	last_recorded_len += len;
  
      buf[1] = NUL;
***************
*** 1254,1260 ****
  	c = *s++;
  	updatescript(c);
  
! 	if (Recording)
  	{
  	    buf[0] = c;
  	    add_buff(&recordbuff, buf, 1L);
--- 1254,1260 ----
  	c = *s++;
  	updatescript(c);
  
! 	if (reg_recording != 0)
  	{
  	    buf[0] = c;
  	    add_buff(&recordbuff, buf, 1L);
***************
*** 2007,2013 ****
      init_typebuf();
      start_stuff();
      if (advance && typebuf.tb_maplen == 0)
! 	Exec_reg = FALSE;
      do
      {
  /*
--- 2007,2013 ----
      init_typebuf();
      start_stuff();
      if (advance && typebuf.tb_maplen == 0)
! 	reg_executing = 0;
      do
      {
  /*
*** ../vim-8.1.0019/src/normal.c	2018-05-10 15:04:13.000000000 +0200
--- src/normal.c	2018-05-22 20:22:01.537798525 +0200
***************
*** 871,878 ****
  		|| (nv_cmds[idx].cmd_flags & NV_NCH_ALW) == NV_NCH_ALW
  		|| (ca.cmdchar == 'q'
  		    && oap->op_type == OP_NOP
! 		    && !Recording
! 		    && !Exec_reg)
  		|| ((ca.cmdchar == 'a' || ca.cmdchar == 'i')
  		    && (oap->op_type != OP_NOP || VIsual_active))))
      {
--- 871,878 ----
  		|| (nv_cmds[idx].cmd_flags & NV_NCH_ALW) == NV_NCH_ALW
  		|| (ca.cmdchar == 'q'
  		    && oap->op_type == OP_NOP
! 		    && reg_recording == 0
! 		    && reg_executing == 0)
  		|| ((ca.cmdchar == 'a' || ca.cmdchar == 'i')
  		    && (oap->op_type != OP_NOP || VIsual_active))))
      {
***************
*** 9324,9330 ****
  #endif
  	    /* (stop) recording into a named register, unless executing a
  	     * register */
! 	    if (!Exec_reg && do_record(cap->nchar) == FAIL)
  		clearopbeep(cap->oap);
      }
  }
--- 9324,9330 ----
  #endif
  	    /* (stop) recording into a named register, unless executing a
  	     * register */
! 	    if (reg_executing == 0 && do_record(cap->nchar) == FAIL)
  		clearopbeep(cap->oap);
      }
  }
*** ../vim-8.1.0019/src/ops.c	2018-05-01 19:10:26.000000000 +0200
--- src/ops.c	2018-05-22 20:22:13.973784219 +0200
***************
*** 1091,1104 ****
      yankreg_T	    *old_y_previous, *old_y_current;
      int		    retval;
  
!     if (Recording == FALSE)	    /* start recording */
      {
  	/* registers 0-9, a-z and " are allowed */
  	if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
  	    retval = FAIL;
  	else
  	{
! 	    Recording = c;
  	    showmode();
  	    regname = c;
  	    retval = OK;
--- 1091,1104 ----
      yankreg_T	    *old_y_previous, *old_y_current;
      int		    retval;
  
!     if (reg_recording == 0)	    /* start recording */
      {
  	/* registers 0-9, a-z and " are allowed */
  	if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
  	    retval = FAIL;
  	else
  	{
! 	    reg_recording = c;
  	    showmode();
  	    regname = c;
  	    retval = OK;
***************
*** 1111,1117 ****
  	 * needs to be removed again to put it in a register.  exec_reg then
  	 * adds the escaping back later.
  	 */
! 	Recording = FALSE;
  	MSG("");
  	p = get_recorded();
  	if (p == NULL)
--- 1111,1117 ----
  	 * needs to be removed again to put it in a register.  exec_reg then
  	 * adds the escaping back later.
  	 */
! 	reg_recording = 0;
  	MSG("");
  	p = get_recorded();
  	if (p == NULL)
***************
*** 1318,1324 ****
  								      == FAIL)
  		return FAIL;
  	}
! 	Exec_reg = TRUE;	/* disable the 'q' command */
      }
      return retval;
  }
--- 1318,1324 ----
  								      == FAIL)
  		return FAIL;
  	}
! 	reg_executing = regname == 0 ? '"' : regname; // disable "q" command
      }
      return retval;
  }
*** ../vim-8.1.0019/src/globals.h	2018-05-01 15:29:24.000000000 +0200
--- src/globals.h	2018-05-22 20:22:30.453765251 +0200
***************
*** 933,940 ****
  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 no_mapping INIT(= FALSE);	/* currently no mapping allowed */
  EXTERN int no_zero_mapping INIT(= 0);	/* mapping zero not allowed */
--- 933,940 ----
  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 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 */
*** ../vim-8.1.0019/src/edit.c	2018-05-10 15:03:58.000000000 +0200
--- src/edit.c	2018-05-22 20:19:41.393959222 +0200
***************
*** 8698,8704 ****
       * When recording or for CTRL-O, need to display the new mode.
       * Otherwise remove the mode message.
       */
!     if (Recording || restart_edit != NUL)
  	showmode();
      else if (p_smd)
  	MSG("");
--- 8698,8704 ----
       * When recording or for CTRL-O, need to display the new mode.
       * Otherwise remove the mode message.
       */
!     if (reg_recording != 0 || restart_edit != NUL)
  	showmode();
      else if (p_smd)
  	MSG("");
*** ../vim-8.1.0019/src/fileio.c	2018-05-21 13:39:36.047906786 +0200
--- src/fileio.c	2018-05-22 20:19:50.201949153 +0200
***************
*** 9274,9280 ****
  
      if (!did_cursorhold
  	    && has_cursorhold()
! 	    && !Recording
  	    && typebuf.tb_len == 0
  #ifdef FEAT_INS_EXPAND
  	    && !ins_compl_active()
--- 9274,9280 ----
  
      if (!did_cursorhold
  	    && has_cursorhold()
! 	    && reg_recording == 0
  	    && typebuf.tb_len == 0
  #ifdef FEAT_INS_EXPAND
  	    && !ins_compl_active()
*** ../vim-8.1.0019/src/message.c	2018-04-29 12:18:04.000000000 +0200
--- src/message.c	2018-05-22 20:20:24.417909998 +0200
***************
*** 1025,1031 ****
      int		oldState;
      int		tmpState;
      int		had_got_int;
!     int		save_Recording;
      FILE	*save_scriptout;
  
      if (redraw == TRUE)
--- 1025,1031 ----
      int		oldState;
      int		tmpState;
      int		had_got_int;
!     int		save_reg_recording;
      FILE	*save_scriptout;
  
      if (redraw == TRUE)
***************
*** 1103,1118 ****
  	    /* 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_scriptout = scriptout;
! 	    Recording = FALSE;
  	    scriptout = NULL;
  	    c = safe_vgetc();
  	    if (had_got_int && !global_busy)
  		got_int = FALSE;
  	    --no_mapping;
  	    --allow_keys;
! 	    Recording = save_Recording;
  	    scriptout = save_scriptout;
  
  #ifdef FEAT_CLIPBOARD
--- 1103,1118 ----
  	    /* 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_reg_recording = reg_recording;
  	    save_scriptout = scriptout;
! 	    reg_recording = 0;
  	    scriptout = NULL;
  	    c = safe_vgetc();
  	    if (had_got_int && !global_busy)
  		got_int = FALSE;
  	    --no_mapping;
  	    --allow_keys;
! 	    reg_recording = save_reg_recording;
  	    scriptout = save_scriptout;
  
  #ifdef FEAT_CLIPBOARD
*** ../vim-8.1.0019/src/screen.c	2018-05-19 14:43:26.775509740 +0200
--- src/screen.c	2018-05-22 20:20:50.233880413 +0200
***************
*** 10255,10261 ****
  	    && ((State & INSERT)
  		|| restart_edit
  		|| VIsual_active));
!     if (do_mode || Recording)
      {
  	/*
  	 * Don't show mode right now, when not redrawing or inside a mapping.
--- 10255,10261 ----
  	    && ((State & INSERT)
  		|| restart_edit
  		|| VIsual_active));
!     if (do_mode || reg_recording != 0)
      {
  	/*
  	 * Don't show mode right now, when not redrawing or inside a mapping.
***************
*** 10414,10420 ****
  
  	    need_clear = TRUE;
  	}
! 	if (Recording
  #ifdef FEAT_INS_EXPAND
  		&& edit_submode == NULL	    /* otherwise it gets too long */
  #endif
--- 10414,10420 ----
  
  	    need_clear = TRUE;
  	}
! 	if (reg_recording != 0
  #ifdef FEAT_INS_EXPAND
  		&& edit_submode == NULL	    /* otherwise it gets too long */
  #endif
***************
*** 10489,10495 ****
      int save_msg_col = msg_col;
  
      msg_pos_mode();
!     if (Recording)
  	recording_mode(HL_ATTR(HLF_CM));
      msg_clr_eos();
  
--- 10489,10495 ----
      int save_msg_col = msg_col;
  
      msg_pos_mode();
!     if (reg_recording != 0)
  	recording_mode(HL_ATTR(HLF_CM));
      msg_clr_eos();
  
***************
*** 10504,10510 ****
      if (!shortmess(SHM_RECORDING))
      {
  	char_u s[4];
! 	sprintf((char *)s, " @%c", Recording);
  	MSG_PUTS_ATTR(s, attr);
      }
  }
--- 10504,10510 ----
      if (!shortmess(SHM_RECORDING))
      {
  	char_u s[4];
! 	sprintf((char *)s, " @%c", reg_recording);
  	MSG_PUTS_ATTR(s, attr);
      }
  }
*** ../vim-8.1.0019/src/version.c	2018-05-22 18:31:30.001365739 +0200
--- src/version.c	2018-05-22 20:33:34.882025227 +0200
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     20,
  /**/

-- 
            |

Ceci n'est pas une pipe.

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///