~kris/dots

srice

94ef01abf339f7156c69870d969cd635566faddd — Kris Yotam 3 months ago 3bdfd3e
remove nvim config, add mksh/planrc/gentoo profile, update code+write configs and fastfetch glenda
26 files changed, 400 insertions(+), 1028 deletions(-)

A .config/code/glenda.txt
M .config/code/init.lua
A .config/mksh/aliases.sh
A .config/mksh/functions.sh
D .config/nvim/.gitignore
D .config/nvim/.neoconf.json
D .config/nvim/colors/acme.lua
D .config/nvim/colors/plan9.lua
D .config/nvim/init.lua
D .config/nvim/lazy-lock.json
D .config/nvim/lazyvim.json
D .config/nvim/lua/config/autocmds.lua
D .config/nvim/lua/config/keymaps.lua
D .config/nvim/lua/config/lazy.lua
D .config/nvim/lua/config/options.lua
D .config/nvim/lua/plugins/colorscheme.lua
D .config/nvim/lua/plugins/dashboard.lua
D .config/nvim/lua/plugins/neo-tree.lua
D .config/nvim/stylua.toml
M .config/write/init.lua
M .local/share/fastfetch/ascii/glenda.txt
A .planrc
M README.md
M profiles/README.md
A profiles/gentoo/portage/make.conf
A profiles/gentoo/portage/package.use
A .config/code/glenda.txt => .config/code/glenda.txt +16 -0
@@ 0,0 1,16 @@
                 __
     \          /  )     
      \        /' /    __ 
        _.----'-./  _-"  )
      -"         "v"  _-' 
    ."             'Y"    
   |                |     
   | o     o        |     
   |  .><.          |     
   |  "Ll"         /      
   '.             |       
    |             |       
    \             )       
    / .          /'\      *
    '-(_/,__.--^--"  *      * 
                   *     *        *

M .config/code/init.lua => .config/code/init.lua +29 -1
@@ 51,7 51,7 @@ vim.opt.clipboard = "unnamedplus"
vim.opt.mouse = "a"
vim.opt.updatetime = 250

-- snacks.nvim (explorer + project picker)
-- snacks.nvim (explorer + project picker + dashboard)
require("snacks").setup({
  explorer = { enabled = true },
  picker = {


@@ 63,6 63,34 @@ require("snacks").setup({
      },
    },
  },
  dashboard = {
    enabled = true,
    preset = {
      header = (function()
        local f = io.open(vim.fn.stdpath("config") .. "/glenda.txt", "r")
        if f then local s = f:read("*a"); f:close(); return s end
        return "code"
      end)(),
      keys = {
        { icon = " ", key = "f", desc = "Find File", action = ":lua Snacks.dashboard.pick('files')" },
        { icon = " ", key = "n", desc = "New File", action = ":ene | startinsert" },
        { icon = " ", key = "g", desc = "Find Text", action = ":lua Snacks.dashboard.pick('live_grep')" },
        { icon = " ", key = "r", desc = "Recent Files", action = ":lua Snacks.dashboard.pick('oldfiles')" },
        { icon = " ", key = "s", desc = "Browse src", action = ":e ~/.local/src/" },
        { icon = " ", key = "b", desc = "Browse scripts", action = ":e ~/.local/bin/" },
        { icon = " ", key = "i", desc = "mkshrc", action = ":e ~/.mkshrc" },
        { icon = " ", key = "p", desc = "plan9rc", action = ":e ~/.planrc" },
        { icon = " ", key = "a", desc = "aliases.sh", action = ":e ~/.config/mksh/aliases.sh" },
        { icon = " ", key = "u", desc = "functions.sh", action = ":e ~/.config/mksh/functions.sh" },
        { icon = " ", key = "e", desc = "Explorer", action = ":lua Snacks.explorer.open()" },
        { icon = " ", key = "q", desc = "Quit", action = ":qa" },
      },
    },
    sections = {
      { section = "header" },
      { section = "keys", gap = 1, padding = 1 },
    },
  },
})

-- gitsigns

A .config/mksh/aliases.sh => .config/mksh/aliases.sh +2 -0
@@ 0,0 1,2 @@
# mksh aliases
alias cc="$HOME/src/criterion-cli/criterion"

A .config/mksh/functions.sh => .config/mksh/functions.sh +30 -0
@@ 0,0 1,30 @@
# mksh functions

# search repo names in ~/src/
fs() {
	[ -z "$1" ] && { echo "usage: fs <pattern>"; return 1; }
	pattern=$(echo "$*" | tr '[:upper:]' '[:lower:]')
	matches=""
	count=0
	for d in "$HOME"/src/*/; do
		name=${d%/}
		name=${name##*/}
		lower=$(echo "$name" | tr '[:upper:]' '[:lower:]')
		case "$lower" in
			*"$pattern"*) matches="$matches$name
"; count=$((count + 1)) ;;
		esac
	done
	if [ "$count" -eq 0 ]; then
		printf '\n  \033[2mno matches for\033[0m \033[1m%s\033[0m\n\n' "$*"
		return 1
	fi
	printf '\n  \033[2m%d match(es) for\033[0m \033[1m%s\033[0m\n\n' "$count" "$*"
	echo "$matches" | while IFS= read -r m; do
		[ -n "$m" ] && printf '    \033[36m>\033[0m  %s\n' "$m"
	done
	printf '\n'
}

lp() { cd "$HOME/edu/craft/learn"; }
fcc() { cd "$HOME/edu/craft/freecodecamp"; }

D .config/nvim/.gitignore => .config/nvim/.gitignore +0 -8
@@ 1,8 0,0 @@
tt.*
.tests
doc/tags
debug
.repro
foo.*
*.log
data

D .config/nvim/.neoconf.json => .config/nvim/.neoconf.json +0 -15
@@ 1,15 0,0 @@
{
  "neodev": {
    "library": {
      "enabled": true,
      "plugins": true
    }
  },
  "neoconf": {
    "plugins": {
      "lua_ls": {
        "enabled": true
      }
    }
  }
}

D .config/nvim/colors/acme.lua => .config/nvim/colors/acme.lua +0 -322
@@ 1,322 0,0 @@
-- Acme colorscheme for Neovim
-- Authentic Plan 9 Acme editor aesthetic: monochrome on cream
-- No syntax highlighting — true to how Acme actually works
-- Based on dookie.nvim by Jose Esparza (pebeto/dookie.nvim)

local M = {}

local colors = {
  fg = "#000000",
  fg_dim = "#b7b19c",
  bg = "#ffffea",
  bg_dim = "#ffffca",
  bg_dark = "#eeee9e",
  cursor = "#98ce8f",
  tagbar = "#eaffff",
  tagbar_inactive = "#bdc1bb",

  error = "#b85c57",
  warn = "#8f7634",
  info = "#57864e",
  hint = "#2a8dc5",

  git_add = "#57864e",
  git_change = "#8f7634",
  git_delete = "#b85c57",

  diff_add = "#d5ebd0",
  diff_delete = "#ebd0d0",
  diff_change = "#ebe8d0",
  diff_text = "#d8d5b0",
}

