aboutsummaryrefslogtreecommitdiff
path: root/text-objects.c
diff options
context:
space:
mode:
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);