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