vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit 3a6db93abea31f0a7a0ea63acd900cd858d780fc
parent fee0d55424bbc871f6561fe23f083f9561b2a185
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Sun, 26 Jul 2015 11:21:47 +0200

text-object: add new functions to search for words

Diffstat:
Mtext-objects.c | 31+++++++++++++++++++++++++++++++
Mtext-objects.h | 3+++
2 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/text-objects.c b/text-objects.c @@ -13,6 +13,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <string.h> #include <ctype.h> #include "text-motions.h" #include "text-objects.h" @@ -165,6 +166,36 @@ Filerange text_object_word_outer(Text *txt, size_t pos) { return r; } +Filerange text_object_word_find_next(Text *txt, size_t pos, const char *word) { + size_t len = strlen(word); + for (;;) { + size_t match_pos = text_find_next(txt, pos, word); + if (match_pos != pos) { + Filerange match_word = text_object_word(txt, match_pos); + if (text_range_size(&match_word) == len) + return match_word; + pos = match_pos; + } else { + return text_range_empty(); + } + } +} + +Filerange text_object_word_find_prev(Text *txt, size_t pos, const char *word) { + size_t len = strlen(word); + for (;;) { + size_t match_pos = text_find_prev(txt, pos, word); + if (match_pos != pos) { + Filerange match_word = text_object_word(txt, match_pos); + if (text_range_size(&match_word) == len) + return match_word; + pos = match_pos; + } else { + return text_range_empty(); + } + } +} + Filerange text_object_line(Text *txt, size_t pos) { Filerange r; r.start = text_line_begin(txt, pos); diff --git a/text-objects.h b/text-objects.h @@ -14,6 +14,9 @@ Filerange text_object_word(Text*, size_t pos); /* includes trailing white spaces. if at pos happens to be a white space * include all neighbouring leading white spaces and the following word. */ Filerange text_object_word_outer(Text*, size_t pos); +/* find next occurance of `word' (as word not substring) in forward/backward direction */ +Filerange text_object_word_find_next(Text*, size_t pos, const char *word); +Filerange text_object_word_find_prev(Text*, size_t pos, const char *word); /* same semantics as above but for a longword (i.e. delimited by white spaces) */ Filerange text_object_longword(Text*, size_t pos); Filerange text_object_longword_outer(Text*, size_t pos);