Mercurial > vim
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 } |