dotfiles

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

commit 6cac815a0cac5a555dd5a75eac9efb46fa224688
parent 63f5face2a3ecd7056b636192da185766af24b29
Author: Hayden Hamilton <hayden@haydenvh.com>
Date:   Sun, 15 Mar 2020 12:05:21 +0000

.

Diffstat:
A.config/nvim/cheat.png | 0
A.config/nvim/colors/haydenh.vim | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
M.config/nvim/init.vim | 21++++++++++++++-------
A.config/nvim/lua/colorizer.lua | 647+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/nvim/lua/colorizer/nvim.lua | 193+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/nvim/lua/colorizer/trie.lua | 242+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
R.config/nvim/colors/.vimrc -> .config/nvim/modules/filetype.vim | 0
M.config/nvim/modules/message.vim | 8++++++--
M.config/nvim/modules/splits.vim | 4++--
M.config/nvim/modules/statusline.vim | 117+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
M.config/nvim/modules/tabs.vim | 6+++---
M.config/nvim/modules/term.vim | 1+
D.config/nvim/modules/theme.vim | 13-------------
M.config/nvim/modules/window.vim | 2+-
A.config/nvim/plugin/colorizer.vim | 12++++++++++++
M.config/nvim/syntax/greet.vim | 8++++----
M.config/nvim/syntax/recent.vim | 7++++---
M.config/zsh/functions | 34++++++++++++++++++++++++++++++----
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 +}