function M.setup()
  vim.cmd("hi clear")
  if vim.fn.exists("syntax_on") then
    vim.cmd("syntax reset")
  end

  vim.o.background = "light"
  vim.g.colors_name = "acme"

  local hi = function(group, opts)
    vim.api.nvim_set_hl(0, group, opts)
  end

  -- Editor
  hi("Normal", { fg = colors.fg, bg = colors.bg })
  hi("NormalFloat", { fg = colors.fg, bg = colors.bg })
  hi("FloatBorder", { fg = colors.fg, bg = colors.bg })
  hi("Cursor", { bg = colors.cursor })
  hi("CursorLine", { bg = colors.bg_dim })
  hi("CursorLineNr", { fg = colors.fg, bg = colors.bg_dim })
  hi("CursorColumn", { bg = colors.bg_dim })
  hi("LineNr", { fg = colors.fg, bg = colors.bg_dim })
  hi("SignColumn", { bg = colors.bg_dim })
  hi("ColorColumn", { bg = colors.bg_dim })
  hi("VertSplit", { fg = colors.bg_dark, bg = colors.bg })
  hi("WinSeparator", { fg = colors.bg_dark, bg = colors.bg })
  hi("Folded", { fg = colors.fg, bg = colors.bg_dim })
  hi("FoldColumn", { fg = colors.fg, bg = colors.bg_dim })
  hi("NonText", { fg = colors.fg_dim })
  hi("SpecialKey", { fg = colors.fg_dim })
  hi("EndOfBuffer", { fg = colors.bg_dim })
  hi("MatchParen", { fg = colors.fg, bg = colors.bg_dark, underline = true })
  hi("Directory", { fg = colors.fg, bold = true })
  hi("Title", { fg = colors.fg, bold = true })
  hi("Conceal", { fg = colors.fg_dim })

  -- Selection
  hi("Visual", { bg = colors.bg_dark })
  hi("VisualNOS", { bg = colors.bg_dark })

  -- Search
  hi("Search", { fg = colors.fg, bg = colors.bg_dim, bold = true })
  hi("IncSearch", { fg = colors.fg, bg = colors.bg_dark, bold = true })
  hi("CurSearch", { fg = colors.fg, bg = colors.bg_dark, bold = true })

  -- Spell
  hi("SpellBad", { undercurl = true, sp = colors.error })
  hi("SpellCap", { undercurl = true, sp = colors.info })
  hi("SpellRare", { undercurl = true, sp = colors.hint })
  hi("SpellLocal", { undercurl = true, sp = colors.warn })

  -- Statusline (Acme tag bar cyan)
  hi("StatusLine", { fg = colors.fg, bg = colors.tagbar, bold = true })
  hi("StatusLineNC", { fg = colors.fg, bg = colors.tagbar_inactive })
  hi("TabLine", { fg = colors.fg, bg = colors.bg_dim })
  hi("TabLineFill", { fg = colors.fg, bg = colors.bg_dim })
  hi("TabLineSel", { fg = colors.fg, bg = colors.bg, bold = true })
  hi("WinBar", { fg = colors.fg, bg = colors.bg })
  hi("WinBarNC", { fg = colors.fg, bg = colors.bg_dim })

  -- Popup menu
  hi("Pmenu", { fg = colors.fg, bg = colors.bg_dim })
  hi("PmenuSel", { fg = colors.fg, bg = colors.bg_dim, bold = true })
  hi("PmenuSbar", { bg = colors.bg_dim })
  hi("PmenuThumb", { bg = colors.fg })

  -- Messages
  hi("ErrorMsg", { fg = colors.error, bold = true })
  hi("WarningMsg", { fg = colors.warn, bold = true })
  hi("ModeMsg", { fg = colors.fg, bold = true })
  hi("MoreMsg", { fg = colors.fg, bold = true })
  hi("Question", { fg = colors.fg, bold = true })

  -- Diagnostics
  hi("DiagnosticError", { fg = colors.error })
  hi("DiagnosticWarn", { fg = colors.warn })
  hi("DiagnosticInfo", { fg = colors.info })
  hi("DiagnosticHint", { fg = colors.hint })
  hi("DiagnosticUnderlineError", { undercurl = true, sp = colors.error })
  hi("DiagnosticUnderlineWarn", { undercurl = true, sp = colors.warn })
  hi("DiagnosticUnderlineInfo", { undercurl = true, sp = colors.info })
  hi("DiagnosticUnderlineHint", { undercurl = true, sp = colors.hint })

  -- Diff
  hi("DiffAdd", { bg = colors.diff_add })
  hi("DiffDelete", { bg = colors.diff_delete })
  hi("DiffChange", { bg = colors.diff_change })
  hi("DiffText", { bg = colors.diff_text })

  -- Syntax (monochrome — the Acme way)
  hi("Comment", { fg = colors.fg, bold = true })
  hi("Constant", { fg = colors.fg })
  hi("String", { fg = colors.fg, bold = true })
  hi("Character", { fg = colors.fg, bold = true })
  hi("Number", { fg = colors.fg })
  hi("Boolean", { fg = colors.fg })
  hi("Float", { fg = colors.fg })
  hi("Identifier", { fg = colors.fg })
  hi("Function", { fg = colors.fg })
  hi("Statement", { fg = colors.fg })
  hi("Conditional", { fg = colors.fg })
  hi("Repeat", { fg = colors.fg })
  hi("Label", { fg = colors.fg })
  hi("Operator", { fg = colors.fg })
  hi("Keyword", { fg = colors.fg })
  hi("Exception", { fg = colors.fg })
  hi("PreProc", { fg = colors.fg })
  hi("Include", { fg = colors.fg })
  hi("Define", { fg = colors.fg })
  hi("Macro", { fg = colors.fg })
  hi("PreCondit", { fg = colors.fg })
  hi("Type", { fg = colors.fg })
  hi("StorageClass", { fg = colors.fg })
  hi("Structure", { fg = colors.fg })
  hi("Typedef", { fg = colors.fg })
  hi("Special", { fg = colors.fg })
  hi("SpecialChar", { fg = colors.fg })
  hi("Tag", { fg = colors.fg })
  hi("Delimiter", { fg = colors.fg })
  hi("SpecialComment", { fg = colors.fg, bold = true })
  hi("Debug", { fg = colors.fg })
  hi("Underlined", { fg = colors.fg, underline = true })
  hi("Ignore", { fg = colors.fg_dim })
  hi("Error", { fg = colors.error, bold = true })
  hi("Todo", { fg = colors.fg, bold = true, underline = true })

  -- Treesitter (monochrome)
  hi("@variable", { fg = colors.fg })
  hi("@variable.builtin", { fg = colors.fg })
  hi("@variable.parameter", { fg = colors.fg })
  hi("@variable.member", { fg = colors.fg })
  hi("@constant", { fg = colors.fg })
  hi("@constant.builtin", { fg = colors.fg })
  hi("@module", { fg = colors.fg })
  hi("@label", { fg = colors.fg })
  hi("@string", { fg = colors.fg, bold = true })
  hi("@string.documentation", { fg = colors.fg, bold = true })
  hi("@string.escape", { fg = colors.fg, bold = true })
  hi("@string.special", { fg = colors.fg, bold = true })
  hi("@character", { fg = colors.fg, bold = true })
  hi("@number", { fg = colors.fg })
  hi("@boolean", { fg = colors.fg })
  hi("@float", { fg = colors.fg })
  hi("@function", { fg = colors.fg })
  hi("@function.builtin", { fg = colors.fg })
  hi("@function.call", { fg = colors.fg })
  hi("@function.macro", { fg = colors.fg })
  hi("@method", { fg = colors.fg })
  hi("@method.call", { fg = colors.fg })
  hi("@constructor", { fg = colors.fg })
  hi("@parameter", { fg = colors.fg })
  hi("@keyword", { fg = colors.fg })
  hi("@keyword.function", { fg = colors.fg })
  hi("@keyword.operator", { fg = colors.fg })
  hi("@keyword.return", { fg = colors.fg })
  hi("@conditional", { fg = colors.fg })
  hi("@repeat", { fg = colors.fg })
  hi("@exception", { fg = colors.fg })
  hi("@include", { fg = colors.fg })
  hi("@type", { fg = colors.fg })
  hi("@type.builtin", { fg = colors.fg })
  hi("@type.qualifier", { fg = colors.fg })
  hi("@type.definition", { fg = colors.fg })
  hi("@storageclass", { fg = colors.fg })
  hi("@attribute", { fg = colors.fg })
  hi("@field", { fg = colors.fg })
  hi("@property", { fg = colors.fg })
  hi("@punctuation.bracket", { fg = colors.fg })
  hi("@punctuation.delimiter", { fg = colors.fg })
  hi("@punctuation.special", { fg = colors.fg })
  hi("@comment", { fg = colors.fg, bold = true })
  hi("@tag", { fg = colors.fg })
  hi("@tag.attribute", { fg = colors.fg })
  hi("@tag.delimiter", { fg = colors.fg })
  hi("@text", { fg = colors.fg })
  hi("@text.strong", { fg = colors.fg, bold = true })
  hi("@text.emphasis", { fg = colors.fg, italic = true })
  hi("@text.underline", { fg = colors.fg, underline = true })
  hi("@text.strike", { fg = colors.fg, strikethrough = true })
  hi("@text.title", { fg = colors.fg, bold = true })
  hi("@text.literal", { fg = colors.fg, bold = true })
  hi("@text.uri", { fg = colors.fg, underline = true })
  hi("@text.todo", { fg = colors.fg, bold = true, underline = true })
  hi("@text.note", { fg = colors.info, bold = true })
  hi("@text.warning", { fg = colors.warn, bold = true })
  hi("@text.danger", { fg = colors.error, bold = true })

  -- LSP
  hi("LspReferenceText", { bg = colors.bg_dark })
  hi("LspReferenceRead", { bg = colors.bg_dark })
  hi("LspReferenceWrite", { bg = colors.bg_dark })
  hi("LspSignatureActiveParameter", { fg = colors.fg, bold = true, underline = true })

  -- Git signs
  hi("GitSignsAdd", { fg = colors.git_add })
  hi("GitSignsChange", { fg = colors.git_change })
  hi("GitSignsDelete", { fg = colors.git_delete })
  hi("GitSignsCurrentLineBlame", { fg = colors.fg_dim, italic = true })

  -- Telescope
  hi("TelescopeBorder", { fg = colors.fg })
  hi("TelescopePromptBorder", { fg = colors.fg })
  hi("TelescopeResultsBorder", { fg = colors.fg })
  hi("TelescopePreviewBorder", { fg = colors.fg })
  hi("TelescopeSelection", { bg = colors.bg_dark })
  hi("TelescopeSelectionCaret", { fg = colors.fg, bg = colors.bg_dark })
  hi("TelescopeMatching", { fg = colors.fg, bold = true, underline = true })

  -- NeoTree
  hi("NeoTreeNormal", { fg = colors.fg, bg = colors.bg_dim })
  hi("NeoTreeNormalNC", { fg = colors.fg, bg = colors.bg_dim })
  hi("NeoTreeDirectoryName", { fg = colors.fg, bold = true })
  hi("NeoTreeDirectoryIcon", { fg = colors.fg })
  hi("NeoTreeRootName", { fg = colors.fg, bold = true })
  hi("NeoTreeFileName", { fg = colors.fg })
  hi("NeoTreeGitAdded", { fg = colors.git_add })
  hi("NeoTreeGitModified", { fg = colors.git_change })
  hi("NeoTreeGitDeleted", { fg = colors.git_delete })

  -- Which-key
  hi("WhichKey", { fg = colors.fg, bold = true })
  hi("WhichKeyGroup", { fg = colors.fg, bold = true })
  hi("WhichKeyDesc", { fg = colors.fg })
  hi("WhichKeySeparator", { fg = colors.fg_dim })
  hi("WhichKeyFloat", { bg = colors.bg_dim })

  -- Indent blankline
  hi("IndentBlanklineChar", { fg = colors.bg_dark })
  hi("IndentBlanklineContextChar", { fg = colors.fg_dim })
  hi("IblIndent", { fg = colors.bg_dark })
  hi("IblScope", { fg = colors.fg_dim })

  -- Notify
  hi("NotifyERRORBorder", { fg = colors.error })
  hi("NotifyWARNBorder", { fg = colors.warn })
  hi("NotifyINFOBorder", { fg = colors.info })
  hi("NotifyDEBUGBorder", { fg = colors.fg_dim })
  hi("NotifyTRACEBorder", { fg = colors.hint })
  hi("NotifyERRORIcon", { fg = colors.error })
  hi("NotifyWARNIcon", { fg = colors.warn })
  hi("NotifyINFOIcon", { fg = colors.info })
  hi("NotifyDEBUGIcon", { fg = colors.fg_dim })
  hi("NotifyTRACEIcon", { fg = colors.hint })
  hi("NotifyERRORTitle", { fg = colors.error })
  hi("NotifyWARNTitle", { fg = colors.warn })
  hi("NotifyINFOTitle", { fg = colors.info })
  hi("NotifyDEBUGTitle", { fg = colors.fg_dim })
  hi("NotifyTRACETitle", { fg = colors.hint })

  -- Dashboard
  hi("DashboardHeader", { fg = colors.fg, bold = true })
  hi("DashboardCenter", { fg = colors.fg })
  hi("DashboardFooter", { fg = colors.fg_dim })
  hi("DashboardShortCut", { fg = colors.fg, bold = true })

  -- Lazy
  hi("LazyButton", { fg = colors.fg, bg = colors.bg_dim })
  hi("LazyButtonActive", { fg = colors.fg, bg = colors.bg_dark, bold = true })
  hi("LazyH1", { fg = colors.fg, bold = true })
  hi("LazySpecial", { fg = colors.fg, bold = true })

  -- Mini
  hi("MiniStatuslineModeNormal", { fg = colors.fg, bg = colors.tagbar, bold = true })
  hi("MiniStatuslineModeInsert", { fg = colors.fg, bg = colors.tagbar_inactive, bold = true })
  hi("MiniStatuslineModeVisual", { fg = colors.fg, bg = colors.bg_dark, bold = true })
  hi("MiniStatuslineModeReplace", { fg = colors.bg, bg = colors.error, bold = true })
  hi("MiniStatuslineModeCommand", { fg = colors.fg, bg = colors.bg_dim, bold = true })

  -- Bufferline
  hi("BufferLineFill", { bg = colors.bg_dim })
  hi("BufferLineBackground", { fg = colors.fg_dim, bg = colors.bg_dim })
  hi("BufferLineBuffer", { fg = colors.fg_dim, bg = colors.bg_dim })
  hi("BufferLineBufferSelected", { fg = colors.fg, bg = colors.bg, bold = true })
  hi("BufferLineBufferVisible", { fg = colors.fg_dim, bg = colors.bg_dim })
  hi("BufferLineCloseButton", { fg = colors.fg_dim, bg = colors.bg_dim })
  hi("BufferLineCloseButtonSelected", { fg = colors.error, bg = colors.bg })
  hi("BufferLineCloseButtonVisible", { fg = colors.fg_dim, bg = colors.bg_dim })
  hi("BufferLineIndicatorSelected", { fg = colors.fg, bg = colors.bg })
  hi("BufferLineModified", { fg = colors.fg, bg = colors.bg_dim })
  hi("BufferLineModifiedSelected", { fg = colors.fg, bg = colors.bg })
  hi("BufferLineSeparator", { fg = colors.bg_dim, bg = colors.bg_dim })
  hi("BufferLineSeparatorSelected", { fg = colors.bg_dim, bg = colors.bg })

  -- Copilot
  hi("CopilotSuggestion", { fg = colors.fg_dim })
