aboutsummaryrefslogtreecommitdiff
path: root/text-objects.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2015-07-26 11:21:47 +0200
committerMarc André Tanner <mat@brain-dump.org>2015-07-26 11:34:20 +0200
commit5e016233a9fe77258edd85a2dc746d20e6db46a0 (patch)
tree6ad4e754aa9a3dec4ca1f8f56e5b3e86cd2d2d45 /text-objects.c
parent5b9b15333670e49e708c71baaa824943bc1796ba (diff)
downloadvis-5e016233a9fe77258edd85a2dc746d20e6db46a0.tar.gz
vis-5e016233a9fe77258edd85a2dc746d20e6db46a0.tar.xz
text-object: add new functions to search for words
Diffstat (limited to 'text-objects.c')
-rw-r--r--text-objects.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/text-objects.c b/text-objects.c
index 815e36a..b06d680 100644
--- 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);