diff src/regexp_bt.c @ 25147:10b269321459 v8.2.3110

patch 8.2.3110: a pattern that matches the cursor position is complicated Commit: https://github.com/vim/vim/commit/04db26b36000a4677b95403ec94bd11f6cc73975 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jul 5 20:15:23 2021 +0200 patch 8.2.3110: a pattern that matches the cursor position is complicated Problem: A pattern that matches the cursor position is bit complicated. Solution: Use a dot to indicate the cursor line and column. (Christian Brabandt, closes #8497, closes #8179)
author Bram Moolenaar <Bram@vim.org>
date Mon, 05 Jul 2021 20:30:03 +0200
parents 97789fcef0cf
children 078edc1821bf
line wrap: on
line diff
--- a/src/regexp_bt.c
+++ b/src/regexp_bt.c
@@ -1628,14 +1628,20 @@ regatom(int *flagp)
 
 		default:
 			  if (VIM_ISDIGIT(c) || c == '<' || c == '>'
-								 || c == '\'')
+						|| c == '\'' || c == '.')
 			  {
 			      long_u	n = 0;
 			      int	cmp;
+			      int	cur = FALSE;
 
 			      cmp = c;
 			      if (cmp == '<' || cmp == '>')
 				  c = getchr();
+			      if (no_Magic(c) == '.')
+			      {
+				  cur = TRUE;
+				  c = getchr();
+			      }
 			      while (VIM_ISDIGIT(c))
 			      {
 				  n = n * 10 + (c - '0');
@@ -1657,16 +1663,42 @@ regatom(int *flagp)
 			      }
 			      else if (c == 'l' || c == 'c' || c == 'v')
 			      {
+				  if (cur && n)
+				  {
+				    semsg(_(e_regexp_number_after_dot_pos_search), no_Magic(c));
+				    rc_did_emsg = TRUE;
+				    return NULL;
+				  }
 				  if (c == 'l')
 				  {
+				      if (cur)
+					  n = curwin->w_cursor.lnum;
 				      ret = regnode(RE_LNUM);
 				      if (save_prev_at_start)
 					  at_start = TRUE;
 				  }
 				  else if (c == 'c')
+				  {
+				      if (cur)
+				      {
+					  n = curwin->w_cursor.col;
+					  n++;
+				      }
 				      ret = regnode(RE_COL);
+				  }
 				  else
+				  {
+				      if (cur)
+				      {
+					  colnr_T vcol = 0;
+
+					  getvvcol(curwin, &curwin->w_cursor,
+							    NULL, NULL, &vcol);
+					  ++vcol;
+					  n = vcol;
+				      }
 				      ret = regnode(RE_VCOL);
+				  }
 				  if (ret == JUST_CALC_SIZE)
 				      regsize += 5;
 				  else