end

M.setup()

return M

D .config/nvim/colors/plan9.lua => .config/nvim/colors/plan9.lua +0 -414
@@ 1,414 0,0 @@
-- Plan9 colorscheme for Neovim
-- Authentic Plan 9 / Acme colors from plan9port and 9front source
-- All colors derived from libdraw constants and acme/rio/sam source code
-- Syntax highlighting uses only the Plan 9 system palette

local M = {}

-- Authentic Plan 9 palette (from draw.h / libdraw)
local p9 = {
  black         = "#000000", -- DBlack
  white         = "#ffffff", -- DWhite
  red           = "#ff0000", -- DRed
  green         = "#00ff00", -- DGreen
  blue          = "#0000ff", -- DBlue
  cyan          = "#00ffff", -- DCyan
  magenta       = "#ff00ff", -- DMagenta
  yellow        = "#ffff00", -- DYellow
  paleyellow    = "#ffffaa", -- DPaleyellow
  darkyellow    = "#eeee9e", -- DDarkyellow
  darkgreen     = "#448844", -- DDarkgreen
  palegreen     = "#aaffaa", -- DPalegreen
  medgreen      = "#88cc88", -- DMedgreen
  darkblue      = "#000055", -- DDarkblue
  palebluegreen = "#aaffff", -- DPalebluegreen
  paleblue      = "#0000bb", -- DPaleblue
  bluegreen     = "#008888", -- DBluegreen
  greygreen     = "#55aaaa", -- DGreygreen
  palegreygreen = "#9eeeee", -- DPalegreygreen
  yellowgreen   = "#99994c", -- DYellowgreen
  medblue       = "#000099", -- DMedblue
  greyblue      = "#005dbb", -- DGreyblue
  palegreyblue  = "#4993dd", -- DPalegreyblue
  purpleblue    = "#8888cc", -- DPurpleblue

  -- Acme computed mixes (allocimagemix)
  acme_body     = "#ffffea", -- DPaleyellow + DWhite mix (acme text bg)
  acme_tag      = "#eaffff", -- DPalebluegreen + DWhite mix (acme tag bg)

  -- Acme UI specific
  b2_red        = "#aa0000", -- Mouse button 2 (execute)
  b3_green      = "#006600", -- Mouse button 3 (look/plumb)
  scroll        = "#444444", -- Sam scroll indicator
  pale_text     = "#666666", -- Rio inactive text
  rio_bg        = "#777777", -- Rio desktop
  rio_inactive  = "#999999", -- Rio inactive border
}

