annotate src/search.c @ 10098:72e4b7f90465 v7.4.2320

commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b Author: Bram Moolenaar <Bram@vim.org> Date: Sat Sep 3 21:04:58 2016 +0200 patch 7.4.2320 Problem: Redraw problem when using 'incsearch'. Solution: Save the current view when deleting characters. (Christian Brabandt) Fix that the '" mark is set in the wrong position. Don't change the search start when using BS.
author Christian Brabandt <cb@256bit.org>
date Sat, 03 Sep 2016 21:15:06 +0200
parents 793471c09a4b
children ab45de65977b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 9913
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 * search.c: code for normal mode searching commands
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 #ifdef FEAT_EVAL
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
16 static void set_vv_searchforward(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
17 static int first_submatch(regmmatch_T *rp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 #endif
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
19 static int check_prevcol(char_u *linep, int col, int ch, int *prevcol);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
20 static int inmacro(char_u *, char_u *);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
21 static int check_linecomment(char_u *line);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
22 static int cls(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
23 static int skip_chars(int, int);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 #ifdef FEAT_TEXTOBJ
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
25 static void back_in_line(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
26 static void find_first_blank(pos_T *);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
27 static void findsent_forward(long count, int at_start_sent);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 #ifdef FEAT_FIND_ID
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
30 static void show_pat_in_path(char_u *, int,
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
31 int, int, FILE *, linenr_T *, long);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 #ifdef FEAT_VIMINFO
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
34 static void wvsp_one(FILE *fp, int idx, char *s, int sc);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
37 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 * This file contains various searching-related routines. These fall into
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 * three groups:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40 * 1. string searches (for /, ?, n, and N)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
41 * 2. character searches within a single line (for f, F, t, T, etc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 * 3. "other" kinds of searches like the '%' command, and 'word' searches.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
46 * String searches
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 * The string search functions are divided into two levels:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 * lowest: searchit(); uses an pos_T for starting position and found match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 * Highest: do_search(); uses curwin->w_cursor; calls searchit().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52 * The last search pattern is remembered for repeating the same search.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 * This pattern is shared between the :g, :s, ? and / commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54 * This is in search_regcomp().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 * The actual string matching is done using a heavily modified version of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 * Henry Spencer's regular expression library. See regexp.c.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 /* The offset for a search command is store in a soff struct */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 /* Note: only spats[0].off is really used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 struct soffset
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 {
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
64 int dir; /* search direction, '/' or '?' */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 int line; /* search has line offset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 int end; /* search set cursor at end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 long off; /* line or char offset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 /* A search pattern and its attributes are stored in a spat struct */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 struct spat
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 char_u *pat; /* the pattern (in allocated memory) or NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 int magic; /* magicness of the pattern */
4352
04736b4030ec updated for version 7.3.925
Bram Moolenaar <bram@vim.org>
parents: 4252
diff changeset
75 int no_scs; /* no smartcase for this pattern */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 struct soffset off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 * Two search patterns are remembered: One for the :substitute command and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 * one for other searches. last_idx points to the one that was used the last
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 * time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 static struct spat spats[2] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 {NULL, TRUE, FALSE, {'/', 0, 0, 0L}}, /* last used search pat */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 {NULL, TRUE, FALSE, {'/', 0, 0, 0L}} /* last used substitute pat */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 static int last_idx = 0; /* index in spats[] for RE_LAST */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
92 static char_u lastc[2] = {NUL, NUL}; /* last character searched for */
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
93 static int lastcdir = FORWARD; /* last direction of character search */
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
94 static int last_t_cmd = TRUE; /* last search t_cmd */
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
95 #ifdef FEAT_MBYTE
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
96 static char_u lastc_bytes[MB_MAXBYTES + 1];
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
97 static int lastc_bytelen = 1; /* >1 for multi-byte char */
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
98 #endif
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
99
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 #if defined(FEAT_AUTOCMD) || defined(FEAT_EVAL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 /* copy of spats[], for keeping the search patterns while executing autocmds */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102 static struct spat saved_spats[2];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 static int saved_last_idx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 # ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 static int saved_no_hlsearch = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 static char_u *mr_pattern = NULL; /* pattern used by search_regcomp() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 static int mr_pattern_alloced = FALSE; /* mr_pattern was allocated */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 #ifdef FEAT_FIND_ID
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 * Type used by find_pattern_in_path() to remember which included files have
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 * been searched already.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119 typedef struct SearchedFile
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 FILE *fp; /* File pointer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 char_u *name; /* Full name of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 linenr_T lnum; /* Line we were up to in file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 int matched; /* Found a match in this file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 } SearchedFile;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 * translate search pattern for vim_regcomp()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 * pat_save == RE_SEARCH: save pat in spats[RE_SEARCH].pat (normal search cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 * pat_save == RE_SUBST: save pat in spats[RE_SUBST].pat (:substitute command)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 * pat_save == RE_BOTH: save pat in both patterns (:global command)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 * pat_use == RE_SEARCH: use previous search pattern if "pat" is NULL
1222
756bed568f5d updated for version 7.1b
vimboss
parents: 1062
diff changeset
135 * pat_use == RE_SUBST: use previous substitute pattern if "pat" is NULL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 * pat_use == RE_LAST: use last used pattern if "pat" is NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 * options & SEARCH_HIS: put search string in history
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 * options & SEARCH_KEEP: keep previous search pattern
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140 * returns FAIL if failed, OK otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
143 search_regcomp(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
144 char_u *pat,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
145 int pat_save,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
146 int pat_use,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
147 int options,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
148 regmmatch_T *regmatch) /* return: pattern and ignore-case flag */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 rc_did_emsg = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 magic = p_magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 * If no pattern given, use a previously defined pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 if (pat == NULL || *pat == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 if (pat_use == RE_LAST)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 i = last_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 i = pat_use;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 if (spats[i].pat == NULL) /* pattern was never defined */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 if (pat_use == RE_SUBST)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 EMSG(_(e_nopresub));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 EMSG(_(e_noprevre));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 rc_did_emsg = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174 pat = spats[i].pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175 magic = spats[i].magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 no_smartcase = spats[i].no_scs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178 #ifdef FEAT_CMDHIST
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179 else if (options & SEARCH_HIS) /* put new pattern in history */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 add_to_history(HIST_SEARCH, pat, TRUE, NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 if (mr_pattern_alloced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 vim_free(mr_pattern);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 mr_pattern_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 if (curwin->w_p_rl && *curwin->w_p_rlc == 's')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 char_u *rev_pattern;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 rev_pattern = reverse_text(pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 if (rev_pattern == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 mr_pattern = pat; /* out of memory, keep normal pattern. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 mr_pattern = rev_pattern;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 mr_pattern_alloced = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 mr_pattern = pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 * Save the currently used pattern in the appropriate place,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 * unless the pattern should not be remembered.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 */
5606
15960ebc2ee8 updated for version 7.4.150
Bram Moolenaar <bram@vim.org>
parents: 5523
diff changeset
211 if (!(options & SEARCH_KEEP) && !cmdmod.keeppatterns)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 /* search or global command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 if (pat_save == RE_SEARCH || pat_save == RE_BOTH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 save_re_pat(RE_SEARCH, pat, magic);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 /* substitute or global command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 if (pat_save == RE_SUBST || pat_save == RE_BOTH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 save_re_pat(RE_SUBST, pat, magic);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 regmatch->rmm_ic = ignorecase(pat);
410
c60ba877860b updated for version 7.0107
vimboss
parents: 408
diff changeset
222 regmatch->rmm_maxcol = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 regmatch->regprog = vim_regcomp(pat, magic ? RE_MAGIC : 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 if (regmatch->regprog == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 * Get search pattern used by search_regcomp().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 char_u *
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
233 get_search_pat(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 return mr_pattern;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237
1344
843bfffb04c7 updated for version 7.1-058
vimboss
parents: 1311
diff changeset
238 #if defined(FEAT_RIGHTLEFT) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 * Reverse text into allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 * Returns the allocated string, NULL when out of memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 */
1344
843bfffb04c7 updated for version 7.1-058
vimboss
parents: 1311
diff changeset
243 char_u *
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
244 reverse_text(char_u *s)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 unsigned len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 unsigned s_i, rev_i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 char_u *rev;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 * Reverse the pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 len = (unsigned)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 rev = alloc(len + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 if (rev != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 rev_i = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 for (s_i = 0; s_i < len; ++s_i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 int mb_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 464
diff changeset
265 mb_len = (*mb_ptr2len)(s + s_i);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 rev_i -= mb_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 mch_memmove(rev + rev_i, s + s_i, mb_len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 s_i += mb_len - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 rev[--rev_i] = s[s_i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 rev[len] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 return rev;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280
6426
f673842874b6 updated for version 7.4.543
Bram Moolenaar <bram@vim.org>
parents: 6402
diff changeset
281 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
282 save_re_pat(int idx, char_u *pat, int magic)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 if (spats[idx].pat != pat)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 vim_free(spats[idx].pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 spats[idx].pat = vim_strsave(pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 spats[idx].magic = magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 spats[idx].no_scs = no_smartcase;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 last_idx = idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 /* If 'hlsearch' set and search pat changed: need redraw. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 if (p_hls)
745
d41f5f59266e updated for version 7.0222
vimboss
parents: 712
diff changeset
294 redraw_all_later(SOME_VALID);
5458
6ae816249627 updated for version 7.4.079
Bram Moolenaar <bram@vim.org>
parents: 5452
diff changeset
295 SET_NO_HLSEARCH(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 #if defined(FEAT_AUTOCMD) || defined(FEAT_EVAL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 * Save the search patterns, so they can be restored later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 * Used before/after executing autocommands and user functions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 static int save_level = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
308 save_search_patterns(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 if (save_level++ == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 saved_spats[0] = spats[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 if (spats[0].pat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 saved_spats[0].pat = vim_strsave(spats[0].pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 saved_spats[1] = spats[1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 if (spats[1].pat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 saved_spats[1].pat = vim_strsave(spats[1].pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 saved_last_idx = last_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 # ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 saved_no_hlsearch = no_hlsearch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
326 restore_search_patterns(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 if (--save_level == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 vim_free(spats[0].pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 spats[0] = saved_spats[0];
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
332 #if defined(FEAT_EVAL)
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
333 set_vv_searchforward();
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
334 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 vim_free(spats[1].pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 spats[1] = saved_spats[1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 last_idx = saved_last_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 # ifdef FEAT_SEARCH_EXTRA
5458
6ae816249627 updated for version 7.4.079
Bram Moolenaar <bram@vim.org>
parents: 5452
diff changeset
339 SET_NO_HLSEARCH(saved_no_hlsearch);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
343 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
344
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 333
diff changeset
345 #if defined(EXITFREE) || defined(PROTO)
6c62b9b939bd updated for version 7.0093
vimboss
parents: 333
diff changeset
346 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
347 free_search_patterns(void)
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 333
diff changeset
348 {
6c62b9b939bd updated for version 7.0093
vimboss
parents: 333
diff changeset
349 vim_free(spats[0].pat);
6c62b9b939bd updated for version 7.0093
vimboss
parents: 333
diff changeset
350 vim_free(spats[1].pat);
1862
44c01fae1181 updated for version 7.2-160
vimboss
parents: 1859
diff changeset
351
44c01fae1181 updated for version 7.2-160
vimboss
parents: 1859
diff changeset
352 # ifdef FEAT_RIGHTLEFT
44c01fae1181 updated for version 7.2-160
vimboss
parents: 1859
diff changeset
353 if (mr_pattern_alloced)
44c01fae1181 updated for version 7.2-160
vimboss
parents: 1859
diff changeset
354 {
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2302
diff changeset
355 vim_free(mr_pattern);
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2302
diff changeset
356 mr_pattern_alloced = FALSE;
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2302
diff changeset
357 mr_pattern = NULL;
1862
44c01fae1181 updated for version 7.2-160
vimboss
parents: 1859
diff changeset
358 }
44c01fae1181 updated for version 7.2-160
vimboss
parents: 1859
diff changeset
359 # endif
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 333
diff changeset
360 }
6c62b9b939bd updated for version 7.0093
vimboss
parents: 333
diff changeset
361 #endif
6c62b9b939bd updated for version 7.0093
vimboss
parents: 333
diff changeset
362
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 * Return TRUE when case should be ignored for search pattern "pat".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 * Uses the 'ignorecase' and 'smartcase' options.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
368 ignorecase(char_u *pat)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 {
9913
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
370 return ignorecase_opt(pat, p_ic, p_scs);
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
371 }
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
372
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
373 /*
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
374 * As ignorecase() put pass the "ic" and "scs" flags.
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
375 */
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
376 int
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
377 ignorecase_opt(char_u *pat, int ic_in, int scs)
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
378 {
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
379 int ic = ic_in;
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
380
bb00c661b3a4 commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents: 9647
diff changeset
381 if (ic && !no_smartcase && scs
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 && !(ctrl_x_mode && curbuf->b_p_inf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 )
2302
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
386 ic = !pat_has_uppercase(pat);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 no_smartcase = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 return ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391
2302
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
392 /*
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
393 * Return TRUE if pattern "pat" has an uppercase character.
2302
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
394 */
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
395 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
396 pat_has_uppercase(char_u *pat)
2302
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
397 {
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
398 char_u *p = pat;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
399
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
400 while (*p != NUL)
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
401 {
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
402 #ifdef FEAT_MBYTE
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
403 int l;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
404
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
405 if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
406 {
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
407 if (enc_utf8 && utf_isupper(utf_ptr2char(p)))
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
408 return TRUE;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
409 p += l;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
410 }
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
411 else
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
412 #endif
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
413 if (*p == '\\')
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
414 {
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
415 if (p[1] == '_' && p[2] != NUL) /* skip "\_X" */
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
416 p += 3;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
417 else if (p[1] == '%' && p[2] != NUL) /* skip "\%X" */
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
418 p += 3;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
419 else if (p[1] != NUL) /* skip "\X" */
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
420 p += 2;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
421 else
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
422 p += 1;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
423 }
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
424 else if (MB_ISUPPER(*p))
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
425 return TRUE;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
426 else
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
427 ++p;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
428 }
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
429 return FALSE;
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
430 }
488be8cbe19c Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Bram Moolenaar <bram@vim.org>
parents: 2282
diff changeset
431
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 char_u *
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
433 last_csearch(void)
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
434 {
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
435 #ifdef FEAT_MBYTE
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
436 return lastc_bytes;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
437 #else
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
438 return lastc;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
439 #endif
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
440 }
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
441
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
442 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
443 last_csearch_forward(void)
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
444 {
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
445 return lastcdir == FORWARD;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
446 }
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
447
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
448 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
449 last_csearch_until(void)
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
450 {
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
451 return last_t_cmd == TRUE;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
452 }
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
453
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
454 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
455 set_last_csearch(int c, char_u *s UNUSED, int len UNUSED)
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
456 {
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
457 *lastc = c;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
458 #ifdef FEAT_MBYTE
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
459 lastc_bytelen = len;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
460 if (len)
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
461 memcpy(lastc_bytes, s, len);
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
462 else
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
463 vim_memset(lastc_bytes, 0, sizeof(lastc_bytes));
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
464 #endif
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
465 }
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
466
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
467 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
468 set_csearch_direction(int cdir)
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
469 {
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
470 lastcdir = cdir;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
471 }
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
472
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
473 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
474 set_csearch_until(int t_cmd)
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
475 {
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
476 last_t_cmd = t_cmd;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
477 }
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
478
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
479 char_u *
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
480 last_search_pat(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 return spats[last_idx].pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 * Reset search direction to forward. For "gd" and "gD" commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
489 reset_search_dir(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 spats[0].off.dir = '/';
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
492 #if defined(FEAT_EVAL)
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
493 set_vv_searchforward();
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
494 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 #if defined(FEAT_EVAL) || defined(FEAT_VIMINFO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 * Set the last search pattern. For ":let @/ =" and viminfo.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 * Also set the saved search pattern, so that this works in an autocommand.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
503 set_last_search_pat(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
504 char_u *s,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
505 int idx,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
506 int magic,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
507 int setlast)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 vim_free(spats[idx].pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 /* An empty string means that nothing should be matched. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 if (*s == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 spats[idx].pat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 spats[idx].pat = vim_strsave(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 spats[idx].magic = magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 spats[idx].no_scs = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 spats[idx].off.dir = '/';
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
518 #if defined(FEAT_EVAL)
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
519 set_vv_searchforward();
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
520 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 spats[idx].off.line = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 spats[idx].off.end = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 spats[idx].off.off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 if (setlast)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 last_idx = idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 if (save_level)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 vim_free(saved_spats[idx].pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 saved_spats[idx] = spats[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 if (spats[idx].pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 saved_spats[idx].pat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 saved_spats[idx].pat = vim_strsave(spats[idx].pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 saved_last_idx = last_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 # ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 /* If 'hlsearch' set and search pat changed: need redraw. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 if (p_hls && idx == last_idx && !no_hlsearch)
745
d41f5f59266e updated for version 7.0222
vimboss
parents: 712
diff changeset
539 redraw_all_later(SOME_VALID);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 * Get a regexp program for the last used search pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 * This is used for highlighting all matches in a window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 * Values returned in regmatch->regprog and regmatch->rmm_ic.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
551 last_pat_prog(regmmatch_T *regmatch)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 if (spats[last_idx].pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 regmatch->regprog = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 ++emsg_off; /* So it doesn't beep if bad expr */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 (void)search_regcomp((char_u *)"", 0, last_idx, SEARCH_KEEP, regmatch);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 --emsg_off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 /*
5735
50dbef5e774a updated for version 7.4.212
Bram Moolenaar <bram@vim.org>
parents: 5616
diff changeset
565 * Lowest level search function.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 * Search for 'count'th occurrence of pattern 'pat' in direction 'dir'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 * Start at position 'pos' and return the found position in 'pos'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569 * if (options & SEARCH_MSG) == 0 don't give any messages
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 * if (options & SEARCH_MSG) == SEARCH_NFMSG don't give 'notfound' messages
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 * if (options & SEARCH_MSG) == SEARCH_MSG give all messages
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 * if (options & SEARCH_HIS) put search pattern in history
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 * if (options & SEARCH_END) return position at end of match
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 * if (options & SEARCH_START) accept match at pos itself
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 * if (options & SEARCH_KEEP) keep previous search pattern
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 * if (options & SEARCH_FOLD) match only once in a closed fold
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 * if (options & SEARCH_PEEK) check for typed char, cancel search
7358
6fbeef3b65e6 commit https://github.com/vim/vim/commit/ad4d8a192abf44b89371af87d70b971cd654b799
Christian Brabandt <cb@256bit.org>
parents: 7070
diff changeset
578 * if (options & SEARCH_COL) start at pos->col instead of zero
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 * Return FAIL (zero) for failure, non-zero for success.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 * When FEAT_EVAL is defined, returns the index of the first matching
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 * subpattern plus one; one if there was none.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
585 searchit(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
586 win_T *win, /* window to search in; can be NULL for a
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 buffer without a window! */
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
588 buf_T *buf,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
589 pos_T *pos,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
590 int dir,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
591 char_u *pat,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
592 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
593 int options,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
594 int pat_use, /* which pattern to use when "pat" is empty */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
595 linenr_T stop_lnum, /* stop after this line number when != 0 */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
596 proftime_T *tm UNUSED) /* timeout limit or NULL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 int found;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 linenr_T lnum; /* no init to shut up Apollo cc */
7358
6fbeef3b65e6 commit https://github.com/vim/vim/commit/ad4d8a192abf44b89371af87d70b971cd654b799
Christian Brabandt <cb@256bit.org>
parents: 7070
diff changeset
600 colnr_T col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 regmmatch_T regmatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 colnr_T matchcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 lpos_T endpos;
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
605 lpos_T matchpos;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 int loop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 pos_T start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 int at_first_line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 int extra_col;
6903
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
610 int start_char_len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 int match_ok;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 long nmatched;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 int submatch = 0;
6402
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
614 int first_match = TRUE;
648
9032e4668296 updated for version 7.0189
vimboss
parents: 620
diff changeset
615 int save_called_emsg = called_emsg;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617 int break_loop = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 if (search_regcomp(pat, RE_SEARCH, pat_use,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 (options & (SEARCH_HIS + SEARCH_KEEP)), &regmatch) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 if ((options & SEARCH_MSG) && !rc_did_emsg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624 EMSG2(_("E383: Invalid search string: %s"), mr_pattern);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627
648
9032e4668296 updated for version 7.0189
vimboss
parents: 620
diff changeset
628 /*
9032e4668296 updated for version 7.0189
vimboss
parents: 620
diff changeset
629 * find the string
9032e4668296 updated for version 7.0189
vimboss
parents: 620
diff changeset
630 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 called_emsg = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 do /* loop for count */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 {
6402
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
634 /* When not accepting a match at the start position set "extra_col" to
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
635 * a non-zero value. Don't do that when starting at MAXCOL, since
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
636 * MAXCOL + 1 is zero. */
6903
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
637 if (pos->col == MAXCOL)
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
638 start_char_len = 0;
6402
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
639 #ifdef FEAT_MBYTE
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
640 /* Watch out for the "col" being MAXCOL - 2, used in a closed fold. */
6903
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
641 else if (has_mbyte
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
642 && pos->lnum >= 1 && pos->lnum <= buf->b_ml.ml_line_count
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
643 && pos->col < MAXCOL - 2)
6402
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
644 {
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
645 ptr = ml_get_buf(buf, pos->lnum, FALSE) + pos->col;
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
646 if (*ptr == NUL)
6903
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
647 start_char_len = 1;
6402
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
648 else
6903
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
649 start_char_len = (*mb_ptr2len)(ptr);
6402
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
650 }
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
651 #endif
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
652 else
6903
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
653 start_char_len = 1;
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
654 if (dir == FORWARD)
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
655 {
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
656 if (options & SEARCH_START)
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
657 extra_col = 0;
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
658 else
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
659 extra_col = start_char_len;
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
660 }
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
661 else
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
662 {
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
663 if (options & SEARCH_START)
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
664 extra_col = start_char_len;
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
665 else
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
666 extra_col = 0;
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
667 }
6402
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
668
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 start_pos = *pos; /* remember start pos for detecting no match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 found = 0; /* default: not found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 at_first_line = TRUE; /* default: start in first line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 if (pos->lnum == 0) /* correct lnum for when starting in line 0 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 pos->lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 pos->col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 at_first_line = FALSE; /* not in first line now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 * Start searching in current line, unless searching backwards and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681 * we're in column 0.
1311
b686fb4898d1 updated for version 7.1-025
vimboss
parents: 1310
diff changeset
682 * If we are searching backwards, in column 0, and not including the
b686fb4898d1 updated for version 7.1-025
vimboss
parents: 1310
diff changeset
683 * current position, gain some efficiency by skipping back a line.
b686fb4898d1 updated for version 7.1-025
vimboss
parents: 1310
diff changeset
684 * Otherwise begin the search in the current line.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 */
1311
b686fb4898d1 updated for version 7.1-025
vimboss
parents: 1310
diff changeset
686 if (dir == BACKWARD && start_pos.col == 0
b686fb4898d1 updated for version 7.1-025
vimboss
parents: 1310
diff changeset
687 && (options & SEARCH_START) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 lnum = pos->lnum - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690 at_first_line = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 lnum = pos->lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 for (loop = 0; loop <= 1; ++loop) /* loop twice if 'wrapscan' set */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 for ( ; lnum > 0 && lnum <= buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 lnum += dir, at_first_line = FALSE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
700 /* Stop after checking "stop_lnum", if it's set. */
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
701 if (stop_lnum != 0 && (dir == FORWARD
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
702 ? lnum > stop_lnum : lnum < stop_lnum))
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
703 break;
1496
29c09fa57168 updated for version 7.1-211
vimboss
parents: 1463
diff changeset
704 #ifdef FEAT_RELTIME
29c09fa57168 updated for version 7.1-211
vimboss
parents: 1463
diff changeset
705 /* Stop after passing the "tm" time limit. */
29c09fa57168 updated for version 7.1-211
vimboss
parents: 1463
diff changeset
706 if (tm != NULL && profile_passed_limit(tm))
29c09fa57168 updated for version 7.1-211
vimboss
parents: 1463
diff changeset
707 break;
29c09fa57168 updated for version 7.1-211
vimboss
parents: 1463
diff changeset
708 #endif
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
709
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
710 /*
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
711 * Look for a match somewhere in line "lnum".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 */
7358
6fbeef3b65e6 commit https://github.com/vim/vim/commit/ad4d8a192abf44b89371af87d70b971cd654b799
Christian Brabandt <cb@256bit.org>
parents: 7070
diff changeset
713 col = at_first_line && (options & SEARCH_COL) ? pos->col
6fbeef3b65e6 commit https://github.com/vim/vim/commit/ad4d8a192abf44b89371af87d70b971cd654b799
Christian Brabandt <cb@256bit.org>
parents: 7070
diff changeset
714 : (colnr_T)0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 nmatched = vim_regexec_multi(&regmatch, win, buf,
7358
6fbeef3b65e6 commit https://github.com/vim/vim/commit/ad4d8a192abf44b89371af87d70b971cd654b799
Christian Brabandt <cb@256bit.org>
parents: 7070
diff changeset
716 lnum, col,
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
717 #ifdef FEAT_RELTIME
7358
6fbeef3b65e6 commit https://github.com/vim/vim/commit/ad4d8a192abf44b89371af87d70b971cd654b799
Christian Brabandt <cb@256bit.org>
parents: 7070
diff changeset
718 tm
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
719 #else
7358
6fbeef3b65e6 commit https://github.com/vim/vim/commit/ad4d8a192abf44b89371af87d70b971cd654b799
Christian Brabandt <cb@256bit.org>
parents: 7070
diff changeset
720 NULL
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
721 #endif
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
722 );
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 /* Abort searching on an error (e.g., out of stack). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 if (called_emsg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 if (nmatched > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 /* match may actually be in another line when using \zs */
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
729 matchpos = regmatch.startpos[0];
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730 endpos = regmatch.endpos[0];
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
731 #ifdef FEAT_EVAL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 submatch = first_submatch(&regmatch);
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
733 #endif
1544
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
734 /* "lnum" may be past end of buffer for "\n\zs". */
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
735 if (lnum + matchpos.lnum > buf->b_ml.ml_line_count)
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
736 ptr = (char_u *)"";
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
737 else
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
738 ptr = ml_get_buf(buf, lnum + matchpos.lnum, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 * Forward search in the first line: match should be after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 * the start position. If not, continue at the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743 * match (this is vi compatible) or on the next char.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 if (dir == FORWARD && at_first_line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 match_ok = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 /*
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
749 * When the match starts in a next line it's certainly
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
750 * past the start position.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 * When match lands on a NUL the cursor will be put
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 * one back afterwards, compare with that position,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753 * otherwise "/$" will get stuck on end of line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 */
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
755 while (matchpos.lnum == 0
6402
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
756 && ((options & SEARCH_END) && first_match
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
757 ? (nmatched == 1
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
758 && (int)endpos.col - 1
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
759 < (int)start_pos.col + extra_col)
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
760 : ((int)matchpos.col
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
761 - (ptr[matchpos.col] == NUL)
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
762 < (int)start_pos.col + extra_col)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765 * If vi-compatible searching, continue at the end
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 * of the match, otherwise continue one position
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767 * forward.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769 if (vim_strchr(p_cpo, CPO_SEARCH) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
770 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771 if (nmatched > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773 /* end is in next line, thus no match in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 * this line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775 match_ok = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
776 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
777 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
778 matchcol = endpos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
779 /* for empty match: advance one char */
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
780 if (matchcol == matchpos.col
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781 && ptr[matchcol] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
782 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
783 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
784 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 matchcol +=
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 464
diff changeset
786 (*mb_ptr2len)(ptr + matchcol);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
789 ++matchcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
791 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
792 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
793 {
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
794 matchcol = matchpos.col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 if (ptr[matchcol] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
798 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 464
diff changeset
799 matchcol += (*mb_ptr2len)(ptr
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
800 + matchcol);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803 ++matchcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
804 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
805 }
4252
96f478b812b1 updated for version 7.3.877
Bram Moolenaar <bram@vim.org>
parents: 4240
diff changeset
806 if (matchcol == 0 && (options & SEARCH_START))
4240
d52c45b35fb0 updated for version 7.3.871
Bram Moolenaar <bram@vim.org>
parents: 4153
diff changeset
807 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 if (ptr[matchcol] == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 || (nmatched = vim_regexec_multi(&regmatch,
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
810 win, buf, lnum + matchpos.lnum,
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
811 matchcol,
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
812 #ifdef FEAT_RELTIME
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
813 tm
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
814 #else
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
815 NULL
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
816 #endif
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
817 )) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819 match_ok = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
821 }
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
822 matchpos = regmatch.startpos[0];
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 endpos = regmatch.endpos[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 submatch = first_submatch(&regmatch);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
826 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
828 /* Need to get the line pointer again, a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 * multi-line search may have made it invalid. */
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
830 ptr = ml_get_buf(buf, lnum + matchpos.lnum, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 if (!match_ok)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
834 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835 if (dir == BACKWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 * Now, if there are multiple matches on this line,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839 * we have to get the last one. Or the last one before
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840 * the cursor, if we're on that line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841 * When putting the new cursor at the end, compare
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842 * relative to the end of the match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 match_ok = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846 {
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
847 /* Remember a position that is before the start
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
848 * position, we use it if it's the last match in
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
849 * the line. Always accept a position after
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
850 * wrapping around. */
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
851 if (loop
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
852 || ((options & SEARCH_END)
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
853 ? (lnum + regmatch.endpos[0].lnum
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
854 < start_pos.lnum
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
855 || (lnum + regmatch.endpos[0].lnum
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
856 == start_pos.lnum
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
857 && (int)regmatch.endpos[0].col - 1
6903
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
858 < (int)start_pos.col
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
859 + extra_col))
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
860 : (lnum + regmatch.startpos[0].lnum
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
861 < start_pos.lnum
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
862 || (lnum + regmatch.startpos[0].lnum
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
863 == start_pos.lnum
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
864 && (int)regmatch.startpos[0].col
6903
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
865 < (int)start_pos.col
dd923806ae3b patch 7.4.771
Bram Moolenaar <bram@vim.org>
parents: 6675
diff changeset
866 + extra_col))))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
868 match_ok = TRUE;
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
869 matchpos = regmatch.startpos[0];
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
870 endpos = regmatch.endpos[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
871 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
872 submatch = first_submatch(&regmatch);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
873 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
874 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
875 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
876 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
877
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
878 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
879 * We found a valid match, now check if there is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
880 * another one after it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
881 * If vi-compatible searching, continue at the end
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
882 * of the match, otherwise continue one position
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883 * forward.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
884 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885 if (vim_strchr(p_cpo, CPO_SEARCH) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 if (nmatched > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 matchcol = endpos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 /* for empty match: advance one char */
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
891 if (matchcol == matchpos.col
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
892 && ptr[matchcol] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
893 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
896 matchcol +=
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 464
diff changeset
897 (*mb_ptr2len)(ptr + matchcol);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
899 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
900 ++matchcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
901 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
902 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
904 {
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
905 /* Stop when the match is in a next line. */
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
906 if (matchpos.lnum > 0)
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
907 break;
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
908 matchcol = matchpos.col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909 if (ptr[matchcol] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
910 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
911 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
913 matchcol +=
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 464
diff changeset
914 (*mb_ptr2len)(ptr + matchcol);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
917 ++matchcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
918 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
919 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920 if (ptr[matchcol] == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
921 || (nmatched = vim_regexec_multi(&regmatch,
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
922 win, buf, lnum + matchpos.lnum,
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
923 matchcol,
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
924 #ifdef FEAT_RELTIME
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
925 tm
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
926 #else
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
927 NULL
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
928 #endif
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
929 )) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 /* Need to get the line pointer again, a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 * multi-line search may have made it invalid. */
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
934 ptr = ml_get_buf(buf, lnum + matchpos.lnum, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
935 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
938 * If there is only a match after the cursor, skip
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 * this match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 if (!match_ok)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944
1544
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
945 /* With the SEARCH_END option move to the last character
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
946 * of the match. Don't do it for an empty match, end
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
947 * should be same as start then. */
4252
96f478b812b1 updated for version 7.3.877
Bram Moolenaar <bram@vim.org>
parents: 4240
diff changeset
948 if ((options & SEARCH_END) && !(options & SEARCH_NOOF)
1544
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
949 && !(matchpos.lnum == endpos.lnum
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
950 && matchpos.col == endpos.col))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 {
1544
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
952 /* For a match in the first column, set the position
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
953 * on the NUL in the previous line. */
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
954 pos->lnum = lnum + endpos.lnum;
1544
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
955 pos->col = endpos.col;
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
956 if (endpos.col == 0)
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 816
diff changeset
957 {
1544
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
958 if (pos->lnum > 1) /* just in case */
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
959 {
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
960 --pos->lnum;
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
961 pos->col = (colnr_T)STRLEN(ml_get_buf(buf,
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
962 pos->lnum, FALSE));
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
963 }
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
964 }
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
965 else
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
966 {
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
967 --pos->col;
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
968 #ifdef FEAT_MBYTE
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
969 if (has_mbyte
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
970 && pos->lnum <= buf->b_ml.ml_line_count)
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
971 {
1060
39d115408c71 updated for version 7.0-186
vimboss
parents: 1007
diff changeset
972 ptr = ml_get_buf(buf, pos->lnum, FALSE);
1544
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
973 pos->col -= (*mb_head_off)(ptr, ptr + pos->col);
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
974 }
fc42d9cc7ad0 updated for version 7.1-258
vimboss
parents: 1527
diff changeset
975 #endif
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 816
diff changeset
976 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 {
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
980 pos->lnum = lnum + matchpos.lnum;
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
981 pos->col = matchpos.col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984 pos->coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 found = 1;
6402
7f48abe500e1 updated for version 7.4.532
Bram Moolenaar <bram@vim.org>
parents: 5975
diff changeset
987 first_match = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
989 /* Set variables used for 'incsearch' highlighting. */
140
8ecb0db93e9a updated for version 7.0045
vimboss
parents: 96
diff changeset
990 search_match_lines = endpos.lnum - matchpos.lnum;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991 search_match_endcol = endpos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
992 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
993 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
994 line_breakcheck(); /* stop if ctrl-C typed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
995 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
999 /* Cancel searching if a character was typed. Used for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1000 * 'incsearch'. Don't check too often, that would slowdown
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1001 * searching too much. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 if ((options & SEARCH_PEEK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 && ((lnum - pos->lnum) & 0x3f) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1004 && char_avail())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1006 break_loop = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1011 if (loop && lnum == start_pos.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 break; /* if second loop, stop where started */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1014 at_first_line = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016 /*
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
1017 * Stop the search if wrapscan isn't set, "stop_lnum" is
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
1018 * specified, after an interrupt, after a match and after looping
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
1019 * twice.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 */
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
1021 if (!p_ws || stop_lnum != 0 || got_int || called_emsg
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1862
diff changeset
1022 #ifdef FEAT_SEARCH_EXTRA
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1862
diff changeset
1023 || break_loop
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1862
diff changeset
1024 #endif
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1862
diff changeset
1025 || found || loop)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 * If 'wrapscan' is set we continue at the other end of the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 * If 'shortmess' does not contain 's', we give a message.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031 * This message is also remembered in keep_msg for when the screen
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 * is redrawn. The keep_msg is cleared whenever another message is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1033 * written.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035 if (dir == BACKWARD) /* start second loop at the other end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 lnum = buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1038 lnum = 1;
504
35cde31bdcbd updated for version 7.0141
vimboss
parents: 481
diff changeset
1039 if (!shortmess(SHM_SEARCH) && (options & SEARCH_MSG))
35cde31bdcbd updated for version 7.0141
vimboss
parents: 481
diff changeset
1040 give_warning((char_u *)_(dir == BACKWARD
35cde31bdcbd updated for version 7.0141
vimboss
parents: 481
diff changeset
1041 ? top_bot_msg : bot_top_msg), TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042 }
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1862
diff changeset
1043 if (got_int || called_emsg
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1862
diff changeset
1044 #ifdef FEAT_SEARCH_EXTRA
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1862
diff changeset
1045 || break_loop
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1862
diff changeset
1046 #endif
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1862
diff changeset
1047 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1048 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050 while (--count > 0 && found); /* stop after count matches or no match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1051
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
1052 vim_regfree(regmatch.regprog);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053
648
9032e4668296 updated for version 7.0189
vimboss
parents: 620
diff changeset
1054 called_emsg |= save_called_emsg;
9032e4668296 updated for version 7.0189
vimboss
parents: 620
diff changeset
1055
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1056 if (!found) /* did not find it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1057 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1058 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1059 EMSG(_(e_interr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 else if ((options & SEARCH_MSG) == SEARCH_MSG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1061 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1062 if (p_ws)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 EMSG2(_(e_patnotf2), mr_pattern);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064 else if (lnum == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1065 EMSG2(_("E384: search hit TOP without match for: %s"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 mr_pattern);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068 EMSG2(_("E385: search hit BOTTOM without match for: %s"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069 mr_pattern);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
1074 /* A pattern like "\n\zs" may go past the last line. */
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
1075 if (pos->lnum > buf->b_ml.ml_line_count)
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
1076 {
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
1077 pos->lnum = buf->b_ml.ml_line_count;
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
1078 pos->col = (int)STRLEN(ml_get_buf(buf, pos->lnum, FALSE));
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
1079 if (pos->col > 0)
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
1080 --pos->col;
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
1081 }
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 681
diff changeset
1082
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1083 return submatch + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1084 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1085
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1086 #ifdef FEAT_EVAL
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1087 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1088 set_search_direction(int cdir)
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1089 {
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1090 spats[0].off.dir = cdir;
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1091 }
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1092
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1093 static void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1094 set_vv_searchforward(void)
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1095 {
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1096 set_vim_var_nr(VV_SEARCHFORWARD, (long)(spats[0].off.dir == '/'));
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1097 }
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1098
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1100 * Return the number of the first subpat that matched.
7358
6fbeef3b65e6 commit https://github.com/vim/vim/commit/ad4d8a192abf44b89371af87d70b971cd654b799
Christian Brabandt <cb@256bit.org>
parents: 7070
diff changeset
1101 * Return zero if none of them matched.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1102 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1104 first_submatch(regmmatch_T *rp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106 int submatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1108 for (submatch = 1; ; ++submatch)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 if (rp->startpos[submatch].lnum >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112 if (submatch == 9)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1114 submatch = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1117 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1118 return submatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 * Highest level string search function.
1222
756bed568f5d updated for version 7.1b
vimboss
parents: 1062
diff changeset
1124 * Search for the 'count'th occurrence of pattern 'pat' in direction 'dirc'
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 * If 'dirc' is 0: use previous dir.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126 * If 'pat' is NULL or empty : use previous string.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127 * If 'options & SEARCH_REV' : go in reverse of previous dir.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 * If 'options & SEARCH_ECHO': echo the search command and handle options
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 * If 'options & SEARCH_MSG' : may give error message
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 * If 'options & SEARCH_OPT' : interpret optional flags
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 * If 'options & SEARCH_HIS' : put search pattern in history
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 * If 'options & SEARCH_NOOF': don't add offset to position
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 * If 'options & SEARCH_MARK': set previous context mark
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 * If 'options & SEARCH_KEEP': keep previous search pattern
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 * If 'options & SEARCH_START': accept match at curpos itself
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 * If 'options & SEARCH_PEEK': check for typed char, cancel search
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 * Careful: If spats[0].off.line == TRUE and spats[0].off.off == 0 this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 * makes the movement linewise without moving the match position.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 *
6661
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
1141 * Return 0 for failure, 1 for found, 2 for found and line offset added.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1144 do_search(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1145 oparg_T *oap, /* can be NULL */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1146 int dirc, /* '/' or '?' */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1147 char_u *pat,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1148 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1149 int options,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1150 proftime_T *tm) /* timeout limit or NULL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152 pos_T pos; /* position of the last match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153 char_u *searchstr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 struct soffset old_off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1155 int retval; /* Return value */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1157 long c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1158 char_u *dircp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1159 char_u *strcopy = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1160 char_u *ps;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1161
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1162 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 * A line offset is not remembered, this is vi compatible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1164 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1165 if (spats[0].off.line && vim_strchr(p_cpo, CPO_LINEOFF) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1166 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1167 spats[0].off.line = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1168 spats[0].off.off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1169 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1170
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1171 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1172 * Save the values for when (options & SEARCH_KEEP) is used.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1173 * (there is no "if ()" around this because gcc wants them initialized)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1174 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1175 old_off = spats[0].off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1176
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1177 pos = curwin->w_cursor; /* start searching at the cursor position */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1178
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1179 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1180 * Find out the direction of the search.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1181 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1182 if (dirc == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1183 dirc = spats[0].off.dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1184 else
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1185 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1186 spats[0].off.dir = dirc;
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1187 #if defined(FEAT_EVAL)
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1188 set_vv_searchforward();
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1189 #endif
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1190 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1191 if (options & SEARCH_REV)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1192 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1193 #ifdef WIN32
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1194 /* There is a bug in the Visual C++ 2.2 compiler which means that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1195 * dirc always ends up being '/' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1196 dirc = (dirc == '/') ? '?' : '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1197 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1198 if (dirc == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1199 dirc = '?';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1200 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1201 dirc = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1202 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1203 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1204
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1205 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1206 /* If the cursor is in a closed fold, don't find another match in the same
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1207 * fold. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1208 if (dirc == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1209 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1210 if (hasFolding(pos.lnum, NULL, &pos.lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1211 pos.col = MAXCOL - 2; /* avoid overflow when adding 1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1212 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1213 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215 if (hasFolding(pos.lnum, &pos.lnum, NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216 pos.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1217 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1218 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1219
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1220 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1221 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1222 * Turn 'hlsearch' highlighting back on.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1223 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1224 if (no_hlsearch && !(options & SEARCH_KEEP))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1225 {
745
d41f5f59266e updated for version 7.0222
vimboss
parents: 712
diff changeset
1226 redraw_all_later(SOME_VALID);
5458
6ae816249627 updated for version 7.4.079
Bram Moolenaar <bram@vim.org>
parents: 5452
diff changeset
1227 SET_NO_HLSEARCH(FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1229 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1231 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1232 * Repeat the search when pattern followed by ';', e.g. "/foo/;?bar".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1233 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 searchstr = pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 dircp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 /* use previous pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1239 if (pat == NULL || *pat == NUL || *pat == dirc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 if (spats[RE_SEARCH].pat == NULL) /* no previous pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 {
2719
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1243 pat = spats[RE_SUBST].pat;
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1244 if (pat == NULL)
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1245 {
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1246 EMSG(_(e_noprevre));
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1247 retval = 0;
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1248 goto end_do_search;
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1249 }
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1250 searchstr = pat;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 }
2719
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1252 else
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1253 {
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1254 /* make search_regcomp() use spats[RE_SEARCH].pat */
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1255 searchstr = (char_u *)"";
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
1256 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 if (pat != NULL && *pat != NUL) /* look for (new) offset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 * Find end of regular expression.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 * If there is a matching '/' or '?', toss it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 ps = strcopy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 p = skip_regexp(pat, dirc, (int)p_magic, &strcopy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 if (strcopy != ps)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 /* made a copy of "pat" to change "\?" to "?" */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
1270 searchcmdlen += (int)(STRLEN(pat) - STRLEN(strcopy));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 pat = strcopy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 searchstr = strcopy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 if (*p == dirc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1276 dircp = p; /* remember where we put the NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 *p++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 spats[0].off.line = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 spats[0].off.end = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 spats[0].off.off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 * Check for a line offset or a character offset.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 * For get_address (echo off) we don't check for a character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 * offset, because it is meaningless and the 's' could be a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 * substitute command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 if (*p == '+' || *p == '-' || VIM_ISDIGIT(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 spats[0].off.line = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 else if ((options & SEARCH_OPT) &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 (*p == 'e' || *p == 's' || *p == 'b'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 if (*p == 'e') /* end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 spats[0].off.end = SEARCH_END;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 if (VIM_ISDIGIT(*p) || *p == '+' || *p == '-') /* got an offset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 /* 'nr' or '+nr' or '-nr' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 if (VIM_ISDIGIT(*p) || VIM_ISDIGIT(*(p + 1)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 spats[0].off.off = atol((char *)p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 else if (*p == '-') /* single '-' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 spats[0].off.off = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304 else /* single '+' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 spats[0].off.off = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307 while (VIM_ISDIGIT(*p)) /* skip number */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311 /* compute length of search command for get_address() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 searchcmdlen += (int)(p - pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 pat = p; /* put pat after search command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 if ((options & SEARCH_ECHO) && messaging()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 && !cmd_silent && msg_silent == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 char_u *msgbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 char_u *trunc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1322
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 if (*searchstr == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324 p = spats[last_idx].pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326 p = searchstr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 msgbuf = alloc((unsigned)(STRLEN(p) + 40));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 if (msgbuf != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 msgbuf[0] = dirc;
507
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1331 #ifdef FEAT_MBYTE
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1332 if (enc_utf8 && utf_iscomposing(utf_ptr2char(p)))
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1333 {
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1334 /* Use a space to draw the composing char on. */
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1335 msgbuf[1] = ' ';
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1336 STRCPY(msgbuf + 2, p);
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1337 }
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1338 else
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1339 #endif
a1059cda45f2 updated for version 7.0142
vimboss
parents: 504
diff changeset
1340 STRCPY(msgbuf + 1, p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 if (spats[0].off.line || spats[0].off.end || spats[0].off.off)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 p = msgbuf + STRLEN(msgbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 *p++ = dirc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 if (spats[0].off.end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346 *p++ = 'e';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 else if (!spats[0].off.line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 *p++ = 's';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 if (spats[0].off.off > 0 || spats[0].off.line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 *p++ = '+';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 if (spats[0].off.off != 0 || spats[0].off.line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 sprintf((char *)p, "%ld", spats[0].off.off);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 *p = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 msg_start();
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 507
diff changeset
1358 trunc = msg_strtrunc(msgbuf, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 /* The search pattern could be shown on the right in rightleft
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362 * mode, but the 'ruler' and 'showcmd' area use it too, thus
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363 * it would be blanked out again very soon. Show it on the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364 * left, but do reverse the text. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 if (curwin->w_p_rl && *curwin->w_p_rlc == 's')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 char_u *r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369 r = reverse_text(trunc != NULL ? trunc : msgbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 if (r != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 vim_free(trunc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373 trunc = r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 if (trunc != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 msg_outtrans(trunc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 vim_free(trunc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383 msg_outtrans(msgbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1384 msg_clr_eos();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385 msg_check();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1386 vim_free(msgbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388 gotocmdline(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 msg_nowait = TRUE; /* don't wait for this message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 * If there is a character offset, subtract it from the current
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396 * position, so we don't get stuck at "?pat?e+2" or "/pat/s-2".
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
1397 * Skip this if pos.col is near MAXCOL (closed fold).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 * This is not done for a line offset, because then we would not be vi
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399 * compatible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400 */
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
1401 if (!spats[0].off.line && spats[0].off.off && pos.col < MAXCOL - 2)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 if (spats[0].off.off > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 for (c = spats[0].off.off; c; --c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 if (decl(&pos) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 if (c) /* at start of buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410 pos.lnum = 0; /* allow lnum == 0 here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411 pos.col = MAXCOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1413 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1415 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1416 for (c = spats[0].off.off; c; ++c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1417 if (incl(&pos) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 if (c) /* at end of buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1421 pos.lnum = curbuf->b_ml.ml_line_count + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422 pos.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 #ifdef FEAT_FKMAP /* when in Farsi mode, reverse the character flow */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 if (p_altkeymap && curwin->w_p_rl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429 lrFswap(searchstr,0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432 c = searchit(curwin, curbuf, &pos, dirc == '/' ? FORWARD : BACKWARD,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 searchstr, count, spats[0].off.end + (options &
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 + SEARCH_MSG + SEARCH_START
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))),
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1496
diff changeset
1437 RE_LAST, (linenr_T)0, tm);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 if (dircp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 if (c == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1442 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443 retval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 goto end_do_search;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 if (spats[0].off.end && oap != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 oap->inclusive = TRUE; /* 'e' includes last character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1449 retval = 1; /* pattern found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 * Add character and/or line offset
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 */
945
0b211ebefd4e updated for version 7.0-071
vimboss
parents: 944
diff changeset
1454 if (!(options & SEARCH_NOOF) || (pat != NULL && *pat == ';'))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456 if (spats[0].off.line) /* Add the offset to the line number. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458 c = pos.lnum + spats[0].off.off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459 if (c < 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460 pos.lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 else if (c > curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 pos.lnum = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 pos.lnum = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1465 pos.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 retval = 2; /* pattern found, line offset added */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1468 }
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
1469 else if (pos.col < MAXCOL - 2) /* just in case */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1471 /* to the right, check for end of file */
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1472 c = spats[0].off.off;
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1473 if (c > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1474 {
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1475 while (c-- > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1476 if (incl(&pos) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1477 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 /* to the left, check for start of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 {
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1482 while (c++ < 0)
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1483 if (decl(&pos) == -1)
18ee39301b82 updated for version 7.2a
vimboss
parents: 1557
diff changeset
1484 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1489 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 * The search command can be followed by a ';' to do another search.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491 * For example: "/pat/;/foo/+3;?bar"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492 * This is like doing another search command, except:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493 * - The remembered direction '/' or '?' is from the first search.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 * - When an error happens the cursor isn't moved at all.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 * Don't do this when called by get_address() (it handles ';' itself).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 if (!(options & SEARCH_OPT) || pat == NULL || *pat != ';')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 dirc = *++pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 if (dirc != '?' && dirc != '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 retval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504 EMSG(_("E386: Expected '?' or '/' after ';'"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505 goto end_do_search;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1507 ++pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1509
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1510 if (options & SEARCH_MARK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1511 setpcmark();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 curwin->w_cursor = pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515 end_do_search:
5616
fa53233519c6 updated for version 7.4.155
Bram Moolenaar <bram@vim.org>
parents: 5606
diff changeset
1516 if ((options & SEARCH_KEEP) || cmdmod.keeppatterns)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 spats[0].off = old_off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 vim_free(strcopy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 #if defined(FEAT_INS_EXPAND) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 * search_for_exact_line(buf, pos, dir, pat)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527 * Search for a line starting with the given pattern (ignoring leading
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 * white-space), starting from pos and going in direction dir. pos will
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 * contain the position of the match found. Blank lines match only if
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 * ADDING is set. if p_ic is set then the pattern must be in lowercase.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531 * Return OK for success, or FAIL if no line found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1534 search_for_exact_line(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1535 buf_T *buf,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1536 pos_T *pos,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1537 int dir,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1538 char_u *pat)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540 linenr_T start = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 if (buf->b_ml.ml_line_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 pos->lnum += dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 if (pos->lnum < 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1551 if (p_ws)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1552 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1553 pos->lnum = buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1554 if (!shortmess(SHM_SEARCH))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1555 give_warning((char_u *)_(top_bot_msg), TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1556 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1557 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1558 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1559 pos->lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1560 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1561 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1562 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1563 else if (pos->lnum > buf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1564 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1565 if (p_ws)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1566 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 pos->lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1568 if (!shortmess(SHM_SEARCH))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 give_warning((char_u *)_(bot_top_msg), TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 pos->lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 if (pos->lnum == start)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579 if (start == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 start = pos->lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1581 ptr = ml_get_buf(buf, pos->lnum, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 p = skipwhite(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583 pos->col = (colnr_T) (p - ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585 /* when adding lines the matching line may be empty but it is not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586 * ignored because we are interested in the next line -- Acevedo */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
1587 if ((compl_cont_status & CONT_ADDING)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
1588 && !(compl_cont_status & CONT_SOL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590 if ((p_ic ? MB_STRICMP(p, pat) : STRCMP(p, pat)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1592 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1593 else if (*p != NUL) /* ignore empty lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1594 { /* expanding lines or words */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
1595 if ((p_ic ? MB_STRNICMP(p, pat, compl_length)
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
1596 : STRNCMP(p, pat, compl_length)) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1597 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1601 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1602 #endif /* FEAT_INS_EXPAND */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1603
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605 * Character Searches
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1609 * Search for a character in a line. If "t_cmd" is FALSE, move to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1610 * position of the character, otherwise move to just before the char.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1611 * Do this "cap->count1" times.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1612 * Return FAIL or OK.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1613 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1614 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1615 searchc(cmdarg_T *cap, int t_cmd)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1616 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1617 int c = cap->nchar; /* char to search for */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1618 int dir = cap->arg; /* TRUE for searching forward */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1619 long count = cap->count1; /* repeat count */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1620 int col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622 int len;
2925
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1623 int stop = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1625 if (c != NUL) /* normal search: remember args for repeat */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1626 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1627 if (!KeyStuffed) /* don't remember when redoing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 {
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1629 *lastc = c;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1630 set_csearch_direction(dir);
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1631 set_csearch_until(t_cmd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632 #ifdef FEAT_MBYTE
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1633 lastc_bytelen = (*mb_char2bytes)(c, lastc_bytes);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634 if (cap->ncharC1 != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635 {
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1636 lastc_bytelen += (*mb_char2bytes)(cap->ncharC1,
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1637 lastc_bytes + lastc_bytelen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 if (cap->ncharC2 != 0)
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1639 lastc_bytelen += (*mb_char2bytes)(cap->ncharC2,
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1640 lastc_bytes + lastc_bytelen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1641 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1642 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1643 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1644 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1645 else /* repeat previous search */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1646 {
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1647 if (*lastc == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649 if (dir) /* repeat in opposite direction */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1650 dir = -lastcdir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1651 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1652 dir = lastcdir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1653 t_cmd = last_t_cmd;
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1654 c = *lastc;
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1655 /* For multi-byte re-use last lastc_bytes[] and lastc_bytelen. */
2925
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1656
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1657 /* Force a move of at least one char, so ";" and "," will move the
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1658 * cursor, even if the cursor is right in front of char we are looking
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1659 * at. */
2947
3f1a4ed36d1b updated for version 7.3.246
Bram Moolenaar <bram@vim.org>
parents: 2925
diff changeset
1660 if (vim_strchr(p_cpo, CPO_SCOLON) == NULL && count == 1 && t_cmd)
2925
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1661 stop = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1662 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663
530
339999b511a0 updated for version 7.0148
vimboss
parents: 527
diff changeset
1664 if (dir == BACKWARD)
339999b511a0 updated for version 7.0148
vimboss
parents: 527
diff changeset
1665 cap->oap->inclusive = FALSE;
339999b511a0 updated for version 7.0148
vimboss
parents: 527
diff changeset
1666 else
339999b511a0 updated for version 7.0148
vimboss
parents: 527
diff changeset
1667 cap->oap->inclusive = TRUE;
339999b511a0 updated for version 7.0148
vimboss
parents: 527
diff changeset
1668
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 p = ml_get_curline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1670 col = curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1671 len = (int)STRLEN(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1672
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673 while (count--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1674 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1675 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1676 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1678 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 if (dir > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1681 {
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 464
diff changeset
1682 col += (*mb_ptr2len)(p + col);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 if (col >= len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1684 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688 if (col == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690 col -= (*mb_head_off)(p, p + col - 1) + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 }
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1692 if (lastc_bytelen == 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1693 {
2925
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1694 if (p[col] == c && stop)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1695 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1696 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1697 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1698 {
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1699 if (vim_memcmp(p + col, lastc_bytes, lastc_bytelen) == 0 && stop)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1700 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1701 }
2925
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1702 stop = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1710 if ((col += dir) < 0 || col >= len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1711 return FAIL;
2925
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1712 if (p[col] == c && stop)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1713 break;
2925
441d364773dc updated for version 7.3.235
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
1714 stop = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1715 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1717 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1718
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1719 if (t_cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1720 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1721 /* backup to before the character (possibly double-byte) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1722 col -= dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1723 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1724 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1725 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1726 if (dir < 0)
6991
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1727 /* Landed on the search char which is lastc_bytelen long */
814f1f569e4a patch 7.4.813
Bram Moolenaar <bram@vim.org>
parents: 6971
diff changeset
1728 col += lastc_bytelen - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1729 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1730 /* To previous char, which may be multi-byte. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1731 col -= (*mb_head_off)(p, p + col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1732 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1733 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1734 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1735 curwin->w_cursor.col = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1736
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1737 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1738 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1739
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1740 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1741 * "Other" Searches
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1742 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1745 * findmatch - find the matching paren or brace
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1746 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747 * Improvement over vi: Braces inside quotes are ignored.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1748 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1749 pos_T *
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1750 findmatch(oparg_T *oap, int initc)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752 return findmatchlimit(oap, initc, 0, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756 * Return TRUE if the character before "linep[col]" equals "ch".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757 * Return FALSE if "col" is zero.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 * Update "*prevcol" to the column of the previous character, unless "prevcol"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 * is NULL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 * Handles multibyte string correctly.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1761 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1763 check_prevcol(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1764 char_u *linep,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1765 int col,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1766 int ch,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1767 int *prevcol)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 --col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1770 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1771 if (col > 0 && has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 col -= (*mb_head_off)(linep, linep + col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774 if (prevcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 *prevcol = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 return (col >= 0 && linep[col] == ch) ? TRUE : FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
1779 static int find_rawstring_end(char_u *linep, pos_T *startpos, pos_T *endpos);
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1780
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1781 /*
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1782 * Raw string start is found at linep[startpos.col - 1].
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1783 * Return TRUE if the matching end can be found between startpos and endpos.
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1784 */
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1785 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1786 find_rawstring_end(char_u *linep, pos_T *startpos, pos_T *endpos)
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1787 {
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1788 char_u *p;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1789 char_u *delim_copy;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1790 size_t delim_len;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1791 linenr_T lnum;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1792 int found = FALSE;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1793
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1794 for (p = linep + startpos->col + 1; *p && *p != '('; ++p)
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1795 ;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1796 delim_len = (p - linep) - startpos->col - 1;
7054
3a1a6d6fb9b3 commit https://github.com/vim/vim/commit/6ed535dbc0981d328c02e139d6505207cbef4835
Christian Brabandt <cb@256bit.org>
parents: 7019
diff changeset
1797 delim_copy = vim_strnsave(linep + startpos->col + 1, (int)delim_len);
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1798 if (delim_copy == NULL)
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1799 return FALSE;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1800 for (lnum = startpos->lnum; lnum <= endpos->lnum; ++lnum)
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1801 {
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1802 char_u *line = ml_get(lnum);
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1803
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1804 for (p = line + (lnum == startpos->lnum
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1805 ? startpos->col + 1 : 0); *p; ++p)
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1806 {
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1807 if (lnum == endpos->lnum && (colnr_T)(p - line) >= endpos->col)
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1808 break;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1809 if (*p == ')' && p[delim_len + 1] == '"'
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1810 && STRNCMP(delim_copy, p + 1, delim_len) == 0)
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1811 {
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1812 found = TRUE;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1813 break;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1814 }
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1815 }
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1816 if (found)
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1817 break;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1818 }
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1819 vim_free(delim_copy);
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1820 return found;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1821 }
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1822
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1824 * findmatchlimit -- find the matching paren or brace, if it exists within
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1825 * maxtravel lines of the cursor. A maxtravel of 0 means search until falling
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1826 * off the edge of the file.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828 * "initc" is the character to find a match for. NUL means to find the
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1829 * character at or after the cursor. Special values:
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1830 * '*' look for C-style comment / *
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1831 * '/' look for C-style comment / *, ignoring comment-end
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1832 * '#' look for preprocessor directives
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1833 * 'R' look for raw string start: R"delim(text)delim" (only backwards)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1835 * flags: FM_BACKWARD search backwards (when initc is '/', '*' or '#')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836 * FM_FORWARD search forwards (when initc is '/', '*' or '#')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837 * FM_BLOCKSTOP stop at start/end of block ({ or } in column 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838 * FM_SKIPCOMM skip comments (not implemented yet!)
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 516
diff changeset
1839 *
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1840 * "oap" is only used to set oap->motion_type for a linewise motion, it can be
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 516
diff changeset
1841 * NULL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 pos_T *
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1845 findmatchlimit(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1846 oparg_T *oap,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1847 int initc,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1848 int flags,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1849 int maxtravel)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 static pos_T pos; /* current search position */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 int findc = 0; /* matching brace */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 int count = 0; /* cumulative number of braces */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 int backwards = FALSE; /* init for gcc */
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1856 int raw_string = FALSE; /* search for raw string */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 int inquote = FALSE; /* TRUE when inside quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 char_u *linep; /* pointer to current line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 int do_quotes; /* check for quotes in current line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 int at_start; /* do_quotes value at start position */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862 int hash_dir = 0; /* Direction searched for # things */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 int comment_dir = 0; /* Direction searched for comments */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864 pos_T match_pos; /* Where last slash-star was found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 int start_in_quotes; /* start position is in quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1866 int traveled = 0; /* how far we've searched so far */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1867 int ignore_cend = FALSE; /* ignore comment end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1868 int cpo_match; /* vi compatible matching */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1869 int cpo_bsl; /* don't recognize backslashes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870 int match_escaped = 0; /* search for escaped match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1871 int dir; /* Direction to search */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 int comment_col = MAXCOL; /* start of / / comment */
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
1873 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
1874 int lispcomm = FALSE; /* inside of Lisp-style comment */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
1875 int lisp = curbuf->b_p_lisp; /* engage Lisp-specific hacks ;) */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
1876 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878 pos = curwin->w_cursor;
5304
3640cf4c0d4b updated for version 7.4.005
Bram Moolenaar <bram@vim.org>
parents: 5210
diff changeset
1879 #ifdef FEAT_VIRTUALEDIT
3640cf4c0d4b updated for version 7.4.005
Bram Moolenaar <bram@vim.org>
parents: 5210
diff changeset
1880 pos.coladd = 0;
3640cf4c0d4b updated for version 7.4.005
Bram Moolenaar <bram@vim.org>
parents: 5210
diff changeset
1881 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882 linep = ml_get(pos.lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 cpo_match = (vim_strchr(p_cpo, CPO_MATCH) != NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 cpo_bsl = (vim_strchr(p_cpo, CPO_MATCHBSL) != NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1887 /* Direction to search when initc is '/', '*' or '#' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888 if (flags & FM_BACKWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889 dir = BACKWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 else if (flags & FM_FORWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 dir = FORWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 dir = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 * if initc given, look in the table for the matching character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1897 * '/' and '*' are special cases: look for start or end of comment.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 * When '/' is used, we ignore running backwards into an star-slash, for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 * "[*" command, we just want to find any comment.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 */
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1901 if (initc == '/' || initc == '*' || initc == 'R')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 comment_dir = dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904 if (initc == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 ignore_cend = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 backwards = (dir == FORWARD) ? FALSE : TRUE;
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1907 raw_string = (initc == 'R');
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1908 initc = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 else if (initc != '#' && initc != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 {
4029
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
1912 find_mps_values(&initc, &findc, &backwards, TRUE);
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
1913 if (findc == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1914 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1915 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1916 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1917 {
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1918 /*
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1919 * Either initc is '#', or no initc was given and we need to look
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1920 * under the cursor.
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
1921 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 if (initc == '#')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 hash_dir = dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 * initc was not given, must look for something to match under
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 * or near the cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 * Only check for special things when 'cpo' doesn't have '%'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 if (!cpo_match)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 /* Are we before or at #if, #else etc.? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 ptr = skipwhite(linep);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1937 if (*ptr == '#' && pos.col <= (colnr_T)(ptr - linep))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1938 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 ptr = skipwhite(ptr + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 if ( STRNCMP(ptr, "if", 2) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 || STRNCMP(ptr, "endif", 5) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 || STRNCMP(ptr, "el", 2) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 hash_dir = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1946 /* Are we on a comment? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947 else if (linep[pos.col] == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1949 if (linep[pos.col + 1] == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951 comment_dir = FORWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952 backwards = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953 pos.col++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1954 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 else if (pos.col > 0 && linep[pos.col - 1] == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1956 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 comment_dir = BACKWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958 backwards = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 pos.col--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1960 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1961 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 else if (linep[pos.col] == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1963 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1964 if (linep[pos.col + 1] == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 comment_dir = BACKWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 backwards = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 else if (pos.col > 0 && linep[pos.col - 1] == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 comment_dir = FORWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 backwards = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1976
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1978 * If we are not on a comment or the # at the start of a line, then
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1979 * look for brace anywhere on this line after the cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1980 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981 if (!hash_dir && !comment_dir)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1982 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1984 * Find the brace under or after the cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 * If beyond the end of the line, use the last character in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 * the line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1987 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1988 if (linep[pos.col] == NUL && pos.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1989 --pos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1990 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1991 {
4029
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
1992 initc = PTR2CHAR(linep + pos.col);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1993 if (initc == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1994 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1995
4029
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
1996 find_mps_values(&initc, &findc, &backwards, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 if (findc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 break;
4029
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
1999 pos.col += MB_PTR2LEN(linep + pos.col);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 if (!findc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 /* no brace in the line, maybe use " #if" then */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2004 if (!cpo_match && *skipwhite(linep) == '#')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2005 hash_dir = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2006 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2007 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2008 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2009 else if (!cpo_bsl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2010 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2011 int col, bslcnt = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2012
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2013 /* Set "match_escaped" if there are an odd number of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2014 * backslashes. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2015 for (col = pos.col; check_prevcol(linep, col, '\\', &col);)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2016 bslcnt++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2017 match_escaped = (bslcnt & 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2018 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2019 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2020 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2021 if (hash_dir)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2022 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2023 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2024 * Look for matching #if, #else, #elif, or #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2025 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2026 if (oap != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2027 oap->motion_type = MLINE; /* Linewise for this case only */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2028 if (initc != '#')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2029 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2030 ptr = skipwhite(skipwhite(linep) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2031 if (STRNCMP(ptr, "if", 2) == 0 || STRNCMP(ptr, "el", 2) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2032 hash_dir = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2033 else if (STRNCMP(ptr, "endif", 5) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2034 hash_dir = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2035 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2036 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2037 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2038 pos.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2039 while (!got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2040 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2041 if (hash_dir > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2042 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2043 if (pos.lnum == curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2044 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2045 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2046 else if (pos.lnum == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2047 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2048 pos.lnum += hash_dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2049 linep = ml_get(pos.lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 line_breakcheck(); /* check for CTRL-C typed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2051 ptr = skipwhite(linep);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2052 if (*ptr != '#')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2053 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2054 pos.col = (colnr_T) (ptr - linep);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2055 ptr = skipwhite(ptr + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2056 if (hash_dir > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2057 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2058 if (STRNCMP(ptr, "if", 2) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2059 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2060 else if (STRNCMP(ptr, "el", 2) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2061 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2062 if (count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2063 return &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2064 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065 else if (STRNCMP(ptr, "endif", 5) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2066 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 if (count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 return &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2069 count--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074 if (STRNCMP(ptr, "if", 2) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2076 if (count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2077 return &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2078 count--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2079 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2080 else if (initc == '#' && STRNCMP(ptr, "el", 2) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082 if (count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 return &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 else if (STRNCMP(ptr, "endif", 5) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 #ifdef FEAT_RIGHTLEFT
1344
843bfffb04c7 updated for version 7.1-058
vimboss
parents: 1311
diff changeset
2094 /* This is just guessing: when 'rightleft' is set, search for a matching
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 * paren/brace in the other direction. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 if (curwin->w_p_rl && vim_strchr((char_u *)"()[]{}<>", initc) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 backwards = !backwards;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 do_quotes = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 start_in_quotes = MAYBE;
699
2af8de31a3a8 updated for version 7.0211
vimboss
parents: 692
diff changeset
2102 clearpos(&match_pos);
2af8de31a3a8 updated for version 7.0211
vimboss
parents: 692
diff changeset
2103
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 /* backward search: Check if this line contains a single-line comment */
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2105 if ((backwards && comment_dir)
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2106 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2107 || lisp
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2108 #endif
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2109 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 comment_col = check_linecomment(linep);
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2111 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2112 if (lisp && comment_col != MAXCOL && pos.col > (colnr_T)comment_col)
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2113 lispcomm = TRUE; /* find match inside this comment */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2114 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 while (!got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 * Go to the next position, forward or backward. We could use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 * inc() and dec() here, but that is much slower
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 if (backwards)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 {
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2123 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2124 /* char to match is inside of comment, don't search outside */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2125 if (lispcomm && pos.col < (colnr_T)comment_col)
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2126 break;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2127 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 if (pos.col == 0) /* at start of line, go to prev. one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130 if (pos.lnum == 1) /* start of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 --pos.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133
829
dc8197342755 updated for version 7.0d04
vimboss
parents: 819
diff changeset
2134 if (maxtravel > 0 && ++traveled > maxtravel)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 linep = ml_get(pos.lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 pos.col = (colnr_T)STRLEN(linep); /* pos.col on trailing NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 do_quotes = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 line_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 /* Check if this line contains a single-line comment */
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2143 if (comment_dir
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2144 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2145 || lisp
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2146 #endif
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2147 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 comment_col = check_linecomment(linep);
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2149 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2150 /* skip comment */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2151 if (lisp && comment_col != MAXCOL)
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2152 pos.col = comment_col;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2153 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2155 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 --pos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2160 pos.col -= (*mb_head_off)(linep, linep + pos.col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2161 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2162 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164 else /* forward search */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 {
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2166 if (linep[pos.col] == NUL
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2167 /* at end of line, go to next one */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2168 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2169 /* don't search for match in comment */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2170 || (lisp && comment_col != MAXCOL
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2171 && pos.col == (colnr_T)comment_col)
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2172 #endif
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2173 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174 {
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2175 if (pos.lnum == curbuf->b_ml.ml_line_count /* end of file */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2176 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2177 /* line is exhausted and comment with it,
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2178 * don't search for match in code */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2179 || lispcomm
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2180 #endif
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2181 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2183 ++pos.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185 if (maxtravel && traveled++ > maxtravel)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188 linep = ml_get(pos.lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 pos.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 do_quotes = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 line_breakcheck();
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2192 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2193 if (lisp) /* find comment pos in new line */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2194 comment_col = check_linecomment(linep);
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2195 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2196 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2197 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 464
diff changeset
2201 pos.col += (*mb_ptr2len)(linep + pos.col);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 ++pos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2209 * If FM_BLOCKSTOP given, stop at a '{' or '}' in column 0.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2210 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 if (pos.col == 0 && (flags & FM_BLOCKSTOP) &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 (linep[0] == '{' || linep[0] == '}'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2213 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 if (linep[0] == findc && count == 0) /* match! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 return &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216 break; /* out of scope */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219 if (comment_dir)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2220 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2221 /* Note: comments do not nest, and we ignore quotes in them */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2222 /* TODO: ignore comment brackets inside strings */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 if (comment_dir == FORWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2225 if (linep[pos.col] == '*' && linep[pos.col + 1] == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2226 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2227 pos.col++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2228 return &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2229 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2230 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231 else /* Searching backwards */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2233 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234 * A comment may contain / * or / /, it may also start or end
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235 * with / * /. Ignore a / * after / /.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2236 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 if (pos.col == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 continue;
6971
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2239 else if (raw_string)
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2240 {
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2241 if (linep[pos.col - 1] == 'R'
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2242 && linep[pos.col] == '"'
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2243 && vim_strchr(linep + pos.col + 1, '(') != NULL)
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2244 {
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2245 /* Possible start of raw string. Now that we have the
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2246 * delimiter we can check if it ends before where we
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2247 * started searching, or before the previously found
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2248 * raw string start. */
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2249 if (!find_rawstring_end(linep, &pos,
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2250 count > 0 ? &match_pos : &curwin->w_cursor))
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2251 {
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2252 count++;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2253 match_pos = pos;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2254 match_pos.col--;
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2255 }
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2256 linep = ml_get(pos.lnum); /* may have been released */
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2257 }
e859731ea1cd patch 7.4.803
Bram Moolenaar <bram@vim.org>
parents: 6949
diff changeset
2258 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2259 else if ( linep[pos.col - 1] == '/'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260 && linep[pos.col] == '*'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2261 && (int)pos.col < comment_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2262 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2263 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2264 match_pos = pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265 match_pos.col--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2266 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2267 else if (linep[pos.col - 1] == '*' && linep[pos.col] == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2268 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2269 if (count > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2270 pos = match_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2271 else if (pos.col > 1 && linep[pos.col - 2] == '/'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2272 && (int)pos.col <= comment_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 pos.col -= 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 else if (ignore_cend)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2275 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2276 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2277 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2278 return &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2279 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2280 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2281 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2282 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2283
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2284 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2285 * If smart matching ('cpoptions' does not contain '%'), braces inside
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2286 * of quotes are ignored, but only if there is an even number of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2287 * quotes in the line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2288 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2289 if (cpo_match)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2290 do_quotes = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2291 else if (do_quotes == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2292 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2293 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2294 * Count the number of quotes in the line, skipping \" and '"'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2295 * Watch out for "\\".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2296 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2297 at_start = do_quotes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 for (ptr = linep; *ptr; ++ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2299 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2300 if (ptr == linep + pos.col + backwards)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2301 at_start = (do_quotes & 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 if (*ptr == '"'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2303 && (ptr == linep || ptr[-1] != '\'' || ptr[1] != '\''))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 ++do_quotes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2305 if (*ptr == '\\' && ptr[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2306 ++ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2307 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2308 do_quotes &= 1; /* result is 1 with even number of quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2309
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2311 * If we find an uneven count, check current line and previous
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312 * one for a '\' at the end.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314 if (!do_quotes)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316 inquote = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317 if (ptr[-1] == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2318 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2319 do_quotes = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2320 if (start_in_quotes == MAYBE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2321 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2322 /* Do we need to use at_start here? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2323 inquote = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2324 start_in_quotes = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2325 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326 else if (backwards)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2327 inquote = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2329 if (pos.lnum > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2331 ptr = ml_get(pos.lnum - 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2332 if (*ptr && *(ptr + STRLEN(ptr) - 1) == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2333 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2334 do_quotes = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2335 if (start_in_quotes == MAYBE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2336 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2337 inquote = at_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2338 if (inquote)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2339 start_in_quotes = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2340 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 else if (!backwards)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2342 inquote = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2343 }
1310
a33e606ceea6 updated for version 7.1-024
vimboss
parents: 1309
diff changeset
2344
a33e606ceea6 updated for version 7.1-024
vimboss
parents: 1309
diff changeset
2345 /* ml_get() only keeps one line, need to get linep again */
a33e606ceea6 updated for version 7.1-024
vimboss
parents: 1309
diff changeset
2346 linep = ml_get(pos.lnum);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2350 if (start_in_quotes == MAYBE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351 start_in_quotes = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2352
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2353 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2354 * If 'smartmatch' is set:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2355 * Things inside quotes are ignored by setting 'inquote'. If we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2356 * find a quote without a preceding '\' invert 'inquote'. At the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2357 * end of a line not ending in '\' we reset 'inquote'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2358 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 * In lines with an uneven number of quotes (without preceding '\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2360 * we do not know which part to ignore. Therefore we only set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 * inquote if the number of quotes in a line is even, unless this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2362 * line or the previous one ends in a '\'. Complicated, isn't it?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2363 */
4029
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
2364 c = PTR2CHAR(linep + pos.col);
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
2365 switch (c)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2366 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2367 case NUL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2368 /* at end of line without trailing backslash, reset inquote */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2369 if (pos.col == 0 || linep[pos.col - 1] != '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2370 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2371 inquote = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2372 start_in_quotes = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2375
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2376 case '"':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377 /* a quote that is preceded with an odd number of backslashes is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378 * ignored */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2379 if (do_quotes)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2380 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2381 int col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2382
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2383 for (col = pos.col - 1; col >= 0; --col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2384 if (linep[col] != '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2386 if ((((int)pos.col - 1 - col) & 1) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2387 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2388 inquote = !inquote;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389 start_in_quotes = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395 * If smart matching ('cpoptions' does not contain '%'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 * Skip things in single quotes: 'x' or '\x'. Be careful for single
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 * single quotes, eg jon's. Things like '\233' or '\x3f' are not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2398 * skipped, there is never a brace in them.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2399 * Ignore this when finding matches for `'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2400 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 case '\'':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402 if (!cpo_match && initc != '\'' && findc != '\'')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2403 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404 if (backwards)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2406 if (pos.col > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2407 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2408 if (linep[pos.col - 2] == '\'')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2409 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410 pos.col -= 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2411 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2412 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2413 else if (linep[pos.col - 2] == '\\' &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 pos.col > 2 && linep[pos.col - 3] == '\'')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 pos.col -= 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2418 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2420 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2421 else if (linep[pos.col + 1]) /* forward search */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2422 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 if (linep[pos.col + 1] == '\\' &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2424 linep[pos.col + 2] && linep[pos.col + 3] == '\'')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426 pos.col += 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2427 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2429 else if (linep[pos.col + 2] == '\'')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2430 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2431 pos.col += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2432 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2435 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2436 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2437
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2438 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2439 #ifdef FEAT_LISP
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2440 /*
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2441 * For Lisp skip over backslashed (), {} and [].
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2442 * (actually, we skip #\( et al)
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2443 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2444 if (curbuf->b_p_lisp
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2445 && vim_strchr((char_u *)"(){}[]", c) != NULL
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2446 && pos.col > 1
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2447 && check_prevcol(linep, pos.col, '\\', NULL)
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2448 && check_prevcol(linep, pos.col - 1, '#', NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2449 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2450 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2451
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2452 /* Check for match outside of quotes, and inside of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2453 * quotes when the start is also inside of quotes. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2454 if ((!inquote || start_in_quotes == TRUE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2455 && (c == initc || c == findc))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2456 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457 int col, bslcnt = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459 if (!cpo_bsl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2460 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2461 for (col = pos.col; check_prevcol(linep, col, '\\', &col);)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2462 bslcnt++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 }
1859
e965cf54d887 updated for version 7.2-157
vimboss
parents: 1675
diff changeset
2464 /* Only accept a match when 'M' is in 'cpo' or when escaping
e965cf54d887 updated for version 7.2-157
vimboss
parents: 1675
diff changeset
2465 * is what we expect. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466 if (cpo_bsl || (bslcnt & 1) == match_escaped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2467 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468 if (c == initc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2470 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2471 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2472 if (count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2473 return &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474 count--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2475 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2476 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2477 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2481 if (comment_dir == BACKWARD && count > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2482 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2483 pos = match_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2484 return &pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2485 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2486 return (pos_T *)NULL; /* never found it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2487 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2488
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2489 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2490 * Check if line[] contains a / / comment.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2491 * Return MAXCOL if not, otherwise return the column.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2492 * TODO: skip strings.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2493 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2494 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2495 check_linecomment(char_u *line)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2496 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2497 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2498
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2499 p = line;
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2500 #ifdef FEAT_LISP
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2501 /* skip Lispish one-line comments */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2502 if (curbuf->b_p_lisp)
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2503 {
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2504 if (vim_strchr(p, ';') != NULL) /* there may be comments */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2505 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3121
diff changeset
2506 int in_str = FALSE; /* inside of string */
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2507
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2508 p = line; /* scan from start */
333
18f024844150 updated for version 7.0086
vimboss
parents: 301
diff changeset
2509 while ((p = vim_strpbrk(p, (char_u *)"\";")) != NULL)
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2510 {
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2511 if (*p == '"')
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2512 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3121
diff changeset
2513 if (in_str)
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2514 {
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2515 if (*(p - 1) != '\\') /* skip escaped quote */
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3121
diff changeset
2516 in_str = FALSE;
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2517 }
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2518 else if (p == line || ((p - line) >= 2
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2519 /* skip #\" form */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2520 && *(p - 1) != '\\' && *(p - 2) != '#'))
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3121
diff changeset
2521 in_str = TRUE;
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2522 }
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3121
diff changeset
2523 else if (!in_str && ((p - line) < 2
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2524 || (*(p - 1) != '\\' && *(p - 2) != '#')))
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2525 break; /* found! */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2526 ++p;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2527 }
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2528 }
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2529 else
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2530 p = NULL;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2531 }
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2532 else
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
2533 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2534 while ((p = vim_strchr(p, '/')) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2535 {
1463
e6a8d55a1626 updated for version 7.1-178
vimboss
parents: 1344
diff changeset
2536 /* accept a double /, unless it's preceded with * and followed by *,
e6a8d55a1626 updated for version 7.1-178
vimboss
parents: 1344
diff changeset
2537 * because * / / * is an end and start of a C comment */
e6a8d55a1626 updated for version 7.1-178
vimboss
parents: 1344
diff changeset
2538 if (p[1] == '/' && (p == line || p[-1] != '*' || p[2] != '*'))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2539 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2540 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2541 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2542
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2543 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2544 return MAXCOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2545 return (int)(p - line);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549 * Move cursor briefly to character matching the one under the cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2550 * Used for Insert mode and "r" command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2551 * Show the match only if it is visible on the screen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2552 * If there isn't a match, then beep.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2553 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2554 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2555 showmatch(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2556 int c) /* char to show match for */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2558 pos_T *lpos, save_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2559 pos_T mpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2560 colnr_T vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2561 long save_so;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2562 long save_siso;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2563 #ifdef CURSOR_SHAPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564 int save_state;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2566 colnr_T save_dollar_vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570 * Only show match for chars in the 'matchpairs' option.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2572 /* 'matchpairs' is "x:y,x:y" */
4029
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
2573 for (p = curbuf->b_p_mps; *p != NUL; ++p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2574 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2575 #ifdef FEAT_RIGHTLEFT
4153
7728d626ae03 updated for version 7.3.829
Bram Moolenaar <bram@vim.org>
parents: 4049
diff changeset
2576 if (PTR2CHAR(p) == c && (curwin->w_p_rl ^ p_ri))
7728d626ae03 updated for version 7.3.829
Bram Moolenaar <bram@vim.org>
parents: 4049
diff changeset
2577 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2578 #endif
4029
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
2579 p += MB_PTR2LEN(p) + 1;
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
2580 if (PTR2CHAR(p) == c
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2581 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2582 && !(curwin->w_p_rl ^ p_ri)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2583 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2584 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2585 break;
4029
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
2586 p += MB_PTR2LEN(p);
d179a8eff9d7 updated for version 7.3.769
Bram Moolenaar <bram@vim.org>
parents: 3831
diff changeset
2587 if (*p == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2589 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2591 if ((lpos = findmatch(NULL, NUL)) == NULL) /* no match, so beep */
6949
1e621b31948b patch 7.4.793
Bram Moolenaar <bram@vim.org>
parents: 6903
diff changeset
2592 vim_beep(BO_MATCH);
4153
7728d626ae03 updated for version 7.3.829
Bram Moolenaar <bram@vim.org>
parents: 4049
diff changeset
2593 else if (lpos->lnum >= curwin->w_topline && lpos->lnum < curwin->w_botline)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2595 if (!curwin->w_p_wrap)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2596 getvcol(curwin, lpos, NULL, &vcol, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2597 if (curwin->w_p_wrap || (vcol >= curwin->w_leftcol
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 && vcol < curwin->w_leftcol + W_WIDTH(curwin)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 mpos = *lpos; /* save the pos, update_screen() may change it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601 save_cursor = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602 save_so = p_so;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2603 save_siso = p_siso;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2604 /* Handle "$" in 'cpo': If the ')' is typed on top of the "$",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2605 * stop displaying the "$". */
3318
c70c005f61fb updated for version 7.3.426
Bram Moolenaar <bram@vim.org>
parents: 3306
diff changeset
2606 if (dollar_vcol >= 0 && dollar_vcol == curwin->w_virtcol)
c70c005f61fb updated for version 7.3.426
Bram Moolenaar <bram@vim.org>
parents: 3306
diff changeset
2607 dollar_vcol = -1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 ++curwin->w_virtcol; /* do display ')' just before "$" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609 update_screen(VALID); /* show the new char first */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611 save_dollar_vcol = dollar_vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612 #ifdef CURSOR_SHAPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2613 save_state = State;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614 State = SHOWMATCH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615 ui_cursor_shape(); /* may show different cursor shape */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2616 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2617 curwin->w_cursor = mpos; /* move to matching char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 p_so = 0; /* don't use 'scrolloff' here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2619 p_siso = 0; /* don't use 'sidescrolloff' here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2620 showruler(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621 setcursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2622 cursor_on(); /* make sure that the cursor is shown */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2624 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2625 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2626 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 gui_update_cursor(TRUE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2628 gui_mch_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2629 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2630 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2631 /* Restore dollar_vcol(), because setcursor() may call curs_rows()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2632 * which resets it if the matching position is in a previous line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2633 * and has a higher column number. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2634 dollar_vcol = save_dollar_vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2635
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2636 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2637 * brief pause, unless 'm' is present in 'cpo' and a character is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 * available.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 if (vim_strchr(p_cpo, CPO_SHOWMATCH) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2641 ui_delay(p_mat * 100L, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2642 else if (!char_avail())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2643 ui_delay(p_mat * 100L, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2644 curwin->w_cursor = save_cursor; /* restore cursor position */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2645 p_so = save_so;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 p_siso = save_siso;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647 #ifdef CURSOR_SHAPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2648 State = save_state;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649 ui_cursor_shape(); /* may show different cursor shape */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2650 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2651 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2652 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2655 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2656 * findsent(dir, count) - Find the start of the next sentence in direction
620
9e359e5759f6 updated for version 7.0177
vimboss
parents: 572
diff changeset
2657 * "dir" Sentences are supposed to end in ".", "!" or "?" followed by white
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2658 * space or a line break. Also stop at an empty line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2659 * Return OK if the next sentence was found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2660 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2661 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2662 findsent(int dir, long count)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2663 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2664 pos_T pos, tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2665 int c;
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
2666 int (*func)(pos_T *);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2667 int startlnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2668 int noskip = FALSE; /* do not skip blanks */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2669 int cpo_J;
45
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
2670 int found_dot;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2671
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2672 pos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2673 if (dir == FORWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2674 func = incl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2675 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2676 func = decl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2677
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678 while (count--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2679 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2681 * if on an empty line, skip upto a non-empty line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2682 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2683 if (gchar_pos(&pos) == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2684 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2685 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2686 if ((*func)(&pos) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2687 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2688 while (gchar_pos(&pos) == NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2689 if (dir == FORWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2690 goto found;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2691 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2692 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2693 * if on the start of a paragraph or a section and searching forward,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2694 * go to the next line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2695 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2696 else if (dir == FORWARD && pos.col == 0 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2697 startPS(pos.lnum, NUL, FALSE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2698 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2699 if (pos.lnum == curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2700 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2701 ++pos.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2702 goto found;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2703 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2704 else if (dir == BACKWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2705 decl(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2706
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2707 /* go back to the previous non-blank char */
45
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
2708 found_dot = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 while ((c = gchar_pos(&pos)) == ' ' || c == '\t' ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2710 (dir == BACKWARD && vim_strchr((char_u *)".!?)]\"'", c) != NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2711 {
45
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
2712 if (vim_strchr((char_u *)".!?", c) != NULL)
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
2713 {
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
2714 /* Only skip over a '.', '!' and '?' once. */
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
2715 if (found_dot)
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
2716 break;
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
2717 found_dot = TRUE;
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
2718 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2719 if (decl(&pos) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2720 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 /* when going forward: Stop in front of empty line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 if (lineempty(pos.lnum) && dir == FORWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 incl(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725 goto found;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2726 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2727 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2728
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2729 /* remember the line where the search started */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2730 startlnum = pos.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2731 cpo_J = vim_strchr(p_cpo, CPO_ENDOFSENT) != NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2732
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2733 for (;;) /* find end of sentence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2734 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2735 c = gchar_pos(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2736 if (c == NUL || (pos.col == 0 && startPS(pos.lnum, NUL, FALSE)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2737 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2738 if (dir == BACKWARD && pos.lnum != startlnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2739 ++pos.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2740 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2741 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2742 if (c == '.' || c == '!' || c == '?')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2743 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2744 tpos = pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2745 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2746 if ((c = inc(&tpos)) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2747 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2748 while (vim_strchr((char_u *)")]\"'", c = gchar_pos(&tpos))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2749 != NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2750 if (c == -1 || (!cpo_J && (c == ' ' || c == '\t')) || c == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2751 || (cpo_J && (c == ' ' && inc(&tpos) >= 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2752 && gchar_pos(&tpos) == ' ')))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2753 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 pos = tpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2755 if (gchar_pos(&pos) == NUL) /* skip NUL at EOL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 inc(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2757 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2758 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2759 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2760 if ((*func)(&pos) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2761 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2762 if (count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2764 noskip = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2765 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2766 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 found:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 /* skip white space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770 while (!noskip && ((c = gchar_pos(&pos)) == ' ' || c == '\t'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 if (incl(&pos) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2772 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2773 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2775 setpcmark();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2776 curwin->w_cursor = pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2777 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2780 /*
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 140
diff changeset
2781 * Find the next paragraph or section in direction 'dir'.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782 * Paragraphs are currently supposed to be separated by empty lines.
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 140
diff changeset
2783 * If 'what' is NUL we go to the next paragraph.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2784 * If 'what' is '{' or '}' we go to the next section.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2785 * If 'both' is TRUE also stop at '}'.
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 140
diff changeset
2786 * Return TRUE if the next paragraph or section was found.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2787 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2788 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2789 findpar(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2790 int *pincl, /* Return: TRUE if last char is to be included */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2791 int dir,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2792 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2793 int what,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2794 int both)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2795 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2796 linenr_T curr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2797 int did_skip; /* TRUE after separating lines have been skipped */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2798 int first; /* TRUE on first line */
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 140
diff changeset
2799 int posix = (vim_strchr(p_cpo, CPO_PARA) != NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2800 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2801 linenr_T fold_first; /* first line of a closed fold */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802 linenr_T fold_last; /* last line of a closed fold */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803 int fold_skipped; /* TRUE if a closed fold was skipped this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804 iteration */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2805 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2806
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2807 curr = curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2808
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2809 while (count--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2810 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2811 did_skip = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2812 for (first = TRUE; ; first = FALSE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2813 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2814 if (*ml_get(curr) != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2815 did_skip = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2816
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2817 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2818 /* skip folded lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2819 fold_skipped = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2820 if (first && hasFolding(curr, &fold_first, &fold_last))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2821 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2822 curr = ((dir > 0) ? fold_last : fold_first) + dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2823 fold_skipped = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2824 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2825 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2826
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 140
diff changeset
2827 /* POSIX has it's own ideas of what a paragraph boundary is and it
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 140
diff changeset
2828 * doesn't match historical Vi: It also stops at a "{" in the
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 140
diff changeset
2829 * first column and at an empty line. */
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 140
diff changeset
2830 if (!first && did_skip && (startPS(curr, what, both)
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 140
diff changeset
2831 || (posix && what == NUL && *ml_get(curr) == '{')))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2832 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2833
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2834 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2835 if (fold_skipped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2836 curr -= dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2837 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2838 if ((curr += dir) < 1 || curr > curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2839 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2840 if (count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2841 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2842 curr -= dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2843 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2844 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2845 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2846 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2847 setpcmark();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2848 if (both && *ml_get(curr) == '}') /* include line with '}' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2849 ++curr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2850 curwin->w_cursor.lnum = curr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2851 if (curr == curbuf->b_ml.ml_line_count && what != '}')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2852 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2853 if ((curwin->w_cursor.col = (colnr_T)STRLEN(ml_get(curr))) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2854 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2855 --curwin->w_cursor.col;
504
35cde31bdcbd updated for version 7.0141
vimboss
parents: 481
diff changeset
2856 *pincl = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2857 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2858 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2859 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2860 curwin->w_cursor.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2861 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2862 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2863
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2864 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2865 * check if the string 's' is a nroff macro that is in option 'opt'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2866 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2867 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2868 inmacro(char_u *opt, char_u *s)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2869 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 char_u *macro;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2871
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2872 for (macro = opt; macro[0]; ++macro)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2873 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2874 /* Accept two characters in the option being equal to two characters
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2875 * in the line. A space in the option matches with a space in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2876 * line or the line having ended. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2877 if ( (macro[0] == s[0]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2878 || (macro[0] == ' '
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2879 && (s[0] == NUL || s[0] == ' ')))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2880 && (macro[1] == s[1]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881 || ((macro[1] == NUL || macro[1] == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 && (s[0] == NUL || s[1] == NUL || s[1] == ' '))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2884 ++macro;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 if (macro[0] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 return (macro[0] != NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2890
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2892 * startPS: return TRUE if line 'lnum' is the start of a section or paragraph.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2893 * If 'para' is '{' or '}' only check for sections.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2894 * If 'both' is TRUE also stop at '}'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2895 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2896 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2897 startPS(linenr_T lnum, int para, int both)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2898 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2899 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2900
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2901 s = ml_get(lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2902 if (*s == para || *s == '\f' || (both && *s == '}'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2903 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2904 if (*s == '.' && (inmacro(p_sections, s + 1) ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 (!para && inmacro(p_para, s + 1))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2907 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2908 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2909
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2910 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2911 * The following routines do the word searches performed by the 'w', 'W',
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 * 'b', 'B', 'e', and 'E' commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2913 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2915 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2916 * To perform these searches, characters are placed into one of three
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2917 * classes, and transitions between classes determine word boundaries.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 * The classes are:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 * 0 - white space
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 * 1 - punctuation
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923 * 2 or higher - keyword characters (letters, digits and underscore)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926 static int cls_bigword; /* TRUE for "W", "B" or "E" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2929 * cls() - returns the class of character at curwin->w_cursor
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2930 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2931 * If a 'W', 'B', or 'E' motion is being done (cls_bigword == TRUE), chars
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2932 * from class 2 and higher are reported as class 1 since only white space
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2933 * boundaries are of interest.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2934 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2935 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2936 cls(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2937 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2938 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2939
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940 c = gchar_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2941 #ifdef FEAT_FKMAP /* when 'akm' (Farsi mode), take care of Farsi blank */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2942 if (p_altkeymap && c == F_BLANK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2943 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2944 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945 if (c == ' ' || c == '\t' || c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2947 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2948 if (enc_dbcs != 0 && c > 0xFF)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2949 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2950 /* If cls_bigword, report multi-byte chars as class 1. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2951 if (enc_dbcs == DBCS_KOR && cls_bigword)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2953
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954 /* process code leading/trailing bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 return dbcs_class(((unsigned)c >> 8), (c & 0xFF));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2956 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2957 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2958 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2959 c = utf_class(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2960 if (c != 0 && cls_bigword)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2961 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2962 return c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2963 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2964 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2965
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2966 /* If cls_bigword is TRUE, report all non-blanks as class 1. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2967 if (cls_bigword)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2970 if (vim_iswordc(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2971 return 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2973 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2974
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2975
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2976 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2977 * fwd_word(count, type, eol) - move forward one word
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2978 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979 * Returns FAIL if the cursor was already at the end of the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980 * If eol is TRUE, last word stops at end of line (for operators).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2981 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2983 fwd_word(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2984 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2985 int bigword, /* "W", "E" or "B" */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2986 int eol)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2987 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2988 int sclass; /* starting class */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2989 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2990 int last_line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2991
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2992 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2993 curwin->w_cursor.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2994 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2995 cls_bigword = bigword;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2996 while (--count >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2997 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2998 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2999 /* When inside a range of folded lines, move to the last char of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3000 * last line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3001 if (hasFolding(curwin->w_cursor.lnum, NULL, &curwin->w_cursor.lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3002 coladvance((colnr_T)MAXCOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3003 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3004 sclass = cls();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3005
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3006 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3007 * We always move at least one character, unless on the last
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3008 * character in the buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3009 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3010 last_line = (curwin->w_cursor.lnum == curbuf->b_ml.ml_line_count);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3011 i = inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3012 if (i == -1 || (i >= 1 && last_line)) /* started at last char in file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3013 return FAIL;
1309
bb7a0b90100a updated for version 7.1-023
vimboss
parents: 1290
diff changeset
3014 if (i >= 1 && eol && count == 0) /* started at last char in line */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3015 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3016
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3017 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3018 * Go one char past end of current word (if any)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3019 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3020 if (sclass != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3021 while (cls() == sclass)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3022 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3023 i = inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3024 if (i == -1 || (i >= 1 && eol && count == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3025 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3026 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3027
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3028 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3029 * go to next non-white
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3030 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3031 while (cls() == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3032 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3033 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3034 * We'll stop if we land on a blank line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3035 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3036 if (curwin->w_cursor.col == 0 && *ml_get_curline() == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3038
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 i = inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3040 if (i == -1 || (i >= 1 && eol && count == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3041 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3042 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3043 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3044 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3045 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3046
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3047 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3048 * bck_word() - move backward 'count' words
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3049 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3050 * If stop is TRUE and we are already on the start of a word, move one less.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3051 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3052 * Returns FAIL if top of the file was reached.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3053 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3054 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3055 bck_word(long count, int bigword, int stop)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3056 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3057 int sclass; /* starting class */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3058
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3059 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3060 curwin->w_cursor.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3061 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 cls_bigword = bigword;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3063 while (--count >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3064 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 /* When inside a range of folded lines, move to the first char of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067 * first line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3068 if (hasFolding(curwin->w_cursor.lnum, &curwin->w_cursor.lnum, NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069 curwin->w_cursor.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3070 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3071 sclass = cls();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3072 if (dec_cursor() == -1) /* started at start of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3073 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3074
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3075 if (!stop || sclass == cls() || sclass == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3076 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3077 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3078 * Skip white space before the word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3079 * Stop on an empty line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3080 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3081 while (cls() == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3082 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3083 if (curwin->w_cursor.col == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3084 && lineempty(curwin->w_cursor.lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3085 goto finished;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3086 if (dec_cursor() == -1) /* hit start of file, stop here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3087 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3088 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3089
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3090 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3091 * Move backward to start of this word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3092 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3093 if (skip_chars(cls(), BACKWARD))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3094 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3095 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3096
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3097 inc_cursor(); /* overshot - forward one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3098 finished:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3099 stop = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3100 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3101 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3102 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3103
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3104 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3105 * end_word() - move to the end of the word
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3106 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3107 * There is an apparent bug in the 'e' motion of the real vi. At least on the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3108 * System V Release 3 version for the 80386. Unlike 'b' and 'w', the 'e'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3109 * motion crosses blank lines. When the real vi crosses a blank line in an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3110 * 'e' motion, the cursor is placed on the FIRST character of the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3111 * non-blank line. The 'E' command, however, works correctly. Since this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3112 * appears to be a bug, I have not duplicated it here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3113 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3114 * Returns FAIL if end of the file was reached.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3115 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3116 * If stop is TRUE and we are already on the end of a word, move one less.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3117 * If empty is TRUE stop on an empty line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3118 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3119 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3120 end_word(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3121 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3122 int bigword,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3123 int stop,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3124 int empty)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3125 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3126 int sclass; /* starting class */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3127
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3128 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3129 curwin->w_cursor.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3130 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3131 cls_bigword = bigword;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3132 while (--count >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3133 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3134 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3135 /* When inside a range of folded lines, move to the last char of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3136 * last line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3137 if (hasFolding(curwin->w_cursor.lnum, NULL, &curwin->w_cursor.lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3138 coladvance((colnr_T)MAXCOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3139 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3140 sclass = cls();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 if (inc_cursor() == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3142 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3145 * If we're in the middle of a word, we just have to move to the end
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3146 * of it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3148 if (cls() == sclass && sclass != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3149 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3150 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3151 * Move forward to end of the current word
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3152 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3153 if (skip_chars(sclass, FORWARD))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3154 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3155 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3156 else if (!stop || sclass == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3157 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3158 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3159 * We were at the end of a word. Go to the end of the next word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3160 * First skip white space, if 'empty' is TRUE, stop at empty line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3161 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3162 while (cls() == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3163 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3164 if (empty && curwin->w_cursor.col == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3165 && lineempty(curwin->w_cursor.lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3166 goto finished;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3167 if (inc_cursor() == -1) /* hit end of file, stop here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3169 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3170
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3171 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3172 * Move forward to the end of this word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3173 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3174 if (skip_chars(cls(), FORWARD))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3175 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3177 dec_cursor(); /* overshot - one char backward */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178 finished:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179 stop = FALSE; /* we move only one word less */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3181 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3184 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3185 * Move back to the end of the word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3186 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3187 * Returns FAIL if start of the file was reached.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3188 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3190 bckend_word(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3191 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3192 int bigword, /* TRUE for "B" */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3193 int eol) /* TRUE: stop at end of line. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3194 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3195 int sclass; /* starting class */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3196 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3197
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3198 #ifdef FEAT_VIRTUALEDIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3199 curwin->w_cursor.coladd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3200 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3201 cls_bigword = bigword;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3202 while (--count >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3203 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3204 sclass = cls();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3205 if ((i = dec_cursor()) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3206 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3207 if (eol && i == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3208 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3209
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3210 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3211 * Move backward to before the start of this word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3212 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3213 if (sclass != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3214 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3215 while (cls() == sclass)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3216 if ((i = dec_cursor()) == -1 || (eol && i == 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3217 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3218 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3219
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3220 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3221 * Move backward to end of the previous word
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3222 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3223 while (cls() == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3224 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3225 if (curwin->w_cursor.col == 0 && lineempty(curwin->w_cursor.lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3226 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3227 if ((i = dec_cursor()) == -1 || (eol && i == 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3228 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3229 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3230 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3231 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3232 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3233
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3234 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3235 * Skip a row of characters of the same class.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3236 * Return TRUE when end-of-file reached, FALSE otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3237 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3238 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3239 skip_chars(int cclass, int dir)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3240 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3241 while (cls() == cclass)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3242 if ((dir == FORWARD ? inc_cursor() : dec_cursor()) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3243 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3244 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3245 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3246
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3247 #ifdef FEAT_TEXTOBJ
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3248 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3249 * Go back to the start of the word or the start of white space
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3250 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3251 static void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3252 back_in_line(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3253 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3254 int sclass; /* starting class */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3255
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3256 sclass = cls();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3257 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3258 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3259 if (curwin->w_cursor.col == 0) /* stop at start of line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3260 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3261 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3262 if (cls() != sclass) /* stop at start of word */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3263 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3264 inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3265 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3266 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3267 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3268 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3269
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3270 static void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3271 find_first_blank(pos_T *posp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3272 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3273 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3274
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3275 while (decl(posp) != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3276 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3277 c = gchar_pos(posp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3278 if (!vim_iswhite(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3279 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3280 incl(posp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3281 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3282 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3283 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3284 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3285
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3286 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3287 * Skip count/2 sentences and count/2 separating white spaces.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3288 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3289 static void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3290 findsent_forward(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3291 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3292 int at_start_sent) /* cursor is at start of sentence */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3293 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3294 while (count--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3295 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3296 findsent(FORWARD, 1L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3297 if (at_start_sent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3298 find_first_blank(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3299 if (count == 0 || at_start_sent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3300 decl(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3301 at_start_sent = !at_start_sent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3302 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3303 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3304
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3305 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3306 * Find word under cursor, cursor at end.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3307 * Used while an operator is pending, and in Visual mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3308 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3309 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3310 current_word(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3311 oparg_T *oap,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3312 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3313 int include, /* TRUE: include word and white space */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3314 int bigword) /* FALSE == word, TRUE == WORD */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3315 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3316 pos_T start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3317 pos_T pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3318 int inclusive = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3319 int include_white = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3320
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3321 cls_bigword = bigword;
699
2af8de31a3a8 updated for version 7.0211
vimboss
parents: 692
diff changeset
3322 clearpos(&start_pos);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3323
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3324 /* Correct cursor when 'selection' is exclusive */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3325 if (VIsual_active && *p_sel == 'e' && lt(VIsual, curwin->w_cursor))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3326 dec_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3327
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3328 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3329 * When Visual mode is not active, or when the VIsual area is only one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3330 * character, select the word and/or white space under the cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3331 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3332 if (!VIsual_active || equalpos(curwin->w_cursor, VIsual))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3333 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3334 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3335 * Go to start of current word or white space.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3336 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3337 back_in_line();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3338 start_pos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3339
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3340 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3341 * If the start is on white space, and white space should be included
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3342 * (" word"), or start is not on white space, and white space should
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3343 * not be included ("word"), find end of word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3344 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3345 if ((cls() == 0) == include)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3346 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3347 if (end_word(1L, bigword, TRUE, TRUE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3348 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3349 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3350 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3351 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3352 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3353 * If the start is not on white space, and white space should be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3354 * included ("word "), or start is on white space and white
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3355 * space should not be included (" "), find start of word.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3356 * If we end up in the first column of the next line (single char
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3357 * word) back up to end of the line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3358 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3359 fwd_word(1L, bigword, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3360 if (curwin->w_cursor.col == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3361 decl(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3362 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3363 oneleft();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3364
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3365 if (include)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3366 include_white = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3367 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3368
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3369 if (VIsual_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3370 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3371 /* should do something when inclusive == FALSE ! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3372 VIsual = start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3373 redraw_curbuf_later(INVERTED); /* update the inversion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3374 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3375 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3376 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3377 oap->start = start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3378 oap->motion_type = MCHAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3379 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3380 --count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3381 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3382
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3383 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3384 * When count is still > 0, extend with more objects.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3385 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3386 while (count > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3387 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3388 inclusive = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3389 if (VIsual_active && lt(curwin->w_cursor, VIsual))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3390 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3391 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3392 * In Visual mode, with cursor at start: move cursor back.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3393 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3394 if (decl(&curwin->w_cursor) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3395 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3396 if (include != (cls() != 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3397 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3398 if (bck_word(1L, bigword, TRUE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3399 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3400 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3401 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3402 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3403 if (bckend_word(1L, bigword, TRUE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3404 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3405 (void)incl(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3406 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3407 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3408 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3409 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3410 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3411 * Move cursor forward one word and/or white area.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3412 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3413 if (incl(&curwin->w_cursor) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3414 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3415 if (include != (cls() == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3416 {
96
8f25c0d2210f updated for version 7.0037
vimboss
parents: 45
diff changeset
3417 if (fwd_word(1L, bigword, TRUE) == FAIL && count > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3418 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3419 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3420 * If end is just past a new-line, we don't want to include
96
8f25c0d2210f updated for version 7.0037
vimboss
parents: 45
diff changeset
3421 * the first character on the line.
8f25c0d2210f updated for version 7.0037
vimboss
parents: 45
diff changeset
3422 * Put cursor on last char of white.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3423 */
96
8f25c0d2210f updated for version 7.0037
vimboss
parents: 45
diff changeset
3424 if (oneleft() == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3425 inclusive = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3426 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3427 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3428 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3429 if (end_word(1L, bigword, TRUE, TRUE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3430 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3431 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3432 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3433 --count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3434 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3435
9
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
3436 if (include_white && (cls() != 0
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
3437 || (curwin->w_cursor.col == 0 && !inclusive)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3438 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3439 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3440 * If we don't include white space at the end, move the start
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3441 * to include some white space there. This makes "daw" work
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3442 * better on the last word in a sentence (and "2daw" on last-but-one
9
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
3443 * word). Also when "2daw" deletes "word." at the end of the line
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
3444 * (cursor is at start of next line).
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
3445 * But don't delete white space at start of line (indent).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3446 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3447 pos = curwin->w_cursor; /* save cursor position */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3448 curwin->w_cursor = start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3449 if (oneleft() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3450 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3451 back_in_line();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3452 if (cls() == 0 && curwin->w_cursor.col > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3453 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3454 if (VIsual_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3455 VIsual = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3456 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3457 oap->start = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3458 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3459 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3460 curwin->w_cursor = pos; /* put cursor back at end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3461 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3462
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3463 if (VIsual_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3464 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3465 if (*p_sel == 'e' && inclusive && ltoreq(VIsual, curwin->w_cursor))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3466 inc_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3467 if (VIsual_mode == 'V')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3468 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3469 VIsual_mode = 'v';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3470 redraw_cmdline = TRUE; /* show mode later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3471 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3472 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3473 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3474 oap->inclusive = inclusive;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3475
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3476 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3477 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3478
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3479 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3480 * Find sentence(s) under the cursor, cursor at end.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3481 * When Visual active, extend it by one or more sentences.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3482 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3483 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3484 current_sent(oparg_T *oap, long count, int include)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3485 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3486 pos_T start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3487 pos_T pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3488 int start_blank;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3489 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3490 int at_start_sent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3491 long ncount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3492
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3493 start_pos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3494 pos = start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3495 findsent(FORWARD, 1L); /* Find start of next sentence. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3496
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3497 /*
3701
9f48a5432997 updated for version 7.3.610
Bram Moolenaar <bram@vim.org>
parents: 3699
diff changeset
3498 * When the Visual area is bigger than one character: Extend it.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3499 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3500 if (VIsual_active && !equalpos(start_pos, VIsual))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3501 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3502 extend:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3503 if (lt(start_pos, VIsual))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3504 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3505 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3506 * Cursor at start of Visual area.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3507 * Find out where we are:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3508 * - in the white space before a sentence
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3509 * - in a sentence or just after it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3510 * - at the start of a sentence
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3511 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3512 at_start_sent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3513 decl(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3514 while (lt(pos, curwin->w_cursor))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3515 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3516 c = gchar_pos(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3517 if (!vim_iswhite(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3518 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3519 at_start_sent = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3520 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3521 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3522 incl(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3523 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3524 if (!at_start_sent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3525 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3526 findsent(BACKWARD, 1L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3527 if (equalpos(curwin->w_cursor, start_pos))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3528 at_start_sent = TRUE; /* exactly at start of sentence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3529 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3530 /* inside a sentence, go to its end (start of next) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3531 findsent(FORWARD, 1L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3532 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3533 if (include) /* "as" gets twice as much as "is" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3534 count *= 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3535 while (count--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3537 if (at_start_sent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3538 find_first_blank(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3539 c = gchar_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3540 if (!at_start_sent || (!include && !vim_iswhite(c)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3541 findsent(BACKWARD, 1L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3542 at_start_sent = !at_start_sent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3543 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3544 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3545 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3546 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3547 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3548 * Cursor at end of Visual area.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3549 * Find out where we are:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3550 * - just before a sentence
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3551 * - just before or in the white space before a sentence
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3552 * - in a sentence
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3553 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3554 incl(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3555 at_start_sent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3556 if (!equalpos(pos, curwin->w_cursor)) /* not just before a sentence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3557 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3558 at_start_sent = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3559 while (lt(pos, curwin->w_cursor))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3560 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3561 c = gchar_pos(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3562 if (!vim_iswhite(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3563 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3564 at_start_sent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3565 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3566 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3567 incl(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3568 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3569 if (at_start_sent) /* in the sentence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3570 findsent(BACKWARD, 1L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3571 else /* in/before white before a sentence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3572 curwin->w_cursor = start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3573 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3574
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3575 if (include) /* "as" gets twice as much as "is" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3576 count *= 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3577 findsent_forward(count, at_start_sent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3578 if (*p_sel == 'e')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3579 ++curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3580 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3581 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3582 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3583
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3584 /*
3701
9f48a5432997 updated for version 7.3.610
Bram Moolenaar <bram@vim.org>
parents: 3699
diff changeset
3585 * If the cursor started on a blank, check if it is just before the start
9f48a5432997 updated for version 7.3.610
Bram Moolenaar <bram@vim.org>
parents: 3699
diff changeset
3586 * of the next sentence.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3587 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3588 while (c = gchar_pos(&pos), vim_iswhite(c)) /* vim_iswhite() is a macro */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3589 incl(&pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3590 if (equalpos(pos, curwin->w_cursor))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3591 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3592 start_blank = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3593 find_first_blank(&start_pos); /* go back to first blank */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3594 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3595 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3596 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3597 start_blank = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3598 findsent(BACKWARD, 1L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3599 start_pos = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3600 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3601 if (include)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3602 ncount = count * 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3603 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3604 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3605 ncount = count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3606 if (start_blank)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3607 --ncount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3608 }
45
e474bae3795f updated for version 7.0027
vimboss
parents: 36
diff changeset
3609 if (ncount > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3610 findsent_forward(ncount, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3611 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3612 decl(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3613
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3614 if (include)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3615 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3616 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3617 * If the blank in front of the sentence is included, exclude the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3618 * blanks at the end of the sentence, go back to the first blank.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3619 * If there are no trailing blanks, try to include leading blanks.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3620 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3621 if (start_blank)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3622 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3623 find_first_blank(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3624 c = gchar_pos(&curwin->w_cursor); /* vim_iswhite() is a macro */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3625 if (vim_iswhite(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3626 decl(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3627 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3628 else if (c = gchar_cursor(), !vim_iswhite(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3629 find_first_blank(&start_pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3630 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3631
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3632 if (VIsual_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3633 {
3701
9f48a5432997 updated for version 7.3.610
Bram Moolenaar <bram@vim.org>
parents: 3699
diff changeset
3634 /* Avoid getting stuck with "is" on a single space before a sentence. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3635 if (equalpos(start_pos, curwin->w_cursor))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3636 goto extend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3637 if (*p_sel == 'e')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3638 ++curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3639 VIsual = start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3640 VIsual_mode = 'v';
10064
793471c09a4b commit https://github.com/vim/vim/commit/779f2fc3a7468e273897d2fd0672315812a2e3da
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
3641 redraw_cmdline = TRUE; /* show mode later */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3642 redraw_curbuf_later(INVERTED); /* update the inversion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3643 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3644 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3645 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3646 /* include a newline after the sentence, if there is one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3647 if (incl(&curwin->w_cursor) == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3648 oap->inclusive = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3649 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3650 oap->inclusive = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3651 oap->start = start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3652 oap->motion_type = MCHAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3653 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3654 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3655 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3656
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3657 /*
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3658 * Find block under the cursor, cursor at end.
4352
04736b4030ec updated for version 7.3.925
Bram Moolenaar <bram@vim.org>
parents: 4252
diff changeset
3659 * "what" and "other" are two matching parenthesis/brace/etc.
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3660 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3661 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3662 current_block(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3663 oparg_T *oap,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3664 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3665 int include, /* TRUE == include white space */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3666 int what, /* '(', '{', etc. */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3667 int other) /* ')', '}', etc. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3668 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3669 pos_T old_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3670 pos_T *pos = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3671 pos_T start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3672 pos_T *end_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3673 pos_T old_start, old_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3674 char_u *save_cpo;
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3675 int sol = FALSE; /* '{' at start of line */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3676
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3677 old_pos = curwin->w_cursor;
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3678 old_end = curwin->w_cursor; /* remember where we started */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3679 old_start = old_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3680
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3681 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3682 * If we start on '(', '{', ')', '}', etc., use the whole block inclusive.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3683 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3684 if (!VIsual_active || equalpos(VIsual, curwin->w_cursor))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3685 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3686 setpcmark();
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3687 if (what == '{') /* ignore indent */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3688 while (inindent(1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3689 if (inc_cursor() != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3690 break;
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3691 if (gchar_cursor() == what)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3692 /* cursor on '(' or '{', move cursor just after it */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3693 ++curwin->w_cursor.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3694 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3695 else if (lt(VIsual, curwin->w_cursor))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3696 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3697 old_start = VIsual;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3698 curwin->w_cursor = VIsual; /* cursor at low end of Visual */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3699 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3700 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3701 old_end = VIsual;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3702
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3703 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3704 * Search backwards for unclosed '(', '{', etc..
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3705 * Put this position in start_pos.
6675
24e0b6dd52e1 updated for version 7.4.662
Bram Moolenaar <bram@vim.org>
parents: 6661
diff changeset
3706 * Ignore quotes here. Keep the "M" flag in 'cpo', as that is what the
24e0b6dd52e1 updated for version 7.4.662
Bram Moolenaar <bram@vim.org>
parents: 6661
diff changeset
3707 * user wants.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3708 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3709 save_cpo = p_cpo;
6675
24e0b6dd52e1 updated for version 7.4.662
Bram Moolenaar <bram@vim.org>
parents: 6661
diff changeset
3710 p_cpo = (char_u *)(vim_strchr(p_cpo, CPO_MATCHBSL) != NULL ? "%M" : "%");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3711 while (count-- > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3712 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3713 if ((pos = findmatch(NULL, what)) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3714 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3715 curwin->w_cursor = *pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3716 start_pos = *pos; /* the findmatch for end_pos will overwrite *pos */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3717 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3718 p_cpo = save_cpo;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3719
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3720 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3721 * Search for matching ')', '}', etc.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3722 * Put this position in curwin->w_cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3723 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3724 if (pos == NULL || (end_pos = findmatch(NULL, other)) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3725 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3726 curwin->w_cursor = old_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3727 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3728 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3729 curwin->w_cursor = *end_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3730
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3731 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3732 * Try to exclude the '(', '{', ')', '}', etc. when "include" is FALSE.
5975
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3733 * If the ending '}', ')' or ']' is only preceded by indent, skip that
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3734 * indent. But only if the resulting area is not smaller than what we
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3735 * started with.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3736 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3737 while (!include)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3738 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3739 incl(&start_pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3740 sol = (curwin->w_cursor.col == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3741 decl(&curwin->w_cursor);
5975
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3742 while (inindent(1))
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3743 {
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3744 sol = TRUE;
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3745 if (decl(&curwin->w_cursor) != 0)
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3746 break;
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3747 }
01d9ffdd6e6f updated for version 7.4.328
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
3748
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3749 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3750 * In Visual mode, when the resulting area is not bigger than what we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3751 * started with, extend it to the next block, and then exclude again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3752 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3753 if (!lt(start_pos, old_start) && !lt(old_end, curwin->w_cursor)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3754 && VIsual_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3755 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3756 curwin->w_cursor = old_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3757 decl(&curwin->w_cursor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3758 if ((pos = findmatch(NULL, what)) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3759 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3760 curwin->w_cursor = old_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3761 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3762 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3763 start_pos = *pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3764 curwin->w_cursor = *pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3765 if ((end_pos = findmatch(NULL, other)) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3766 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3767 curwin->w_cursor = old_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3768 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3769 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3770 curwin->w_cursor = *end_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3771 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3772 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3773 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3774 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3775
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3776 if (VIsual_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3777 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3778 if (*p_sel == 'e')
7070
d92910c0c415 commit https://github.com/vim/vim/commit/8667d66ca923d361e00e6369cbff37283db5a432
Christian Brabandt <cb@256bit.org>
parents: 7054
diff changeset
3779 inc(&curwin->w_cursor);
557
862863033fdd updated for version 7.0158
vimboss
parents: 534
diff changeset
3780 if (sol && gchar_cursor() != NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3781 inc(&curwin->w_cursor); /* include the line break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3782 VIsual = start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3783 VIsual_mode = 'v';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3784 redraw_curbuf_later(INVERTED); /* update the inversion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3785 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3786 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3787 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3788 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3789 oap->start = start_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3790 oap->motion_type = MCHAR;
1290
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
3791 oap->inclusive = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3792 if (sol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3793 incl(&curwin->w_cursor);
1527
03ec0f2b9a40 updated for version 7.1-242
vimboss
parents: 1521
diff changeset
3794 else if (ltoreq(start_pos, curwin->w_cursor))
1290
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
3795 /* Include the character under the cursor. */
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
3796 oap->inclusive = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3797 else
1290
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
3798 /* End is before the start (no text in between <>, [], etc.): don't
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
3799 * operate on any text. */
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
3800 curwin->w_cursor = start_pos;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3801 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3802
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3803 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3804 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3805
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
3806 static int in_html_tag(int);
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3807
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3808 /*
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3809 * Return TRUE if the cursor is on a "<aaa>" tag. Ignore "<aaa/>".
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3810 * When "end_tag" is TRUE return TRUE if the cursor is on "</aaa>".
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3811 */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3812 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3813 in_html_tag(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3814 int end_tag)
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3815 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3816 char_u *line = ml_get_curline();
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3817 char_u *p;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3818 int c;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3819 int lc = NUL;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3820 pos_T pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3821
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3822 #ifdef FEAT_MBYTE
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3823 if (enc_dbcs)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3824 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3825 char_u *lp = NULL;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3826
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3827 /* We search forward until the cursor, because searching backwards is
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3828 * very slow for DBCS encodings. */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3829 for (p = line; p < line + curwin->w_cursor.col; mb_ptr_adv(p))
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3830 if (*p == '>' || *p == '<')
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3831 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3832 lc = *p;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3833 lp = p;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3834 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3835 if (*p != '<') /* check for '<' under cursor */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3836 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3837 if (lc != '<')
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3838 return FALSE;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3839 p = lp;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3840 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3841 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3842 else
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3843 #endif
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3844 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3845 for (p = line + curwin->w_cursor.col; p > line; )
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3846 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3847 if (*p == '<') /* find '<' under/before cursor */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3848 break;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3849 mb_ptr_back(line, p);
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3850 if (*p == '>') /* find '>' before cursor */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3851 break;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3852 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3853 if (*p != '<')
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3854 return FALSE;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3855 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3856
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3857 pos.lnum = curwin->w_cursor.lnum;
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
3858 pos.col = (colnr_T)(p - line);
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3859
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3860 mb_ptr_adv(p);
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3861 if (end_tag)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3862 /* check that there is a '/' after the '<' */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3863 return *p == '/';
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3864
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3865 /* check that there is no '/' after the '<' */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3866 if (*p == '/')
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3867 return FALSE;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3868
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3869 /* check that the matching '>' is not preceded by '/' */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3870 for (;;)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3871 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3872 if (inc(&pos) < 0)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3873 return FALSE;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3874 c = *ml_get_pos(&pos);
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3875 if (c == '>')
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3876 break;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3877 lc = c;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3878 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3879 return lc != '/';
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3880 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3881
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3882 /*
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3883 * Find tag block under the cursor, cursor at end.
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3884 */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3885 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3886 current_tagblock(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3887 oparg_T *oap,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3888 long count_arg,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3889 int include) /* TRUE == include white space */
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3890 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3891 long count = count_arg;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3892 long n;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3893 pos_T old_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3894 pos_T start_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3895 pos_T end_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3896 pos_T old_start, old_end;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3897 char_u *spat, *epat;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3898 char_u *p;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3899 char_u *cp;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3900 int len;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3901 int r;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3902 int do_include = include;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3903 int save_p_ws = p_ws;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3904 int retval = FAIL;
6661
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
3905 int is_inclusive = TRUE;
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3906
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3907 p_ws = FALSE;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3908
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3909 old_pos = curwin->w_cursor;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3910 old_end = curwin->w_cursor; /* remember where we started */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3911 old_start = old_end;
1527
03ec0f2b9a40 updated for version 7.1-242
vimboss
parents: 1521
diff changeset
3912 if (!VIsual_active || *p_sel == 'e')
03ec0f2b9a40 updated for version 7.1-242
vimboss
parents: 1521
diff changeset
3913 decl(&old_end); /* old_end is inclusive */
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3914
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3915 /*
435
73f016dbb279 updated for version 7.0112
vimboss
parents: 423
diff changeset
3916 * If we start on "<aaa>" select that block.
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3917 */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3918 if (!VIsual_active || equalpos(VIsual, curwin->w_cursor))
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3919 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3920 setpcmark();
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3921
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3922 /* ignore indent */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3923 while (inindent(1))
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3924 if (inc_cursor() != 0)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3925 break;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3926
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3927 if (in_html_tag(FALSE))
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3928 {
1290
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
3929 /* cursor on start tag, move to its '>' */
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3930 while (*ml_get_cursor() != '>')
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3931 if (inc_cursor() < 0)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3932 break;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3933 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3934 else if (in_html_tag(TRUE))
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3935 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3936 /* cursor on end tag, move to just before it */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3937 while (*ml_get_cursor() != '<')
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3938 if (dec_cursor() < 0)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3939 break;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3940 dec_cursor();
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3941 old_end = curwin->w_cursor;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3942 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3943 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3944 else if (lt(VIsual, curwin->w_cursor))
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3945 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3946 old_start = VIsual;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3947 curwin->w_cursor = VIsual; /* cursor at low end of Visual */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3948 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3949 else
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3950 old_end = VIsual;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3951
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3952 again:
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3953 /*
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3954 * Search backwards for unclosed "<aaa>".
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3955 * Put this position in start_pos.
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3956 */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3957 for (n = 0; n < count; ++n)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3958 {
435
73f016dbb279 updated for version 7.0112
vimboss
parents: 423
diff changeset
3959 if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)",
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3960 (char_u *)"",
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
3961 (char_u *)"</[^>]*>", BACKWARD, (char_u *)"", 0,
1496
29c09fa57168 updated for version 7.1-211
vimboss
parents: 1463
diff changeset
3962 NULL, (linenr_T)0, 0L) <= 0)
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3963 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3964 curwin->w_cursor = old_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3965 goto theend;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3966 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3967 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3968 start_pos = curwin->w_cursor;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3969
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3970 /*
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3971 * Search for matching "</aaa>". First isolate the "aaa".
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3972 */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3973 inc_cursor();
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3974 p = ml_get_cursor();
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3975 for (cp = p; *cp != NUL && *cp != '>' && !vim_iswhite(*cp); mb_ptr_adv(cp))
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3976 ;
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
3977 len = (int)(cp - p);
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3978 if (len == 0)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3979 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3980 curwin->w_cursor = old_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3981 goto theend;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3982 }
3306
ded8f5add04c updated for version 7.3.420
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
3983 spat = alloc(len + 31);
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3984 epat = alloc(len + 9);
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3985 if (spat == NULL || epat == NULL)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3986 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3987 vim_free(spat);
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3988 vim_free(epat);
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3989 curwin->w_cursor = old_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3990 goto theend;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3991 }
3306
ded8f5add04c updated for version 7.3.420
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
3992 sprintf((char *)spat, "<%.*s\\>\\%%(\\s\\_[^>]\\{-}[^/]>\\|>\\)\\c", len, p);
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3993 sprintf((char *)epat, "</%.*s>\\c", len, p);
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3994
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
3995 r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"",
1496
29c09fa57168 updated for version 7.1-211
vimboss
parents: 1463
diff changeset
3996 0, NULL, (linenr_T)0, 0L);
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3997
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3998 vim_free(spat);
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
3999 vim_free(epat);
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4000
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4001 if (r < 1 || lt(curwin->w_cursor, old_end))
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4002 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4003 /* Can't find other end or it's before the previous end. Could be a
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4004 * HTML tag that doesn't have a matching end. Search backwards for
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4005 * another starting tag. */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4006 count = 1;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4007 curwin->w_cursor = start_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4008 goto again;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4009 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4010
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4011 if (do_include || r < 1)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4012 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4013 /* Include up to the '>'. */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4014 while (*ml_get_cursor() != '>')
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4015 if (inc_cursor() < 0)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4016 break;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4017 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4018 else
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4019 {
6661
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4020 char_u *c = ml_get_cursor();
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4021
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4022 /* Exclude the '<' of the end tag.
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4023 * If the closing tag is on new line, do not decrement cursor, but
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4024 * make operation exclusive, so that the linefeed will be selected */
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4025 if (*c == '<' && !VIsual_active && curwin->w_cursor.col == 0)
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4026 /* do not decrement cursor */
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4027 is_inclusive = FALSE;
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4028 else if (*c == '<')
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4029 dec_cursor();
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4030 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4031 end_pos = curwin->w_cursor;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4032
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4033 if (!do_include)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4034 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4035 /* Exclude the start tag. */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4036 curwin->w_cursor = start_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4037 while (inc_cursor() >= 0)
1290
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4038 if (*ml_get_cursor() == '>')
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4039 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4040 inc_cursor();
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4041 start_pos = curwin->w_cursor;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4042 break;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4043 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4044 curwin->w_cursor = end_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4045
435
73f016dbb279 updated for version 7.0112
vimboss
parents: 423
diff changeset
4046 /* If we now have the same text as before reset "do_include" and try
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4047 * again. */
435
73f016dbb279 updated for version 7.0112
vimboss
parents: 423
diff changeset
4048 if (equalpos(start_pos, old_start) && equalpos(end_pos, old_end))
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4049 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4050 do_include = TRUE;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4051 curwin->w_cursor = old_start;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4052 count = count_arg;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4053 goto again;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4054 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4055 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4056
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4057 if (VIsual_active)
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4058 {
1290
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4059 /* If the end is before the start there is no text between tags, select
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4060 * the char under the cursor. */
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4061 if (lt(end_pos, start_pos))
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4062 curwin->w_cursor = start_pos;
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4063 else if (*p_sel == 'e')
6434
19726451aabe updated for version 7.4.547
Bram Moolenaar <bram@vim.org>
parents: 6426
diff changeset
4064 inc_cursor();
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4065 VIsual = start_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4066 VIsual_mode = 'v';
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4067 redraw_curbuf_later(INVERTED); /* update the inversion */
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4068 showmode();
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4069 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4070 else
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4071 {
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4072 oap->start = start_pos;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4073 oap->motion_type = MCHAR;
1290
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4074 if (lt(end_pos, start_pos))
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4075 {
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4076 /* End is before the start: there is no text between tags; operate
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4077 * on an empty area. */
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4078 curwin->w_cursor = start_pos;
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4079 oap->inclusive = FALSE;
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4080 }
87a777aea899 updated for version 7.1-005
vimboss
parents: 1222
diff changeset
4081 else
6661
950e24f26ef8 updated for version 7.4.655
Bram Moolenaar <bram@vim.org>
parents: 6443
diff changeset
4082 oap->inclusive = is_inclusive;
423
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4083 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4084 retval = OK;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4085
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4086 theend:
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4087 p_ws = save_p_ws;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4088 return retval;
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4089 }
e40d32d8d4e7 updated for version 7.0110
vimboss
parents: 410
diff changeset
4090
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4091 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4092 current_par(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4093 oparg_T *oap,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4094 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4095 int include, /* TRUE == include white space */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4096 int type) /* 'p' for paragraph, 'S' for section */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4097 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4098 linenr_T start_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4099 linenr_T end_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4100 int white_in_front;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4101 int dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4102 int start_is_white;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4103 int prev_start_is_white;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4104 int retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4105 int do_white = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4106 int t;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4107 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4108
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4109 if (type == 'S') /* not implemented yet */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4110 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4112 start_lnum = curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4114 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4115 * When visual area is more than one line: extend it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4116 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4117 if (VIsual_active && start_lnum != VIsual.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4118 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4119 extend:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4120 if (start_lnum < VIsual.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4121 dir = BACKWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4122 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4123 dir = FORWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4124 for (i = count; --i >= 0; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4125 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4126 if (start_lnum ==
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4127 (dir == BACKWARD ? 1 : curbuf->b_ml.ml_line_count))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4128 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4129 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4130 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4131 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4132
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4133 prev_start_is_white = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4134 for (t = 0; t < 2; ++t)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4135 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4136 start_lnum += dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4137 start_is_white = linewhite(start_lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4138 if (prev_start_is_white == start_is_white)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4139 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4140 start_lnum -= dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4141 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4142 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4143 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4144 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4145 if (start_lnum == (dir == BACKWARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4146 ? 1 : curbuf->b_ml.ml_line_count))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4147 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4148 if (start_is_white != linewhite(start_lnum + dir)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4149 || (!start_is_white
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4150 && startPS(start_lnum + (dir > 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4151 ? 1 : 0), 0, 0)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4152 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4153 start_lnum += dir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4154 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4155 if (!include)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4156 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4157 if (start_lnum == (dir == BACKWARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4158 ? 1 : curbuf->b_ml.ml_line_count))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4159 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4160 prev_start_is_white = start_is_white;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4161 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4162 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4163 curwin->w_cursor.lnum = start_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4164 curwin->w_cursor.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4165 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4166 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4167
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4168 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4169 * First move back to the start_lnum of the paragraph or white lines
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4170 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4171 white_in_front = linewhite(start_lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4172 while (start_lnum > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4173 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4174 if (white_in_front) /* stop at first white line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4175 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4176 if (!linewhite(start_lnum - 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4177 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4178 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4179 else /* stop at first non-white line of start of paragraph */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4180 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4181 if (linewhite(start_lnum - 1) || startPS(start_lnum, 0, 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4182 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4183 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4184 --start_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4185 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4186
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4187 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4188 * Move past the end of any white lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4189 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4190 end_lnum = start_lnum;
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
4191 while (end_lnum <= curbuf->b_ml.ml_line_count && linewhite(end_lnum))
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
4192 ++end_lnum;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4193
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4194 --end_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4195 i = count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4196 if (!include && white_in_front)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4197 --i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4198 while (i--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4199 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4200 if (end_lnum == curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4201 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4202
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4203 if (!include)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4204 do_white = linewhite(end_lnum + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4205
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4206 if (include || !do_white)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4207 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4208 ++end_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4209 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4210 * skip to end of paragraph
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4211 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4212 while (end_lnum < curbuf->b_ml.ml_line_count
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4213 && !linewhite(end_lnum + 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4214 && !startPS(end_lnum + 1, 0, 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4215 ++end_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4216 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4217
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4218 if (i == 0 && white_in_front && include)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4219 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4220
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4221 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4222 * skip to end of white lines after paragraph
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4223 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4224 if (include || do_white)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4225 while (end_lnum < curbuf->b_ml.ml_line_count
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4226 && linewhite(end_lnum + 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4227 ++end_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4228 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4229
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4230 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4231 * If there are no empty lines at the end, try to find some empty lines at
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4232 * the start (unless that has been done already).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4233 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4234 if (!white_in_front && !linewhite(end_lnum) && include)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4235 while (start_lnum > 1 && linewhite(start_lnum - 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4236 --start_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4237
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4238 if (VIsual_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4239 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4240 /* Problem: when doing "Vipipip" nothing happens in a single white
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4241 * line, we get stuck there. Trap this here. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4242 if (VIsual_mode == 'V' && start_lnum == curwin->w_cursor.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4243 goto extend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4244 VIsual.lnum = start_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4245 VIsual_mode = 'V';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4246 redraw_curbuf_later(INVERTED); /* update the inversion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4247 showmode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4248 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4249 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4250 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4251 oap->start.lnum = start_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4252 oap->start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4253 oap->motion_type = MLINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4254 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4255 curwin->w_cursor.lnum = end_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4256 curwin->w_cursor.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4257
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4258 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4259 }
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4260
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
4261 static int find_next_quote(char_u *top_ptr, int col, int quotechar, char_u *escape);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
4262 static int find_prev_quote(char_u *line, int col_start, int quotechar, char_u *escape);
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4263
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4264 /*
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4265 * Search quote char from string line[col].
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4266 * Quote character escaped by one of the characters in "escape" is not counted
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4267 * as a quote.
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4268 * Returns column number of "quotechar" or -1 when not found.
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4269 */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4270 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4271 find_next_quote(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4272 char_u *line,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4273 int col,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4274 int quotechar,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4275 char_u *escape) /* escape characters, can be NULL */
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4276 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4277 int c;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4278
408
06234af3a8b7 updated for version 7.0106
vimboss
parents: 359
diff changeset
4279 for (;;)
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4280 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4281 c = line[col];
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4282 if (c == NUL)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4283 return -1;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4284 else if (escape != NULL && vim_strchr(escape, c))
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4285 ++col;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4286 else if (c == quotechar)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4287 break;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4288 #ifdef FEAT_MBYTE
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4289 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 464
diff changeset
4290 col += (*mb_ptr2len)(line + col);
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4291 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4292 #endif
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4293 ++col;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4294 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4295 return col;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4296 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4297
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4298 /*
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4299 * Search backwards in "line" from column "col_start" to find "quotechar".
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4300 * Quote character escaped by one of the characters in "escape" is not counted
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4301 * as a quote.
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4302 * Return the found column or zero.
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4303 */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4304 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4305 find_prev_quote(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4306 char_u *line,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4307 int col_start,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4308 int quotechar,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4309 char_u *escape) /* escape characters, can be NULL */
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4310 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4311 int n;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4312
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4313 while (col_start > 0)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4314 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4315 --col_start;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4316 #ifdef FEAT_MBYTE
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4317 col_start -= (*mb_head_off)(line, line + col_start);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4318 #endif
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4319 n = 0;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4320 if (escape != NULL)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4321 while (col_start - n > 0 && vim_strchr(escape,
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4322 line[col_start - n - 1]) != NULL)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4323 ++n;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4324 if (n & 1)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4325 col_start -= n; /* uneven number of escape chars, skip it */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4326 else if (line[col_start] == quotechar)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4327 break;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4328 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4329 return col_start;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4330 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4331
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4332 /*
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4333 * Find quote under the cursor, cursor at end.
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4334 * Returns TRUE if found, else FALSE.
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4335 */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4336 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4337 current_quote(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4338 oparg_T *oap,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4339 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4340 int include, /* TRUE == include quote char */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4341 int quotechar) /* Quote character */
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4342 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4343 char_u *line = ml_get_curline();
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4344 int col_end;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4345 int col_start = curwin->w_cursor.col;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4346 int inclusive = FALSE;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4347 int vis_empty = TRUE; /* Visual selection <= 1 char */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4348 int vis_bef_curs = FALSE; /* Visual starts before cursor */
527
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4349 int inside_quotes = FALSE; /* Looks like "i'" done before */
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4350 int selected_quote = FALSE; /* Has quote inside selection */
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4351 int i;
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4352
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4353 /* Correct cursor when 'selection' is exclusive */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4354 if (VIsual_active)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4355 {
527
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4356 vis_bef_curs = lt(VIsual, curwin->w_cursor);
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4357 if (*p_sel == 'e' && vis_bef_curs)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4358 dec_cursor();
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4359 vis_empty = equalpos(VIsual, curwin->w_cursor);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4360 }
527
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4361
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4362 if (!vis_empty)
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4363 {
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4364 /* Check if the existing selection exactly spans the text inside
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4365 * quotes. */
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4366 if (vis_bef_curs)
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4367 {
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4368 inside_quotes = VIsual.col > 0
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4369 && line[VIsual.col - 1] == quotechar
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4370 && line[curwin->w_cursor.col] != NUL
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4371 && line[curwin->w_cursor.col + 1] == quotechar;
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4372 i = VIsual.col;
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4373 col_end = curwin->w_cursor.col;
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4374 }
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4375 else
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4376 {
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4377 inside_quotes = curwin->w_cursor.col > 0
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4378 && line[curwin->w_cursor.col - 1] == quotechar
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4379 && line[VIsual.col] != NUL
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4380 && line[VIsual.col + 1] == quotechar;
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4381 i = curwin->w_cursor.col;
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4382 col_end = VIsual.col;
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4383 }
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4384
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4385 /* Find out if we have a quote in the selection. */
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4386 while (i <= col_end)
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4387 if (line[i++] == quotechar)
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4388 {
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4389 selected_quote = TRUE;
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4390 break;
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4391 }
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4392 }
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4393
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4394 if (!vis_empty && line[col_start] == quotechar)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4395 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4396 /* Already selecting something and on a quote character. Find the
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4397 * next quoted string. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4398 if (vis_bef_curs)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4399 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4400 /* Assume we are on a closing quote: move to after the next
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4401 * opening quote. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4402 col_start = find_next_quote(line, col_start + 1, quotechar, NULL);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4403 if (col_start < 0)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4404 return FALSE;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4405 col_end = find_next_quote(line, col_start + 1, quotechar,
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4406 curbuf->b_p_qe);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4407 if (col_end < 0)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4408 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4409 /* We were on a starting quote perhaps? */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4410 col_end = col_start;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4411 col_start = curwin->w_cursor.col;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4412 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4413 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4414 else
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4415 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4416 col_end = find_prev_quote(line, col_start, quotechar, NULL);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4417 if (line[col_end] != quotechar)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4418 return FALSE;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4419 col_start = find_prev_quote(line, col_end, quotechar,
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4420 curbuf->b_p_qe);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4421 if (line[col_start] != quotechar)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4422 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4423 /* We were on an ending quote perhaps? */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4424 col_start = col_end;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4425 col_end = curwin->w_cursor.col;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4426 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4427 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4428 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4429 else
5735
50dbef5e774a updated for version 7.4.212
Bram Moolenaar <bram@vim.org>
parents: 5616
diff changeset
4430
50dbef5e774a updated for version 7.4.212
Bram Moolenaar <bram@vim.org>
parents: 5616
diff changeset
4431 if (line[col_start] == quotechar || !vis_empty)
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4432 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4433 int first_col = col_start;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4434
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4435 if (!vis_empty)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4436 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4437 if (vis_bef_curs)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4438 first_col = find_next_quote(line, col_start, quotechar, NULL);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4439 else
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4440 first_col = find_prev_quote(line, col_start, quotechar, NULL);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4441 }
5735
50dbef5e774a updated for version 7.4.212
Bram Moolenaar <bram@vim.org>
parents: 5616
diff changeset
4442
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4443 /* The cursor is on a quote, we don't know if it's the opening or
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4444 * closing quote. Search from the start of the line to find out.
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4445 * Also do this when there is a Visual area, a' may leave the cursor
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4446 * in between two strings. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4447 col_start = 0;
408
06234af3a8b7 updated for version 7.0106
vimboss
parents: 359
diff changeset
4448 for (;;)
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4449 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4450 /* Find open quote character. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4451 col_start = find_next_quote(line, col_start, quotechar, NULL);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4452 if (col_start < 0 || col_start > first_col)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4453 return FALSE;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4454 /* Find close quote character. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4455 col_end = find_next_quote(line, col_start + 1, quotechar,
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4456 curbuf->b_p_qe);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4457 if (col_end < 0)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4458 return FALSE;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4459 /* If is cursor between start and end quote character, it is
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4460 * target text object. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4461 if (col_start <= first_col && first_col <= col_end)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4462 break;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4463 col_start = col_end + 1;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4464 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4465 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4466 else
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4467 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4468 /* Search backward for a starting quote. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4469 col_start = find_prev_quote(line, col_start, quotechar, curbuf->b_p_qe);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4470 if (line[col_start] != quotechar)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4471 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4472 /* No quote before the cursor, look after the cursor. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4473 col_start = find_next_quote(line, col_start, quotechar, NULL);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4474 if (col_start < 0)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4475 return FALSE;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4476 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4477
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4478 /* Find close quote character. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4479 col_end = find_next_quote(line, col_start + 1, quotechar,
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4480 curbuf->b_p_qe);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4481 if (col_end < 0)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4482 return FALSE;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4483 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4484
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4485 /* When "include" is TRUE, include spaces after closing quote or before
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4486 * the starting quote. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4487 if (include)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4488 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4489 if (vim_iswhite(line[col_end + 1]))
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4490 while (vim_iswhite(line[col_end + 1]))
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4491 ++col_end;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4492 else
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4493 while (col_start > 0 && vim_iswhite(line[col_start - 1]))
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4494 --col_start;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4495 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4496
527
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4497 /* Set start position. After vi" another i" must include the ".
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4498 * For v2i" include the quotes. */
5735
50dbef5e774a updated for version 7.4.212
Bram Moolenaar <bram@vim.org>
parents: 5616
diff changeset
4499 if (!include && count < 2 && (vis_empty || !inside_quotes))
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4500 ++col_start;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4501 curwin->w_cursor.col = col_start;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4502 if (VIsual_active)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4503 {
527
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4504 /* Set the start of the Visual area when the Visual area was empty, we
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4505 * were just inside quotes or the Visual area didn't start at a quote
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4506 * and didn't include a quote.
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4507 */
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4508 if (vis_empty
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4509 || (vis_bef_curs
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4510 && !selected_quote
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4511 && (inside_quotes
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4512 || (line[VIsual.col] != quotechar
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4513 && (VIsual.col == 0
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4514 || line[VIsual.col - 1] != quotechar)))))
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4515 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4516 VIsual = curwin->w_cursor;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4517 redraw_curbuf_later(INVERTED);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4518 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4519 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4520 else
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4521 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4522 oap->start = curwin->w_cursor;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4523 oap->motion_type = MCHAR;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4524 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4525
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4526 /* Set end position. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4527 curwin->w_cursor.col = col_end;
5735
50dbef5e774a updated for version 7.4.212
Bram Moolenaar <bram@vim.org>
parents: 5616
diff changeset
4528 if ((include || count > 1 /* After vi" another i" must include the ". */
527
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4529 || (!vis_empty && inside_quotes)
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4530 ) && inc_cursor() == 2)
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4531 inclusive = TRUE;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4532 if (VIsual_active)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4533 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4534 if (vis_empty || vis_bef_curs)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4535 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4536 /* decrement cursor when 'selection' is not exclusive */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4537 if (*p_sel != 'e')
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4538 dec_cursor();
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4539 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4540 else
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4541 {
527
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4542 /* Cursor is at start of Visual area. Set the end of the Visual
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4543 * area when it was just inside quotes or it didn't end at a
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4544 * quote. */
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4545 if (inside_quotes
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4546 || (!selected_quote
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4547 && line[VIsual.col] != quotechar
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4548 && (line[VIsual.col] == NUL
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4549 || line[VIsual.col + 1] != quotechar)))
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4550 {
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4551 dec_cursor();
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4552 VIsual = curwin->w_cursor;
93a822c9e3d2 updated for version 7.0147
vimboss
parents: 523
diff changeset
4553 }
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4554 curwin->w_cursor.col = col_start;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4555 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4556 if (VIsual_mode == 'V')
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4557 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4558 VIsual_mode = 'v';
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4559 redraw_cmdline = TRUE; /* show mode later */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4560 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4561 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4562 else
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4563 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4564 /* Set inclusive and other oap's flags. */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4565 oap->inclusive = inclusive;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4566 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4567
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4568 return OK;
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4569 }
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4570
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 9
diff changeset
4571 #endif /* FEAT_TEXTOBJ */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4572
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7358
diff changeset
4573 static int is_one_char(char_u *pattern, int move);
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4574
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4575 /*
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4576 * Find next search match under cursor, cursor at end.
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4577 * Used while an operator is pending, and in Visual mode.
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4578 */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4579 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4580 current_search(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4581 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4582 int forward) /* move forward or backwards */
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4583 {
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4584 pos_T start_pos; /* position before the pattern */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4585 pos_T orig_pos; /* position of the cursor at beginning */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4586 pos_T pos; /* position after the pattern */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4587 int i;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4588 int dir;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4589 int result; /* result of various function calls */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4590 char_u old_p_ws = p_ws;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4591 int flags = 0;
5210
839ebe7c1b2f updated for version 7.4a.031
Bram Moolenaar <bram@vim.org>
parents: 5118
diff changeset
4592 pos_T save_VIsual = VIsual;
5064
8875401008da updated for version 7.3.1275
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
4593 int one_char;
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4594
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4595 /* wrapping should not occur */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4596 p_ws = FALSE;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4597
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4598 /* Correct cursor when 'selection' is exclusive */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4599 if (VIsual_active && *p_sel == 'e' && lt(VIsual, curwin->w_cursor))
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4600 dec_cursor();
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4601
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4602 if (VIsual_active)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4603 {
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4604 orig_pos = curwin->w_cursor;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4605
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4606 pos = curwin->w_cursor;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4607
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4608 /* make sure, searching further will extend the match */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4609 if (VIsual_active)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4610 {
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4611 if (forward)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4612 incl(&pos);
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4613 else
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4614 decl(&pos);
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4615 }
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4616 }
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4617 else
8954
ab4fe611d205 commit https://github.com/vim/vim/commit/268a06ce901d2c780304e0395028e3c2f60ec755
Christian Brabandt <cb@256bit.org>
parents: 7835
diff changeset
4618 orig_pos = pos = curwin->w_cursor;
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4619
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4620 /* Is the pattern is zero-width? */
6443
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4621 one_char = is_one_char(spats[last_idx].pat, TRUE);
5064
8875401008da updated for version 7.3.1275
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
4622 if (one_char == -1)
5523
6e54d1b3408c updated for version 7.4.110
Bram Moolenaar <bram@vim.org>
parents: 5458
diff changeset
4623 {
6e54d1b3408c updated for version 7.4.110
Bram Moolenaar <bram@vim.org>
parents: 5458
diff changeset
4624 p_ws = old_p_ws;
6e54d1b3408c updated for version 7.4.110
Bram Moolenaar <bram@vim.org>
parents: 5458
diff changeset
4625 return FAIL; /* pattern not found */
6e54d1b3408c updated for version 7.4.110
Bram Moolenaar <bram@vim.org>
parents: 5458
diff changeset
4626 }
3732
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4627
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4628 /*
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4629 * The trick is to first search backwards and then search forward again,
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4630 * so that a match at the current cursor position will be correctly
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4631 * captured.
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4632 */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4633 for (i = 0; i < 2; i++)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4634 {
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4635 if (forward)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4636 dir = i;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4637 else
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4638 dir = !i;
3732
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4639
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4640 flags = 0;
5064
8875401008da updated for version 7.3.1275
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
4641 if (!dir && !one_char)
3732
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4642 flags = SEARCH_END;
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4643
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4644 result = searchit(curwin, curbuf, &pos, (dir ? FORWARD : BACKWARD),
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4645 spats[last_idx].pat, (long) (i ? count : 1),
3732
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4646 SEARCH_KEEP | flags, RE_SEARCH, 0, NULL);
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4647
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4648 /* First search may fail, but then start searching from the
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4649 * beginning of the file (cursor might be on the search match)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4650 * except when Visual mode is active, so that extending the visual
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4651 * selection works. */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4652 if (!result && i) /* not found, abort */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4653 {
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4654 curwin->w_cursor = orig_pos;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4655 if (VIsual_active)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4656 VIsual = save_VIsual;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4657 p_ws = old_p_ws;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4658 return FAIL;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4659 }
3778
29fe4e5c1db1 updated for version 7.3.647
Bram Moolenaar <bram@vim.org>
parents: 3755
diff changeset
4660 else if (!i && !result)
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4661 {
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4662 if (forward) /* try again from start of buffer */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4663 {
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4664 clearpos(&pos);
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4665 }
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4666 else /* try again from end of buffer */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4667 {
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4668 /* searching backwards, so set pos to last line and col */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4669 pos.lnum = curwin->w_buffer->b_ml.ml_line_count;
3724
ac13ea2b098d updated for version 7.3.621
Bram Moolenaar <bram@vim.org>
parents: 3718
diff changeset
4670 pos.col = (colnr_T)STRLEN(
ac13ea2b098d updated for version 7.3.621
Bram Moolenaar <bram@vim.org>
parents: 3718
diff changeset
4671 ml_get(curwin->w_buffer->b_ml.ml_line_count));
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4672 }
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4673 }
5452
8f0c264db1e7 updated for version 7.4.076
Bram Moolenaar <bram@vim.org>
parents: 5398
diff changeset
4674 p_ws = old_p_ws;
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4675 }
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4676
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4677 start_pos = pos;
3732
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4678 flags = forward ? SEARCH_END : 0;
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4679
6443
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4680 /* Check again from the current cursor position,
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4681 * since the next match might actually by only one char wide */
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4682 one_char = is_one_char(spats[last_idx].pat, FALSE);
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4683
3732
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4684 /* move to match, except for zero-width matches, in which case, we are
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4685 * already on the next match */
5064
8875401008da updated for version 7.3.1275
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
4686 if (!one_char)
3732
f43ffd820a46 updated for version 7.3.625
Bram Moolenaar <bram@vim.org>
parents: 3724
diff changeset
4687 result = searchit(curwin, curbuf, &pos, (forward ? FORWARD : BACKWARD),
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4688 spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH, 0, NULL);
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4689
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4690 if (!VIsual_active)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4691 VIsual = start_pos;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4692
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4693 curwin->w_cursor = pos;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4694 VIsual_active = TRUE;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4695 VIsual_mode = 'v';
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4696
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4697 if (VIsual_active)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4698 {
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4699 redraw_curbuf_later(INVERTED); /* update the inversion */
3831
ca1c025079b1 updated for version 7.3.673
Bram Moolenaar <bram@vim.org>
parents: 3778
diff changeset
4700 if (*p_sel == 'e')
ca1c025079b1 updated for version 7.3.673
Bram Moolenaar <bram@vim.org>
parents: 3778
diff changeset
4701 {
ca1c025079b1 updated for version 7.3.673
Bram Moolenaar <bram@vim.org>
parents: 3778
diff changeset
4702 /* Correction for exclusive selection depends on the direction. */
ca1c025079b1 updated for version 7.3.673
Bram Moolenaar <bram@vim.org>
parents: 3778
diff changeset
4703 if (forward && ltoreq(VIsual, curwin->w_cursor))
ca1c025079b1 updated for version 7.3.673
Bram Moolenaar <bram@vim.org>
parents: 3778
diff changeset
4704 inc_cursor();
ca1c025079b1 updated for version 7.3.673
Bram Moolenaar <bram@vim.org>
parents: 3778
diff changeset
4705 else if (!forward && ltoreq(curwin->w_cursor, VIsual))
ca1c025079b1 updated for version 7.3.673
Bram Moolenaar <bram@vim.org>
parents: 3778
diff changeset
4706 inc(&VIsual);
ca1c025079b1 updated for version 7.3.673
Bram Moolenaar <bram@vim.org>
parents: 3778
diff changeset
4707 }
ca1c025079b1 updated for version 7.3.673
Bram Moolenaar <bram@vim.org>
parents: 3778
diff changeset
4708
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4709 }
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4710
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4711 #ifdef FEAT_FOLDING
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4712 if (fdo_flags & FDO_SEARCH && KeyTyped)
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4713 foldOpenCursor();
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4714 #endif
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4715
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4716 may_start_select('c');
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4717 #ifdef FEAT_MOUSE
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4718 setmouse();
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4719 #endif
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4720 #ifdef FEAT_CLIPBOARD
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4721 /* Make sure the clipboard gets updated. Needed because start and
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4722 * end are still the same, and the selection needs to be owned */
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4723 clip_star.vmode = NUL;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4724 #endif
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4725 redraw_curbuf_later(INVERTED);
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4726 showmode();
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4727
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4728 return OK;
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4729 }
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4730
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4731 /*
9647
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4732 * Check if the pattern is one character long or zero-width.
6443
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4733 * If move is TRUE, check from the beginning of the buffer, else from the
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4734 * current cursor position.
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4735 * Returns TRUE, FALSE or -1 for failure.
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4736 */
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4737 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4738 is_one_char(char_u *pattern, int move)
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4739 {
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4740 regmmatch_T regmatch;
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4741 int nmatched = 0;
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4742 int result = -1;
3778
29fe4e5c1db1 updated for version 7.3.647
Bram Moolenaar <bram@vim.org>
parents: 3755
diff changeset
4743 pos_T pos;
29fe4e5c1db1 updated for version 7.3.647
Bram Moolenaar <bram@vim.org>
parents: 3755
diff changeset
4744 int save_called_emsg = called_emsg;
6443
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4745 int flag = 0;
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4746
9647
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4747 if (pattern == NULL)
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4748 pattern = spats[last_idx].pat;
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4749
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4750 if (search_regcomp(pattern, RE_SEARCH, RE_SEARCH,
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4751 SEARCH_KEEP, &regmatch) == FAIL)
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4752 return -1;
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4753
9647
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4754 /* init startcol correctly */
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4755 regmatch.startpos[0].col = -1;
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4756 /* move to match */
6443
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4757 if (move)
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4758 clearpos(&pos)
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4759 else
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4760 {
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4761 pos = curwin->w_cursor;
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4762 /* accept a match at the cursor position */
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4763 flag = SEARCH_START;
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4764 }
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4765
9647
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4766 if (searchit(curwin, curbuf, &pos, FORWARD, pattern, 1,
6443
eb0fb921e197 updated for version 7.4.551
Bram Moolenaar <bram@vim.org>
parents: 6434
diff changeset
4767 SEARCH_KEEP + flag, RE_SEARCH, 0, NULL) != FAIL)
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4768 {
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4769 /* Zero-width pattern should match somewhere, then we can check if
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4770 * start and end are in the same position. */
3778
29fe4e5c1db1 updated for version 7.3.647
Bram Moolenaar <bram@vim.org>
parents: 3755
diff changeset
4771 called_emsg = FALSE;
9647
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4772 do
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4773 {
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4774 regmatch.startpos[0].col++;
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4775 nmatched = vim_regexec_multi(&regmatch, curwin, curbuf,
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4776 pos.lnum, regmatch.startpos[0].col, NULL);
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4777 if (!nmatched)
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4778 break;
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4779 } while (regmatch.startpos[0].col < pos.col);
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4780
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4781 if (!called_emsg)
9647
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4782 {
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4783 result = (nmatched != 0
3778
29fe4e5c1db1 updated for version 7.3.647
Bram Moolenaar <bram@vim.org>
parents: 3755
diff changeset
4784 && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum
29fe4e5c1db1 updated for version 7.3.647
Bram Moolenaar <bram@vim.org>
parents: 3755
diff changeset
4785 && regmatch.startpos[0].col == regmatch.endpos[0].col);
9647
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4786 /* one char width */
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4787 if (!result && inc(&pos) >= 0 && pos.col == regmatch.endpos[0].col)
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4788 result = TRUE;
847518911c0b commit https://github.com/vim/vim/commit/6835dc61aebca2b602d85a9d63c449ace58683b4
Christian Brabandt <cb@256bit.org>
parents: 8954
diff changeset
4789 }
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4790 }
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4791
3778
29fe4e5c1db1 updated for version 7.3.647
Bram Moolenaar <bram@vim.org>
parents: 3755
diff changeset
4792 called_emsg |= save_called_emsg;
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
4793 vim_regfree(regmatch.regprog);
3755
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4794 return result;
616bc1ad4f12 updated for version 7.3.636
Bram Moolenaar <bram@vim.org>
parents: 3732
diff changeset
4795 }
3718
0b1cb3f839c4 updated for version 7.3.618
Bram Moolenaar <bram@vim.org>
parents: 3701
diff changeset
4796
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4797 #if defined(FEAT_LISP) || defined(FEAT_CINDENT) || defined(FEAT_TEXTOBJ) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4798 || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4799 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4800 * return TRUE if line 'lnum' is empty or has white chars only.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4801 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4802 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4803 linewhite(linenr_T lnum)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4804 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4805 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4806
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4807 p = skipwhite(ml_get(lnum));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4808 return (*p == NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4809 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4810 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4811
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4812 #if defined(FEAT_FIND_ID) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4813 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4814 * Find identifiers or defines in included files.
2719
0139403c8eb0 updated for version 7.3.135
Bram Moolenaar <bram@vim.org>
parents: 2583
diff changeset
4815 * If p_ic && (compl_cont_status & CONT_SOL) then ptr must be in lowercase.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4816 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4817 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4818 find_pattern_in_path(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4819 char_u *ptr, /* pointer to search pattern */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4820 int dir UNUSED, /* direction of expansion */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4821 int len, /* length of search pattern */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4822 int whole, /* match whole words only */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4823 int skip_comments, /* don't match inside comments */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4824 int type, /* Type of search; are we looking for a type?
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4825 a macro? */
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4826 long count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4827 int action, /* What to do when we find it */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4828 linenr_T start_lnum, /* first line to start searching */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
4829 linenr_T end_lnum) /* last line for searching */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4830 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4831 SearchedFile *files; /* Stack of included files */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4832 SearchedFile *bigger; /* When we need more space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4833 int max_path_depth = 50;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4834 long match_count = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4835
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4836 char_u *pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4837 char_u *new_fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4838 char_u *curr_fname = curbuf->b_fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4839 char_u *prev_fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4840 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4841 int depth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4842 int depth_displayed; /* For type==CHECK_PATH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4843 int old_files;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4844 int already_searched;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4845 char_u *file_line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4846 char_u *line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4847 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4848 char_u save_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4849 int define_matched;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4850 regmatch_T regmatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4851 regmatch_T incl_regmatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4852 regmatch_T def_regmatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4853 int matched = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4854 int did_show = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4855 int found = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4856 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4857 char_u *already = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4858 char_u *startp = NULL;
534
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4859 char_u *inc_opt = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4860 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4861 win_T *curwin_save = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4862 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4863
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4864 regmatch.regprog = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4865 incl_regmatch.regprog = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4866 def_regmatch.regprog = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4867
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4868 file_line = alloc(LSIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4869 if (file_line == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4870 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4871
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4872 if (type != CHECK_PATH && type != FIND_DEFINE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4873 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4874 /* when CONT_SOL is set compare "ptr" with the beginning of the line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4875 * is faster than quote_meta/regcomp/regexec "ptr" -- Acevedo */
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
4876 && !(compl_cont_status & CONT_SOL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4877 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4878 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4879 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4880 pat = alloc(len + 5);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4881 if (pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4882 goto fpip_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4883 sprintf((char *)pat, whole ? "\\<%.*s\\>" : "%.*s", len, ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4884 /* ignore case according to p_ic, p_scs and pat */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4885 regmatch.rm_ic = ignorecase(pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4886 regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4887 vim_free(pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4888 if (regmatch.regprog == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4889 goto fpip_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4890 }
534
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4891 inc_opt = (*curbuf->b_p_inc == NUL) ? p_inc : curbuf->b_p_inc;
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4892 if (*inc_opt != NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4893 {
534
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4894 incl_regmatch.regprog = vim_regcomp(inc_opt, p_magic ? RE_MAGIC : 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4895 if (incl_regmatch.regprog == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4896 goto fpip_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4897 incl_regmatch.rm_ic = FALSE; /* don't ignore case in incl. pat. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4898 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4899 if (type == FIND_DEFINE && (*curbuf->b_p_def != NUL || *p_def != NUL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4900 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4901 def_regmatch.regprog = vim_regcomp(*curbuf->b_p_def == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4902 ? p_def : curbuf->b_p_def, p_magic ? RE_MAGIC : 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4903 if (def_regmatch.regprog == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4904 goto fpip_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4905 def_regmatch.rm_ic = FALSE; /* don't ignore case in define pat. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4906 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4907 files = (SearchedFile *)lalloc_clear((long_u)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4908 (max_path_depth * sizeof(SearchedFile)), TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4909 if (files == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4910 goto fpip_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4911 old_files = max_path_depth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4912 depth = depth_displayed = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4913
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4914 lnum = start_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4915 if (end_lnum > curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4916 end_lnum = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4917 if (lnum > end_lnum) /* do at least one line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4918 lnum = end_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4919 line = ml_get(lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4920
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4921 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4922 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4923 if (incl_regmatch.regprog != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4924 && vim_regexec(&incl_regmatch, line, (colnr_T)0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4925 {
534
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4926 char_u *p_fname = (curr_fname == curbuf->b_fname)
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4927 ? curbuf->b_ffname : curr_fname;
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4928
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4929 if (inc_opt != NULL && strstr((char *)inc_opt, "\\zs") != NULL)
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4930 /* Use text from '\zs' to '\ze' (or end) of 'include'. */
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4931 new_fname = find_file_name_in_path(incl_regmatch.startp[0],
5118
5569d11ef585 updated for version 7.3.1302
Bram Moolenaar <bram@vim.org>
parents: 5064
diff changeset
4932 (int)(incl_regmatch.endp[0] - incl_regmatch.startp[0]),
534
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4933 FNAME_EXP|FNAME_INCL|FNAME_REL, 1L, p_fname);
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4934 else
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4935 /* Use text after match with 'include'. */
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 530
diff changeset
4936 new_fname = file_name_in_line(incl_regmatch.endp[0], 0,
681
9364d114ed8d updated for version 7.0204
vimboss
parents: 673
diff changeset
4937 FNAME_EXP|FNAME_INCL|FNAME_REL, 1L, p_fname, NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4938 already_searched = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4939 if (new_fname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4940 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4941 /* Check whether we have already searched in this file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4942 for (i = 0;; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4943 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4944 if (i == depth + 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4945 i = old_files;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4946 if (i == max_path_depth)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4947 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4948 if (fullpathcmp(new_fname, files[i].name, TRUE) & FPC_SAME)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4949 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4950 if (type != CHECK_PATH &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4951 action == ACTION_SHOW_ALL && files[i].matched)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4952 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4953 msg_putchar('\n'); /* cursor below last one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4954 if (!got_int) /* don't display if 'q'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4955 typed at "--more--"
1859
e965cf54d887 updated for version 7.2-157
vimboss
parents: 1675
diff changeset
4956 message */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4957 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4958 msg_home_replace_hl(new_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4959 MSG_PUTS(_(" (includes previously listed match)"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4960 prev_fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4961 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4962 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4963 vim_free(new_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4964 new_fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4965 already_searched = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4966 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4967 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4968 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4969 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4970
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4971 if (type == CHECK_PATH && (action == ACTION_SHOW_ALL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4972 || (new_fname == NULL && !already_searched)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4973 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4974 if (did_show)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4975 msg_putchar('\n'); /* cursor below last one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4976 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4977 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4978 gotocmdline(TRUE); /* cursor at status line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4979 MSG_PUTS_TITLE(_("--- Included files "));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4980 if (action != ACTION_SHOW_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4981 MSG_PUTS_TITLE(_("not found "));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4982 MSG_PUTS_TITLE(_("in path ---\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4983 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4984 did_show = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4985 while (depth_displayed < depth && !got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4986 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4987 ++depth_displayed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4988 for (i = 0; i < depth_displayed; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4989 MSG_PUTS(" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4990 msg_home_replace(files[depth_displayed].name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4991 MSG_PUTS(" -->\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4992 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4993 if (!got_int) /* don't display if 'q' typed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4994 for "--more--" message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4995 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4996 for (i = 0; i <= depth_displayed; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4997 MSG_PUTS(" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4998 if (new_fname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4999 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5000 /* using "new_fname" is more reliable, e.g., when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5001 * 'includeexpr' is set. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5002 msg_outtrans_attr(new_fname, hl_attr(HLF_D));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5003 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5004 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5005 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5006 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5007 * Isolate the file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5008 * Include the surrounding "" or <> if present.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5009 */
3699
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5010 if (inc_opt != NULL
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5011 && strstr((char *)inc_opt, "\\zs") != NULL)
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5012 {
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5013 /* pattern contains \zs, use the match */
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5014 p = incl_regmatch.startp[0];
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5015 i = (int)(incl_regmatch.endp[0]
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5016 - incl_regmatch.startp[0]);
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5017 }
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5018 else
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5019 {
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5020 /* find the file name after the end of the match */
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5021 for (p = incl_regmatch.endp[0];
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5022 *p && !vim_isfilec(*p); p++)
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5023 ;
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5024 for (i = 0; vim_isfilec(p[i]); i++)
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5025 ;
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5026 }
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5027
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5028 if (i == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5029 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5030 /* Nothing found, use the rest of the line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5031 p = incl_regmatch.endp[0];
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
5032 i = (int)STRLEN(p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5033 }
3699
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5034 /* Avoid checking before the start of the line, can
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5035 * happen if \zs appears in the regexp. */
d29aa05b7e31 updated for version 7.3.609
Bram Moolenaar <bram@vim.org>
parents: 3693
diff changeset
5036 else if (p > line)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5037 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5038 if (p[-1] == '"' || p[-1] == '<')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5039 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5040 --p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5041 ++i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5042 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5043 if (p[i] == '"' || p[i] == '>')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5044 ++i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5045 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5046 save_char = p[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5047 p[i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5048 msg_outtrans_attr(p, hl_attr(HLF_D));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5049 p[i] = save_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5050 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5051
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5052 if (new_fname == NULL && action == ACTION_SHOW_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5053 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5054 if (already_searched)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5055 MSG_PUTS(_(" (Already listed)"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5056 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5057 MSG_PUTS(_(" NOT FOUND"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5058 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5059 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5060 out_flush(); /* output each line directly */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5061 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5062
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5063 if (new_fname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5064 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5065 /* Push the new file onto the file stack */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5066 if (depth + 1 == old_files)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5067 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5068 bigger = (SearchedFile *)lalloc((long_u)(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5069 max_path_depth * 2 * sizeof(SearchedFile)), TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5070 if (bigger != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5071 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5072 for (i = 0; i <= depth; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5073 bigger[i] = files[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5074 for (i = depth + 1; i < old_files + max_path_depth; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5075 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5076 bigger[i].fp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5077 bigger[i].name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5078 bigger[i].lnum = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5079 bigger[i].matched = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5080 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5081 for (i = old_files; i < max_path_depth; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5082 bigger[i + max_path_depth] = files[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5083 old_files += max_path_depth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5084 max_path_depth *= 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5085 vim_free(files);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5086 files = bigger;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5087 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5088 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5089 if ((files[depth + 1].fp = mch_fopen((char *)new_fname, "r"))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5090 == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5091 vim_free(new_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5092 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5093 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5094 if (++depth == old_files)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5095 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5096 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5097 * lalloc() for 'bigger' must have failed above. We
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5098 * will forget one of our already visited files now.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5099 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5100 vim_free(files[old_files].name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5101 ++old_files;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5102 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5103 files[depth].name = curr_fname = new_fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5104 files[depth].lnum = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5105 files[depth].matched = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5106 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5107 if (action == ACTION_EXPAND)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5108 {
1007
7d29124f77f5 updated for version 7.0-133
vimboss
parents: 945
diff changeset
5109 msg_hist_off = TRUE; /* reset in msg_trunc_attr() */
274
8fa8d7964cf1 updated for version 7.0073
vimboss
parents: 168
diff changeset
5110 vim_snprintf((char*)IObuff, IOSIZE,
8fa8d7964cf1 updated for version 7.0073
vimboss
parents: 168
diff changeset
5111 _("Scanning included file: %s"),
8fa8d7964cf1 updated for version 7.0073
vimboss
parents: 168
diff changeset
5112 (char *)new_fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5113 msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5114 }
712
2e887dfa8917 updated for version 7.0214
vimboss
parents: 699
diff changeset
5115 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5116 #endif
712
2e887dfa8917 updated for version 7.0214
vimboss
parents: 699
diff changeset
5117 if (p_verbose >= 5)
2e887dfa8917 updated for version 7.0214
vimboss
parents: 699
diff changeset
5118 {
2e887dfa8917 updated for version 7.0214
vimboss
parents: 699
diff changeset
5119 verbose_enter();
2e887dfa8917 updated for version 7.0214
vimboss
parents: 699
diff changeset
5120 smsg((char_u *)_("Searching included file %s"),
2e887dfa8917 updated for version 7.0214
vimboss
parents: 699
diff changeset
5121 (char *)new_fname);
2e887dfa8917 updated for version 7.0214
vimboss
parents: 699
diff changeset
5122 verbose_leave();
2e887dfa8917 updated for version 7.0214
vimboss
parents: 699
diff changeset
5123 }
2e887dfa8917 updated for version 7.0214
vimboss
parents: 699
diff changeset
5124
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5125 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5126 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5127 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5128 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5129 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5130 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5131 * Check if the line is a define (type == FIND_DEFINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5132 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5133 p = line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5134 search_line:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5135 define_matched = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5136 if (def_regmatch.regprog != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5137 && vim_regexec(&def_regmatch, line, (colnr_T)0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5138 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5139 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5140 * Pattern must be first identifier after 'define', so skip
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5141 * to that position before checking for match of pattern. Also
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5142 * don't let it match beyond the end of this identifier.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5143 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5144 p = def_regmatch.endp[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5145 while (*p && !vim_iswordc(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5146 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5147 define_matched = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5148 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5149
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5150 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5151 * Look for a match. Don't do this if we are looking for a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5152 * define and this line didn't match define_prog above.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5153 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5154 if (def_regmatch.regprog == NULL || define_matched)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5155 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5156 if (define_matched
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5157 #ifdef FEAT_INS_EXPAND
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
5158 || (compl_cont_status & CONT_SOL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5159 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5160 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5161 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5162 /* compare the first "len" chars from "ptr" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5163 startp = skipwhite(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5164 if (p_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5165 matched = !MB_STRNICMP(startp, ptr, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5166 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5167 matched = !STRNCMP(startp, ptr, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5168 if (matched && define_matched && whole
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5169 && vim_iswordc(startp[len]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5170 matched = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5171 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5172 else if (regmatch.regprog != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5173 && vim_regexec(&regmatch, line, (colnr_T)(p - line)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5174 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5175 matched = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5176 startp = regmatch.startp[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5177 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5178 * Check if the line is not a comment line (unless we are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5179 * looking for a define). A line starting with "# define"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5180 * is not considered to be a comment line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5181 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5182 if (!define_matched && skip_comments)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5183 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5184 #ifdef FEAT_COMMENTS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5185 if ((*line != '#' ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5186 STRNCMP(skipwhite(line + 1), "define", 6) != 0)
3562
5c1aaf9b4b1b updated for version 7.3.541
Bram Moolenaar <bram@vim.org>
parents: 3318
diff changeset
5187 && get_leader_len(line, NULL, FALSE, TRUE))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5188 matched = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5189
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5190 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5191 * Also check for a "/ *" or "/ /" before the match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5192 * Skips lines like "int backwards; / * normal index
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5193 * * /" when looking for "normal".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5194 * Note: Doesn't skip "/ *" in comments.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5195 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5196 p = skipwhite(line);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5197 if (matched
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5198 || (p[0] == '/' && p[1] == '*') || p[0] == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5199 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5200 for (p = line; *p && p < startp; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5201 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5202 if (matched
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5203 && p[0] == '/'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5204 && (p[1] == '*' || p[1] == '/'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5205 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5206 matched = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5207 /* After "//" all text is comment */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5208 if (p[1] == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5209 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5210 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5211 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5212 else if (!matched && p[0] == '*' && p[1] == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5213 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5214 /* Can find match after "* /". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5215 matched = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5216 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5217 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5218 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5219 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5220 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5221 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5222 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5223 if (matched)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5224 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5225 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5226 if (action == ACTION_EXPAND)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5227 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5228 int reuse = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5229 int add_r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5230 char_u *aux;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5231
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5232 if (depth == -1 && lnum == curwin->w_cursor.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5233 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5234 found = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5235 aux = p = startp;
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
5236 if (compl_cont_status & CONT_ADDING)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5237 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
5238 p += compl_length;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5239 if (vim_iswordp(p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5240 goto exit_matched;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5241 p = find_word_start(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5242 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5243 p = find_word_end(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5244 i = (int)(p - aux);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5245
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
5246 if ((compl_cont_status & CONT_ADDING) && i == compl_length)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5247 {
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
5248 /* IOSIZE > compl_length, so the STRNCPY works */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5249 STRNCPY(IObuff, aux, i);
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5250
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5251 /* Get the next line: when "depth" < 0 from the current
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5252 * buffer, otherwise from the included file. Jump to
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5253 * exit_matched when past the last line. */
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5254 if (depth < 0)
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5255 {
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5256 if (lnum >= end_lnum)
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5257 goto exit_matched;
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5258 line = ml_get(++lnum);
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5259 }
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5260 else if (vim_fgets(line = file_line,
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 942
diff changeset
5261 LSIZE, files[depth].fp))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5262 goto exit_matched;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5263
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5264 /* we read a line, set "already" to check this "line" later
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5265 * if depth >= 0 we'll increase files[depth].lnum far
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5266 * bellow -- Acevedo */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5267 already = aux = p = skipwhite(line);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5268 p = find_word_start(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5269 p = find_word_end(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5270 if (p > aux)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5271 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5272 if (*aux != ')' && IObuff[i-1] != TAB)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5273 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5274 if (IObuff[i-1] != ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5275 IObuff[i++] = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5276 /* IObuf =~ "\(\k\|\i\).* ", thus i >= 2*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5277 if (p_js
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5278 && (IObuff[i-2] == '.'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5279 || (vim_strchr(p_cpo, CPO_JOINSP) == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5280 && (IObuff[i-2] == '?'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5281 || IObuff[i-2] == '!'))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5282 IObuff[i++] = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5283 }
1859
e965cf54d887 updated for version 7.2-157
vimboss
parents: 1675
diff changeset
5284 /* copy as much as possible of the new word */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5285 if (p - aux >= IOSIZE - i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5286 p = aux + IOSIZE - i - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5287 STRNCPY(IObuff + i, aux, p - aux);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5288 i += (int)(p - aux);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5289 reuse |= CONT_S_IPOS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5290 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5291 IObuff[i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5292 aux = IObuff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5293
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
5294 if (i == compl_length)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5295 goto exit_matched;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5296 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5297
942
29bf49bad20d updated for version 7.0-068
vimboss
parents: 867
diff changeset
5298 add_r = ins_compl_add_infercase(aux, i, p_ic,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5299 curr_fname == curbuf->b_fname ? NULL : curr_fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5300 dir, reuse);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5301 if (add_r == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5302 /* if dir was BACKWARD then honor it just once */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5303 dir = FORWARD;
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 449
diff changeset
5304 else if (add_r == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5305 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5306 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5307 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5308 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5309 if (action == ACTION_SHOW_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5310 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5311 found = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5312 if (!did_show)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5313 gotocmdline(TRUE); /* cursor at status line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5314 if (curr_fname != prev_fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5315 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5316 if (did_show)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5317 msg_putchar('\n'); /* cursor below last one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5318 if (!got_int) /* don't display if 'q' typed
1859
e965cf54d887 updated for version 7.2-157
vimboss
parents: 1675
diff changeset
5319 at "--more--" message */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5320 msg_home_replace_hl(curr_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5321 prev_fname = curr_fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5322 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5323 did_show = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5324 if (!got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5325 show_pat_in_path(line, type, TRUE, action,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5326 (depth == -1) ? NULL : files[depth].fp,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5327 (depth == -1) ? &lnum : &files[depth].lnum,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5328 match_count++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5330 /* Set matched flag for this file and all the ones that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5331 * include it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5332 for (i = 0; i <= depth; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5333 files[i].matched = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5334 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5335 else if (--count <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5336 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5337 found = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5338 if (depth == -1 && lnum == curwin->w_cursor.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5339 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5340 && g_do_tagpreview == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5341 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5342 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5343 EMSG(_("E387: Match is on current line"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5344 else if (action == ACTION_SHOW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5345 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5346 show_pat_in_path(line, type, did_show, action,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5347 (depth == -1) ? NULL : files[depth].fp,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5348 (depth == -1) ? &lnum : &files[depth].lnum, 1L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5349 did_show = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5350 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5351 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5352 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5353 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5354 need_mouse_correct = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5355 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5356 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5357 /* ":psearch" uses the preview window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5358 if (g_do_tagpreview != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5359 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5360 curwin_save = curwin;
816
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 745
diff changeset
5361 prepare_tagpreview(TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5362 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5363 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5364 if (action == ACTION_SPLIT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5365 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5366 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5367 if (win_split(0, 0) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5368 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5369 break;
2583
7c2e6ba1d702 updated for version 7.3.008
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
5370 RESET_BINDING(curwin);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5371 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5372 if (depth == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5373 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5374 /* match in current file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5375 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5376 if (g_do_tagpreview != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5377 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5378 if (getfile(0, curwin_save->w_buffer->b_fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5379 NULL, TRUE, lnum, FALSE) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5380 break; /* failed to jump to file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5381 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5382 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5383 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5384 setpcmark();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5385 curwin->w_cursor.lnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5386 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5387 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5388 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5389 if (getfile(0, files[depth].name, NULL, TRUE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5390 files[depth].lnum, FALSE) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5391 break; /* failed to jump to file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5392 /* autocommands may have changed the lnum, we don't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5393 * want that here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5394 curwin->w_cursor.lnum = files[depth].lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5395 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5396 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5397 if (action != ACTION_SHOW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5398 {
1859
e965cf54d887 updated for version 7.2-157
vimboss
parents: 1675
diff changeset
5399 curwin->w_cursor.col = (colnr_T)(startp - line);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5400 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5401 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5402
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5403 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5404 if (g_do_tagpreview != 0
673
513866ffe6af updated for version 7.0200
vimboss
parents: 667
diff changeset
5405 && curwin != curwin_save && win_valid(curwin_save))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5406 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5407 /* Return cursor to where we were */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5408 validate_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5409 redraw_later(VALID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5410 win_enter(curwin_save, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5411 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5412 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5413 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5414 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5415 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5416 exit_matched:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5417 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5418 matched = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5419 /* look for other matches in the rest of the line if we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5420 * are not at the end of it already */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5421 if (def_regmatch.regprog == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5422 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5423 && action == ACTION_EXPAND
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
5424 && !(compl_cont_status & CONT_SOL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5425 #endif
1859
e965cf54d887 updated for version 7.2-157
vimboss
parents: 1675
diff changeset
5426 && *startp != NUL
3693
c612d154bcdd updated for version 7.3.606
Bram Moolenaar <bram@vim.org>
parents: 3562
diff changeset
5427 && *(p = startp + MB_PTR2LEN(startp)) != NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5428 goto search_line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5429 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5430 line_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5431 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5432 if (action == ACTION_EXPAND)
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 449
diff changeset
5433 ins_compl_check_keys(30);
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
5434 if (got_int || compl_interrupted)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5435 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5436 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5437 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5438 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5439
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5440 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5441 * Read the next line. When reading an included file and encountering
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5442 * end-of-file, close the file and continue in the file that included
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5443 * it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5444 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5445 while (depth >= 0 && !already
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5446 && vim_fgets(line = file_line, LSIZE, files[depth].fp))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5447 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5448 fclose(files[depth].fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5449 --old_files;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5450 files[old_files].name = files[depth].name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5451 files[old_files].matched = files[depth].matched;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5452 --depth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5453 curr_fname = (depth == -1) ? curbuf->b_fname
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5454 : files[depth].name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5455 if (depth < depth_displayed)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5456 depth_displayed = depth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5457 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5458 if (depth >= 0) /* we could read the line */
5118
5569d11ef585 updated for version 7.3.1302
Bram Moolenaar <bram@vim.org>
parents: 5064
diff changeset
5459 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5460 files[depth].lnum++;
5118
5569d11ef585 updated for version 7.3.1302
Bram Moolenaar <bram@vim.org>
parents: 5064
diff changeset
5461 /* Remove any CR and LF from the line. */
5569d11ef585 updated for version 7.3.1302
Bram Moolenaar <bram@vim.org>
parents: 5064
diff changeset
5462 i = (int)STRLEN(line);
5569d11ef585 updated for version 7.3.1302
Bram Moolenaar <bram@vim.org>
parents: 5064
diff changeset
5463 if (i > 0 && line[i - 1] == '\n')
5569d11ef585 updated for version 7.3.1302
Bram Moolenaar <bram@vim.org>
parents: 5064
diff changeset
5464 line[--i] = NUL;
5569d11ef585 updated for version 7.3.1302
Bram Moolenaar <bram@vim.org>
parents: 5064
diff changeset
5465 if (i > 0 && line[i - 1] == '\r')
5569d11ef585 updated for version 7.3.1302
Bram Moolenaar <bram@vim.org>
parents: 5064
diff changeset
5466 line[--i] = NUL;
5569d11ef585 updated for version 7.3.1302
Bram Moolenaar <bram@vim.org>
parents: 5064
diff changeset
5467 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5468 else if (!already)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5469 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5470 if (++lnum > end_lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5471 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5472 line = ml_get(lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5473 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5474 already = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5475 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5476 /* End of big for (;;) loop. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5477
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5478 /* Close any files that are still open. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5479 for (i = 0; i <= depth; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5480 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5481 fclose(files[i].fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5482 vim_free(files[i].name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5483 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5484 for (i = old_files; i < max_path_depth; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5485 vim_free(files[i].name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5486 vim_free(files);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5487
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5488 if (type == CHECK_PATH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5489 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5490 if (!did_show)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5491 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5492 if (action != ACTION_SHOW_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5493 MSG(_("All included files were found"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5494 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5495 MSG(_("No included files"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5496 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5497 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5498 else if (!found
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5499 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5500 && action != ACTION_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5501 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5502 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5503 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5504 #ifdef FEAT_INS_EXPAND
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 435
diff changeset
5505 if (got_int || compl_interrupted)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5506 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5507 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5508 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5509 EMSG(_(e_interr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5510 else if (type == FIND_DEFINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5511 EMSG(_("E388: Couldn't find definition"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5512 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5513 EMSG(_("E389: Couldn't find pattern"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5514 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5515 if (action == ACTION_SHOW || action == ACTION_SHOW_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5516 msg_end();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5517
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5518 fpip_end:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5519 vim_free(file_line);
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
5520 vim_regfree(regmatch.regprog);
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
5521 vim_regfree(incl_regmatch.regprog);
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
5522 vim_regfree(def_regmatch.regprog);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5523 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5525 static void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5526 show_pat_in_path(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5527 char_u *line,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5528 int type,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5529 int did_show,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5530 int action,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5531 FILE *fp,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5532 linenr_T *lnum,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5533 long count)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5534 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5535 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5536
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5537 if (did_show)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5538 msg_putchar('\n'); /* cursor below last one */
867
a5677b7ce858 updated for version 7.0g04
vimboss
parents: 835
diff changeset
5539 else if (!msg_silent)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5540 gotocmdline(TRUE); /* cursor at status line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5541 if (got_int) /* 'q' typed at "--more--" message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5542 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5543 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5544 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5545 p = line + STRLEN(line) - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5546 if (fp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5547 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5548 /* We used fgets(), so get rid of newline at end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5549 if (p >= line && *p == '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5550 --p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5551 if (p >= line && *p == '\r')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5552 --p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5553 *(p + 1) = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5554 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5555 if (action == ACTION_SHOW_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5556 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5557 sprintf((char *)IObuff, "%3ld: ", count); /* show match nr */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5558 msg_puts(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5559 sprintf((char *)IObuff, "%4ld", *lnum); /* show line nr */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5560 /* Highlight line numbers */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5561 msg_puts_attr(IObuff, hl_attr(HLF_N));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5562 MSG_PUTS(" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5563 }
168
4d9eabb1396e updated for version 7.0051
vimboss
parents: 164
diff changeset
5564 msg_prt_line(line, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5565 out_flush(); /* show one line at a time */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5566
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5567 /* Definition continues until line that doesn't end with '\' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5568 if (got_int || type != FIND_DEFINE || p < line || *p != '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5569 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5570
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5571 if (fp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5572 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5573 if (vim_fgets(line, LSIZE, fp)) /* end of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5574 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5575 ++*lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5576 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5577 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5578 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5579 if (++*lnum > curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5580 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5581 line = ml_get(*lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5582 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5583 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5584 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5585 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5586 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5587
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5588 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5589 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5590 read_viminfo_search_pattern(vir_T *virp, int force)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5591 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5592 char_u *lp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5593 int idx = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5594 int magic = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5595 int no_scs = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5596 int off_line = FALSE;
572
2244be18d9e9 updated for version 7.0162
vimboss
parents: 557
diff changeset
5597 int off_end = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5598 long off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5599 int setlast = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5600 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5601 static int hlsearch_on = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5602 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5603 char_u *val;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5604
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5605 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5606 * Old line types:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5607 * "/pat", "&pat": search/subst. pat
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5608 * "~/pat", "~&pat": last used search/subst. pat
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5609 * New line types:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5610 * "~h", "~H": hlsearch highlighting off/on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5611 * "~<magic><smartcase><line><end><off><last><which>pat"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5612 * <magic>: 'm' off, 'M' on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5613 * <smartcase>: 's' off, 'S' on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5614 * <line>: 'L' line offset, 'l' char offset
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5615 * <end>: 'E' from end, 'e' from start
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5616 * <off>: decimal, offset
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5617 * <last>: '~' last used pattern
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5618 * <which>: '/' search pat, '&' subst. pat
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5619 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5620 lp = virp->vir_line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5621 if (lp[0] == '~' && (lp[1] == 'm' || lp[1] == 'M')) /* new line type */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5622 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5623 if (lp[1] == 'M') /* magic on */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5624 magic = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5625 if (lp[2] == 's')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5626 no_scs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5627 if (lp[3] == 'L')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5628 off_line = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5629 if (lp[4] == 'E')
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
5630 off_end = SEARCH_END;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5631 lp += 5;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5632 off = getdigits(&lp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5633 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5634 if (lp[0] == '~') /* use this pattern for last-used pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5635 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5636 setlast = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5637 lp++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5638 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5639 if (lp[0] == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5640 idx = RE_SEARCH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5641 else if (lp[0] == '&')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5642 idx = RE_SUBST;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5643 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5644 else if (lp[0] == 'h') /* ~h: 'hlsearch' highlighting off */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5645 hlsearch_on = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5646 else if (lp[0] == 'H') /* ~H: 'hlsearch' highlighting on */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5647 hlsearch_on = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5648 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5649 if (idx >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5650 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5651 if (force || spats[idx].pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5652 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5653 val = viminfo_readstring(virp, (int)(lp - virp->vir_line + 1),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5654 TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5655 if (val != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5656 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5657 set_last_search_pat(val, idx, magic, setlast);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5658 vim_free(val);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5659 spats[idx].no_scs = no_scs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5660 spats[idx].off.line = off_line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5661 spats[idx].off.end = off_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5662 spats[idx].off.off = off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5663 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5664 if (setlast)
5458
6ae816249627 updated for version 7.4.079
Bram Moolenaar <bram@vim.org>
parents: 5452
diff changeset
5665 {
6ae816249627 updated for version 7.4.079
Bram Moolenaar <bram@vim.org>
parents: 5452
diff changeset
5666 SET_NO_HLSEARCH(!hlsearch_on);
6ae816249627 updated for version 7.4.079
Bram Moolenaar <bram@vim.org>
parents: 5452
diff changeset
5667 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5668 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5669 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5670 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5671 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5672 return viminfo_readline(virp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5673 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5674
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5675 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5676 write_viminfo_search_pattern(FILE *fp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5677 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5678 if (get_viminfo_parameter('/') != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5679 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5680 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5681 fprintf(fp, "\n# hlsearch on (H) or off (h):\n~%c",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5682 (no_hlsearch || find_viminfo_parameter('h') != NULL) ? 'h' : 'H');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5683 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5684 wvsp_one(fp, RE_SEARCH, "", '/');
1675
9368159253f8 updated for version 7.2b-007
vimboss
parents: 1624
diff changeset
5685 wvsp_one(fp, RE_SUBST, _("Substitute "), '&');
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5686 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5687 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5688
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5689 static void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5690 wvsp_one(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5691 FILE *fp, /* file to write to */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5692 int idx, /* spats[] index */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5693 char *s, /* search pat */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
5694 int sc) /* dir char */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5695 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5696 if (spats[idx].pat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5697 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 829
diff changeset
5698 fprintf(fp, _("\n# Last %sSearch Pattern:\n~"), s);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5699 /* off.dir is not stored, it's reset to forward */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5700 fprintf(fp, "%c%c%c%c%ld%s%c",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5701 spats[idx].magic ? 'M' : 'm', /* magic */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5702 spats[idx].no_scs ? 's' : 'S', /* smartcase */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5703 spats[idx].off.line ? 'L' : 'l', /* line offset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5704 spats[idx].off.end ? 'E' : 'e', /* offset from end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5705 spats[idx].off.off, /* offset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5706 last_idx == idx ? "~" : "", /* last used pat */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5707 sc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5708 viminfo_writestring(fp, spats[idx].pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5709 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5710 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5711 #endif /* FEAT_VIMINFO */