aboutsummaryrefslogtreecommitdiff
path: root/lua/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'lua/plugins')
-rw-r--r--lua/plugins/number-inc-dec.lua54
1 files changed, 54 insertions, 0 deletions
diff --git a/lua/plugins/number-inc-dec.lua b/lua/plugins/number-inc-dec.lua
new file mode 100644
index 0000000..a165b5a
--- /dev/null
+++ b/lua/plugins/number-inc-dec.lua
@@ -0,0 +1,54 @@
+-- increment/decrement number in dec/hex/oct format
+local lexer = vis.lexers
+if not lexer then return end
+
+local change = function(delta)
+
+ local win = vis.win
+ local file = win.file
+ local count = vis.count
+ if not count then count = 1 end
+ vis.count = nil -- reset count
+
+ for cursor in win:cursors_iterator() do
+ local pos = cursor.pos
+ local word = file:text_object_word(pos);
+ local s, e = word.start, word.finish;
+ if s then
+ local data = file:content(s, e - s)
+ if data and #data > 0 then
+ local base, format, padding = 10, 'd', 0
+ if lexer.oct_num:match(data) then
+ base = 8
+ format = 'o'
+ padding = #data
+ elseif lexer.hex_num:match(data) then
+ base = 16
+ format = 'x'
+ padding = #data - #"0x"
+ end
+ local number = tonumber(data, base == 8 and 8 or nil)
+ if number then
+ number = number + delta * count
+ if base ~= 10 and number < 0 then
+ -- string.format does not handle negative hex/oct values
+ -- should we wrap around?
+ number = 0
+ end
+ number = string.format((base == 16 and "0x" or "") .. "%0"..padding..format, number)
+ if base == 8 and string.sub(number, 0, 1) ~= "0" then
+ number = '0' .. number
+ end
+ file:delete(s, e - s)
+ file:insert(s, number)
+ cursor.pos = s
+ else
+ vis:info("Not a number")
+ end
+ end
+ end
+ end
+end
+
+vis:map(vis.modes.NORMAL, "<C-a>", function() change( 1) end, "Increment number")
+vis:map(vis.modes.NORMAL, "<C-x>", function() change(-1) end, "Decrement number")