local colors = {
  -- Editor base (Acme body)
  bg            = p9.acme_body,
  bg_dim        = p9.darkyellow,
  bg_dark       = p9.yellowgreen,
  fg            = p9.black,
  fg_dim        = p9.pale_text,
  fg_faint      = p9.rio_inactive,

  -- Acme tag bar
  tagbar        = p9.acme_tag,
  tag_sel       = p9.palegreygreen,
  tag_border    = p9.purpleblue,

  -- Selection (Acme body selection)
  selection     = p9.darkyellow,
  cursor_line   = "#f5f5d5",

  -- Borders
  border        = p9.yellowgreen,

  -- Syntax (using only Plan 9 system colors)
  comment       = p9.yellowgreen,
  string        = p9.b2_red,
  keyword       = p9.medblue,
  func          = p9.bluegreen,
  type          = p9.darkgreen,
  const         = p9.darkblue,
  preproc       = p9.greyblue,
  special       = p9.purpleblue,
  operator      = p9.scroll,

  -- Diagnostics / semantic (Plan 9 UI colors)
  error         = p9.b2_red,
  warn          = p9.yellowgreen,
  info          = p9.darkgreen,
  hint          = p9.bluegreen,

  -- Git (semantic using Plan 9 palette)
  git_add       = p9.darkgreen,
  git_change    = p9.yellowgreen,
  git_delete    = p9.b2_red,

  -- Diff backgrounds (pale versions)
  diff_add      = p9.palegreen,
  diff_delete   = "#ffaaaa",
  diff_change   = p9.darkyellow,
  diff_text     = p9.yellowgreen,

  -- Line numbers
  line_nr       = p9.rio_inactive,

  -- Modified indicator
  modified      = p9.medblue,
}

