Compare commits

...
Sign in to create a new pull request.

9 commits

Author SHA1 Message Date
2e1f408dbf WIP: xterm.js
All checks were successful
ci/woodpecker/push/check Pipeline was successful
2025-09-05 19:13:42 +01:00
82cd41cc54 [2] WIP: home: tmux: fix undercurl rendering 2025-09-05 19:13:42 +01:00
4460f095a5 home: tmux: fix undercurl rendering 2025-09-05 19:13:42 +01:00
5492365d0a home: tmux: refactor 'mkTerminalFlags'
I'm about to add a similar helper for `terminal-overrides`, hence making
`mkTerminalFlags` the helper and `mkTerminalFeatures` the new function.
2025-09-05 19:13:42 +01:00
0a927c5cc0 home: terminal: termite: add 'enable' 2025-09-04 19:47:43 +01:00
5e5f63eb26 home: terminal: alacritty: add 'enable' 2025-09-04 19:47:43 +01:00
8b028ce19f home: terminal: rename 'default'
It doesn't make the *most* sense as an option name to use `program`.
2025-09-04 19:47:38 +01:00
d4668416af home: terminal: use 'colors' directly 2025-09-04 19:46:28 +01:00
88b943076d home: terminal: use 'colors' directly 2025-09-04 19:46:28 +01:00
10 changed files with 84 additions and 42 deletions

View file

@ -29,6 +29,8 @@
terminalFeatures = { terminalFeatures = {
# HTerm uses `xterm-256color` as its `$TERM`, so use that here # HTerm uses `xterm-256color` as its `$TERM`, so use that here
xterm-256color = { }; xterm-256color = { };
# Terminal app uses `xterm.js`, not HTerm
"xterm.js" = { };
}; };
}; };

View file

@ -35,6 +35,8 @@
terminalFeatures = { terminalFeatures = {
# HTerm uses `xterm-256color` as its `$TERM`, so use that here # HTerm uses `xterm-256color` as its `$TERM`, so use that here
xterm-256color = { }; xterm-256color = { };
# Terminal app uses `xterm.js`, not HTerm
"xterm.js" = { };
}; };
}; };
}; };

View file

@ -25,7 +25,7 @@
# Network-Manager applet # Network-Manager applet
nm-applet.enable = true; nm-applet.enable = true;
# Terminal # Terminal
terminal.program = "alacritty"; terminal.default = "alacritty";
# Transmission remote # Transmission remote
trgui.enable = true; trgui.enable = true;
# Zathura document viewer # Zathura document viewer

View file

