diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-03-12 14:02:04 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-03-12 14:02:04 +0100 |
| commit | 2bbcf715a18a2a27dc2beb30e3f644273d7e16a9 (patch) | |
| tree | 6b96898dd85e5a21eb085fbd31c97f1cc5d4cdd4 /vis-motions.c | |
| parent | b9f04d851d17d404a842a4d8afe2156aef337283 (diff) | |
| download | vis-2bbcf715a18a2a27dc2beb30e3f644273d7e16a9.tar.gz vis-2bbcf715a18a2a27dc2beb30e3f644273d7e16a9.tar.xz | |
vis: overhaul search related code, support "/ register
Diffstat (limited to 'vis-motions.c')
| -rw-r--r-- | vis-motions.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/vis-motions.c b/vis-motions.c index e62dc35..5bff026 100644 --- a/vis-motions.c +++ b/vis-motions.c @@ -9,44 +9,56 @@ /** utility functions */ -static bool search_word(Vis *vis, Text *txt, size_t pos) { +static Regex *search_word(Vis *vis, Text *txt, size_t pos) { char expr[512]; Filerange word = text_object_word(txt, pos); if (!text_range_valid(&word)) - return false; + return NULL; char *buf = text_bytes_alloc0(txt, word.start, text_range_size(&word)); if (!buf) - return false; + return NULL; snprintf(expr, sizeof(expr), "[[:<:]]%s[[:>:]]", buf); - bool ret = text_regex_compile(vis->search_pattern, expr, REG_EXTENDED) == 0; - if (!ret) { + Regex *regex = vis_regex(vis, expr); + if (!regex) { snprintf(expr, sizeof(expr), "\\<%s\\>", buf); - ret = text_regex_compile(vis->search_pattern, expr, REG_EXTENDED) == 0; + regex = vis_regex(vis, expr); } free(buf); - return ret; + return regex; } /** motion implementations */ static size_t search_word_forward(Vis *vis, Text *txt, size_t pos) { - if (search_word(vis, txt, pos)) - pos = text_search_forward(txt, pos, vis->search_pattern); + Regex *regex = search_word(vis, txt, pos); + if (regex) + pos = text_search_forward(txt, pos, regex); + text_regex_free(regex); return pos; } static size_t search_word_backward(Vis *vis, Text *txt, size_t pos) { - if (search_word(vis, txt, pos)) - pos = text_search_backward(txt, pos, vis->search_pattern); + Regex *regex = search_word(vis, txt, pos); + if (regex) + pos = text_search_backward(txt, pos, regex); + text_regex_free(regex); return pos; } static size_t search_forward(Vis *vis, Text *txt, size_t pos) { - return text_search_forward(txt, pos, vis->search_pattern); + Regex *regex = vis_regex(vis, NULL); + if (regex) + pos = text_search_forward(txt, pos, regex); + text_regex_free(regex); + return pos; } static size_t search_backward(Vis *vis, Text *txt, size_t pos) { - return text_search_backward(txt, pos, vis->search_pattern); + Regex *regex = vis_regex(vis, NULL); + if (regex) + pos = text_search_backward(txt, pos, regex); + text_regex_free(regex); + return pos; } static size_t mark_goto(Vis *vis, File *file, size_t pos) { @@ -245,10 +257,12 @@ bool vis_motion(Vis *vis, enum VisMotion motion, ...) { case VIS_MOVE_SEARCH_BACKWARD: { const char *pattern = va_arg(ap, char*); - if (text_regex_compile(vis->search_pattern, pattern, REG_EXTENDED|REG_NEWLINE)) { + Regex *regex = vis_regex(vis, pattern); + if (!regex) { vis_cancel(vis); goto err; } + text_regex_free(regex); if (motion == VIS_MOVE_SEARCH_FORWARD) motion = VIS_MOVE_SEARCH_NEXT; else |