function M.setup()
  vim.cmd("hi clear")
  if vim.fn.exists("syntax_on") then
    vim.cmd("syntax reset")
  end

  vim.o.background = "light"
  vim.g.colors_name = "plan9"

  local hi = function(group, opts)
    vim.api.nvim_set_hl(0, group, opts)
  end

  -- Editor
  hi("Normal", { fg = colors.fg, bg = colors.bg })
  hi("NormalFloat", { fg = colors.fg, bg = p9.acme_tag })
  hi("FloatBorder", { fg = colors.tag_border, bg = p9.acme_tag })
  hi("Cursor", { fg = colors.bg, bg = colors.fg })
  hi("CursorLine", { bg = colors.cursor_line })
  hi("CursorLineNr", { fg = colors.fg, bg = colors.cursor_line, bold = true })
  hi("CursorColumn", { bg = colors.cursor_line })
  hi("LineNr", { fg = colors.line_nr })
  hi("SignColumn", { bg = colors.bg })
  hi("ColorColumn", { bg = colors.bg_dim })
  hi("VertSplit", { fg = colors.border })
  hi("WinSeparator", { fg = colors.border })
  hi("Folded", { fg = colors.fg_dim, bg = colors.bg_dim })
  hi("FoldColumn", { fg = colors.line_nr, bg = colors.bg })
  hi("NonText", { fg = colors.border })
  hi("SpecialKey", { fg = colors.border })
  hi("EndOfBuffer", { fg = colors.bg_dim })
  hi("MatchParen", { fg = colors.fg, bg = p9.palegreygreen, bold = true })
  hi("Directory", { fg = colors.func, bold = true })
  hi("Title", { fg = colors.keyword, bold = true })
  hi("Conceal", { fg = colors.fg_dim })

  -- Selection
  hi("Visual", { bg = colors.selection })
  hi("VisualNOS", { bg = colors.selection })

  -- Search
  hi("Search", { fg = colors.fg, bg = colors.selection })
  hi("IncSearch", { fg = p9.white, bg = colors.keyword })
  hi("CurSearch", { fg = p9.white, bg = colors.keyword })

  -- Spell
  hi("SpellBad", { undercurl = true, sp = colors.error })
  hi("SpellCap", { undercurl = true, sp = colors.info })
  hi("SpellRare", { undercurl = true, sp = colors.hint })
  hi("SpellLocal", { undercurl = true, sp = colors.warn })

  -- Statusline (Acme tag bar style)
  hi("StatusLine", { fg = colors.fg, bg = colors.tagbar, bold = true })
  hi("StatusLineNC", { fg = colors.fg_dim, bg = colors.tagbar })
  hi("TabLine", { fg = colors.fg_dim, bg = colors.tagbar })
  hi("TabLineFill", { bg = colors.tagbar })
  hi("TabLineSel", { fg = colors.fg, bg = colors.bg, bold = true })
  hi("WinBar", { fg = colors.fg, bg = colors.bg })
  hi("WinBarNC", { fg = colors.fg_dim, bg = colors.bg_dim })

  -- Popup menu (Acme tag bar colors)
  hi("Pmenu", { fg = colors.fg, bg = colors.tagbar })
  hi("PmenuSel", { fg = colors.fg, bg = colors.tag_sel, bold = true })
  hi("PmenuSbar", { bg = colors.tagbar })
  hi("PmenuThumb", { bg = colors.tag_border })

  -- Messages
  hi("ErrorMsg", { fg = colors.error, bold = true })
  hi("WarningMsg", { fg = colors.warn, bold = true })
  hi("ModeMsg", { fg = colors.fg, bold = true })
  hi("MoreMsg", { fg = colors.info, bold = true })
  hi("Question", { fg = colors.info })

  -- Diagnostics
  hi("DiagnosticError", { fg = colors.error })
  hi("DiagnosticWarn", { fg = colors.warn })
  hi("DiagnosticInfo", { fg = colors.info })
  hi("DiagnosticHint", { fg = colors.hint })
  hi("DiagnosticUnderlineError", { undercurl = true, sp = colors.error })
  hi("DiagnosticUnderlineWarn", { undercurl = true, sp = colors.warn })
  hi("DiagnosticUnderlineInfo", { undercurl = true, sp = colors.info })
  hi("DiagnosticUnderlineHint", { undercurl = true, sp = colors.hint })

  -- Diff
  hi("DiffAdd", { bg = colors.diff_add })
  hi("DiffDelete", { bg = colors.diff_delete })
  hi("DiffChange", { bg = colors.diff_change })
  hi("DiffText", { bg = colors.diff_text })

  -- Syntax (Plan 9 palette — muted, deliberate color choices)
  hi("Comment", { fg = colors.comment, italic = true })
  hi("Constant", { fg = colors.const })
  hi("String", { fg = colors.string })
  hi("Character", { fg = colors.string })
  hi("Number", { fg = colors.const })
  hi("Boolean", { fg = colors.const })
  hi("Float", { fg = colors.const })
  hi("Identifier", { fg = colors.fg })
  hi("Function", { fg = colors.func })
  hi("Statement", { fg = colors.keyword })
  hi("Conditional", { fg = colors.keyword })
  hi("Repeat", { fg = colors.keyword })
  hi("Label", { fg = colors.keyword })
  hi("Operator", { fg = colors.operator })
  hi("Keyword", { fg = colors.keyword, bold = true })
  hi("Exception", { fg = colors.error })
  hi("PreProc", { fg = colors.preproc })
  hi("Include", { fg = colors.preproc })
  hi("Define", { fg = colors.preproc })
  hi("Macro", { fg = colors.preproc })
  hi("PreCondit", { fg = colors.preproc })
  hi("Type", { fg = colors.type })
  hi("StorageClass", { fg = colors.type })
  hi("Structure", { fg = colors.type })
  hi("Typedef", { fg = colors.type })
  hi("Special", { fg = colors.special })
  hi("SpecialChar", { fg = colors.special })
  hi("Tag", { fg = colors.func })
  hi("Delimiter", { fg = colors.operator })
  hi("SpecialComment", { fg = colors.comment, bold = true })
  hi("Debug", { fg = colors.error })
  hi("Underlined", { fg = colors.preproc, underline = true })
  hi("Ignore", { fg = colors.fg_faint })
  hi("Error", { fg = p9.white, bg = colors.error, bold = true })
  hi("Todo", { fg = colors.bg, bg = colors.modified, bold = true })

  -- Treesitter
  hi("@variable", { fg = colors.fg })
  hi("@variable.builtin", { fg = colors.special })
  hi("@variable.parameter", { fg = colors.fg })
  hi("@variable.member", { fg = colors.fg })
  hi("@constant", { fg = colors.const })
  hi("@constant.builtin", { fg = colors.const, bold = true })
  hi("@module", { fg = colors.type })
  hi("@label", { fg = colors.keyword })
  hi("@string", { fg = colors.string })
  hi("@string.documentation", { fg = colors.comment })
  hi("@string.escape", { fg = colors.special })
  hi("@string.special", { fg = colors.special })
  hi("@character", { fg = colors.string })
  hi("@number", { fg = colors.const })
  hi("@boolean", { fg = colors.const, bold = true })
  hi("@float", { fg = colors.const })
  hi("@function", { fg = colors.func })
  hi("@function.builtin", { fg = colors.func })
  hi("@function.call", { fg = colors.func })
  hi("@function.macro", { fg = colors.preproc })
  hi("@method", { fg = colors.func })
  hi("@method.call", { fg = colors.func })
  hi("@constructor", { fg = colors.type })
  hi("@parameter", { fg = colors.fg })
  hi("@keyword", { fg = colors.keyword, bold = true })
  hi("@keyword.function", { fg = colors.keyword, bold = true })
  hi("@keyword.operator", { fg = colors.keyword })
  hi("@keyword.return", { fg = colors.keyword, bold = true })
  hi("@conditional", { fg = colors.keyword })
  hi("@repeat", { fg = colors.keyword })
  hi("@exception", { fg = colors.error })
  hi("@include", { fg = colors.preproc })
  hi("@type", { fg = colors.type })
  hi("@type.builtin", { fg = colors.type })
  hi("@type.qualifier", { fg = colors.keyword })
  hi("@type.definition", { fg = colors.type })
  hi("@storageclass", { fg = colors.keyword })
  hi("@attribute", { fg = colors.preproc })
  hi("@field", { fg = colors.fg })
  hi("@property", { fg = colors.fg })
  hi("@punctuation.bracket", { fg = colors.operator })
  hi("@punctuation.delimiter", { fg = colors.operator })
  hi("@punctuation.special", { fg = colors.special })
  hi("@comment", { fg = colors.comment, italic = true })
  hi("@tag", { fg = colors.func })
  hi("@tag.attribute", { fg = colors.type })
  hi("@tag.delimiter", { fg = colors.operator })
  hi("@text", { fg = colors.fg })
  hi("@text.strong", { bold = true })
  hi("@text.emphasis", { italic = true })
  hi("@text.underline", { underline = true })
  hi("@text.strike", { strikethrough = true })
  hi("@text.title", { fg = colors.keyword, bold = true })
  hi("@text.literal", { fg = colors.string })
  hi("@text.uri", { fg = colors.preproc, underline = true })
  hi("@text.todo", { fg = colors.bg, bg = colors.modified, bold = true })
  hi("@text.note", { fg = colors.bg, bg = colors.info, bold = true })
  hi("@text.warning", { fg = colors.bg, bg = colors.warn, bold = true })
  hi("@text.danger", { fg = p9.white, bg = colors.error, bold = true })

  -- LSP
  hi("LspReferenceText", { bg = colors.selection })
  hi("LspReferenceRead", { bg = colors.selection })
  hi("LspReferenceWrite", { bg = colors.selection })
  hi("LspSignatureActiveParameter", { fg = colors.keyword, bold = true })

  -- Git signs
  hi("GitSignsAdd", { fg = colors.git_add })
  hi("GitSignsChange", { fg = colors.git_change })
  hi("GitSignsDelete", { fg = colors.git_delete })
  hi("GitSignsCurrentLineBlame", { fg = colors.fg_faint, italic = true })

  -- Telescope / Snacks picker
  hi("TelescopeBorder", { fg = colors.tag_border })
  hi("TelescopePromptBorder", { fg = colors.tag_border })
  hi("TelescopeResultsBorder", { fg = colors.tag_border })
  hi("TelescopePreviewBorder", { fg = colors.tag_border })
  hi("TelescopeSelection", { bg = colors.selection })
  hi("TelescopeSelectionCaret", { fg = colors.keyword, bg = colors.selection })
  hi("TelescopeMatching", { fg = colors.string, bold = true })

  -- NeoTree (sidebar like Acme tag column)
  hi("NeoTreeNormal", { fg = colors.fg, bg = colors.tagbar })
  hi("NeoTreeNormalNC", { fg = colors.fg, bg = colors.tagbar })
  hi("NeoTreeDirectoryName", { fg = colors.fg, bold = true })
  hi("NeoTreeDirectoryIcon", { fg = colors.func })
  hi("NeoTreeRootName", { fg = colors.fg, bold = true })
  hi("NeoTreeFileName", { fg = colors.fg })
  hi("NeoTreeGitAdded", { fg = colors.git_add })
  hi("NeoTreeGitModified", { fg = colors.git_change })
  hi("NeoTreeGitDeleted", { fg = colors.git_delete })

  -- Which-key
  hi("WhichKey", { fg = colors.keyword, bold = true })
  hi("WhichKeyGroup", { fg = colors.func })
  hi("WhichKeyDesc", { fg = colors.fg })
  hi("WhichKeySeparator", { fg = colors.fg_faint })
  hi("WhichKeyFloat", { bg = colors.tagbar })

  -- Indent blankline
  hi("IndentBlanklineChar", { fg = colors.bg_dim })
  hi("IndentBlanklineContextChar", { fg = colors.border })
  hi("IblIndent", { fg = colors.bg_dim })
  hi("IblScope", { fg = colors.border })

  -- Notify
  hi("NotifyERRORBorder", { fg = colors.error })
  hi("NotifyWARNBorder", { fg = colors.warn })
  hi("NotifyINFOBorder", { fg = colors.info })
  hi("NotifyDEBUGBorder", { fg = colors.fg_faint })
  hi("NotifyTRACEBorder", { fg = colors.hint })
  hi("NotifyERRORIcon", { fg = colors.error })
  hi("NotifyWARNIcon", { fg = colors.warn })
  hi("NotifyINFOIcon", { fg = colors.info })
  hi("NotifyDEBUGIcon", { fg = colors.fg_faint })
  hi("NotifyTRACEIcon", { fg = colors.hint })
  hi("NotifyERRORTitle", { fg = colors.error })
  hi("NotifyWARNTitle", { fg = colors.warn })
  hi("NotifyINFOTitle", { fg = colors.info })
  hi("NotifyDEBUGTitle", { fg = colors.fg_faint })
  hi("NotifyTRACETitle", { fg = colors.hint })

  -- Snacks (LazyVim notifications/dashboard)
  hi("SnacksNotifierBorderError", { fg = colors.error })
  hi("SnacksNotifierBorderWarn", { fg = colors.warn })
  hi("SnacksNotifierBorderInfo", { fg = colors.info })
  hi("SnacksNotifierBorderDebug", { fg = colors.fg_faint })
  hi("SnacksNotifierBorderTrace", { fg = colors.hint })
  hi("SnacksDashboardHeader", { fg = colors.keyword, bold = true })
  hi("SnacksDashboardKey", { fg = colors.keyword, bold = true })
  hi("SnacksDashboardIcon", { fg = colors.func })
  hi("SnacksDashboardDesc", { fg = colors.fg })
  hi("SnacksDashboardFooter", { fg = colors.fg_dim })

  -- Dashboard (legacy)
  hi("DashboardHeader", { fg = colors.keyword, bold = true })
  hi("DashboardCenter", { fg = colors.fg })
  hi("DashboardFooter", { fg = colors.fg_faint })
  hi("DashboardShortCut", { fg = colors.keyword })

  -- Lazy
  hi("LazyButton", { fg = colors.fg, bg = colors.bg_dim })
  hi("LazyButtonActive", { fg = colors.fg, bg = colors.tag_sel, bold = true })
  hi("LazyH1", { fg = colors.keyword, bold = true })
  hi("LazySpecial", { fg = colors.func })

  -- Mini statusline (Plan 9 accent colors for modes)
  hi("MiniStatuslineModeNormal", { fg = p9.white, bg = p9.bluegreen, bold = true })
  hi("MiniStatuslineModeInsert", { fg = p9.white, bg = p9.darkgreen, bold = true })
  hi("MiniStatuslineModeVisual", { fg = p9.white, bg = p9.purpleblue, bold = true })
  hi("MiniStatuslineModeReplace", { fg = p9.white, bg = p9.b2_red, bold = true })
  hi("MiniStatuslineModeCommand", { fg = colors.fg, bg = p9.darkyellow, bold = true })

  -- Bufferline (tag bar style)
  hi("BufferLineFill", { bg = colors.tagbar })
  hi("BufferLineBackground", { fg = colors.fg_dim, bg = colors.tagbar })
  hi("BufferLineBuffer", { fg = colors.fg_dim, bg = colors.tagbar })
  hi("BufferLineBufferSelected", { fg = colors.fg, bg = colors.bg, bold = true })
  hi("BufferLineBufferVisible", { fg = colors.fg_dim, bg = colors.tagbar })
  hi("BufferLineCloseButton", { fg = colors.fg_dim, bg = colors.tagbar })
  hi("BufferLineCloseButtonSelected", { fg = colors.error, bg = colors.bg })
  hi("BufferLineCloseButtonVisible", { fg = colors.fg_dim, bg = colors.tagbar })
  hi("BufferLineIndicatorSelected", { fg = colors.tag_border, bg = colors.bg })
  hi("BufferLineModified", { fg = colors.modified, bg = colors.tagbar })
  hi("BufferLineModifiedSelected", { fg = colors.modified, bg = colors.bg })
  hi("BufferLineSeparator", { fg = colors.tagbar, bg = colors.tagbar })
  hi("BufferLineSeparatorSelected", { fg = colors.tagbar, bg = colors.bg })

  -- Copilot
  hi("CopilotSuggestion", { fg = colors.fg_faint })

  -- Lualine (if used instead of mini)
  hi("lualine_a_normal", { fg = p9.white, bg = p9.bluegreen, bold = true })
  hi("lualine_a_insert", { fg = p9.white, bg = p9.darkgreen, bold = true })
  hi("lualine_a_visual", { fg = p9.white, bg = p9.purpleblue, bold = true })
  hi("lualine_a_replace", { fg = p9.white, bg = p9.b2_red, bold = true })
  hi("lualine_a_command", { fg = colors.fg, bg = p9.darkyellow, bold = true })
  hi("lualine_b_normal", { fg = colors.fg, bg = colors.tagbar })
  hi("lualine_c_normal", { fg = colors.fg_dim, bg = colors.bg_dim })