@ -2,7 +2,7 @@
let let
cfg = config.my.home.firefox.tridactyl; cfg = config.my.home.firefox.tridactyl;
term = config.my.home.terminal.program; term = config.my.home.terminal.default;
vimCommandLine = { vimCommandLine = {
alacritty = ''-e "vim" "%f" "+normal!%lGzv%c|"''; alacritty = ''-e "vim" "%f" "+normal!%lGzv%c|"'';

View file

@ -1,9 +1,16 @@
{ config, lib, ... }: { config, lib, ... }:
let let
cfg = config.my.home.terminal; cfg = config.my.home.terminal.alacritty;
inherit (config.my.home.terminal) colors;
in in
{ {
config = lib.mkIf (cfg.program == "alacritty") { options.my.home.terminal.alacritty = with lib; {
enable = lib.mkEnableOption "alacritty" // {
default = config.my.home.terminal.default == "alacritty";
};
};
config = lib.mkIf cfg.enable {
programs.alacritty = { programs.alacritty = {
enable = true; enable = true;
@ -14,36 +21,36 @@ in
colors = { colors = {
primary = { primary = {
background = cfg.colors.background; background = colors.background;
foreground = cfg.colors.foreground; foreground = colors.foreground;
bright_foreground = cfg.colors.foregroundBold; bright_foreground = colors.foregroundBold;
}; };
cursor = { cursor = {
cursor = cfg.colors.cursor; cursor = colors.cursor;
}; };
normal = { normal = {
black = cfg.colors.black; black = colors.black;
red = cfg.colors.red; red = colors.red;
green = cfg.colors.green; green = colors.green;
yellow = cfg.colors.yellow; yellow = colors.yellow;
blue = cfg.colors.blue; blue = colors.blue;
magenta = cfg.colors.magenta; magenta = colors.magenta;
cyan = cfg.colors.cyan; cyan = colors.cyan;
white = cfg.colors.white; white = colors.white;
}; };
bright = { bright = {
black = cfg.colors.blackBold; black = colors.blackBold;
red = cfg.colors.redBold; red = colors.redBold;
green = cfg.colors.greenBold; green = colors.greenBold;
yellow = cfg.colors.yellowBold; yellow = colors.yellowBold;
blue = cfg.colors.blueBold; blue = colors.blueBold;
magenta = cfg.colors.magentaBold; magenta = colors.magentaBold;
cyan = cfg.colors.cyanBold; cyan = colors.cyanBold;
white = cfg.colors.whiteBold; white = colors.whiteBold;
}; };
}; };
}; };

View file

@ -16,11 +16,11 @@ in
options.my.home = with lib; { options.my.home = with lib; {
terminal = { terminal = {
program = mkOption { default = mkOption {
type = with types; nullOr (enum [ "alacritty" "termite" ]); type = with types; nullOr (enum [ "alacritty" "termite" ]);
default = null; default = null;
example = "termite"; example = "termite";
description = "Which terminal to use for home session"; description = "Which default terminal to use for home session";
}; };
colors = { colors = {
@ -56,7 +56,7 @@ in
}; };
}; };
config.home.sessionVariables = lib.mkIf (cfg.program != null) { config.home.sessionVariables = lib.mkIf (cfg.default != null) {
TERMINAL = cfg.program; TERMINAL = cfg.default;
}; };
} }

View file

@ -1,9 +1,16 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
let let
cfg = config.my.home.terminal; cfg = config.my.home.terminal.termite;
inherit (config.my.home.terminal) colors;
in in
{ {
config = lib.mkIf (cfg.program == "termite") { options.my.home.terminal.termite = with lib; {
enable = lib.mkEnableOption "termite" // {
default = config.my.home.terminal.default == "termite";
};
};
config = lib.mkIf cfg.enable {
programs.termite = { programs.termite = {
enable = true; enable = true;
@ -24,11 +31,11 @@ in
# Colors # Colors
backgroundColor = cfg.colors.background; backgroundColor = colors.background;
cursorColor = cfg.colors.cursor; cursorColor = colors.cursor;
foregroundColor = cfg.colors.foreground; foregroundColor = colors.foreground;
foregroundBoldColor = cfg.colors.foregroundBold; foregroundBoldColor = colors.foregroundBold;
colorsExtra = with cfg.colors; '' colorsExtra = with colors; ''
# Normal colors # Normal colors
color0 = ${black} color0 = ${black}
color1 = ${red} color1 = ${red}

View file

@ -6,13 +6,16 @@ let
(config.my.home.wm.windowManager != null) (config.my.home.wm.windowManager != null)
]; ];
mkTerminalFeature = opt: flag: mkTerminalFlag = tmuxVar: opt: flag:
let let
mkFlag = term: ''set -as terminal-features ",${term}:${flag}"''; mkFlag = term: ''set -as ${tmuxVar} ",${term}:${flag}"'';
enabledTerminals = lib.filterAttrs (_: v: v.${opt}) cfg.terminalFeatures; enabledTerminals = lib.filterAttrs (_: v: v.${opt}) cfg.terminalFeatures;
terminals = lib.attrNames enabledTerminals; terminals = lib.attrNames enabledTerminals;
in in
lib.concatMapStringsSep "\n" mkFlag terminals; lib.concatMapStringsSep "\n" mkFlag terminals;
mkTerminalFeature = mkTerminalFlag "terminal-features";
mkTerminalOverride = mkTerminalFlag "terminal-overrides";
in in
{ {
options.my.home.tmux = with lib; { options.my.home.tmux = with lib; {
@ -28,12 +31,14 @@ in
hyperlinks = my.mkDisableOption "hyperlinks through OSC8"; hyperlinks = my.mkDisableOption "hyperlinks through OSC8";
trueColor = my.mkDisableOption "24-bit (RGB) color support"; trueColor = my.mkDisableOption "24-bit (RGB) color support";
underscoreStyle = my.mkDisableOption "underscore style/color support";
}; };
}); });
default = { ${config.my.home.terminal.program} = { }; }; default = { ${config.my.home.terminal.default} = { }; };
defaultText = literalExpression '' defaultText = literalExpression ''
{ ''${config.my.home.terminal.program} = { }; }; { ''${config.my.home.terminal.default} = { }; };
''; '';
example = { xterm-256color = { }; }; example = { xterm-256color = { }; };
description = '' description = ''
@ -54,6 +59,20 @@ in
terminal = "tmux-256color"; # I want accurate termcap info terminal = "tmux-256color"; # I want accurate termcap info
aggressiveResize = true; # Automatic resize when switching client size aggressiveResize = true; # Automatic resize when switching client size
# FIXME
# * Sixel support
# * OSC 133 prompt integration
# FIXME: when sensible-on-top is disabled: check if any of those are unset
# * tmux bind-key $prefix_without_ctrl last-window
# *
# * tmux bind-key C-b send-prefix: included
# * aggressive resize? done
# * tmux bind-key C-p previous-window: done
# * tmux bind-key C-n next-window: done
# * C-r to refresh my config: done
# * tmux set-option -g focus-events on: done
# FIXME: make PRs for `bind-key` description
plugins = with pkgs.tmuxPlugins; builtins.filter (attr: attr != { }) [ plugins = with pkgs.tmuxPlugins; builtins.filter (attr: attr != { }) [
# Open high-lighted files in copy mode # Open high-lighted files in copy mode
open open
@ -126,6 +145,11 @@ in
${mkTerminalFeature "hyperlinks" "hyperlinks"} ${mkTerminalFeature "hyperlinks" "hyperlinks"}
# Force 24-bit color for each relevant $TERM # Force 24-bit color for each relevant $TERM
${mkTerminalFeature "trueColor" "RGB"} ${mkTerminalFeature "trueColor" "RGB"}
# Force underscore style/color for each relevant $TERM
${mkTerminalFeature "underscoreStyle" "usstyle"}
# FIXME: see https://github.com/folke/tokyonight.nvim#fix-undercurls-in-tmux for additional overrides
# ${mkTerminalOverride "underscoreStyle" "Smulx=\\E[4::%p1%dm"}
# ${mkTerminalOverride "underscoreStyle" "Setulc=\\E[58::2::::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m"}
''; '';
}; };
} }

View file

@ -3,8 +3,8 @@ let
isEnabled = config.my.home.wm.windowManager == "i3"; isEnabled = config.my.home.wm.windowManager == "i3";
terminal = terminal =
if config.my.home.terminal.program != null if config.my.home.terminal.default != null
then config.my.home.terminal.program then config.my.home.terminal.default
else "i3-sensible-terminal"; else "i3-sensible-terminal";
alt = "Mod1"; # `Alt` key alt = "Mod1"; # `Alt` key

View file

@ -7,7 +7,7 @@ in
programs.rofi = { programs.rofi = {
enable = true; enable = true;
terminal = config.my.home.terminal.program; # null by default terminal = config.my.home.terminal.default; # null by default
package = pkgs.rofi.override { package = pkgs.rofi.override {
plugins = with pkgs; [ plugins = with pkgs; [