comparison 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
comparison
equal deleted inserted replaced
25146:84fff3a2c3d3 25147:10b269321459
1705 1705
1706 default: 1706 default:
1707 { 1707 {
1708 long_u n = 0; 1708 long_u n = 0;
1709 int cmp = c; 1709 int cmp = c;
1710 int cur = FALSE;
1710 1711
1711 if (c == '<' || c == '>') 1712 if (c == '<' || c == '>')
1712 c = getchr(); 1713 c = getchr();
1714 if (no_Magic(c) == '.')
1715 {
1716 cur = TRUE;
1717 c = getchr();
1718 }
1713 while (VIM_ISDIGIT(c)) 1719 while (VIM_ISDIGIT(c))
1714 { 1720 {
1715 long_u tmp = n * 10 + (c - '0'); 1721 long_u tmp;
1722
1723 if (cur)
1724 semsg(_(e_regexp_number_after_dot_pos_search),
1725 no_Magic(c));
1726 tmp = n * 10 + (c - '0');
1716 1727
1717 if (tmp < n) 1728 if (tmp < n)
1718 { 1729 {
1719 // overflow. 1730 // overflow.
1720 emsg(_(e_value_too_large)); 1731 emsg(_(e_value_too_large));
1727 { 1738 {
1728 long_u limit = INT_MAX; 1739 long_u limit = INT_MAX;
1729 1740
1730 if (c == 'l') 1741 if (c == 'l')
1731 { 1742 {
1743 if (cur)
1744 n = curwin->w_cursor.lnum;
1732 // \%{n}l \%{n}<l \%{n}>l 1745 // \%{n}l \%{n}<l \%{n}>l
1733 EMIT(cmp == '<' ? NFA_LNUM_LT : 1746 EMIT(cmp == '<' ? NFA_LNUM_LT :
1734 cmp == '>' ? NFA_LNUM_GT : NFA_LNUM); 1747 cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
1735 if (save_prev_at_start) 1748 if (save_prev_at_start)
1736 at_start = TRUE; 1749 at_start = TRUE;
1737 } 1750 }
1738 else if (c == 'c') 1751 else if (c == 'c')
1752 {
1753 if (cur)
1754 {
1755 n = curwin->w_cursor.col;
1756 n++;
1757 }
1739 // \%{n}c \%{n}<c \%{n}>c 1758 // \%{n}c \%{n}<c \%{n}>c
1740 EMIT(cmp == '<' ? NFA_COL_LT : 1759 EMIT(cmp == '<' ? NFA_COL_LT :
1741 cmp == '>' ? NFA_COL_GT : NFA_COL); 1760 cmp == '>' ? NFA_COL_GT : NFA_COL);
1761 }
1742 else 1762 else
1743 { 1763 {
1764 if (cur)
1765 {
1766 colnr_T vcol = 0;
1767
1768 getvvcol(curwin, &curwin->w_cursor,
1769 NULL, NULL, &vcol);
1770 n = ++vcol;
1771 }
1744 // \%{n}v \%{n}<v \%{n}>v 1772 // \%{n}v \%{n}<v \%{n}>v
1745 EMIT(cmp == '<' ? NFA_VCOL_LT : 1773 EMIT(cmp == '<' ? NFA_VCOL_LT :
1746 cmp == '>' ? NFA_VCOL_GT : NFA_VCOL); 1774 cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);
1747 limit = INT_MAX / MB_MAXBYTES; 1775 limit = INT_MAX / MB_MAXBYTES;
1748 } 1776 }