diff src/regexp_nfa.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 0797c8ce343d
line wrap: on
line diff
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1707,12 +1707,23 @@ nfa_regatom(void)
 		    {
 			long_u	n = 0;
 			int	cmp = c;
+			int	cur = FALSE;
 
 			if (c == '<' || c == '>')
 			    c = getchr();
+			if (no_Magic(c) == '.')
+			{
+			    cur = TRUE;
+			    c = getchr();
+			}
 			while (VIM_ISDIGIT(c))
 			{
-			    long_u tmp = n * 10 + (c - '0');
+			    long_u tmp;
+
+			    if (cur)
+				semsg(_(e_regexp_number_after_dot_pos_search),
+								 no_Magic(c));
+			    tmp = n * 10 + (c - '0');
 
 			    if (tmp < n)
 			    {
@@ -1729,6 +1740,8 @@ nfa_regatom(void)
 
 			    if (c == 'l')
 			    {
+				if (cur)
+				    n = curwin->w_cursor.lnum;
 				// \%{n}l  \%{n}<l  \%{n}>l
 				EMIT(cmp == '<' ? NFA_LNUM_LT :
 				     cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
@@ -1736,11 +1749,26 @@ nfa_regatom(void)
 				    at_start = TRUE;
 			    }
 			    else if (c == 'c')
+			    {
+				if (cur)
+				{
+				    n = curwin->w_cursor.col;
+				    n++;
+				}
 				// \%{n}c  \%{n}<c  \%{n}>c
 				EMIT(cmp == '<' ? NFA_COL_LT :
 				     cmp == '>' ? NFA_COL_GT : NFA_COL);
+			    }
 			    else
 			    {
+				if (cur)
+				{
+				    colnr_T vcol = 0;
+
+				    getvvcol(curwin, &curwin->w_cursor,
+							    NULL, NULL, &vcol);
+				    n = ++vcol;
+				}
 				// \%{n}v  \%{n}<v  \%{n}>v
 				EMIT(cmp == '<' ? NFA_VCOL_LT :
 				     cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);