neovim

Personal neovim configuration files
git clone git://gtms.dev/neovim
Log | Files | Refs

hexen.lua (1544B)


      1 local utf8 = require('luautf8')
      2 local api = vim.api
      3 local fn = vim.fn
      4 
      5 local M = {}
      6 
      7 -- Encode
      8 
      9 local function byteToHex(b)
     10   return string.format('\\u%04X', b)
     11 end
     12 
     13 local function lineToHex(line)
     14   local r = {}
     15   for _, j in utf8.codes(line) do
     16     if j > 128 then
     17       table.insert(r, byteToHex(j))
     18     else
     19       table.insert(r, utf8.char(j))
     20     end
     21   end
     22   return table.concat(r, '')
     23 end
     24 
     25 -- Decode
     26 
     27 local function byteFromHex(h)
     28   return tonumber(h, 16)
     29 end
     30 
     31 local function lineFromHex(line)
     32   local sub = string.gsub(line, '\\u(%x+)', function(hex)
     33     return utf8.char(byteFromHex(hex))
     34   end)
     35   return sub
     36 end
     37 
     38 -- --
     39 
     40 local function translate(filterFn)
     41   local _s = fn.getpos('\'<')
     42   local start_range = { _s[2], _s[3] }
     43   local _e = fn.getpos('\'>')
     44   local end_range = { _e[2], _e[3] }
     45 
     46   local lines = api.nvim_buf_get_lines(0, start_range[1] - 1, end_range[1], true)
     47   if #lines == 0 then
     48     print('No lines selected')
     49     return
     50   end
     51   local end_col = #lines[#lines]
     52   end_range[2] = math.min(end_col, end_range[2] + 1)
     53   lines[#lines] = string.sub(lines[#lines], 1, end_range[2])
     54   lines[1] = string.sub(lines[1], start_range[2])
     55 
     56   local r = {}
     57   for _, v in pairs(lines) do
     58     table.insert(r, filterFn(v))
     59   end
     60 
     61   api.nvim_buf_set_text(0, start_range[1] - 1, start_range[2] - 1, end_range[1] - 1, end_range[2], r)
     62 end
     63 
     64 -- API
     65 
     66 function M.decode()
     67   translate(lineFromHex)
     68 end
     69 
     70 function M.encode()
     71   translate(lineToHex)
     72 end
     73 
     74 return M
     75 
     76 -- +ěščř
     77 -- žýáíé
     78 -- +\u011B\u0161\u010D\u0159\u017E\u00FD\u00E1\u00ED\u00E9