78 lines
3.0 KiB
Nix
78 lines
3.0 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
vaculib,
|
|
vacuModuleType,
|
|
...
|
|
}:
|
|
let
|
|
cfg = config.vacu.shell;
|
|
# https://en.wikipedia.org/wiki/ANSI_escape_code#Colors
|
|
colors = vaculib.shellColors;
|
|
|
|
# TODO: reset_without_clear doesn't fully work
|
|
# thanks colin https://git.uninsane.org/colin/nix-files/src/commit/7f5b2628016c8ca1beec417766157c7676a9c5e5/hosts/common/programs/zsh/starship.nix#L24
|
|
set = opt: "\\e[?${opt}h";
|
|
clear = opt: "\\e[?${opt}l";
|
|
reset_without_clear = builtins.concatStringsSep "" [
|
|
# reset terminal mode (in case the previous command screwed with it)
|
|
# 'l' = turn option of, 'h' = turn option on.
|
|
#
|
|
# options are enumerated in Alacritty's VTE library's `PrivateMode` type:
|
|
# - <https://github.com/alacritty/vte/blob/ebc4a4d7259678a8626f5c269ea9348dfc3e79b2/src/ansi.rs#L845>
|
|
# see also the reset code path (does a bit too much, like clearing the screen):
|
|
# - <https://github.com/alacritty/alacritty/blob/6067787763e663bd308e5b724a5efafc2c54a3d1/alacritty_terminal/src/term/mod.rs#L1802>
|
|
# and the crucial TermMode::default: <https://github.com/alacritty/alacritty/blob/master/alacritty_terminal/src/term/mod.rs#L113>
|
|
#
|
|
# query the state of any mode bit `<n>` with `printf '\033[?<n>$p'`
|
|
# e.g. `printf '\033[?7$p'` returns `^[[?7;1$y` with the `1` indicating it's **set**,
|
|
# `printf '\033[?1000$p'` returns `^[[?1000;2$y` with the `2` indicating it's **unset**.
|
|
#
|
|
# TODO: unset Line mode and Insert mode?
|
|
(clear "1") # Cursor Keys
|
|
# (clear "3") # Column Mode (i.e. clear screen/history)
|
|
(clear "6") # Origin
|
|
(set "7") # Line Wrap
|
|
(clear "12") # Blinking Cursor
|
|
(set "25") # Show Cursor
|
|
(clear "1000") # Report Mouse Clicks
|
|
(clear "1002") # Report Cell Mouse Motion
|
|
(clear "1003") # Report All Mouse Motion
|
|
(clear "1004") # Report Focus In/Out
|
|
(clear "1005") # UTF8 Mouse
|
|
(clear "1006") # Sgr Mouse
|
|
(set "1007") # Alternate Scroll
|
|
(set "1042") # Urgency Hints
|
|
# (clear "1049") # Swap Screen And Set Restore Cursor
|
|
(clear "2004") # Bracketed Paste
|
|
(clear "2026") # Sync Update
|
|
];
|
|
# https://man.archlinux.org/man/bash.1#PROMPTING
|
|
# \[ and \] begins and ends "a sequence of non-printing characters"
|
|
set_color = colornum: "\\[\\e[1;${toString colornum}m\\]";
|
|
set_inverted_color = colornum: "\\[\\e[1;37;${toString (colornum + 10)}m\\]";
|
|
reset_color = "\\[\\e[0m\\]";
|
|
colornum = colors.${cfg.color};
|
|
root_text = root: lib.optionalString root "ROOT@";
|
|
final = root: if root then (set_inverted_color colors.red) + "!!" else "$";
|
|
hostName = if vacuModuleType == "plain" then "\\h" else config.vacu.shortHostName;
|
|
default_ps1 =
|
|
root:
|
|
"\\n"
|
|
# + ''\[${reset_without_clear}\]''
|
|
+ (set_color colornum)
|
|
+ "${root_text root}${hostName}:\\w"
|
|
+ (final root)
|
|
+ reset_color
|
|
+ " ";
|
|
in
|
|
{
|
|
vacu.shell.idempotentShellLines = ''
|
|
if [ $UID = 0 ]; then
|
|
export PS1=${lib.escapeShellArg (default_ps1 true)}
|
|
else
|
|
export PS1=${lib.escapeShellArg (default_ps1 false)}
|
|
fi
|
|
'';
|
|
}
|