From ef1df7358d1a14671665fd2b489e485eb7eaf621 Mon Sep 17 00:00:00 2001
From: Barrett Ruth
Date: Wed, 11 Feb 2026 10:42:58 -0500
Subject: [PATCH] refactor
---
config/lf/cleaner | 2 -
config/lf/lf.lua | 250 -----------------------------
config/lf/previewer | 72 ---------
config/lf/sort.py | 53 ------
config/nvim/lua/plugins/guard.lua | 2 +-
config/rofi/themes/daylight.rasi | 146 +++++++++++++++++
config/tmux/themes/daylight.conf | 11 ++
config/tmux/themes/midnight.conf | 11 ++
home/modules/shell.nix | 258 ++++++++----------------------
home/modules/ui.nix | 97 ++---------
10 files changed, 253 insertions(+), 649 deletions(-)
delete mode 100755 config/lf/cleaner
delete mode 100644 config/lf/lf.lua
delete mode 100755 config/lf/previewer
delete mode 100755 config/lf/sort.py
create mode 100644 config/rofi/themes/daylight.rasi
create mode 100644 config/tmux/themes/daylight.conf
create mode 100644 config/tmux/themes/midnight.conf
diff --git a/config/lf/cleaner b/config/lf/cleaner
deleted file mode 100755
index af197ee..0000000
--- a/config/lf/cleaner
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-exec kitten icat --clear --stdin no --transfer-mode memory /dev/tty
diff --git a/config/lf/lf.lua b/config/lf/lf.lua
deleted file mode 100644
index 470607b..0000000
--- a/config/lf/lf.lua
+++ /dev/null
@@ -1,250 +0,0 @@
-_G.lf = _G.lf or {}
-
-function _G.lf.setup()
- vim.opt.swapfile = false
- vim.opt.backup = false
- vim.opt.writebackup = false
- vim.opt.termguicolors = true
-
- vim.pack.add({
- {
- src = "https://github.com/nvim-treesitter/nvim-treesitter.git",
- name = "nvim-treesitter",
- },
- {
- src = "https://github.com/barrettruth/midnight.nvim.git",
- name = "midnight.nvim",
- },
- })
-
- vim.cmd('silent TSInstall all')
-
- vim.api.nvim_create_autocmd("OptionSet", {
- pattern = "background",
- callback = function()
- vim.cmd.colorscheme(vim.o.background == "dark" and "midnight" or "daylight")
- end,
- group = vim.api.nvim_create_augroup("Midnight", { clear = true }),
- })
-end
-
-local hl_cache = {}
-local reset = "\27[0m"
-
----@param name string
----@return string
-local function get_fg_ansi(name)
- if hl_cache[name] then
- return hl_cache[name]
- end
-
- local hl = vim.api.nvim_get_hl(0, { name = name, link = false })
-
- if not hl.fg then
- hl_cache[name] = ""
- return ""
- end
-
- local r = bit.rshift(bit.band(hl.fg, 0xff0000), 16)
- local g = bit.rshift(bit.band(hl.fg, 0x00ff00), 8)
- local b = bit.band(hl.fg, 0x0000ff)
-
- local ansi = string.format("\27[38;2;%d;%d;%dm", r, g, b)
- hl_cache[name] = ansi
- return ansi
-end
-
----@param lines string[]
----@return boolean
-local function render_with_vim_syntax(lines)
- local ok = pcall(vim.cmd.syntax, "enable")
- if not ok then
- return false
- end
-
- for lnum, text in ipairs(lines) do
- if #text == 0 then
- io.write("\n")
- else
- local rendered = {}
- local current_group = nil
- local chunk_start = 1
-
- for col = 1, #text do
- local syn_id = vim.fn.synID(lnum, col, 1)
- local group = vim.fn.synIDattr(syn_id, "name")
-
- if group ~= current_group then
- if current_group then
- local chunk = text:sub(chunk_start, col - 1)
- local ansi = get_fg_ansi(current_group)
- if ansi ~= "" then
- table.insert(rendered, ansi)
- table.insert(rendered, chunk)
- table.insert(rendered, reset)
- else
- table.insert(rendered, chunk)
- end
- end
- current_group = group
- chunk_start = col
- end
- end
-
- if current_group then
- local chunk = text:sub(chunk_start)
- local ansi = get_fg_ansi(current_group)
- if ansi ~= "" then
- table.insert(rendered, ansi)
- table.insert(rendered, chunk)
- table.insert(rendered, reset)
- else
- table.insert(rendered, chunk)
- end
- end
-
- local line = table.concat(rendered)
- io.write(line .. "\n")
- end
- end
-
- io.flush()
- return true
-end
-
----@param lines string[]
-local function render_plain(lines)
- for _, line in ipairs(lines) do
- io.write(line .. "\n")
- end
- io.flush()
-end
-
----@param buf number
----@param lines string[]
----@param filetype string
----@param preview_line_count number
----@return table>
-local function collect_treesitter_highlights(buf, lines, filetype, preview_line_count)
- local parser = vim.treesitter.get_parser(buf)
- local trees = parser:parse()
- if not trees or #trees == 0 then
- return {}
- end
-
- local root = trees[1]:root()
- local query = vim.treesitter.query.get(filetype, "highlights")
- if not query then
- return {}
- end
-
- ---@type table>
- local line_highlights = {}
-
- for id, node in query:iter_captures(root, buf, 0, preview_line_count) do
- local name = query.captures[id]
- local start_row, start_col, end_row, end_col = node:range()
-
- for row = start_row, end_row do
- line_highlights[row] = line_highlights[row] or {}
- local s_col = row == start_row and start_col or 0
- local e_col = row == end_row and end_col or #lines[row + 1]
- table.insert(line_highlights[row], { s_col, e_col, name })
- end
- end
-
- for _, highlights in pairs(line_highlights) do
- table.sort(highlights, function(a, b)
- if a[1] == b[1] then
- return a[2] > b[2]
- end
- return a[1] < b[1]
- end)
- end
-
- return line_highlights
-end
-
----@param lines string[]
----@param line_highlights table>
----@param filetype string
-local function render_with_treesitter(lines, line_highlights, filetype)
- for i, text in ipairs(lines) do
- local row = i - 1
- local highlights = line_highlights[row] or {}
-
- if #highlights == 0 then
- io.write(text .. "\n")
- else
- local rendered = {}
- local pos = 0
- ---@type {[1]: number, [2]: number}[]
- local used_ranges = {}
-
- for _, hl in ipairs(highlights) do
- local s_col, e_col, name = hl[1], hl[2], hl[3]
-
- local skip = false
- for _, used in ipairs(used_ranges) do
- if s_col >= used[1] and s_col < used[2] then
- skip = true
- break
- end
- end
-
- if not skip then
- if pos < s_col then
- table.insert(rendered, text:sub(pos + 1, s_col))
- end
-
- local chunk = text:sub(s_col + 1, e_col)
- local ansi = get_fg_ansi("@" .. name .. "." .. filetype)
- if ansi == "" then
- ansi = get_fg_ansi("@" .. name)
- end
-
- if ansi ~= "" then
- table.insert(rendered, ansi)
- table.insert(rendered, chunk)
- table.insert(rendered, reset)
- else
- table.insert(rendered, chunk)
- end
-
- table.insert(used_ranges, { s_col, e_col })
- pos = e_col
- end
- end
-
- if pos < #text then
- table.insert(rendered, text:sub(pos + 1))
- end
-
- io.write(table.concat(rendered) .. "\n")
- end
- end
-
- io.flush()
-end
-
----@param filepath string
----@param preview_line_count number
-function _G.lf.preview(filepath, preview_line_count)
- vim.cmd.edit(filepath)
- vim.cmd.colorscheme(vim.env.THEME)
-
- local buf = vim.api.nvim_get_current_buf()
- local lines = vim.api.nvim_buf_get_lines(buf, 0, preview_line_count, false)
-
- local ft = vim.filetype.match({ buf = buf, filename = filepath })
-
- local tsok, result = pcall(collect_treesitter_highlights, buf, lines, ft, preview_line_count)
-
- if tsok and next(result) ~= nil then
- render_with_treesitter(lines, result, ft)
- elseif render_with_vim_syntax(lines) then
- return
- else
- render_plain(lines)
- end
-end
diff --git a/config/lf/previewer b/config/lf/previewer
deleted file mode 100755
index bd47d7e..0000000
--- a/config/lf/previewer
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/bin/sh
-FILE_PATH="$1"
-w="$2"
-h="$3"
-x="$4"
-y="$5"
-
-CACHE_DIR="$HOME/.cache/lf/thumbnail"
-mkdir -p "$CACHE_DIR"
-
-CACHE_BASE="$CACHE_DIR/$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$FILE_PATH")" | sha256sum | awk '{print $1}')"
-
-get_cell_size() {
- size_info=$(kitten @ get-window-size --self)
- cell_w=$(echo "$size_info" | awk 'BEGIN{RS="[{} ,]"} /"xpixels"/{gsub(/"/,"",$0); split($0,a,":"); x=a[2]} /"cols"/{gsub(/"/,"",$0); split($0,a,":"); c=a[2]} END{if(c) print int(x/c); else print 8}')
- cell_h=$(echo "$size_info" | awk 'BEGIN{RS="[{} ,]"} /"ypixels"/{gsub(/"/,"",$0); split($0,a,":"); y=a[2]} /"rows"/{gsub(/"/,"",$0); split($0,a,":"); r=a[2]} END{if(r) print int(y/r); else print 16}')
-}
-
-draw() {
- kitten icat --stdin no --transfer-mode memory --place "${w}x${h}@${x}x${y}" "$1" /dev/tty
- exit 1
-}
-
-get_cell_size
-preview_px_w=$((w * ${cell_w:-8} - 16))
-preview_px_h=$((h * ${cell_h:-16} - 16))
-PREVIEW_LINE_COUNT=200
-
-mime_type=$(file -Lb --mime-type "$FILE_PATH")
-
-case "$mime_type" in
-image/gif | video/*)
- if [ "$(stat -c %Y "$FILE_PATH" 2>/dev/null || echo 0)" -gt "$(stat -c %Y "${CACHE_BASE}.jpg" 2>/dev/null || echo 0)" ]; then
- ffmpeg -y -i "$FILE_PATH" -vf "select=eq(n\,0),scale=${preview_px_w}:-1" -vframes 1 "${CACHE_BASE}.jpg"
- fi
- draw "${CACHE_BASE}.jpg"
- ;;
-image/svg+xml | image/svg)
- if [ "$(stat -c %Y "$FILE_PATH")" -gt "$(stat -c %Y "${CACHE_BASE}.png" 2>/dev/null || echo 0)" ]; then
- rsvg-convert --keep-aspect-ratio --width "$preview_px_w" --format=png "$FILE_PATH" -o "${CACHE_BASE}.png"
- fi
- draw "${CACHE_BASE}.png"
- ;;
-image/*)
- draw "$FILE_PATH"
- ;;
-application/pdf)
- if [ "$(stat -c %Y "$FILE_PATH")" -gt "$(stat -c %Y "${CACHE_BASE}.jpg" 2>/dev/null || echo 0)" ]; then
- pdftoppm -f 1 -l 1 -scale-to-x "$preview_px_w" -scale-to-y -1 -singlefile -jpeg -- "$FILE_PATH" "${CACHE_BASE}"
- fi
- draw "${CACHE_BASE}.jpg"
- ;;
-application/epub+zip | application/x-mobipocket-ebook)
- if [ "$(stat -c %Y "$FILE_PATH")" -gt "$(stat -c %Y "${CACHE_BASE}.png" 2>/dev/null || echo 0)" ]; then
- gnome-epub-thumbnailer -s "$preview_px_w" "$FILE_PATH" "${CACHE_BASE}.png" 2>/dev/null || convert -size "${preview_px_w}x${preview_px_w}" xc:gray "${CACHE_BASE}.png"
- fi
- [ -f "${CACHE_BASE}.png" ] && draw "${CACHE_BASE}.png"
- ;;
-audio/*)
- if [ "$(stat -c %Y "$FILE_PATH")" -gt "$(stat -c %Y "${CACHE_BASE}.jpg" 2>/dev/null || echo 0)" ]; then
- ffmpeg -y -i "$FILE_PATH" -an -vcodec copy "${CACHE_BASE}.jpg" 2>/dev/null || convert -size "${preview_px_w}x${preview_px_w}" xc:gray "${CACHE_BASE}.jpg"
- fi
- draw "${CACHE_BASE}.jpg"
- ;;
-*)
- nvim --headless -u NONE \
- -c "luafile $XDG_CONFIG_HOME/lf/lf.lua" \
- -c "lua lf.setup()" \
- -c "lua lf.preview([[${FILE_PATH}]], ${PREVIEW_LINE_COUNT})" \
- -c "quitall!"
- ;;
-esac
diff --git a/config/lf/sort.py b/config/lf/sort.py
deleted file mode 100755
index 6457ff5..0000000
--- a/config/lf/sort.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import sys
-
-
-def categorize_and_sort(directory: str) -> list[str]:
- try:
- entries = os.listdir(directory)
- except (PermissionError, FileNotFoundError):
- return []
-
- folders: list[str] = []
- files: list[str] = []
- dotfolders: list[str] = []
- dotfiles: list[str] = []
-
- for entry in entries:
- full_path = os.path.join(directory, entry)
- is_hidden = entry.startswith(".")
- is_dir = os.path.isdir(full_path)
-
- if not is_hidden and is_dir:
- folders.append(entry)
- elif not is_hidden and not is_dir:
- files.append(entry)
- elif is_hidden and is_dir:
- dotfolders.append(entry)
- else:
- dotfiles.append(entry)
-
- folders.sort(key=str.lower)
- files.sort(key=str.lower)
- dotfolders.sort(key=str.lower)
- dotfiles.sort(key=str.lower)
-
- return folders + files + dotfolders + dotfiles
-
-
-def main() -> None:
- if len(sys.argv) < 2:
- directory = os.getcwd()
- else:
- directory = sys.argv[1]
-
- sorted_entries = categorize_and_sort(directory)
-
- for entry in sorted_entries:
- print(entry)
-
-
-if __name__ == "__main__":
- main()
diff --git a/config/nvim/lua/plugins/guard.lua b/config/nvim/lua/plugins/guard.lua
index e9c9b8e..388aa9a 100644
--- a/config/nvim/lua/plugins/guard.lua
+++ b/config/nvim/lua/plugins/guard.lua
@@ -1,7 +1,7 @@
return {
'nvimdev/guard.nvim',
dependencies = {
- { 'nvimdev/guard-collection' },
+ { dir = '~/dev/guard-collection' },
},
init = function()
vim.g.guard_config = {
diff --git a/config/rofi/themes/daylight.rasi b/config/rofi/themes/daylight.rasi
new file mode 100644
index 0000000..0430959
--- /dev/null
+++ b/config/rofi/themes/daylight.rasi
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * ROFI Color theme
+ * User: Sergio Morales
+ * Copyright: Sergio Morales
+ *******************************************************************************/
+
+* {
+ selected-normal-foreground: rgba ( 255, 255, 255, 100 % );
+ foreground: rgba ( 82, 93, 118, 100 % );
+ normal-foreground: @foreground;
+ alternate-normal-background: rgba ( 245, 245, 245, 100 % );
+ red: rgba ( 220, 50, 47, 100 % );
+ selected-urgent-foreground: rgba ( 220, 50, 47, 100 % );
+ blue: rgba ( 38, 139, 210, 100 % );
+ urgent-foreground: rgba ( 220, 50, 47, 100 % );
+ alternate-urgent-background: rgba ( 245, 245, 245, 100 % );
+ active-foreground: rgba ( 194, 202, 208, 100 % );
+ lightbg: rgba ( 238, 232, 213, 100 % );
+ selected-active-foreground: rgba ( 194, 202, 208, 100 % );
+ alternate-active-background: rgba ( 245, 245, 245, 100 % );
+ background: rgba ( 255, 255, 255, 100 % );
+ bordercolor: rgba ( 245, 245, 245, 100 % );
+ alternate-normal-foreground: @foreground;
+ normal-background: rgba ( 255, 255, 255, 100 % );
+ lightfg: rgba ( 88, 104, 117, 100 % );
+ selected-normal-background: rgba ( 82, 148, 226, 100 % );
+ border-color: @foreground;
+ spacing: 2;
+ separatorcolor: @foreground;
+ urgent-background: rgba ( 255, 255, 255, 100 % );
+ selected-urgent-background: rgba ( 82, 148, 226, 100 % );
+ alternate-urgent-foreground: @urgent-foreground;
+ background-color: rgba ( 0, 0, 0, 0 % );
+ alternate-active-foreground: @active-foreground;
+ active-background: rgba ( 255, 255, 255, 100 % );
+ selected-active-background: rgba ( 82, 148, 226, 100 % );
+}
+window {
+ background-color: @background;
+ border: 1;
+ padding: 5;
+}
+mainbox {
+ border: 0;
+ padding: 0;
+}
+message {
+ border: 2px 0px 0px ;
+ border-color: @separatorcolor;
+ padding: 1px ;
+}
+textbox {
+ text-color: @foreground;
+}
+listview {
+ fixed-height: 0;
+ border: 2px 0px 0px ;
+ border-color: @separatorcolor;
+ spacing: 2px ;
+ scrollbar: true;
+ padding: 2px 0px 0px ;
+}
+element {
+ border: 0;
+ padding: 1px ;
+}
+element-text {
+ background-color: inherit;
+ text-color: inherit;
+}
+element.normal.normal {
+ background-color: @normal-background;
+ text-color: @normal-foreground;
+}
+element.normal.urgent {
+ background-color: @urgent-background;
+ text-color: @urgent-foreground;
+}
+element.normal.active {
+ background-color: @active-background;
+ text-color: @active-foreground;
+}
+element.selected.normal {
+ background-color: @selected-normal-background;
+ text-color: @selected-normal-foreground;
+}
+element.selected.urgent {
+ background-color: @selected-urgent-background;
+ text-color: @selected-urgent-foreground;
+}
+element.selected.active {
+ background-color: @selected-active-background;
+ text-color: @selected-active-foreground;
+}
+element.alternate.normal {
+ background-color: @alternate-normal-background;
+ text-color: @alternate-normal-foreground;
+}
+element.alternate.urgent {
+ background-color: @alternate-urgent-background;
+ text-color: @alternate-urgent-foreground;
+}
+element.alternate.active {
+ background-color: @alternate-active-background;
+ text-color: @alternate-active-foreground;
+}
+scrollbar {
+ width: 4px ;
+ border: 0;
+ handle-width: 8px ;
+ padding: 0;
+}
+mode-switcher {
+ border: 2px 0px 0px ;
+ border-color: @separatorcolor;
+}
+button.selected {
+ background-color: @selected-normal-background;
+ text-color: @selected-normal-foreground;
+}
+inputbar {
+ spacing: 0;
+ text-color: @normal-foreground;
+ padding: 1px ;
+}
+case-indicator {
+ spacing: 0;
+ text-color: @normal-foreground;
+}
+entry {
+ spacing: 0;
+ text-color: @normal-foreground;
+}
+prompt {
+ spacing: 0;
+ text-color: @normal-foreground;
+}
+inputbar {
+ children: [ prompt,textbox-prompt-colon,entry,case-indicator ];
+}
+textbox-prompt-colon {
+ expand: false;
+ str: ":";
+ margin: 0px 0.3em 0em 0em ;
+ text-color: @normal-foreground;
+}
diff --git a/config/tmux/themes/daylight.conf b/config/tmux/themes/daylight.conf
new file mode 100644
index 0000000..ed6e29c
--- /dev/null
+++ b/config/tmux/themes/daylight.conf
@@ -0,0 +1,11 @@
+set -g status-bg '#f5f5f5'
+set -g status-fg '#1a1a1a'
+set -g window-status-style fg='#1a1a1a'
+set -g window-status-current-style fg='#1a1a1a'
+set -g window-status-bell-style fg='#c7254e',bg='#f5f5f5',bold
+set -g window-status-activity-style fg='#3b5bdb',bg='#f5f5f5',bold
+set -g pane-border-style fg='#e8e8e8'
+set -g pane-active-border-style fg='#1a1a1a'
+set -g copy-mode-selection-style fg='#f5f5f5',bg='yellow'
+set -g copy-mode-current-match-style fg='#f5f5f5',bg='yellow'
+set -g copy-mode-match-style 'reverse'
diff --git a/config/tmux/themes/midnight.conf b/config/tmux/themes/midnight.conf
new file mode 100644
index 0000000..35efc83
--- /dev/null
+++ b/config/tmux/themes/midnight.conf
@@ -0,0 +1,11 @@
+set -g status-bg '#121212'
+set -g status-fg '#e0e0e0'
+set -g window-status-style fg='#e0e0e0'
+set -g window-status-current-style fg='#e0e0e0'
+set -g window-status-bell-style fg='#ff6b6b',bg='#121212',bold
+set -g window-status-activity-style fg='#7aa2f7',bg='#121212',bold
+set -g pane-border-style fg='#3d3d3d'
+set -g pane-active-border-style fg='#e0e0e0'
+set -g copy-mode-selection-style fg='#121212',bg='yellow'
+set -g copy-mode-current-match-style fg='#121212',bg='yellow'
+set -g copy-mode-match-style 'reverse'
diff --git a/home/modules/shell.nix b/home/modules/shell.nix
index df01c42..fb07dca 100644
--- a/home/modules/shell.nix
+++ b/home/modules/shell.nix
@@ -42,70 +42,72 @@ in
imagemagick
];
- home.sessionVariables = {
- LESSHISTFILE = "-";
- GRADLE_USER_HOME = "${config.xdg.configHome}/gradle";
- LIBVIRT_DEFAULT_URI = "qemu:///system";
- MBSYNCRC = "${config.xdg.configHome}/mbsync/config";
- PARALLEL_HOME = "${config.xdg.configHome}/parallel";
- PASSWORD_STORE_DIR = "${config.xdg.dataHome}/pass";
- PRETTIERD_CONFIG_HOME = "${config.xdg.stateHome}/prettierd";
- }
- // lib.optionalAttrs ripgrep {
- RIPGREP_CONFIG_PATH = "${config.xdg.configHome}/rg/config";
- }
- // lib.optionalAttrs rust {
- CARGO_HOME = "${config.xdg.dataHome}/cargo";
- RUSTUP_HOME = "${config.xdg.dataHome}/rustup";
- }
- // lib.optionalAttrs go {
- GOPATH = "${config.xdg.dataHome}/go";
- GOMODCACHE = "${config.xdg.cacheHome}/go/mod";
- }
- // lib.optionalAttrs node {
- NPM_CONFIG_USERCONFIG = "${config.xdg.configHome}/npm/npmrc";
- NODE_REPL_HISTORY = "${config.xdg.stateHome}/node_repl_history";
- PNPM_HOME = "${config.xdg.dataHome}/pnpm";
- PNPM_NO_UPDATE_NOTIFIER = "true";
- }
- // lib.optionalAttrs python {
- PYTHONSTARTUP = "${config.xdg.configHome}/python/pythonrc";
- PYTHON_HISTORY = "${config.xdg.stateHome}/python_history";
- PYTHONPYCACHEPREFIX = "${config.xdg.cacheHome}/python";
- PYTHONUSERBASE = "${config.xdg.dataHome}/python";
- MYPY_CACHE_DIR = "${config.xdg.cacheHome}/mypy";
- JUPYTER_CONFIG_DIR = "${config.xdg.configHome}/jupyter";
- JUPYTER_PLATFORM_DIRS = "1";
- }
- // lib.optionalAttrs ocaml {
- OPAMROOT = "${config.xdg.dataHome}/opam";
- }
- // lib.optionalAttrs docker {
- DOCKER_CONFIG = "${config.xdg.configHome}/docker";
- }
- // lib.optionalAttrs aws {
- AWS_SHARED_CREDENTIALS_FILE = "${config.xdg.configHome}/aws/credentials";
- AWS_CONFIG_FILE = "${config.xdg.configHome}/aws/config";
- BOTO_CONFIG = "${config.xdg.configHome}/boto/config";
- }
- // lib.optionalAttrs psql {
- PSQL_HISTORY = "${config.xdg.stateHome}/psql_history";
- }
- // lib.optionalAttrs sqlite {
- SQLITE_HISTORY = "${config.xdg.stateHome}/sqlite_history";
- }
- // lib.optionalAttrs tex {
- TEXMFHOME = "${config.xdg.dataHome}/texmf";
- TEXMFVAR = "${config.xdg.cacheHome}/texlive/texmf-var";
- TEXMFCONFIG = "${config.xdg.configHome}/texlive/texmf-config";
- };
+ home.sessionVariables = lib.mkMerge [
+ {
+ LESSHISTFILE = "-";
+ GRADLE_USER_HOME = "${config.xdg.configHome}/gradle";
+ LIBVIRT_DEFAULT_URI = "qemu:///system";
+ MBSYNCRC = "${config.xdg.configHome}/mbsync/config";
+ PARALLEL_HOME = "${config.xdg.configHome}/parallel";
+ PASSWORD_STORE_DIR = "${config.xdg.dataHome}/pass";
+ PRETTIERD_CONFIG_HOME = "${config.xdg.stateHome}/prettierd";
+ }
+ (lib.mkIf ripgrep {
+ RIPGREP_CONFIG_PATH = "${config.xdg.configHome}/rg/config";
+ })
+ (lib.mkIf rust {
+ CARGO_HOME = "${config.xdg.dataHome}/cargo";
+ RUSTUP_HOME = "${config.xdg.dataHome}/rustup";
+ })
+ (lib.mkIf go {
+ GOPATH = "${config.xdg.dataHome}/go";
+ GOMODCACHE = "${config.xdg.cacheHome}/go/mod";
+ })
+ (lib.mkIf node {
+ NPM_CONFIG_USERCONFIG = "${config.xdg.configHome}/npm/npmrc";
+ NODE_REPL_HISTORY = "${config.xdg.stateHome}/node_repl_history";
+ PNPM_HOME = "${config.xdg.dataHome}/pnpm";
+ PNPM_NO_UPDATE_NOTIFIER = "true";
+ })
+ (lib.mkIf python {
+ PYTHONSTARTUP = "${config.xdg.configHome}/python/pythonrc";
+ PYTHON_HISTORY = "${config.xdg.stateHome}/python_history";
+ PYTHONPYCACHEPREFIX = "${config.xdg.cacheHome}/python";
+ PYTHONUSERBASE = "${config.xdg.dataHome}/python";
+ MYPY_CACHE_DIR = "${config.xdg.cacheHome}/mypy";
+ JUPYTER_CONFIG_DIR = "${config.xdg.configHome}/jupyter";
+ JUPYTER_PLATFORM_DIRS = "1";
+ })
+ (lib.mkIf ocaml {
+ OPAMROOT = "${config.xdg.dataHome}/opam";
+ })
+ (lib.mkIf docker {
+ DOCKER_CONFIG = "${config.xdg.configHome}/docker";
+ })
+ (lib.mkIf aws {
+ AWS_SHARED_CREDENTIALS_FILE = "${config.xdg.configHome}/aws/credentials";
+ AWS_CONFIG_FILE = "${config.xdg.configHome}/aws/config";
+ BOTO_CONFIG = "${config.xdg.configHome}/boto/config";
+ })
+ (lib.mkIf psql {
+ PSQL_HISTORY = "${config.xdg.stateHome}/psql_history";
+ })
+ (lib.mkIf sqlite {
+ SQLITE_HISTORY = "${config.xdg.stateHome}/sqlite_history";
+ })
+ (lib.mkIf tex {
+ TEXMFHOME = "${config.xdg.dataHome}/texmf";
+ TEXMFVAR = "${config.xdg.cacheHome}/texlive/texmf-var";
+ TEXMFCONFIG = "${config.xdg.configHome}/texlive/texmf-config";
+ })
+ ];
- home.sessionPath = [
- "${config.home.homeDirectory}/.local/bin"
- ]
- ++ lib.optionals rust [ "${config.xdg.dataHome}/cargo/bin" ]
- ++ lib.optionals go [ "${config.xdg.dataHome}/go/bin" ]
- ++ lib.optionals node [ "${config.xdg.dataHome}/pnpm" ];
+ home.sessionPath = lib.mkMerge [
+ [ "${config.home.homeDirectory}/.local/bin" ]
+ (lib.mkIf rust [ "${config.xdg.dataHome}/cargo/bin" ])
+ (lib.mkIf go [ "${config.xdg.dataHome}/go/bin" ])
+ (lib.mkIf node [ "${config.xdg.dataHome}/pnpm" ])
+ ];
xdg.configFile."aws/config" = lib.mkIf aws {
text = ''
@@ -437,134 +439,14 @@ in
set -g lock-after-time 300
set -g lock-command "pipes -p 2"
- set -g @resurrect-dir '~/.local/state/tmux/resurrect'
+ set -g @resurrect-dir '${config.xdg.stateHome}/tmux/resurrect'
set -g @resurrect-capture-pane-contents on
'';
};
- xdg.configFile."tmux/themes/midnight.conf".text = ''
- set -g status-bg '#121212'
- set -g status-fg '#e0e0e0'
- set -g window-status-style fg='#e0e0e0'
- set -g window-status-current-style fg='#e0e0e0'
- set -g window-status-bell-style fg='#ff6b6b',bg='#121212',bold
- set -g window-status-activity-style fg='#7aa2f7',bg='#121212',bold
- set -g pane-border-style fg='#3d3d3d'
- set -g pane-active-border-style fg='#e0e0e0'
- set -g copy-mode-selection-style fg='#121212',bg='yellow'
- set -g copy-mode-current-match-style fg='#121212',bg='yellow'
- set -g copy-mode-match-style 'reverse'
- '';
+ xdg.configFile."tmux/themes/midnight.conf".source =
+ config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/config/tmux/themes/midnight.conf";
+ xdg.configFile."tmux/themes/daylight.conf".source =
+ config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/config/tmux/themes/daylight.conf";
- xdg.configFile."tmux/themes/daylight.conf".text = ''
- set -g status-bg '#f5f5f5'
- set -g status-fg '#1a1a1a'
- set -g window-status-style fg='#1a1a1a'
- set -g window-status-current-style fg='#1a1a1a'
- set -g window-status-bell-style fg='#c7254e',bg='#f5f5f5',bold
- set -g window-status-activity-style fg='#3b5bdb',bg='#f5f5f5',bold
- set -g pane-border-style fg='#e8e8e8'
- set -g pane-active-border-style fg='#1a1a1a'
- set -g copy-mode-selection-style fg='#f5f5f5',bg='yellow'
- set -g copy-mode-current-match-style fg='#f5f5f5',bg='yellow'
- set -g copy-mode-match-style 'reverse'
- '';
-
- programs.lf = {
- enable = true;
- settings = {
- drawbox = true;
- number = true;
- relativenumber = true;
- hidden = true;
- shell = "zsh";
- icons = false;
- incsearch = true;
- scrolloff = 4;
- tabstop = 2;
- smartcase = true;
- dircounts = true;
- info = "size";
- ratios = "1:2:3";
- timefmt = "2006-01-02 15:04:05 -0700";
- previewer = "~/.config/lf/previewer";
- cleaner = "~/.config/lf/cleaner";
- };
-
- commands = {
- open = ''
- $${{
- setsid -f xdg-open "$f" 2>/dev/null 2>&1 &
- }}'';
- sopen = ''
- $${{
- for f in $fx; do
- setsid -f xdg-open "$f" >/dev/null 2>&1 &
- done
- }}'';
- rmd = ''
- $${{
- set -f
- while IFS= read -r dir; do
- rmdir -v -- "$dir"
- done <<< "$fx"
- }}'';
- rmf = ''
- $${{
- set -f
- while IFS= read -r file; do
- rm -v -- "$file"
- done <<< "$fx"
- }}'';
- resize = ''
- %{{
- w=$(tmux display-message -p '#{pane_width}' || tput cols)
- if [ $w -le 62 ]; then
- lf -remote "send $id set ratios 1:4"
- lf -remote "send $id set nopreview"
- elif [ $w -le 80 ]; then
- lf -remote "send $id set ratios 1:2:2"
- elif [ $w -le 100 ]; then
- lf -remote "send $id set ratios 1:2:3"
- else
- lf -remote "send $id set ratios 2:4:5"
- fi
- }}'';
- on-init = ''
- %{{
- lf -remote "send $id resize"
- }}'';
- };
-
- keybindings = {
- "" = ":sopen; quit";
- "." = "set hidden!";
- "ad" = "push $mkdir";
- "af" = "push $touch";
- "xd" = "rmd";
- "xf" = "rmf";
- "H" = "jump-prev";
- "L" = "jump-next";
- "" = ''$lf -remote "send $id select $(fzf)"'';
- "zz" = "push :z";
- };
-
- extraConfig = ''
- set shellopts '-eu'
- set ifs "\n"
- '';
- };
-
- xdg.configFile."lf/previewer" = {
- source = config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/config/lf/previewer";
- };
-
- xdg.configFile."lf/cleaner" = {
- source = config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/config/lf/cleaner";
- };
-
- xdg.configFile."lf/lf.lua".source =
- config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/config/lf/lf.lua";
- xdg.configFile."lf/sort.py".source =
- config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/config/lf/sort.py";
}
diff --git a/home/modules/ui.nix b/home/modules/ui.nix
index b6d3f65..664b1d2 100644
--- a/home/modules/ui.nix
+++ b/home/modules/ui.nix
@@ -35,7 +35,7 @@ in
brightnessctl
pamixer
socat
- glib
+ glib.bin
gsettings-desktop-schemas
(python3.withPackages (ps: [ ps.pillow ]))
];
@@ -168,88 +168,19 @@ in
'';
};
- programs.rofi = {
- enable = true;
- package = pkgs.rofi;
- font = "Berkeley Mono 15";
- extraConfig = {
- show-icons = false;
- };
- theme =
- let
- inherit (config.lib.formats.rasi) mkLiteral;
- in
- {
- "*" = {
- selected-normal-foreground = mkLiteral "${c.fg}";
- foreground = mkLiteral "${c.fg}";
- normal-foreground = mkLiteral "@foreground";
- alternate-normal-background = mkLiteral "${c.bg}";
- background = mkLiteral "${c.bgAlt}";
- alternate-normal-foreground = mkLiteral "@foreground";
- normal-background = mkLiteral "@background";
- selected-normal-background = mkLiteral "${c.accent}";
- border-color = mkLiteral "${c.fgAlt}";
- spacing = 2;
- separatorcolor = mkLiteral "@foreground";
- background-color = mkLiteral "rgba ( 0, 0, 0, 0 % )";
- };
- window = {
- background-color = mkLiteral "@background";
- border = 1;
- padding = 5;
- };
- mainbox = {
- border = 0;
- padding = 0;
- };
- listview = {
- fixed-height = 0;
- border = mkLiteral "2px 0px 0px";
- border-color = mkLiteral "@separatorcolor";
- spacing = mkLiteral "2px";
- scrollbar = false;
- padding = mkLiteral "2px 0px 0px";
- };
- element = {
- border = 0;
- padding = mkLiteral "1px";
- };
- element-text = {
- background-color = mkLiteral "inherit";
- text-color = mkLiteral "inherit";
- };
- "element.normal.normal" = {
- background-color = mkLiteral "@normal-background";
- text-color = mkLiteral "@normal-foreground";
- };
- "element.selected.normal" = {
- background-color = mkLiteral "@selected-normal-background";
- text-color = mkLiteral "@selected-normal-foreground";
- };
- "element.alternate.normal" = {
- background-color = mkLiteral "@alternate-normal-background";
- text-color = mkLiteral "@alternate-normal-foreground";
- };
- inputbar = {
- spacing = 0;
- text-color = mkLiteral "@normal-foreground";
- padding = mkLiteral "1px";
- children = map mkLiteral [
- "prompt"
- "textbox-prompt-colon"
- "entry"
- "case-indicator"
- ];
- };
- textbox-prompt-colon = {
- expand = false;
- str = ":";
- margin = mkLiteral "0px 0.3em 0em 0em";
- text-color = mkLiteral "@normal-foreground";
- };
- };
- };
+ home.packages = [ pkgs.rofi ];
+
+ xdg.configFile."rofi/config.rasi".source =
+ config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/config/rofi/config.rasi";
+ xdg.configFile."rofi/themes/midnight.rasi".source =
+ config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/config/rofi/themes/midnight.rasi";
+ xdg.configFile."rofi/themes/daylight.rasi".source =
+ config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/config/rofi/themes/daylight.rasi";
+
+ home.activation.linkRofiTheme = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
+ target="${config.xdg.configHome}/rofi/themes/theme.rasi"
+ $DRY_RUN_CMD ln -sf "${config.xdg.configHome}/rofi/themes/${config.theme}.rasi" "$target"
+ '';
services.dunst = {
enable = true;