Skip to content

Commit

Permalink
lua: reimplement number increment <C-a> and decrement <C-x>
Browse files Browse the repository at this point in the history
Based on a patch by Denis Warsow.

Stuff which could probably be improved:

 - in vim the cursor does not need to be on top of the number,
   it suffices to be on the same line.

 - decrementing beyond zero does not work for hexadecimal and
   octal numbers, vim seems to wrap around in this case.

     0x00000000 <C-x> becomes 0xffffffff

Close martanne#506
  • Loading branch information
martanne committed Feb 28, 2017
1 parent 28fae46 commit f9cec7b
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 0 deletions.
54 changes: 54 additions & 0 deletions lua/plugins/number-inc-dec.lua
Original file line number Diff line number Diff line change
@@ -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")
1 change: 1 addition & 0 deletions lua/vis-std.lua
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,4 @@ end)
require('plugins/filetype')
require('plugins/textobject-lexer')
require('plugins/digraph')
require('plugins/number-inc-dec')

0 comments on commit f9cec7b

Please sign in to comment.