dotfiles

<-- duh.
Log | Files | Refs | LICENSE

commit 1246a4b68f5b62109a21dc3e2889a13d972e5739
parent 9f570d4fe92cac34f09a65df3d5c96da29e25113
Author: hhvn <dev@hhvn.uk>
Date:   Sun, 20 Jun 2021 00:05:24 +0100

.c/n/p/colorizer.vim .c/n/lua/*: remove colorizer plugin

Diffstat:
D.config/nvim/lua/colorizer.lua | 647-------------------------------------------------------------------------------
D.config/nvim/lua/colorizer/nvim.lua | 193-------------------------------------------------------------------------------
D.config/nvim/lua/colorizer/trie.lua | 242-------------------------------------------------------------------------------
D.config/nvim/plugin/colorizer.vim | 12------------
4 files changed, 0 insertions(+), 1094 deletions(-)

diff --git a/.config/nvim/lua/colorizer.lua b/.config/nvim/lua/colorizer.lua @@ -1,647 +0,0 @@ ---- Highlights terminal CSI ANSI color codes. --- @module colorizer -local nvim = require 'colorizer/nvim' -local Trie = require 'colorizer/trie' -local bit = require 'bit' -local ffi = require 'ffi' - -local nvim_buf_add_highlight = vim.api.nvim_buf_add_highlight -local nvim_buf_clear_namespace = vim.api.nvim_buf_clear_namespace -local nvim_buf_get_lines = vim.api.nvim_buf_get_lines -local nvim_get_current_buf = vim.api.nvim_get_current_buf -local band, lshift, bor, tohex = bit.band, bit.lshift, bit.bor, bit.tohex -local rshift = bit.rshift -local floor, min, max = math.floor, math.min, math.max - -local COLOR_MAP -local COLOR_TRIE -local COLOR_NAME_MINLEN, COLOR_NAME_MAXLEN -local COLOR_NAME_SETTINGS = { - lowercase = false; - strip_digits = false; -} - ---- Setup the COLOR_MAP and COLOR_TRIE -local function initialize_trie() - if not COLOR_TRIE then - COLOR_MAP = {} - COLOR_TRIE = Trie() - for k, v in pairs(nvim.get_color_map()) do - if not (COLOR_NAME_SETTINGS.strip_digits and k:match("%d+$")) then - COLOR_NAME_MINLEN = COLOR_NAME_MINLEN and min(#k, COLOR_NAME_MINLEN) or #k - COLOR_NAME_MAXLEN = COLOR_NAME_MAXLEN and max(#k, COLOR_NAME_MAXLEN) or #k - local rgb_hex = tohex(v, 6) - COLOR_MAP[k] = rgb_hex - COLOR_TRIE:insert(k) - if COLOR_NAME_SETTINGS.lowercase then - local lowercase = k:lower() - COLOR_MAP[lowercase] = rgb_hex - COLOR_TRIE:insert(lowercase) - end - end - end - end -end - -local function merge(...) - local res = {} - for i = 1,select("#", ...) do - local o = select(i, ...) - for k,v in pairs(o) do - res[k] = v - end - end - return res -end - -local DEFAULT_OPTIONS = { - RGB = true; -- #RGB hex codes - RRGGBB = true; -- #RRGGBB hex codes - names = true; -- "Name" codes like Blue - RRGGBBAA = false; -- #RRGGBBAA hex codes - rgb_fn = false; -- CSS rgb() and rgba() functions - hsl_fn = false; -- CSS hsl() and hsla() functions - css = false; -- Enable all CSS features: rgb_fn, hsl_fn, names, RGB, RRGGBB - css_fn = false; -- Enable all CSS *functions*: rgb_fn, hsl_fn - -- Available modes: foreground, background - mode = 'background'; -- Set the display mode. -} - --- -- TODO use rgb as the return value from the matcher functions --- -- instead of the rgb_hex. Can be the highlight key as well --- -- when you shift it left 8 bits. Use the lower 8 bits for --- -- indicating which highlight mode to use. --- ffi.cdef [[ --- typedef struct { uint8_t r, g, b; } colorizer_rgb; --- ]] --- local rgb_t = ffi.typeof 'colorizer_rgb' - --- Create a lookup table where the bottom 4 bits are used to indicate the --- category and the top 4 bits are the hex value of the ASCII byte. -local BYTE_CATEGORY = ffi.new 'uint8_t[256]' -local CATEGORY_DIGIT = lshift(1, 0); -local CATEGORY_ALPHA = lshift(1, 1); -local CATEGORY_HEX = lshift(1, 2); -local CATEGORY_ALPHANUM = bor(CATEGORY_ALPHA, CATEGORY_DIGIT) -do - local b = string.byte - for i = 0, 255 do - local v = 0 - -- Digit is bit 1 - if i >= b'0' and i <= b'9' then - v = bor(v, lshift(1, 0)) - v = bor(v, lshift(1, 2)) - v = bor(v, lshift(i - b'0', 4)) - end - local lowercase = bor(i, 0x20) - -- Alpha is bit 2 - if lowercase >= b'a' and lowercase <= b'z' then - v = bor(v, lshift(1, 1)) - if lowercase <= b'f' then - v = bor(v, lshift(1, 2)) - v = bor(v, lshift(lowercase - b'a'+10, 4)) - end - end - BYTE_CATEGORY[i] = v - end -end - -local function byte_is_hex(byte) - return band(BYTE_CATEGORY[byte], CATEGORY_HEX) ~= 0 -end - -local function byte_is_alphanumeric(byte) - local category = BYTE_CATEGORY[byte] - return band(category, CATEGORY_ALPHANUM) ~= 0 -end - -local function parse_hex(b) - return rshift(BYTE_CATEGORY[b], 4) -end - -local function percent_or_hex(v) - if v:sub(-1,-1) == "%" then - return tonumber(v:sub(1,-2))/100*255 - end - local x = tonumber(v) - if x > 255 then return end - return x -end - ---- Determine whether to use black or white text --- Ref: https://stackoverflow.com/a/1855903/837964 --- https://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color -local function color_is_bright(r, g, b) - -- Counting the perceptive luminance - human eye favors green color - local luminance = (0.299*r + 0.587*g + 0.114*b)/255 - if luminance > 0.5 then - return true -- Bright colors, black font - else - return false -- Dark colors, white font - end -end - --- https://gist.github.com/mjackson/5311256 -local function hue_to_rgb(p, q, t) - if t < 0 then t = t + 1 end - if t > 1 then t = t - 1 end - if t < 1/6 then return p + (q - p) * 6 * t end - if t < 1/2 then return q end - if t < 2/3 then return p + (q - p) * (2/3 - t) * 6 end - return p -end - -local function hsl_to_rgb(h, s, l) - if h > 1 or s > 1 or l > 1 then return end - if s == 0 then - local r = l * 255 - return r, r, r - end - local q - if l < 0.5 then - q = l * (1 + s) - else - q = l + s - l * s - end - local p = 2 * l - q - return 255*hue_to_rgb(p, q, h + 1/3), 255*hue_to_rgb(p, q, h), 255*hue_to_rgb(p, q, h - 1/3) -end - -local function color_name_parser(line, i) - if i > 1 and byte_is_alphanumeric(line:byte(i-1)) then - return - end - if #line < i + COLOR_NAME_MINLEN - 1 then return end - local prefix = COLOR_TRIE:longest_prefix(line, i) - if prefix then - -- Check if there is a letter here so as to disallow matching here. - -- Take the Blue out of Blueberry - -- Line end or non-letter. - local next_byte_index = i + #prefix - if #line >= next_byte_index and byte_is_alphanumeric(line:byte(next_byte_index)) then - return - end - return #prefix, COLOR_MAP[prefix] - end -end - -local b_hash = ("#"):byte() -local function rgb_hex_parser(line, i, minlen, maxlen) - if i > 1 and byte_is_alphanumeric(line:byte(i-1)) then - return - end - if line:byte(i) ~= b_hash then - return - end - local j = i + 1 - if #line < j + minlen - 1 then return end - local n = j + maxlen - local alpha - local v = 0 - while j <= min(n, #line) do - local b = line:byte(j) - if not byte_is_hex(b) then break end - if j - i >= 7 then - alpha = parse_hex(b) + lshift(alpha or 0, 4) - else - v = parse_hex(b) + lshift(v, 4) - end - j = j + 1 - end - if #line >= j and byte_is_alphanumeric(line:byte(j)) then - return - end - local length = j - i - if length ~= 4 and length ~= 7 and length ~= 9 then return end - if alpha then - alpha = tonumber(alpha)/255 - local r = floor(band(v, 0xFF)*alpha) - local g = floor(band(rshift(v, 8), 0xFF)*alpha) - local b = floor(band(rshift(v, 16), 0xFF)*alpha) - v = bor(lshift(r, 16), lshift(g, 8), b) - return 9, tohex(v, 6) - end - return length, line:sub(i+1, i+length-1) -end - --- TODO consider removing the regexes here --- TODO this might not be the best approach to alpha channel. --- Things like pumblend might be useful here. -local css_fn = {} -do - local CSS_RGB_FN_MINIMUM_LENGTH = #'rgb(0,0,0)' - 1 - local CSS_RGBA_FN_MINIMUM_LENGTH = #'rgba(0,0,0,0)' - 1 - local CSS_HSL_FN_MINIMUM_LENGTH = #'hsl(0,0%,0%)' - 1 - local CSS_HSLA_FN_MINIMUM_LENGTH = #'hsla(0,0%,0%,0)' - 1 - function css_fn.rgb(line, i) - if #line < i + CSS_RGB_FN_MINIMUM_LENGTH then return end - local r, g, b, match_end = line:sub(i):match("^rgb%(%s*(%d+%%?)%s*,%s*(%d+%%?)%s*,%s*(%d+%%?)%s*%)()") - if not match_end then return end - r = percent_or_hex(r) if not r then return end - g = percent_or_hex(g) if not g then return end - b = percent_or_hex(b) if not b then return end - local rgb_hex = tohex(bor(lshift(r, 16), lshift(g, 8), b), 6) - return match_end - 1, rgb_hex - end - function css_fn.hsl(line, i) - if #line < i + CSS_HSL_FN_MINIMUM_LENGTH then return end - local h, s, l, match_end = line:sub(i):match("^hsl%(%s*(%d+)%s*,%s*(%d+)%%%s*,%s*(%d+)%%%s*%)()") - if not match_end then return end - h = tonumber(h) if h > 360 then return end - s = tonumber(s) if s > 100 then return end - l = tonumber(l) if l > 100 then return end - local r, g, b = hsl_to_rgb(h/360, s/100, l/100) - if r == nil or g == nil or b == nil then return end - local rgb_hex = tohex(bor(lshift(floor(r), 16), lshift(floor(g), 8), floor(b)), 6) - return match_end - 1, rgb_hex - end - function css_fn.rgba(line, i) - if #line < i + CSS_RGBA_FN_MINIMUM_LENGTH then return end - local r, g, b, a, match_end = line:sub(i):match("^rgba%(%s*(%d+%%?)%s*,%s*(%d+%%?)%s*,%s*(%d+%%?)%s*,%s*([.%d]+)%s*%)()") - if not match_end then return end - a = tonumber(a) if not a or a > 1 then return end - r = percent_or_hex(r) if not r then return end - g = percent_or_hex(g) if not g then return end - b = percent_or_hex(b) if not b then return end - local rgb_hex = tohex(bor(lshift(floor(r*a), 16), lshift(floor(g*a), 8), floor(b*a)), 6) - return match_end - 1, rgb_hex - end - function css_fn.hsla(line, i) - if #line < i + CSS_HSLA_FN_MINIMUM_LENGTH then return end - local h, s, l, a, match_end = line:sub(i):match("^hsla%(%s*(%d+)%s*,%s*(%d+)%%%s*,%s*(%d+)%%%s*,%s*([.%d]+)%s*%)()") - if not match_end then return end - a = tonumber(a) if not a or a > 1 then return end - h = tonumber(h) if h > 360 then return end - s = tonumber(s) if s > 100 then return end - l = tonumber(l) if l > 100 then return end - local r, g, b = hsl_to_rgb(h/360, s/100, l/100) - if r == nil or g == nil or b == nil then return end - local rgb_hex = tohex(bor(lshift(floor(r*a), 16), lshift(floor(g*a), 8), floor(b*a)), 6) - return match_end - 1, rgb_hex - end -end -local css_function_parser, rgb_function_parser, hsl_function_parser -do - local CSS_FUNCTION_TRIE = Trie {'rgb', 'rgba', 'hsl', 'hsla'} - local RGB_FUNCTION_TRIE = Trie {'rgb', 'rgba'} - local HSL_FUNCTION_TRIE = Trie {'hsl', 'hsla'} - css_function_parser = function(line, i) - local prefix = CSS_FUNCTION_TRIE:longest_prefix(line:sub(i)) - if prefix then - return css_fn[prefix](line, i) - end - end - rgb_function_parser = function(line, i) - local prefix = RGB_FUNCTION_TRIE:longest_prefix(line:sub(i)) - if prefix then - return css_fn[prefix](line, i) - end - end - hsl_function_parser = function(line, i) - local prefix = HSL_FUNCTION_TRIE:longest_prefix(line:sub(i)) - if prefix then - return css_fn[prefix](line, i) - end - end -end - -local function compile_matcher(matchers) - local parse_fn = matchers[1] - for j = 2, #matchers do - local old_parse_fn = parse_fn - local new_parse_fn = matchers[j] - parse_fn = function(line, i) - local length, rgb_hex = new_parse_fn(line, i) - if length then return length, rgb_hex end - return old_parse_fn(line, i) - end - end - return parse_fn -end - ---- Default namespace used in `highlight_buffer` and `attach_to_buffer`. --- The name is "terminal_highlight" --- @see highlight_buffer --- @see attach_to_buffer -local DEFAULT_NAMESPACE = nvim.create_namespace "colorizer" -local HIGHLIGHT_NAME_PREFIX = "colorizer" -local HIGHLIGHT_MODE_NAMES = { - background = "mb"; - foreground = "mf"; -} -local HIGHLIGHT_CACHE = {} - ---- Make a deterministic name for a highlight given these attributes -local function make_highlight_name(rgb, mode) - return table.concat({HIGHLIGHT_NAME_PREFIX, HIGHLIGHT_MODE_NAMES[mode], rgb}, '_') -end - -local function create_highlight(rgb_hex, options) - local mode = options.mode or 'background' - -- TODO validate rgb format? - rgb_hex = rgb_hex:lower() - local cache_key = table.concat({HIGHLIGHT_MODE_NAMES[mode], rgb_hex}, "_") - local highlight_name = HIGHLIGHT_CACHE[cache_key] - -- Look up in our cache. - if not highlight_name then - if #rgb_hex == 3 then - rgb_hex = table.concat { - rgb_hex:sub(1,1):rep(2); - rgb_hex:sub(2,2):rep(2); - rgb_hex:sub(3,3):rep(2); - } - end - -- Create the highlight - highlight_name = make_highlight_name(rgb_hex, mode) - if mode == 'foreground' then - nvim.ex.highlight(highlight_name, "guifg=#"..rgb_hex) - else - local r, g, b = rgb_hex:sub(1,2), rgb_hex:sub(3,4), rgb_hex:sub(5,6) - r, g, b = tonumber(r,16), tonumber(g,16), tonumber(b,16) - local fg_color - if color_is_bright(r,g,b) then - fg_color = "Black" - else - fg_color = "White" - end - nvim.ex.highlight(highlight_name, "guifg="..fg_color, "guibg=#"..rgb_hex) - end - HIGHLIGHT_CACHE[cache_key] = highlight_name - end - return highlight_name -end - -local MATCHER_CACHE = {} -local function make_matcher(options) - local enable_names = options.css or options.names - local enable_RGB = options.css or options.RGB - local enable_RRGGBB = options.css or options.RRGGBB - local enable_RRGGBBAA = options.css or options.RRGGBBAA - local enable_rgb = options.css or options.css_fns or options.rgb_fn - local enable_hsl = options.css or options.css_fns or options.hsl_fn - - local matcher_key = bor( - lshift(enable_names and 1 or 0, 0), - lshift(enable_RGB and 1 or 0, 1), - lshift(enable_RRGGBB and 1 or 0, 2), - lshift(enable_RRGGBBAA and 1 or 0, 3), - lshift(enable_rgb and 1 or 0, 4), - lshift(enable_hsl and 1 or 0, 5)) - - if matcher_key == 0 then return end - - local loop_parse_fn = MATCHER_CACHE[matcher_key] - if loop_parse_fn then - return loop_parse_fn - end - - local loop_matchers = {} - if enable_names then - table.insert(loop_matchers, color_name_parser) - end - do - local valid_lengths = {[3] = enable_RGB, [6] = enable_RRGGBB, [8] = enable_RRGGBBAA} - local minlen, maxlen - for k, v in pairs(valid_lengths) do - if v then - minlen = minlen and min(k, minlen) or k - maxlen = maxlen and max(k, maxlen) or k - end - end - if minlen then - table.insert(loop_matchers, function(line, i) - local length, rgb_hex = rgb_hex_parser(line, i, minlen, maxlen) - if length and valid_lengths[length-1] then - return length, rgb_hex - end - end) - end - end - if enable_rgb and enable_hsl then - table.insert(loop_matchers, css_function_parser) - elseif enable_rgb then - table.insert(loop_matchers, rgb_function_parser) - elseif enable_hsl then - table.insert(loop_matchers, hsl_function_parser) - end - loop_parse_fn = compile_matcher(loop_matchers) - MATCHER_CACHE[matcher_key] = loop_parse_fn - return loop_parse_fn -end - ---[[-- Highlight the buffer region. -Highlight starting from `line_start` (0-indexed) for each line described by `lines` in the -buffer `buf` and attach it to the namespace `ns`. - -@tparam integer buf buffer id. -@tparam[opt=DEFAULT_NAMESPACE] integer ns the namespace id. Create it with `vim.api.create_namespace` -@tparam {string,...} lines the lines to highlight from the buffer. -@tparam integer line_start should be 0-indexed -@param options Configuration options as described in `setup` -@see setup -]] -local function highlight_buffer(buf, ns, lines, line_start, options) - -- TODO do I have to put this here? - initialize_trie() - ns = ns or DEFAULT_NAMESPACE - local loop_parse_fn = make_matcher(options) - for current_linenum, line in ipairs(lines) do - current_linenum = current_linenum - 1 + line_start - -- Upvalues are options and current_linenum - local i = 1 - while i < #line do - local length, rgb_hex = loop_parse_fn(line, i) - if length then - local highlight_name = create_highlight(rgb_hex, options) - nvim_buf_add_highlight(buf, ns, highlight_name, current_linenum, i-1, i+length-1) - i = i + length - else - i = i + 1 - end - end - end -end - ---- --- USER FACING FUNCTIONALITY ---- - -local SETUP_SETTINGS = { - exclusions = {}; - default_options = DEFAULT_OPTIONS; -} -local BUFFER_OPTIONS = {} -local FILETYPE_OPTIONS = {} - -local function rehighlight_buffer(buf, options) - local ns = DEFAULT_NAMESPACE - if buf == 0 or buf == nil then - buf = nvim_get_current_buf() - end - assert(options) - nvim_buf_clear_namespace(buf, ns, 0, -1) - local lines = nvim_buf_get_lines(buf, 0, -1, true) - highlight_buffer(buf, ns, lines, 0, options) -end - -local function new_buffer_options(buf) - local filetype = nvim.buf_get_option(buf, 'filetype') - return FILETYPE_OPTIONS[filetype] or SETUP_SETTINGS.default_options -end - ---- Check if attached to a buffer. --- @tparam[opt=0|nil] integer buf A value of 0 implies the current buffer. --- @return true if attached to the buffer, false otherwise. -local function is_buffer_attached(buf) - if buf == 0 or buf == nil then - buf = nvim_get_current_buf() - end - return BUFFER_OPTIONS[buf] ~= nil -end - ---- Attach to a buffer and continuously highlight changes. --- @tparam[opt=0|nil] integer buf A value of 0 implies the current buffer. --- @param[opt] options Configuration options as described in `setup` --- @see setup -local function attach_to_buffer(buf, options) - if buf == 0 or buf == nil then - buf = nvim_get_current_buf() - end - local already_attached = BUFFER_OPTIONS[buf] ~= nil - local ns = DEFAULT_NAMESPACE - if not options then - options = new_buffer_options(buf) - end - BUFFER_OPTIONS[buf] = options - rehighlight_buffer(buf, options) - if already_attached then - return - end - -- send_buffer: true doesn't actually do anything in Lua (yet) - nvim.buf_attach(buf, false, { - on_lines = function(event_type, buf, changed_tick, firstline, lastline, new_lastline) - -- This is used to signal stopping the handler highlights - if not BUFFER_OPTIONS[buf] then - return true - end - nvim_buf_clear_namespace(buf, ns, firstline, new_lastline) - local lines = nvim_buf_get_lines(buf, firstline, new_lastline, false) - highlight_buffer(buf, ns, lines, firstline, BUFFER_OPTIONS[buf]) - end; - on_detach = function() - BUFFER_OPTIONS[buf] = nil - end; - }) -end - ---- Stop highlighting the current buffer. --- @tparam[opt=0|nil] integer buf A value of 0 or nil implies the current buffer. --- @tparam[opt=DEFAULT_NAMESPACE] integer ns the namespace id. -local function detach_from_buffer(buf, ns) - if buf == 0 or buf == nil then - buf = nvim_get_current_buf() - end - nvim_buf_clear_namespace(buf, ns or DEFAULT_NAMESPACE, 0, -1) - BUFFER_OPTIONS[buf] = nil -end - - ---- Easy to use function if you want the full setup without fine grained control. --- Setup an autocmd which enables colorizing for the filetypes and options specified. --- --- By default highlights all FileTypes. --- --- Example config: --- ``` --- { 'scss', 'html', css = { rgb_fn = true; }, javascript = { no_names = true } } --- ``` --- --- You can combine an array and more specific options. --- Possible options: --- - `no_names`: Don't highlight names like Blue --- - `rgb_fn`: Highlight `rgb(...)` functions. --- - `mode`: Highlight mode. Valid options: `foreground`,`background` --- --- @param[opt={'*'}] filetypes A table/array of filetypes to selectively enable and/or customize. By default, enables all filetypes. --- @tparam[opt] {[string]=string} default_options Default options to apply for the filetypes enable. --- @usage require'colorizer'.setup() -local function setup(filetypes, user_default_options) - if not nvim.o.termguicolors then - nvim.err_writeln("&termguicolors must be set") - return - end - FILETYPE_OPTIONS = {} - SETUP_SETTINGS = { - exclusions = {}; - default_options = merge(DEFAULT_OPTIONS, user_default_options or {}); - } - -- Initialize this AFTER setting COLOR_NAME_SETTINGS - initialize_trie() - function COLORIZER_SETUP_HOOK() - local filetype = nvim.bo.filetype - if SETUP_SETTINGS.exclusions[filetype] then - return - end - local options = FILETYPE_OPTIONS[filetype] or SETUP_SETTINGS.default_options - attach_to_buffer(nvim_get_current_buf(), options) - end - nvim.ex.augroup("ColorizerSetup") - nvim.ex.autocmd_() - if not filetypes then - nvim.ex.autocmd("FileType * lua COLORIZER_SETUP_HOOK()") - else - for k, v in pairs(filetypes) do - local filetype - local options = SETUP_SETTINGS.default_options - if type(k) == 'string' then - filetype = k - if type(v) ~= 'table' then - nvim.err_writeln("colorizer: Invalid option type for filetype "..filetype) - else - options = merge(SETUP_SETTINGS.default_options, v) - assert(HIGHLIGHT_MODE_NAMES[options.mode or 'background'], "colorizer: Invalid mode: "..tostring(options.mode)) - end - else - filetype = v - end - -- Exclude - if filetype:sub(1,1) == '!' then - SETUP_SETTINGS.exclusions[filetype:sub(2)] = true - else - FILETYPE_OPTIONS[filetype] = options - -- TODO What's the right mode for this? BufEnter? - nvim.ex.autocmd("FileType", filetype, "lua COLORIZER_SETUP_HOOK()") - end - end - end - nvim.ex.augroup("END") -end - ---- Reload all of the currently active highlighted buffers. -local function reload_all_buffers() - for buf, buffer_options in pairs(BUFFER_OPTIONS) do - attach_to_buffer(buf) - end -end - ---- Return the currently active buffer options. --- @tparam[opt=0|nil] integer buf A value of 0 or nil implies the current buffer. -local function get_buffer_options(buf) - if buf == 0 or buf == nil then - buf = nvim_get_current_buf() - end - return merge({}, BUFFER_OPTIONS[buf]) -end - ---- @export -return { - DEFAULT_NAMESPACE = DEFAULT_NAMESPACE; - setup = setup; - is_buffer_attached = is_buffer_attached; - attach_to_buffer = attach_to_buffer; - detach_from_buffer = detach_from_buffer; - highlight_buffer = highlight_buffer; - reload_all_buffers = reload_all_buffers; - get_buffer_options = get_buffer_options; -} - diff --git a/.config/nvim/lua/colorizer/nvim.lua b/.config/nvim/lua/colorizer/nvim.lua @@ -1,193 +0,0 @@ ---- Module of magic functions for nvim --- @module nvim - --- Equivalent to `echo vim.inspect(...)` -local function nvim_print(...) - if select("#", ...) == 1 then - vim.api.nvim_out_write(vim.inspect((...))) - else - vim.api.nvim_out_write(vim.inspect {...}) - end - vim.api.nvim_out_write("\n") -end - ---- Equivalent to `echo` EX command -local function nvim_echo(...) - for i = 1, select("#", ...) do - local part = select(i, ...) - vim.api.nvim_out_write(tostring(part)) - -- vim.api.nvim_out_write("\n") - vim.api.nvim_out_write(" ") - end - vim.api.nvim_out_write("\n") -end - -local window_options = { - arab = true; arabic = true; breakindent = true; breakindentopt = true; - bri = true; briopt = true; cc = true; cocu = true; - cole = true; colorcolumn = true; concealcursor = true; conceallevel = true; - crb = true; cuc = true; cul = true; cursorbind = true; - cursorcolumn = true; cursorline = true; diff = true; fcs = true; - fdc = true; fde = true; fdi = true; fdl = true; - fdm = true; fdn = true; fdt = true; fen = true; - fillchars = true; fml = true; fmr = true; foldcolumn = true; - foldenable = true; foldexpr = true; foldignore = true; foldlevel = true; - foldmarker = true; foldmethod = true; foldminlines = true; foldnestmax = true; - foldtext = true; lbr = true; lcs = true; linebreak = true; - list = true; listchars = true; nu = true; number = true; - numberwidth = true; nuw = true; previewwindow = true; pvw = true; - relativenumber = true; rightleft = true; rightleftcmd = true; rl = true; - rlc = true; rnu = true; scb = true; scl = true; - scr = true; scroll = true; scrollbind = true; signcolumn = true; - spell = true; statusline = true; stl = true; wfh = true; - wfw = true; winbl = true; winblend = true; winfixheight = true; - winfixwidth = true; winhighlight = true; winhl = true; wrap = true; -} - --- `nvim.$method(...)` redirects to `nvim.api.nvim_$method(...)` --- `nvim.fn.$method(...)` redirects to `vim.api.nvim_call_function($method, {...})` --- TODO `nvim.ex.$command(...)` is approximately `:$command {...}.join(" ")` --- `nvim.print(...)` is approximately `echo vim.inspect(...)` --- `nvim.echo(...)` is approximately `echo table.concat({...}, '\n')` --- Both methods cache the inital lookup in the metatable, but there is a small overhead regardless. -return setmetatable({ - print = nvim_print; - echo = nvim_echo; - fn = setmetatable({}, { - __index = function(self, k) - local mt = getmetatable(self) - local x = mt[k] - if x ~= nil then - return x - end - local f = function(...) return vim.api.nvim_call_function(k, {...}) end - mt[k] = f - return f - end - }); - buf = setmetatable({ - }, { - __index = function(self, k) - local mt = getmetatable(self) - local x = mt[k] - if x ~= nil then return x end - local f - if k == 'line' then - f = function() - local pos = vim.api.nvim_win_get_cursor(0) - return vim.api.nvim_buf_get_lines(0, pos[1]-1, pos[1], 'line')[1] - end - elseif k == 'nr' then - f = vim.api.nvim_get_current_buf - end - mt[k] = f - return f - end - }); - ex = setmetatable({}, { - __index = function(self, k) - local mt = getmetatable(self) - local x = mt[k] - if x ~= nil then - return x - end - local command = k:gsub("_$", "!") - local f = function(...) - return vim.api.nvim_command(table.concat(vim.tbl_flatten {command, ...}, " ")) - end - mt[k] = f - return f - end - }); - g = setmetatable({}, { - __index = function(_, k) - return vim.api.nvim_get_var(k) - end; - __newindex = function(_, k, v) - if v == nil then - return vim.api.nvim_del_var(k) - else - return vim.api.nvim_set_var(k, v) - end - end; - }); - v = setmetatable({}, { - __index = function(_, k) - return vim.api.nvim_get_vvar(k) - end; - __newindex = function(_, k, v) - return vim.api.nvim_set_vvar(k, v) - end - }); - b = setmetatable({}, { - __index = function(_, k) - return vim.api.nvim_buf_get_var(0, k) - end; - __newindex = function(_, k, v) - if v == nil then - return vim.api.nvim_buf_del_var(0, k) - else - return vim.api.nvim_buf_set_var(0, k, v) - end - end - }); - w = setmetatable({}, { - __index = function(_, k) - return vim.api.nvim_win_get_var(0, k) - end; - __newindex = function(_, k, v) - if v == nil then - return vim.api.nvim_win_del_var(0, k) - else - return vim.api.nvim_win_set_var(0, k, v) - end - end - }); - o = setmetatable({}, { - __index = function(_, k) - return vim.api.nvim_get_option(k) - end; - __newindex = function(_, k, v) - return vim.api.nvim_set_option(k, v) - end - }); - -- TODO add warning if you try to use a window option here? - bo = setmetatable({}, { - __index = function(_, k) - return vim.api.nvim_buf_get_option(0, k) - end; - __newindex = function(_, k, v) - return vim.api.nvim_buf_set_option(0, k, v) - end - }); - wo = setmetatable({}, { - __index = function(_, k) - return vim.api.nvim_win_get_option(0, k) - end; - __newindex = function(_, k, v) - -- passing v == nil will clear the value, just like above. - return vim.api.nvim_win_set_option(0, k, v) - end - }); - env = setmetatable({}, { - __index = function(_, k) - return vim.api.nvim_call_function('getenv', {k}) - end; - __newindex = function(_, k, v) - return vim.api.nvim_call_function('setenv', {k, v}) - end - }); -}, { - __index = function(self, k) - local mt = getmetatable(self) - local x = mt[k] - if x ~= nil then - return x - end - local f = vim.api['nvim_'..k] - mt[k] = f - return f - end -}) - - diff --git a/.config/nvim/lua/colorizer/trie.lua b/.config/nvim/lua/colorizer/trie.lua @@ -1,242 +0,0 @@ ---- Trie implementation in luajit --- Copyright © 2019 Ashkan Kiani - --- This program is free software: you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation, either version 3 of the License, or --- (at your option) any later version. - --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- You should have received a copy of the GNU General Public License --- along with this program. If not, see <http://www.gnu.org/licenses/>. -local ffi = require 'ffi' - -ffi.cdef [[ -struct Trie { - bool is_leaf; - struct Trie* character[62]; -}; -void *malloc(size_t size); -void free(void *ptr); -]] - -local Trie_t = ffi.typeof('struct Trie') -local Trie_ptr_t = ffi.typeof('$ *', Trie_t) -local Trie_size = ffi.sizeof(Trie_t) - -local function trie_create() - local ptr = ffi.C.malloc(Trie_size) - ffi.fill(ptr, Trie_size) - return ffi.cast(Trie_ptr_t, ptr) -end - -local function trie_destroy(trie) - if trie == nil then - return - end - for i = 0, 61 do - local child = trie.character[i] - if child ~= nil then - trie_destroy(child) - end - end - ffi.C.free(trie) -end - -local INDEX_LOOKUP_TABLE = ffi.new 'uint8_t[256]' -local CHAR_LOOKUP_TABLE = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' -do - local b = string.byte - for i = 0, 255 do - if i >= b'0' and i <= b'9' then - INDEX_LOOKUP_TABLE[i] = i - b'0' - elseif i >= b'A' and i <= b'Z' then - INDEX_LOOKUP_TABLE[i] = i - b'A' + 10 - elseif i >= b'a' and i <= b'z' then - INDEX_LOOKUP_TABLE[i] = i - b'a' + 10 + 26 - else - INDEX_LOOKUP_TABLE[i] = 255 - end - end -end - -local function trie_insert(trie, value) - if trie == nil then return false end - local node = trie - for i = 1, #value do - local index = INDEX_LOOKUP_TABLE[value:byte(i)] - if index == 255 then - return false - end - if node.character[index] == nil then - node.character[index] = trie_create() - end - node = node.character[index] - end - node.is_leaf = true - return node, trie -end - -local function trie_search(trie, value, start) - if trie == nil then return false end - local node = trie - for i = (start or 1), #value do - local index = INDEX_LOOKUP_TABLE[value:byte(i)] - if index == 255 then - return - end - local child = node.character[index] - if child == nil then - return false - end - node = child - end - return node.is_leaf -end - -local function trie_longest_prefix(trie, value, start) - if trie == nil then return false end - -- insensitive = insensitive and 0x20 or 0 - start = start or 1 - local node = trie - local last_i = nil - for i = start, #value do - local index = INDEX_LOOKUP_TABLE[value:byte(i)] --- local index = INDEX_LOOKUP_TABLE[bor(insensitive, value:byte(i))] - if index == 255 then - break - end - local child = node.character[index] - if child == nil then - break - end - if child.is_leaf then - last_i = i - end - node = child - end - if last_i then - -- Avoid a copy if the whole string is a match. - if start == 1 and last_i == #value then - return value - else - return value:sub(start, last_i) - end - end -end - -local function trie_extend(trie, t) - assert(type(t) == 'table') - for _, v in ipairs(t) do - trie_insert(trie, v) - end -end - ---- Printing utilities - -local function index_to_char(index) - if index < 0 or index > 61 then return end - return CHAR_LOOKUP_TABLE:sub(index+1, index+1) -end - -local function trie_as_table(trie) - if trie == nil then - return nil - end - local children = {} - for i = 0, 61 do - local child = trie.character[i] - if child ~= nil then - local child_table = trie_as_table(child) - child_table.c = index_to_char(i) - table.insert(children, child_table) - end - end - return { - is_leaf = trie.is_leaf; - children = children; - } -end - -local function print_trie_table(s) - local mark - if not s then - return {'nil'} - end - if s.c then - if s.is_leaf then - mark = s.c.."*" - else - mark = s.c.."─" - end - else - mark = "├─" - end - if #s.children == 0 then - return {mark} - end - local lines = {} - for _, child in ipairs(s.children) do - local child_lines = print_trie_table(child, thicc) - for _, child_line in ipairs(child_lines) do - table.insert(lines, child_line) - end - end - local child_count = 0 - for i, line in ipairs(lines) do - local line_parts = {} - if line:match("^%w") then - child_count = child_count + 1 - if i == 1 then - line_parts = {mark} - elseif i == #lines or child_count == #s.children then - line_parts = {"└─"} - else - line_parts = {"├─"} - end - else - if i == 1 then - line_parts = {mark} - elseif #s.children > 1 and child_count ~= #s.children then - line_parts = {"│ "} - else - line_parts = {" "} - end - end - table.insert(line_parts, line) - lines[i] = table.concat(line_parts) - end - return lines -end - -local function trie_to_string(trie) - if trie == nil then - return 'nil' - end - local as_table = trie_as_table(trie) - return table.concat(print_trie_table(as_table), '\n') -end - -local Trie_mt = { - __new = function(_, init) - local trie = trie_create() - if type(init) == 'table' then - trie_extend(trie, init) - end - return trie - end; - __index = { - insert = trie_insert; - search = trie_search; - longest_prefix = trie_longest_prefix; - extend = trie_extend; - }; - __tostring = trie_to_string; - __gc = trie_destroy; -} - -return ffi.metatype('struct Trie', Trie_mt) diff --git a/.config/nvim/plugin/colorizer.vim b/.config/nvim/plugin/colorizer.vim @@ -1,12 +0,0 @@ -if exists('g:loaded_colorizer') - finish -endif - -command! ColorizerAttachToBuffer lua require'colorizer'.attach_to_buffer(0) -command! ColorizerDetachFromBuffer lua require'colorizer'.detach_from_buffer(0) -command! ColorizerReloadAllBuffers lua require'colorizer'.reload_all_buffers() -command! ColorizerToggle lua local c = require'colorizer' - \ if c.is_buffer_attached(0) then c.detach_from_buffer(0) else - \ c.attach_to_buffer(0) end - -let g:loaded_colorizer = 1