aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-02-11 10:47:28 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-02-11 12:09:10 +0100
commit78f1da727768cc398a09939fdb8d325fdcdca863 (patch)
tree05787dea98953d4690195625d5ebf4bd71c35b33
parenta9db1caf19d34f13319a3ebf92100c2c92015582 (diff)
downloadvis-78f1da727768cc398a09939fdb8d325fdcdca863.tar.gz
vis-78f1da727768cc398a09939fdb8d325fdcdca863.tar.xz
vis: try to make * and # motions work on more systems
The used regular expression \<%s\> where %s refers to the search term/word under cursor is not POSIX compliant but happens to work on both musl and glibc. First try the alternate syntax [[:<:]]%s[[:>:]] which works on Mac OS X. The reason it is done in this order is that musl/glibc will reject it as invalid pattern when compiling while the Mac OS X libc will accept \<%s\> but not match anything. Based on a patch by Erlend Fagerheim.
-rw-r--r--vis-motions.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/vis-motions.c b/vis-motions.c
index 91224b5..63cb0dc 100644
--- a/vis-motions.c
+++ b/vis-motions.c
@@ -16,9 +16,14 @@ static bool search_word(Vis *vis, Text *txt, size_t pos) {
char *buf = text_bytes_alloc0(txt, word.start, text_range_size(&word));
if (!buf)
return false;
- snprintf(expr, sizeof(expr), "\\<%s\\>", buf);
+ snprintf(expr, sizeof(expr), "[[:<:]]%s[[:>:]]", buf);
+ bool ret = text_regex_compile(vis->search_pattern, expr, REG_EXTENDED) == 0;
+ if (!ret) {
+ snprintf(expr, sizeof(expr), "\\<%s\\>", buf);
+ ret = text_regex_compile(vis->search_pattern, expr, REG_EXTENDED) == 0;
+ }
free(buf);
- return text_regex_compile(vis->search_pattern, expr, REG_EXTENDED) == 0;
+ return ret;
}
/** motion implementations */