end

M.setup()

return M

D .config/nvim/init.lua => .config/nvim/init.lua +0 -2
@@ 1,2 0,0 @@
-- bootstrap lazy.nvim, LazyVim and your plugins
require("config.lazy")

D .config/nvim/lazy-lock.json => .config/nvim/lazy-lock.json +0 -34
@@ 1,34 0,0 @@
{
  "LazyVim": { "branch": "main", "commit": "c64a61734fc9d45470a72603395c02137802bc6f" },
  "blink.cmp": { "branch": "main", "commit": "b19413d214068f316c78978b08264ed1c41830ec" },
  "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
  "catppuccin": { "branch": "main", "commit": "beaf41a30c26fd7d6c386d383155cbd65dd554cd" },
  "conform.nvim": { "branch": "master", "commit": "c2526f1cde528a66e086ab1668e996d162c75f4f" },
  "flash.nvim": { "branch": "main", "commit": "fcea7ff883235d9024dc41e638f164a450c14ca2" },
  "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" },
  "gitsigns.nvim": { "branch": "main", "commit": "abf82a65f185bd54adc0679f74b7d6e1ada690c9" },
  "grug-far.nvim": { "branch": "main", "commit": "1f7a722a9b9f0206a345377c13e62542f484398a" },
  "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" },
  "lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" },
  "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" },
  "mason-lspconfig.nvim": { "branch": "main", "commit": "4823a251e7578a835bb979c37df390fca692ba39" },
  "mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" },
  "mini.ai": { "branch": "main", "commit": "9eae720f2b20f6ad28cbfa0ddc524e10dc2c3201" },
  "mini.icons": { "branch": "main", "commit": "efc85e42262cd0c9e1fdbf806c25cb0be6de115c" },
  "mini.pairs": { "branch": "main", "commit": "4089aa6ea6423e02e1a8326a7a7a00159f6f5e04" },
  "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" },
  "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
  "nvim-lint": { "branch": "master", "commit": "ca6ea12daf0a4d92dc24c5c9ae22a1f0418ade37" },
  "nvim-lspconfig": { "branch": "master", "commit": "419b082102fa813739588dd82e19a8b6b2442855" },
  "nvim-treesitter": { "branch": "main", "commit": "511e5ccf404f8a96ee31866b079fca033a8a7c4e" },
  "nvim-treesitter-textobjects": { "branch": "main", "commit": "4d55f63252e04c5212daed958e4e940915ff16ce" },
  "nvim-ts-autotag": { "branch": "main", "commit": "db15f2e0df2f5db916e511e3fffb682ef2f6354f" },
  "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" },
  "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
  "snacks.nvim": { "branch": "main", "commit": "fe7cfe9800a182274d0f868a74b7263b8c0c020b" },
  "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" },
  "tokyonight.nvim": { "branch": "main", "commit": "5da1b76e64daf4c5d410f06bcb6b9cb640da7dfd" },
  "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" },
  "ts-comments.nvim": { "branch": "main", "commit": "123a9fb12e7229342f807ec9e6de478b1102b041" },
  "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" }
}

D .config/nvim/lazyvim.json => .config/nvim/lazyvim.json +0 -10
@@ 1,10 0,0 @@
{
  "extras": [

  ],
  "install_version": 8,
  "news": {
    "NEWS.md": "11866"
  },
  "version": 8
}
\ No newline at end of file

D .config/nvim/lua/config/autocmds.lua => .config/nvim/lua/config/autocmds.lua +0 -8
@@ 1,8 0,0 @@
-- Autocmds are automatically loaded on the VeryLazy event
-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua
--
-- Add any additional autocmds here
-- with `vim.api.nvim_create_autocmd`
--
-- Or remove existing autocmds by their group name (which is prefixed with `lazyvim_` for the defaults)
-- e.g. vim.api.nvim_del_augroup_by_name("lazyvim_wrap_spell")

D .config/nvim/lua/config/keymaps.lua => .config/nvim/lua/config/keymaps.lua +0 -3
@@ 1,3 0,0 @@
-- Keymaps are automatically loaded on the VeryLazy event
-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
-- Add any additional keymaps here

D .config/nvim/lua/config/lazy.lua => .config/nvim/lua/config/lazy.lua +0 -53
@@ 1,53 0,0 @@
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
  local lazyrepo = "https://github.com/folke/lazy.nvim.git"
  local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
  if vim.v.shell_error ~= 0 then
    vim.api.nvim_echo({
      { "Failed to clone lazy.nvim:\n", "ErrorMsg" },
      { out, "WarningMsg" },
      { "\nPress any key to exit..." },
    }, true, {})
    vim.fn.getchar()
    os.exit(1)
  end
end
vim.opt.rtp:prepend(lazypath)

require("lazy").setup({
  spec = {
    -- add LazyVim and import its plugins
    { "LazyVim/LazyVim", import = "lazyvim.plugins" },
    -- import/override with your plugins
    { import = "plugins" },
  },
  defaults = {
    -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup.
    -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default.
    lazy = false,
    -- It's recommended to leave version=false for now, since a lot the plugin that support versioning,
    -- have outdated releases, which may break your Neovim install.
    version = false, -- always use the latest git commit
    -- version = "*", -- try installing the latest stable version for plugins that support semver
  },
  install = { colorscheme = { "tokyonight", "habamax" } },
  checker = {
    enabled = true, -- check for plugin updates periodically
    notify = false, -- notify on update
  }, -- automatically check for plugin updates
  performance = {
    rtp = {
      -- disable some rtp plugins
      disabled_plugins = {
        "gzip",
        -- "matchit",
        -- "matchparen",
        -- "netrwPlugin",
        "tarPlugin",
        "tohtml",
        "tutor",
        "zipPlugin",
      },
    },
  },
})

D .config/nvim/lua/config/options.lua => .config/nvim/lua/config/options.lua +0 -3
@@ 1,3 0,0 @@
-- Options are automatically loaded before lazy.nvim startup
-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua
-- Add any additional options here

D .config/nvim/lua/plugins/colorscheme.lua => .config/nvim/lua/plugins/colorscheme.lua +0 -74
@@ 1,74 0,0 @@
-- Colorscheme configuration
-- Default: plan9
-- Alternatives: acme, base16-grayscale-light, base16-grayscale-dark,
--               catppuccin-latte, tokyonight-night
--
-- Or use keymaps:
--   <leader>up - Plan9 (default)
--   <leader>ua - Acme (monochrome)
--   <leader>ug - Base16 Grayscale Light
--   <leader>uG - Base16 Grayscale Dark
--   <leader>uc - Catppuccin Latte (light)
--   <leader>ut - TokyoNight (dark)

