diff options
Diffstat (limited to 'modules/terminal/system/programs')
| -rw-r--r-- | modules/terminal/system/programs/cmus.nix | 83 | ||||
| -rw-r--r-- | modules/terminal/system/programs/fish.nix | 57 | ||||
| -rw-r--r-- | modules/terminal/system/programs/git.nix | 29 | ||||
| -rw-r--r-- | modules/terminal/system/programs/helix.nix | 139 | ||||
| -rw-r--r-- | modules/terminal/system/programs/lazygit.nix | 26 | ||||
| -rw-r--r-- | modules/terminal/system/programs/starship.nix | 48 | ||||
| -rw-r--r-- | modules/terminal/system/programs/tmux.nix | 164 |
7 files changed, 546 insertions, 0 deletions
diff --git a/modules/terminal/system/programs/cmus.nix b/modules/terminal/system/programs/cmus.nix new file mode 100644 index 0000000..3f1639b --- /dev/null +++ b/modules/terminal/system/programs/cmus.nix @@ -0,0 +1,83 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.terminal.programs.cmus; + + scripts.statusDisplay = pkgs.writeShellScriptBin "status.sh" '' + while [ $# -ge 2 ]; do + eval _$1='$2' + shift + shift + done + + [ -d ~/.local/share/cmus ] || mkdir ~/.local/share/cmus + + if [ -n "$_file" ]; then + ${pkgs.ffmpeg}/bin/ffmpeg -i "$_file" -y -an -c:v copy ~/.local/share/cmus/curr_cover.jpg || rm ~/.local/share/cmus/curr_cover.jpg + fi + + if [[ "$_status" = "playing" ]]; then + notify-send -t 3000 -u low -i ~/.local/share/cmus/curr_cover.jpg "Now Playing: $_title" "$_artist" + fi + ''; + + cmus_theme = pkgs.writeText "catppuccin.theme" '' + set color_cmdline_bg=default + set color_cmdline_fg=default + set color_error=211 + set color_info=223 + set color_separator=8 + set color_statusline_bg=default + set color_statusline_fg=default + set color_titleline_bg=183 + set color_titleline_fg=8 + set color_titleline_attr=bold + set color_win_bg=default + set color_win_cur=117 + set color_win_cur_sel_bg=117 + set color_win_cur_sel_fg=235 + set color_win_dir=default + set color_win_fg=default + set color_win_inactive_cur_sel_bg=0 + set color_win_inactive_cur_sel_fg=default + set color_win_inactive_sel_bg=0 + set color_win_inactive_sel_fg=default + set color_win_sel_bg=15 + set color_win_sel_fg=235 + set color_win_title_bg=default + set color_win_title_fg=183 + set color_win_title_attr=bold + ''; + + cmus_rc = pkgs.writeText "rc" '' + colorscheme catppuccin + set status_display_program=${scripts.statusDisplay}/bin/status.sh + ''; + + cava_config = pkgs.writeText "config" '' + [color] + gradient=1 + gradient_color_1='#94e2d5' + gradient_color_2='#89dceb' + gradient_color_3='#74c7ec' + gradient_color_4='#89b4fa' + gradient_color_5='#cba6f7' + gradient_color_6='#f5c2e7' + gradient_color_7='#eba0ac' + gradient_color_8='#f38ba8' + ''; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/cmus/rc".source = cmus_rc; + ".config/cmus/catppuccin.theme".source = cmus_theme; + ".config/cava/config".source = cava_config; + }; + + packages = with pkgs; [cava cmus]; + }; + } diff --git a/modules/terminal/system/programs/fish.nix b/modules/terminal/system/programs/fish.nix new file mode 100644 index 0000000..89d26ef --- /dev/null +++ b/modules/terminal/system/programs/fish.nix @@ -0,0 +1,57 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.terminal.shells.fish; + + init = pkgs.writeText "config.fish" '' + set fish_greeting + + function starship_transient_prompt_func + ${pkgs.starship}/bin/starship module character + end + + if status is-interactive + alias cat bat + + alias eza "eza -A -w 80 --group-directories-first -I '.git*'" + alias ls eza + alias tree "ls -T" + + ${pkgs.fzf}/bin/fzf --fish | source + ${pkgs.starship}/bin/starship init fish | source + + enable_transience + + # env vars + set -x EDITOR hx + set -x NH_FLAKE "$HOME/nixos" + + set -x BAT_THEME "base16" + set -x FZF_DEFAULT_OPTS "--color bg:#1E1E2E,bg+:#313244,border:#313244,fg:#CDD6F4,fg+:#CDD6F4,header:#F38BA8,hl:#F38BA8,hl+:#F38BA8,info:#CBA6F7,label:#CDD6F4,marker:#B4BEFE,pointer:#F5E0DC,prompt:#CBA6F7,selected-bg:#45475A,spinner:#F5E0DC" + end + ''; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/fish/config.fish".source = init; + }; + + packages = with pkgs; [ + fish + bat + eza + fzf + ripgrep + fd + moreutils + zip + unzip + btop + jq + ]; + }; + } diff --git a/modules/terminal/system/programs/git.nix b/modules/terminal/system/programs/git.nix new file mode 100644 index 0000000..b7c85bc --- /dev/null +++ b/modules/terminal/system/programs/git.nix @@ -0,0 +1,29 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.collinux.terminal.programs.git; + + git_config = pkgs.writeText "config" '' + [alias] + stage = "add" + unstage = "restore --staged" + + [init] + defaultBranch = "main" + + [user] + email = "${cfg.userEmail}" + name = "${cfg.userName}" + ''; +in { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/git/config".source = git_config; + }; + + packages = [pkgs.git]; + }; +} diff --git a/modules/terminal/system/programs/helix.nix b/modules/terminal/system/programs/helix.nix new file mode 100644 index 0000000..4ba78d0 --- /dev/null +++ b/modules/terminal/system/programs/helix.nix @@ -0,0 +1,139 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.terminal.programs.helix; + toml' = pkgs.formats.toml {}; + + languages = toml'.generate "languages.toml" { + language = [ + { + name = "nix"; + file-types = ["nix"]; + language-servers = ["nil"]; + indent = { + tab-width = 2; + unit = " "; + }; + formatter.command = "${pkgs.alejandra}/bin/alejandra"; + auto-format = true; + } + { + name = "html"; + file-types = ["html"]; + language-servers = ["superhtml"]; + auto-format = true; + } + ]; + }; + + customCatppuccinTheme = toml'.generate "catppuccin_mocha_transparent.toml" { + inherits = "catppuccin_mocha"; + "ui.background" = {}; + }; + + mkHelixConfig = { + theme, + hardMode ? false, + }: + toml'.generate "config.toml" { + inherit theme; + editor = { + gutters = ["diff" "diagnostics" "line-numbers" "spacer" "spacer"]; + cursorline = true; + color-modes = true; + + mouse = !hardMode; + + lsp.display-inlay-hints = true; + + statusline = { + left = ["mode" "file-name" "spacer" "file-modification-indicator"]; + right = ["spinner" "spacer" "workspace-diagnostics" "file-type"]; + separator = "x"; + }; + + cursor-shape = { + insert = "bar"; + normal = "block"; + select = "underline"; + }; + }; + keys = { + normal = + { + "C-space" = "expand_selection"; + "A-j" = ["extend_to_line_bounds" "delete_selection" "paste_after"]; + "A-k" = ["extend_to_line_bounds" "delete_selection" "move_line_up" "paste_before"]; + "X" = ["extend_line_up" "extend_to_line_bounds"]; + "C-left" = "goto_line_start"; + "C-right" = "goto_line_end"; + ";" = "flip_selections"; + "esc" = ["collapse_selection" "keep_primary_selection"]; + + # I don't even use these anyway + "pageup" = "no_op"; + "pagedown" = "no_op"; + "home" = "no_op"; + "end" = "no_op"; + } + // ( + if hardMode + then { + "up" = "no_op"; + "down" = "no_op"; + "left" = "no_op"; + "right" = "no_op"; + } + else {} + ); + + insert = + { + "pageup" = "no_op"; + "pagedown" = "no_op"; + "home" = "no_op"; + "end" = "no_op"; + } + // ( + if hardMode + then { + "up" = "no_op"; + "down" = "no_op"; + "left" = "no_op"; + "right" = "no_op"; + } + else {} + ); + + select = { + "esc" = ["collapse_selection" "insert_mode"]; + }; + }; + }; + + settings = mkHelixConfig { + inherit (cfg) hardMode; + theme = + if cfg.theme == "catppuccin" + then "catppuccin_mocha_transparent" + else if cfg.theme == "adwaita" + then "adwaita_dark" + else ""; + }; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/helix/config.toml".source = settings; + ".config/helix/languages.toml".source = languages; + ".config/helix/themes/catppuccin_mocha_transparent.toml".source = customCatppuccinTheme; + }; + + packages = [ + pkgs.helix + ]; + }; + } diff --git a/modules/terminal/system/programs/lazygit.nix b/modules/terminal/system/programs/lazygit.nix new file mode 100644 index 0000000..4c048a0 --- /dev/null +++ b/modules/terminal/system/programs/lazygit.nix @@ -0,0 +1,26 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.terminal.programs.lazygit; + yaml' = pkgs.formats.yaml {}; + + settings = yaml'.generate "config.yml" { + git.paging.pager = "${pkgs.diff-so-fancy}/bin/diff-so-fancy"; + gui = { + showRandomTip = false; + commitLength.show = false; + }; + }; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/lazygit/config.yml".source = settings; + }; + + packages = [pkgs.lazygit]; + }; + } diff --git a/modules/terminal/system/programs/starship.nix b/modules/terminal/system/programs/starship.nix new file mode 100644 index 0000000..60fcc00 --- /dev/null +++ b/modules/terminal/system/programs/starship.nix @@ -0,0 +1,48 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.terminal.programs.starship; + toml' = pkgs.formats.toml {}; + + settings = toml'.generate "starship.toml" { + format = ''$directory$git_branch$git_status $character''; + + add_newline = false; + scan_timeout = 10; + + character = { + success_symbol = "[λ](green bold)"; + error_symbol = "[Σ](red bold)"; + }; + + git_branch.format = "[@$branch](underline)"; + + git_status = { + format = "$modified$staged$ahead$behind"; + modified = "[!](red bold)"; + staged = "[+](green bold)"; + ahead = "[](green)"; + behind = "[](red)"; + }; + + directory = { + format = "$path"; + truncation_length = 3; + truncate_to_repo = true; + }; + }; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/starship.toml".source = settings; + }; + + packages = [ + pkgs.starship + ]; + }; + } diff --git a/modules/terminal/system/programs/tmux.nix b/modules/terminal/system/programs/tmux.nix new file mode 100644 index 0000000..b947d95 --- /dev/null +++ b/modules/terminal/system/programs/tmux.nix @@ -0,0 +1,164 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.terminal.programs.tmux; + + scripts.bat = pkgs.writeShellScriptBin "battery.sh" '' + energy_now=$(cat /sys/class/power_supply/BAT0/energy_now) + energy_full=$(cat /sys/class/power_supply/BAT0/energy_full) + percentage=$((energy_now * 100 / energy_full)) + printf "%.0f%%" "$percentage" + ''; + + scripts.primeProjects = pkgs.writeShellScriptBin "projects.sh" '' + FZF_DEFAULT_OPTS="--color bg:#1E1E2E,bg+:#313244,border:#313244,fg:#CDD6F4,fg+:#CDD6F4,header:#F38BA8,hl:#F38BA8,hl+:#F38BA8,info:#CBA6F7,label:#CDD6F4,marker:#B4BEFE,pointer:#F5E0DC,prompt:#CBA6F7,selected-bg:#45475A,spinner:#F5E0DC" + + projects=" + $(find $HOME/projects -maxdepth 1 -mindepth 1 -type d) + $HOME/Documents/brain2.0 + $HOME/Music + $HOME/nixos + " + if [ $# -eq 1 ]; then + selected="$1" + else + selected="$(echo "$projects" | fzf --tmux --style=minimal --info=hidden $FZF_DEFAULT_OPTS)" + fi + + [ -z "$selected" ] && exit + + session_name="$(basename "$selected" | tr '.' '_')" + + if tmux list-sessions | grep -q "^$session_name:"; then + # session already exists, switch to it + tmux switch -t "$session_name" + else + # session doesn't exist, create it and switch to it + tmux new-session -ds "$session_name" -c "$selected" + tmux switch -t "$session_name" + fi + ''; + + scripts.cleanSessions = pkgs.writeShellScriptBin "clean-sessions.sh" '' + current="$(tmux display-message -p '#S')" + + tmux list-sessions -F '#S' | while read -r line; do + if [[ "$line" != "$current" && "$line" =~ ^[[:digit:]]+$ ]]; then + tmux kill-session -t "$line" + fi + done + ''; + + scripts.bar = pkgs.writeShellScriptBin "bar.sh" '' + text="#c6d0f5" + text_dark="#7F849C" + blue="#b3befe" + green="#a6d189" + red="#f38ba8" + bg_dark="#181825" + bg_light="#1E1E2E" + + tset() { + tmux set -gq "$@" + } + + tset status on + + tset status-position bottom + tset status-justify absolute-centre + tset status-bg $bg_light + + tset status-left-style fg=$green + tset status-left " #{client_session} " + + tset window-status-style fg=$text_dark + tset window-status-format "#I:#W" + tset window-status-current-style fg=$blue,bold + tset window-status-current-format "#I:#W" + tset window-status-separator " " + + tset status-right-style fg=$red + tset status-right "#(${scripts.bat}/bin/battery.sh)" + + ## pane borders + tset pane-border-style fg=$bg_dark,bg=$bg_dark + tset pane-active-border-style fg=$bg_dark,bg=$bg_dark + + ## pane backgrounds + # Set the foreground/background color for the active window + tset window-active-style bg=$bg_light + + # Set the foreground/background color for all other windows + tset window-style bg=$bg_dark + ''; + + plugins.tmux-resurrect = builtins.fetchGit { + url = "https://github.com/tmux-plugins/tmux-resurrect"; + rev = "cff343cf9e81983d3da0c8562b01616f12e8d548"; + }; + + tmux-conf = pkgs.writeText "tmux.conf" '' + # Resurrect + run-shell ${plugins.tmux-resurrect}/resurrect.tmux + set -g @resurrect-dir "$HOME/.local/share/tmux-resurrect" + set -g @resurrect-processes 'hx cmus cava nix-shell' + + set -g mouse on + + # bell + set -g visual-activity off + set -g visual-bell off + set -g visual-silence off + setw -g monitor-activity off + set -g bell-action none + + # Panes + bind-key -n C-w kill-pane + + bind -n C-Enter if -F '#{e|>:#{e|/:#{pane_width},#{pane_height}},2.5}' { + split-window -h -c '#{pane_current_path}' + } { + split-window -v -c '#{pane_current_path}' + } + + unbind -n MouseDown3Pane ## disable right click menu + bind-key -n M-z resize-pane -Z ## Pane zoom + + # Windows + bind-key -n C-t new-window -c '#{pane_current_path}' + bind-key -n C-Tab next-window + bind-key -n C-S-Tab previous-window # doesn't work in foot :( + + set -g renumber-windows on + set -g allow-rename off + + # Statusbar + set-hook -g client-attached 'if -F "#{==:#{session_windows},1}" { set status off } { set status on }' + set-hook -g window-linked 'if -F "#{==:#{session_windows},1}" { set status off } { set status on }' + set-hook -g window-unlinked 'if -F "#{==:#{session_windows},1}" { set status off } { set status on }' + + run-shell "${scripts.bar}/bin/bar.sh" + + # Sessions + # set-hook -ag client-detached 'run-shell ${scripts.cleanSessions}/bin/clean-sessions.sh' + # set-hook -ag client-session-changed 'run-shell ${scripts.cleanSessions}/bin/clean-sessions.sh' + + bind-key -n C-f run-shell "${scripts.primeProjects}/bin/projects.sh" + bind-key -n M-1 run-shell "${scripts.primeProjects}/bin/projects.sh ~/Music" + bind-key -n M-2 run-shell "${scripts.primeProjects}/bin/projects.sh ~/Documents/brain2.0" + bind-key -n M-3 run-shell "${scripts.primeProjects}/bin/projects.sh ~/nixos" + + bind-key -n C-g display-popup -E -w 80% -h 80% -x C -y C -d "#{pane_current_path}" "${pkgs.lazygit}/bin/lazygit" + ''; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/tmux/tmux.conf".source = tmux-conf; + }; + packages = [pkgs.tmux]; + }; + } |
