summaryrefslogtreecommitdiff
path: root/util.lua
diff options
context:
space:
mode:
Diffstat (limited to 'util.lua')
-rw-r--r--util.lua102
1 files changed, 102 insertions, 0 deletions
diff --git a/util.lua b/util.lua
index 04e1bf6..99bba7b 100644
--- a/util.lua
+++ b/util.lua
@@ -125,4 +125,106 @@ function util.stable_kmerge(t, u, k)
return res
end
+function util.str_seek_prev_char(str, pos)
+ return util.utf8_seek(str, pos, -1)
+end
+
+function util.str_seek_next_char(str, pos)
+ return util.utf8_seek(str, pos, 1)
+end
+
+function util.str_seek_prev_word(str, pos)
+ return str:sub(1, pos - 1):match('()%S*%s*$')
+end
+
+function util.str_seek_next_word(str, pos)
+ return str:match('%s*%S*()', pos)
+end
+
+function util.str_insert_char(str, pos, ch)
+ return str:sub(1, pos - 1) .. ch .. str:sub(pos), pos + #ch
+end
+
+function util.str_del_prev_char(str, pos)
+ if pos <= 1 then
+ return
+ end
+
+ local npos = util.utf8_seek(str, pos, -1)
+ return str:sub(1, npos - 1) .. str:sub(pos), npos
+end
+
+function util.str_del_next_char(str, pos)
+ if pos > #str then
+ return
+ end
+
+ return str:sub(1, pos - 1) .. str:sub(util.utf8_seek(str, pos, 1)), pos
+end
+
+function util.str_del_prev_word(str, pos)
+ if pos <= 1 then
+ return
+ end
+
+ local npos = str:sub(1, pos - 1):match('()%S*%s*$')
+ return str:sub(1, npos - 1) .. str:sub(pos), npos
+end
+
+function util.str_del_next_word(str, pos)
+ if pos > #str then
+ return
+ end
+
+ return str:sub(1, pos - 1) .. str:sub(str:match('%s*%S*()', pos)), pos
+end
+
+function util.str_del_to_start(str, pos)
+ if pos <= 1 then
+ return
+ end
+
+ return str:sub(pos), 1
+end
+
+function util.str_del_to_end(str, pos)
+ if pos > #str then
+ return
+ end
+
+ return str:sub(1, pos - 1), pos
+end
+
+function util.str_transpose_chars(str, pos)
+ if pos <= 1 then
+ return
+ end
+
+ local npos = util.utf8_seek(str, pos, 1)
+ local cp2 = util.utf8_seek(str, npos, -1)
+ if cp2 <= 1 then
+ return
+ end
+ local cp1 = util.utf8_seek(str, cp2, -1)
+
+ return str:sub(1, cp1 - 1) .. str:sub(cp2, npos - 1) ..
+ str:sub(cp1, cp2 - 1) .. str:sub(npos),
+ npos
+end
+
+function util.str_transpose_words(str, pos)
+ if pos <= 1 then
+ return
+ end
+
+ local npos = str:match('%s*%S*()', pos)
+ local pre, w1, sp, w2 = str:sub(1, npos - 1):match(
+ '^(.-)(%S+)(%s+)(%S+%s*)$')
+ if not pre then
+ return
+ end
+
+ return pre .. w2 .. sp .. w1 .. str:sub(npos), npos
+end
+
return util