return {
  -- Base16 (grayscale light/dark)
  {
    "RRethy/base16-nvim",
    lazy = true,
  },

  -- Catppuccin (light theme option)
  {
    "catppuccin/nvim",
    name = "catppuccin",
    lazy = true,
    opts = {
      flavour = "latte",
    },
  },

  -- TokyoNight (dark theme option)
  {
    "folke/tokyonight.nvim",
    lazy = true,
    opts = {
      style = "day",
      transparent = false,
      terminal_colors = true,
      styles = {
        comments = { italic = true },
        keywords = { italic = true },
        functions = {},
        variables = {},
        sidebars = "dark",
        floats = "dark",
      },
    },
  },

  -- Set plan9 as the default colorscheme
  {
    "LazyVim/LazyVim",
    opts = {
      colorscheme = "tokyonight-day",
    },
  },

  -- Keymaps for switching themes
  {
    "folke/which-key.nvim",
    optional = true,
    opts = {
      spec = {
        { "<leader>up", "<cmd>colorscheme plan9<cr>", desc = "Plan9 (default)" },
        { "<leader>ua", "<cmd>colorscheme acme<cr>", desc = "Acme (monochrome)" },
        { "<leader>ug", "<cmd>colorscheme base16-grayscale-light<cr>", desc = "Grayscale Light" },
        { "<leader>uG", "<cmd>colorscheme base16-grayscale-dark<cr>", desc = "Grayscale Dark" },
        { "<leader>uc", "<cmd>colorscheme catppuccin-latte<cr>", desc = "Catppuccin Latte (light)" },
        { "<leader>ud", "<cmd>colorscheme tokyonight-day<cr>", desc = "TokyoNight Day (light)" },
        { "<leader>ut", "<cmd>colorscheme tokyonight-night<cr>", desc = "TokyoNight Night (dark)" },
      },
    },
  },
}

D .config/nvim/lua/plugins/dashboard.lua => .config/nvim/lua/plugins/dashboard.lua +0 -34
@@ 1,34 0,0 @@
-- Custom dashboard buttons for LazyVim (using snacks.nvim)
return {
  {
    "folke/snacks.nvim",
    opts = {
      dashboard = {
        preset = {
          keys = {
            { icon = " ", key = "f", desc = "Find File", action = ":lua Snacks.dashboard.pick('files')" },
            { icon = " ", key = "n", desc = "New File", action = ":ene | startinsert" },
            { icon = " ", key = "g", desc = "Find Text", action = ":lua Snacks.dashboard.pick('live_grep')" },
            { icon = " ", key = "r", desc = "Recent Files", action = ":lua Snacks.dashboard.pick('oldfiles')" },
            -- { icon = " ", key = "R", desc = "Restore Session", action = ":lua require('persistence').load()" },
            { icon = " ", key = "s", desc = "Browse src", action = ":e ~/.local/src/" },
            { icon = " ", key = "b", desc = "Browse scripts", action = ":e ~/.local/bin/" },
            -- { icon = " ", key = "p", desc = "Projects", action = ":e ~/dev/" },
            -- { icon = " ", key = "B", desc = "Bookmarks", action = ":e ~/.local/share/karbs/snippets" },
            { icon = " ", key = "i", desc = "Fish Config", action = ":e ~/.config/fish/config.fish" },
            { icon = " ", key = "c", desc = "Lazy Config", action = ":lua Snacks.dashboard.pick('files', {cwd = vim.fn.stdpath('config')})" },
            { icon = " ", key = "m", desc = "Lazy Mappings", action = ":e ~/.config/nvim/lua/config/keymaps.lua" },
            { icon = " ", key = "x", desc = "Lazy Extras", action = ":LazyExtras" },
            { icon = "󰒲 ", key = "l", desc = "Lazy Plugins", action = ":Lazy" },
            { icon = " ", key = "q", desc = "Quit", action = ":qa" },
          },
        },
        sections = {
          { section = "header" },
          { section = "keys", gap = 1, padding = 1 },
          { section = "startup" },
        },
      },
    },
  },
}

D .config/nvim/lua/plugins/neo-tree.lua => .config/nvim/lua/plugins/neo-tree.lua +0 -26
@@ 1,26 0,0 @@
-- Always show neo-tree sidebar
return {
  {
    "nvim-neo-tree/neo-tree.nvim",
    opts = {
      filesystem = {
        filtered_items = {
          visible = true,
          hide_dotfiles = false,
          hide_gitignored = false,
        },
      },
    },
    init = function()
      -- Auto-open neo-tree on startup
      vim.api.nvim_create_autocmd("VimEnter", {
        callback = function()
          if vim.fn.argc() > 0 then
            -- Only open if we're opening a file/directory
            vim.cmd("Neotree show")
          end
        end,
      })
    end,
  },
}

D .config/nvim/stylua.toml => .config/nvim/stylua.toml +0 -3
@@ 1,3 0,0 @@
indent_type = "Spaces"
indent_width = 2
column_width = 120
\ No newline at end of file

M .config/write/init.lua => .config/write/init.lua +33 -3
@@ 67,7 67,7 @@ vim.opt.undodir = vim.fn.stdpath("data") .. "/undo"
vim.opt.clipboard = "unnamedplus"
vim.opt.mouse = "a"

