commit 6cac815a0cac5a555dd5a75eac9efb46fa224688
parent 63f5face2a3ecd7056b636192da185766af24b29
Author: Hayden Hamilton <hayden@haydenvh.com>
Date: Sun, 15 Mar 2020 12:05:21 +0000
.
Diffstat:
18 files changed, 1284 insertions(+), 86 deletions(-)
diff --git a/.config/nvim/cheat.png b/.config/nvim/cheat.png
Binary files differ.
diff --git a/.config/nvim/colors/haydenh.vim b/.config/nvim/colors/haydenh.vim
@@ -0,0 +1,55 @@
+" Vim color file
+" Firstcreated by: Ron Aaron <ron@ronware.org>
+" Modified by: Hayden Hamilton <hayden@haydenvh.com>
+" Last Change: 14th March 2020
+
+set background=dark
+hi clear
+if exists("syntax_on")
+ syntax reset
+endif
+let g:colors_name = "haydenh"
+" Modified for term colors
+hi clear Normal
+hi clear NonText
+hi comment ctermfg=14 guifg=#434343 gui=none
+hi constant ctermfg=13 guifg=#a84b8d gui=none
+hi identifier ctermfg=14 guifg=#434343 gui=NONE
+hi statement ctermfg=11 guifg=#a1a1d9 gui=NONE
+hi preproc ctermfg=44 guifg=#00d7d7 gui=none
+hi type ctermfg=85 guifg=#5fffaf gui=none
+hi special ctermfg=255 guifg=#eeeeee gui=none
+hi link ErrorMsg Error
+hi link WarningMsg Error
+hi Cursor cterm=reverse ctermfg=255 guifg=#eeeeee gui=reverse
+hi Search cterm=bold,underline ctermbg=5 guibg=#777b8e gui=bold,underline
+hi IncSearch cterm=bold,underline ctermbg=5 guibg=#777b8e gui=bold,underline
+hi title ctermfg=225 guifg=#ffd7ff gui=none
+" hi ShowMarksHL ctermfg=cyan ctermbg=lightblue cterm=bold guifg=yellow guibg=black gui=bold
+hi label ctermfg=255 guifg=#eeeeee gui=none
+hi operator ctermfg=240 guifg=#585858 gui=none
+hi clear Visual
+hi Visual cterm=reverse gui=reverse
+" hi DiffChange guibg=darkgreen
+" hi DiffText guibg=olivedrab
+" hi DiffAdd guibg=slateblue
+" hi DiffDelete guibg=coral
+hi Folded cterm=bold,underline ctermfg=255 ctermbg=none guifg=#eeeeee gui=bold,underline
+hi FoldColumn cterm=none ctermfg=249 ctermbg=1 guifg=#b2b2b2 gui=none
+" hi cIf0 guifg=gray
+" hi diffOnly guifg=red gui=bold
+
+" Following section entirely created by Hayden Hamilton
+hi Error ctermbg=10 ctermfg=0 guifg=#892b2b guibg=#141726 gui=none
+hi Todo cterm=bold ctermbg=3 ctermfg=255 guibg=#31364b guifg=#eeeeee gui=none,bold
+hi link NvimInternalError Error
+hi Float ctermfg=13 cterm=bold guifg=#a84b8d gui=none,bold
+hi LineNr ctermfg=11 guifg=#a1a1d9 gui=none
+hi link CursorLineNr LineNr
+hi CursorLineNr gui=bold cterm=bold guifg=#a1a1d9
+hi SpellBad ctermbg=1 ctermfg=10 guifg=#24283c guibg=#24283c gui=none
+hi SpellCap ctermbg=1 ctermfg=13 guifg=#a84b8d guibg=#24283c gui=none
+hi SpellRare ctermbg=1 ctermfg=none cterm=underline guifg=none guibg=#24283c gui=none,underline
+hi SpellLocal ctermbg=1 ctermfg=255 cterm=bold guifg=#eeeeee gui=none,bold
+hi MsgArea ctermbg=0 guibg=#141726 gui=none
+hi MsgSeparator ctermbg=1 guibg=#24283c gui=none
diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim
@@ -16,7 +16,8 @@
" vimwiki - wiki program (can view my wiki)
"Leader
-let mapleader=","
+let mapleader=";"
+let maplocalleader=','
"Cursor
let &t_SI.="\033[6 q" "SI = INSERT mode
@@ -34,7 +35,8 @@ set encoding=utf-8
"Set scheme
syntax on
-colo ron
+set termguicolors
+colo haydenh
set background=dark
set relativenumber
set number
@@ -42,6 +44,9 @@ set hlsearch
filetype plugin on
set noshowmode
+"Fold
+set foldmethod=marker
+
"Leader keys
noremap <leader>vv :edit ~/.config/nvim/init.vim<CR>
noremap <leader>vz :vsplit ~/.config/nvim/init.vim<CR>
@@ -51,6 +56,8 @@ map <leader><leader><leader> <leader>vs
noremap <leader>g :Goyo \| set linebreak<CR>
noremap <leader>cd :chdir
+noremap <leader>ca :ColorizerAttachToBuffer<CR>
+noremap <leader>cd :ColorizerDetachFromBuffer<CR>
noremap <leader>C :!sudo make all install clean<CR>
noremap <leader>oc :!groff -T pdf % - > /tmp/grff \| zathura -<Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left>
noremap <leader>sv :!sent % \| set linebreak<CR>
@@ -101,8 +108,11 @@ inoremap <leader><leader>< <><Esc><Left>i
"General stuff
noremap dw diw
-noremap dl 0d$
+noremap dew dw
noremap cw ciw
+noremap cew cw
+noremap dl 0d$
+
noremap md ddp
noremap mu ddkkp
noremap <c-U> viwU
@@ -164,7 +174,6 @@ nnoremap <leader>TT :split term://zsh<CR><c-k><c-j>
tnoremap <leader><Esc> <C-\><C-n>
"Modules
-source ~/.config/nvim/modules/theme.vim
source ~/.config/nvim/modules/abbrs.vim
source ~/.config/nvim/modules/statusline.vim
source ~/.config/nvim/modules/splits.vim
@@ -176,6 +185,7 @@ source ~/.config/nvim/modules/edit.vim
source ~/.config/nvim/modules/window.vim
source ~/.config/nvim/modules/message.vim
source ~/.config/nvim/modules/openc.vim
+source ~/.config/nvim/modules/filetype.vim
"Automatic commands
augroup autocmd
@@ -193,7 +203,4 @@ augroup autocmd
"C
autocmd FileType C :noremap <buffer> <leader>end $a;<esc>
autocmd FileType C :inoremap <buffer> <leader><leader>end <esc>$a;<esc>
-
- "Numbers
- autocmd BufRead,BufNewFile,WinEnter,BufEnter * setlocal number relativenumber
augroup END
diff --git a/.config/nvim/lua/colorizer.lua b/.config/nvim/lua/colorizer.lua
@@ -0,0 +1,647 @@
+--- 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
@@ -0,0 +1,193 @@
+--- 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
@@ -0,0 +1,242 @@
+--- 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/colors/.vimrc b/.config/nvim/modules/filetype.vim
diff --git a/.config/nvim/modules/message.vim b/.config/nvim/modules/message.vim
@@ -34,7 +34,7 @@ function! LauncherRecent()
redir! >/tmp/vim-recent.1 | silent! echo '' | silent! echo '' | silent! echo 'Config files:' | redir END
redir! >/tmp/vim-recent.2 | silent! echo '' | silent! echo '' | silent! echo 'Recent files (cwd):' | redir END
redir! >/tmp/vim-recent.3 | silent! echo '' | silent! echo '' | silent! echo 'General:' | redir END
- redir! >/tmp/vim-recentcmd.vim | silent! echo ':silent! unmap <buffer> q' | silent! echo 'nnoremap <buffer> q :q<CR>:new<CR>:only<CR>' | silent! echo ':silent! unmap <buffer>Q' | silent! echo ':no <buffer> Q :qa!<CR>' | silent! echo ':nnoremap <buffer>: <CR>' | redir END
+ redir! >/tmp/vim-recentcmd.vim | silent! echo ':silent! unmap <buffer> <c-k>' | silent! echo ':silent! unmap <buffer> q' | silent! echo 'nnoremap <buffer> q :q<CR>:new<CR>:only<CR>' | silent! echo ':silent! unmap <buffer>Q' | silent! echo ':no <buffer> Q :qa!<CR>' | silent! echo ':nnoremap <buffer>: <CR>' | redir END
for string in olist
let string=substitute(string, $HOME, "~", "")
if i=='10'
@@ -80,7 +80,9 @@ function! LauncherConfig()
let configs=[
\":Explore ~/.config/",
\":edit ~/.config/nvim/init.vim",
- \":Explore ~/.config/nvim/modules"
+ \":Explore ~/.config/nvim/modules",
+ \":Explore ~/.config/nvim/syntax",
+ \":Explore ~/.config/nvim/colors",
\]
let g:i=1
for config in configs
@@ -97,8 +99,10 @@ endfunction
function! LauncherGeneral()
let general=[
+ \":!sxiv ~/.config/nvim/cheat.png::: View cheatsheet (only works with `sxiv`)",
\":chdir ::: Change Directory",
\":set path=::: Set (vim) path",
+ \":set path+=::: Append (vim) path",
\]
for gen in general
let a=Itoa(g:i)
diff --git a/.config/nvim/modules/splits.vim b/.config/nvim/modules/splits.vim
@@ -28,5 +28,5 @@ augroup Netrwstop
augroup END
set fillchars+=vert:\
-hi VertSplit ctermbg=1 ctermfg=1
-hi StatusLine ctermbg=1 ctermfg=1
+hi VertSplit ctermbg=1 ctermfg=1 guifg=#24283c guibg=#24283c
+hi link StatusLine VertSplit
diff --git a/.config/nvim/modules/statusline.vim b/.config/nvim/modules/statusline.vim
@@ -1,10 +1,9 @@
-hi Statusbar ctermbg=0 ctermfg=0
-hi Modecol ctermbg=10 ctermfg=254 gui=bold
-hi Basecol ctermbg=1
-hi Filecol ctermbg=3 ctermfg=7 gui=bold
-hi Branchcol ctermbg=9 ctermfg=7 gui=bold
-hi Positioncol ctermbg=3 ctermfg=254 gui=bold
-hi Buffcol ctermbg=4 ctermfg=159
+hi Statusbar ctermbg=0 ctermfg=0 guifg=#141726 guibg=#141726
+hi Basecol ctermbg=1 guibg=#24283c
+hi Filecol cterm=bold ctermbg=3 ctermfg=7 gui=bold guifg=#c7cad9 guibg=#40445c
+hi Branchcol cterm=bold ctermbg=9 ctermfg=7 gui=bold guifg=#c7cad9 guibg=#4747e1
+hi Positioncol cterm=bold ctermbg=3 ctermfg=254 gui=bold guifg=#e4e4e4 guibg=#40445c
+hi Buffcol ctermbg=4 ctermfg=159 guifg=#afffff guibg=#575b72
let g:currentmode={
\'n' : 'Normal ',
@@ -32,92 +31,116 @@ function! Modecurrent() abort
let l:modecurrent = mode()
let l:modelist = toupper(get(g:currentmode, l:modecurrent, 'V·Block '))
let l:current_status_mode = l:modelist
+ let l:lmode = tolower(l:current_status_mode)
+
return l:current_status_mode
endfunction
+function! Modecol()
+ let other=''
+ let l:mode=tolower(Modecurrent())
+
+ if l:mode == 'insert '
+ let gbg='#af005f'
+ elseif l:mode == 'terminal '
+ let gbg='#af8700'
+ elseif l:mode == 'command '
+ let gbg='#005f5f'
+ elseif l:mode == 'visual ' || l:mode == 'v-block ' || l:mode == 'v-line ' || l:mode == 'select '
+ let gbg='#af5f00'
+ else
+ let gbg='#892b2b'
+ endif
+
+ let hargs='gui=bold guifg=#e4e4e4 guibg=' . gbg . ' ' . other
+
+ execute 'hi! Modecol ' . hargs
+ return ''
+endfunction
+
function! Gitbranch()
- return system("git branch | tr -d '\n'")
+ return g:system("git branch | tr -d '\n'")
endfunction
function! Activestatus()
""Mode
- let s="%#Modecol#"
- let s.=" %{Modecurrent()}"
- let s.="%#Basecol#"
+ let g:s.="%#Modecol#"
+ let g:s.=" %{Modecurrent()}"
+ let g:s.="%#Basecol#"
""File
- let s.="%#Filecol#"
- let s.=" %f\ -\ %y%m "
- let s.="%#Basecol#"
- let s.="%="
+ let g:s.="%#Filecol#"
+ let g:s.=" %f\ -\ %y%m "
+ let g:s.="%#Basecol#"
+ let g:s.="%="
""Branch
- " let s.="%#Branchcol#"
- " let s.=" %{Gitbranch()} "
- " let s.="%#Basecol#"
+ " let g:s.="%#Branchcol#"
+ " let g:s.=" %{Gitbranch()} "
+ " let g:s.="%#Basecol#"
""Position
- let s.="%#Positioncol#"
- let s.=" %l/%L,\ %c "
- let s.="%#Basecol#"
+ let g:s.="%#Positioncol#"
+ let g:s.=" %l/%L,\ %c "
+ let g:s.="%#Basecol#"
""Buffer
- let s.="%#Buffcol#"
- let s.=" [%n] "
- let s.="%#Basecol#"
+ let g:s.="%#Buffcol#"
+ let g:s.=" [%n] "
+ let g:s.="%#Basecol#"
- return s
+ return g:s
endfunction
function! Inactivestatus()
""File
- let s="%#Basecol#"
- let s.=" %f\ -\ %y%m"
+ let g:s.="%#Basecol#"
+ let g:s.=" %f\ -\ %y%m"
- return s
+ return g:s
endfunction
function! NetrwAstatus()
""Remimder
- let s="%#Filecol#"
- let s.=" %y "
- let s.="%#Basecol#"
+ let g:s.="%#Filecol#"
+ let g:s.=" %y "
+ let g:s.="%#Basecol#"
- return s
+ return g:s
endfunction
function! NetrwIstatus()
""Remimder
- let s="%#Basecol#"
- let s.=" %y "
+ let g:s.="%#Basecol#"
+ let g:s.=" %y "
- return s
+ return g:s
endfunction
function! TermAstatus()
""Reminder
- let s="%#Filecol#"
- let s.=" [terminal] "
- let s.="%#Basecol#"
+ let g:s.="%#Modecol#"
+ let g:s.=" [terminal] "
+ let g:s.="%#Basecol#"
- return s
+ return g:s
endfunction
function! TermIstatus()
""Reminder
- let s="%#Basecol#"
- let s.=" [terminal] "
+ let g:s.="%#Basecol#"
+ let g:s.=" [terminal] "
- return s
+ return g:s
endfunction
augroup Statusline
autocmd!
- autocmd FileType netrw let _filetype=&filetype
- autocmd FileType netrw let &l:statusline=Choosestatus(1, _filetype)
- autocmd WinEnter,BufEnter * let _filetype=&filetype
- autocmd WinEnter,BufEnter * let &l:statusline=Choosestatus(1, _filetype)
- autocmd WinLeave,BufLeave * let &l:statusline=Choosestatus(0, _filetype)
+ autocmd FileType netrw let &l:statusline=Choosestatus(1, &filetype)
+ autocmd WinEnter,BufEnter * let &l:statusline=Choosestatus(1, &filetype)
+ autocmd WinNew,BufNew * let &l:statusline=Choosestatus(1, &filetype)
+ autocmd WinLeave,BufLeave * let &l:statusline=Choosestatus(0, &filetype)
augroup END
function! Choosestatus(active, filetype)
"Set active or inactive
+ let g:s="%{Modecol()}"
if a:active == '1'
let statusline=Activestatus()
else
diff --git a/.config/nvim/modules/tabs.vim b/.config/nvim/modules/tabs.vim
@@ -1,6 +1,6 @@
-hi TabLine cterm=none ctermfg=252 ctermbg=1
-hi TabLineSel cterm=bold ctermfg=252 ctermbg=3
-hi TabLineFill cterm=none ctermfg=none ctermbg=1
+hi TabLine cterm=none ctermfg=252 ctermbg=1 gui=none guifg=#d0d0d0 guibg=#24283c
+hi TabLineSel cterm=bold ctermfg=252 ctermbg=3 gui=bold guifg=#d0d0d0 guibg=#40445c
+hi TabLineFill cterm=none ctermfg=none ctermbg=1 gui=none guifg=none guibg=#24283c
nnoremap <leader>te :tabedit
nnoremap <leader>tf :tabfind
diff --git a/.config/nvim/modules/term.vim b/.config/nvim/modules/term.vim
@@ -2,6 +2,7 @@ function! Termstart()
let s="term"
if stridx(expand('%:p'), s) == '0'
setlocal nonumber norelativenumber
+ setlocal notermguicolors
endif
endfunction
diff --git a/.config/nvim/modules/theme.vim b/.config/nvim/modules/theme.vim
@@ -1,13 +0,0 @@
-hi Error ctermbg=10 ctermfg=0
-hi Todo cterm=bold ctermbg=3 ctermfg=255
-hi NvimInternalError ctermbg=3 ctermfg=3
-hi Float ctermfg=13 cterm=bold
-hi LineNr ctermfg=11
-hi CursorLineNr ctermfg=11 cterm=bold
-hi SpellBad ctermbg=1 ctermfg=10
-hi SpellCap ctermbg=1 ctermfg=13
-hi SpellRare ctermbg=1 ctermfg=256 cterm=underline
-hi SpellLocal ctermbg=1 ctermfg=255 cterm=bold
-
-hi MsgArea ctermbg=0
-hi MsgSeparator ctermbg=1
diff --git a/.config/nvim/modules/window.vim b/.config/nvim/modules/window.vim
@@ -1,4 +1,4 @@
-hi Float ctermbg=0 cterm=none ctermfg=256
+hi Float ctermbg=0 cterm=none ctermfg=256 gui=none guibg=#141726 guifg=none
function! Winmsg()
let width=&columns+4
diff --git a/.config/nvim/plugin/colorizer.vim b/.config/nvim/plugin/colorizer.vim
@@ -0,0 +1,12 @@
+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
diff --git a/.config/nvim/syntax/greet.vim b/.config/nvim/syntax/greet.vim
@@ -1,3 +1,4 @@
+setlocal nonumber norelativenumber
if exists("b:current_syntax")
finish
endif
@@ -5,8 +6,7 @@ endif
syn match gAscii '|.*|'
syn match gCommand ':[A-Za-z!]* [A-Za-z/~\.]*'
syn match gText '^\s*[A-Za-z].*'
-hi gAscii cterm=none ctermbg=1 ctermfg=12
-hi gCommand cterm=none ctermbg=none ctermfg=13
-hi gText cterm=none ctermbg=none ctermfg=255
+hi gAscii cterm=none ctermbg=1 ctermfg=12 gui=none guifg=#1f8a27 guibg=#24283c
+hi gCommand cterm=none ctermbg=none ctermfg=13 gui=none guifg=#a84b8d guibg=none
+hi gText cterm=none ctermbg=none ctermfg=255 gui=none guifg=#eeeeee
setlocal fcs=eob:\
-set nonumber norelativenumber
diff --git a/.config/nvim/syntax/recent.vim b/.config/nvim/syntax/recent.vim
@@ -1,3 +1,4 @@
+setlocal nonumber norelativenumber
if exists("b:current_syntax")
finish
endif
@@ -5,6 +6,6 @@ endif
syn match rNum '\[[0-9]*\]'
syn match rChar '\[[A-Za-z]*\]'
syn match rHead '^\s*["A-Za-z0-9].*'
-hi rNum cterm=none ctermfg=30
-hi rChar cterm=none ctermfg=28
-hi rHead cterm=bold ctermfg=255
+hi rNum cterm=none ctermfg=30 gui=none guifg=#008787
+hi rChar cterm=none ctermfg=28 gui=none guifg=#008700
+hi rHead cterm=bold ctermfg=255 gui=bold guifg=#eeeeee
diff --git a/.config/zsh/functions b/.config/zsh/functions
@@ -10,18 +10,20 @@ killprog(){
for file in $(printf "$@")
do
name=$(curl -n -F "file=@$file" http://0x0.st)
- echo "$file has been hosted at $name"
- echo "$name" | xclip
+ echo "$file : $name"
+ names="$names $name"
done
+ echo $names | xclip
}
ix(){
for file in $(printf "$@")
do
name=$(curl -n -F "f:1=<-" http://ix.io < $file)
- echo "$file has been hosted at $name"
- echo "$name" | xclip
+ echo "$file : $name"
+ names="$names $name"
done
+ echo $names | xclip
}
pc(){
@@ -39,3 +41,27 @@ make(){
man(){
command man -c "$@" | centre
}
+
+colo(){
+ for file in $(printf "$@")
+ do
+ name=$(curl -n -F "image=@$file" https://api.deepai.org/api/colorizer)
+ echo "$file : $name"
+ names="$names $name"
+ done
+ echo $names | xclip
+}
+
+colotable(){
+ o=0
+ for ((i=0;i<256;i++))
+ do
+ [ $o -gt 5 ] && printf "\n" && o=0
+ o=$(($o+1))
+ tput setaf $i
+ printf " %03d " "$i"
+ tput setab $i
+ printf " "
+ tput sgr0
+ done
+}