-- snacks.nvim (explorer + project picker)
-- snacks.nvim (explorer + project picker + dashboard)
require("snacks").setup({
  explorer = { enabled = true },
  picker = {


@@ 79,6 79,34 @@ require("snacks").setup({
      },
    },
  },
  dashboard = {
    enabled = true,
    preset = {
      header = [[
 (\
'\
 '\     __________
 / '|   ()________)
 \ '/    \ ~~~~~~~~ \
   \       \ ~~~~~~   \
   ==).      \__________\
  (__)       ()__________)]],
      keys = {
        { icon = " ", key = "f", desc = "Find File", action = ":lua Snacks.dashboard.pick('files')" },
        { icon = " ", key = "n", desc = "New File", action = ":ene | startinsert" },
        { icon = " ", key = "g", desc = "Find Text", action = ":lua Snacks.dashboard.pick('live_grep')" },
        { icon = " ", key = "r", desc = "Recent Files", action = ":lua Snacks.dashboard.pick('oldfiles')" },
        { icon = " ", key = "s", desc = "Browse slipbox", action = ":e ~/dev/slipbox/" },
        { icon = " ", key = "b", desc = "Browse content", action = ":e ~/.corpus/content/" },
        { icon = " ", key = "e", desc = "Explorer", action = ":lua Snacks.explorer.open()" },
        { icon = " ", key = "q", desc = "Quit", action = ":qa" },
      },
    },
    sections = {
      { section = "header" },
      { section = "keys", gap = 1, padding = 1 },
    },
  },
})

-- Word count in statusline (shown in cmdline area)


@@ 226,9 254,11 @@ vim.api.nvim_create_autocmd({ "FocusLost", "CursorHold", "InsertLeave" }, {
  end,
})

-- Goyo on by default
-- Goyo on by default (but not when dashboard is showing)
vim.api.nvim_create_autocmd("VimEnter", {
  callback = function()
    vim.cmd("Goyo")
    if vim.fn.argc() > 0 then
      vim.cmd("Goyo")
    end
  end,
})

M .local/share/fastfetch/ascii/glenda.txt => .local/share/fastfetch/ascii/glenda.txt +16 -15
@@ 1,15 1,16 @@
      __
     (  \
 __   \  '\
(  "-_ \ .-'----._
 '-_  "v"         "-
    "Y'             ".
     |                |
     |        o     o |
     |          .<>.  |
      \         "Ll"  |
       |             .'
       |             |
       (             /
      /'\         . \
      "--^--.__,\_)-'
                 __
     \          /  )
      \        /' /    __
        _.----'-./  _-"  )
      -"         "v"  _-'
    ."             'Y"
   |                |
   | o     o        |
   |  .><.          |
   |  "Ll"         /
   '.             |
    |             |
    \             )
    / .          /'\      *
    '-(_/,__.--^--"  *      *
                   *     *        *

A .planrc => .planrc +1 -0
@@ 0,0 1,1 @@
# Plan 9 rc shell config

M README.md => README.md +26 -0
@@ 31,3 31,29 @@ profiles/        → Per-machine overrides (moirai, khr1st, pentest)
## Related

- [sdeploy](https://github.com/krisyotam/sdeploy) — Deployment scripts that install packages and stow these dotfiles



profiles/gentoo/portage/
├── make.conf                      # Global: CFLAGS, USE, GPU,
MAKEOPTS
├── package.use/
│   ├── browsers                   # surf savedconfig
│   ├── documents                  # zathura backends
│   ├── editors                    # neovim, emacs
│   ├── graphics                   # gimp, inkscape
│   ├── multimedia                 # pipewire, mpv, ffmpeg, mpd
│   ├── security                   # gnupg, openvpn
│   └── xorg                      # xorg-server, picom, dunst
├── package.accept_keywords/       # empty, for unmasking ~amd64
├── package.mask/                  # empty
├── package.unmask/                # empty
├── package.license/               # empty
├── repos.conf/                    # empty, for overlays
└── savedconfig/                   # empty, for suckless configs

  www-client/    = web browsers
  app-editors/   = editors (neovim, emacs)
  media-video/   = video stuff (mpv, pipewire)
  sys-process/   = process tools (btop)
  x11-misc/      = X utilities (picom, dunst)
\ No newline at end of file

M profiles/README.md => profiles/README.md +1 -0
@@ 18,3 18,4 @@ cd ~/srice/profiles/moirai && stow -t ~ .
- `moirai/` — Desktop (4-monitor, AMD dGPU + Intel iGPU, Arrow Lake)
- `khr1st/` — Laptop
- `pentest/` — Kali/security-focused config
- `gentoo/` — Gentoo musl/OpenRC system configs (portage, USE flags, make.conf)

A profiles/gentoo/portage/make.conf => profiles/gentoo/portage/make.conf +43 -0
@@ 0,0 1,43 @@
# /etc/portage/make.conf
# Gentoo system configuration for moirai (Arrow Lake + RX 6800 XT)

# Compiler flags
COMMON_FLAGS="-O2 -pipe -march=native"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

# Parallel builds: Arrow Lake Core Ultra 7 265K (20 threads)
MAKEOPTS="-j20"

# Global USE flags
USE="-systemd -elogind -consolekit -pulseaudio -bluetooth -networkmanager
     X openrc musl pipewire alsa iwd seatd
     unicode truetype fontconfig
     jpeg png gif svg webp tiff
     pdf djvu postscript
     gpg ssl curl
     -dbus -policykit -udisks -gvfs"

# GPU
VIDEO_CARDS="amdgpu radeonsi"
INPUT_DEVICES="libinput"

# Accepted licenses
ACCEPT_LICENSE="*"

# Locale
LINGUAS="en"
L10N="en"

# Mirrors
GENTOO_MIRRORS="https://distfiles.gentoo.org"

# Features
FEATURES="parallel-fetch candy"

# Portage directories
PORTDIR="/var/db/repos/gentoo"
DISTDIR="/var/cache/distfiles"
PKGDIR="/var/cache/binpkgs"

A profiles/gentoo/portage/package.use => profiles/gentoo/portage/package.use +203 -0
@@ 0,0 1,203 @@
# =============================================================================
# package.use
# /etc/portage/package.use
#
# Author:  Kris Yotam (khr1st)
# Date:    2026-05-21
# System:  Gentoo musl/OpenRC — moirai (Arrow Lake + RX 6800 XT)
# =============================================================================
#
# Format: category/package flag1 flag2 -flag3
#   flag   = enable at compile time
#   -flag  = disable at compile time
#
# See available flags:  emerge -pv category/package
# See active flags:     equery uses category/package
# =============================================================================


# =============================================================================
# Core / Init
# =============================================================================
sys-apps/openrc -netifrc                          # iwd+dhcpcd, not netifrc
sys-auth/seatd -builtin                           # standalone seat manager
sys-libs/musl -static                             # system libc
sys-fs/eudev -rule-generator                      # device manager
sys-process/audit -gssapi                         # no kerberos


# =============================================================================
# X11 / Display
# =============================================================================
x11-base/xorg-server -minimal -wayland udev
x11-apps/xinit -twm
x11-misc/picom config-file opengl
x11-misc/dunst -wayland
x11-misc/unclutter -xfixes
x11-misc/xdotool -libnotify
x11-misc/arandr -python_single_target_python3_12


# =============================================================================
# Audio
# =============================================================================
media-video/pipewire sound-server -bluetooth -jack
media-video/wireplumber -system-service
media-libs/alsa-lib -alisp -python


# =============================================================================
# Music
# =============================================================================
media-sound/mpd alsa pipewire -pulseaudio flac mp3 opus vorbis
media-sound/ncmpcpp taglib outputs visualizer
media-sound/mpc -doc


# =============================================================================
# Video
# =============================================================================
media-video/mpv lua alsa pipewire cli -sdl -wayland opengl vulkan
media-video/ffmpeg x264 x265 opus vorbis vpx theora mp3 alsa flac


# =============================================================================
# Browsers (active)
# =============================================================================
www-client/nyxt -webkit2
net-misc/helium-browser -hangouts
www-client/torbrowser-launcher -apparmor

# Browsers (archive)
# www-client/brave-bin -keyring
# www-client/chromium -hangouts -widevine
# www-client/google-chrome -l10n_*
# www-client/floorp -l10n_*
# www-client/icecat -dbus
# www-client/palemoon -dbus
# www-client/qutebrowser -widevine
# www-client/surf savedconfig
# www-client/vivaldi -proprietary-codecs
# www-client/lynx ssl
# www-client/w3m imlib


# =============================================================================
# Editors
# =============================================================================
app-editors/neovim lua luajit -python -ruby
app-editors/emacs gui X toolkit-lucid -gtk -xwidgets -imagemagick


# =============================================================================
# Documents / PDF
# =============================================================================
app-text/zathura-meta pdf djvu postscript cb
app-text/poppler cairo -qt5 -qt6


# =============================================================================
# Graphics
# =============================================================================
media-gfx/gimp jpeg png svg tiff webp -python
media-gfx/inkscape svg -cdr
media-gfx/imagemagick jpeg png svg tiff webp -openmp


# =============================================================================
# Networking
# =============================================================================
net-wireless/iwd -ofono -systemd
net-misc/dhcpcd -auth -ipv6
net-dns/unbound -python -gost dnssec
net-vpn/openvpn ssl lzo
net-vpn/mullvad-vpn -appindicator


# =============================================================================
# Security
# =============================================================================
app-crypt/gnupg ssl smartcard usb
app-admin/pass -emacs -git -dmenu
net-misc/proxychains -dns


# =============================================================================
# Development
# =============================================================================
dev-vcs/git curl -perl -python -webdav
dev-lang/go -pie
dev-util/tcc -doc
sys-devel/gcc -fortran -objc -objc++


# =============================================================================
# Shell
# =============================================================================
app-shells/mksh -arc4random


# =============================================================================
# Terminals / Multiplexers
# =============================================================================
app-misc/tmux -utempter
app-misc/dvtm -unicode


# =============================================================================
# Utilities
# =============================================================================
sys-process/btop -gpu
app-misc/nnn -nerd
app-misc/calcurse -caldav
net-irc/catgirl ssl
media-gfx/nsxiv -exif
app-misc/fastfetch -vulkan -opencl
net-misc/yt-dlp -aria2
app-misc/jq -oniguruma
sys-apps/ripgrep -pcre
net-p2p/rtorrent -xmlrpc
app-text/buku -colors
www-misc/sfeed -curses
net-mail/neomutt -notmuch -gpgme
app-misc/conky lua X -wayland


# =============================================================================
# Theming / Notifications
# =============================================================================
x11-libs/libnotify -introspection
app-misc/pywal -colorthief


# =============================================================================
# Torrent
# =============================================================================
net-p2p/rtorrent -xmlrpc
net-p2p/transmission -gtk -qt5


# =============================================================================
# Fonts
# =============================================================================
media-fonts/noto -cjk
media-libs/fontconfig -doc


# =============================================================================
# Containers
# =============================================================================
# app-containers/docker -cli -buildx
# app-containers/docker-compose -python


# =============================================================================
# Suckless (git builds from krisyotam repos, not portage)
# Listed for reference only — these use savedconfig/ if built via portage
# =============================================================================
# x11-wm/dwm savedconfig
# x11-misc/dmenu savedconfig
# x11-terms/st savedconfig
# www-client/surf savedconfig
# sys-process/scron savedconfig
# www-misc/quark savedconfig