nixos/foot: init

linsui 89f10dc1 c6afc4c6

Changed files
+167
nixos
doc
manual
release-notes
modules
+2
nixos/doc/manual/release-notes/rl-2411.section.md
···
- [Wakapi](https://wakapi.dev/), a time tracking software for programmers. Available as [services.wakapi](#opt-services.wakapi.enable).
+
- [foot](https://codeberg.org/dnkl/foot), a fast, lightweight and minimalistic Wayland terminal emulator. Available as [programs.foot](#opt-programs.foot.enable).
+
## Backward Incompatibilities {#sec-release-24.11-incompatibilities}
- `transmission` package has been aliased with a `trace` warning to `transmission_3`. Since [Transmission 4 has been released last year](https://github.com/transmission/transmission/releases/tag/4.0.0), and Transmission 3 will eventually go away, it was decided perform this warning alias to make people aware of the new version. The `services.transmission.package` defaults to `transmission_3` as well because the upgrade can cause data loss in certain specific usage patterns (examples: [#5153](https://github.com/transmission/transmission/issues/5153), [#6796](https://github.com/transmission/transmission/issues/6796)). Please make sure to back up to your data directory per your usage:
+1
nixos/modules/module-list.nix
···
./programs/fish.nix
./programs/flashrom.nix
./programs/flexoptix-app.nix
+
./programs/foot
./programs/freetds.nix
./programs/fuse.nix
./programs/fzf.nix
+27
nixos/modules/programs/foot/bashrc
···
+
osc7_cwd() {
+
local strlen=${#PWD}
+
local encoded=""
+
local pos c o
+
for (( pos=0; pos<strlen; pos++ )); do
+
c=${PWD:$pos:1}
+
case "$c" in
+
[-/:_.!\'\(\)~[:alnum:]] ) o="${c}" ;;
+
* ) printf -v o '%%%02X' "'${c}" ;;
+
esac
+
encoded+="${o}"
+
done
+
printf '\e]7;file://%s%s\e\\' "${HOSTNAME}" "${encoded}"
+
}
+
PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }osc7_cwd
+
+
prompt_marker() {
+
printf '\e]133;A\e\\'
+
}
+
PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }prompt_marker
+
+
PS0+='\e]133;C\e\\'
+
+
command_done() {
+
printf '\e]133;D\e\\'
+
}
+
PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }command_done
+20
nixos/modules/programs/foot/config.fish
···
+
function update_cwd_osc --on-variable PWD --description 'Notify terminals when $PWD changes'
+
if status --is-command-substitution || set -q INSIDE_EMACS
+
return
+
end
+
printf \e\]7\;file://%s%s\e\\ $hostname (string escape --style=url $PWD)
+
end
+
+
update_cwd_osc # Run once since we might have inherited PWD from a parent shell
+
+
function mark_prompt_start --on-event fish_prompt
+
echo -en "\e]133;A\e\\"
+
end
+
+
function foot_cmd_start --on-event fish_preexec
+
echo -en "\e]133;C\e\\"
+
end
+
+
function foot_cmd_end --on-event fish_postexec
+
echo -en "\e]133;D\e\\"
+
end
+92
nixos/modules/programs/foot/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
+
let
+
cfg = config.programs.foot;
+
+
settingsFormat = pkgs.formats.ini {
+
listsAsDuplicateKeys = true;
+
mkKeyValue =
+
with lib.generators;
+
mkKeyValueDefault {
+
mkValueString =
+
v:
+
mkValueStringDefault { } (
+
if v == true then
+
"yes"
+
else if v == false then
+
"no"
+
else if v == null then
+
"none"
+
else
+
v
+
);
+
} "=";
+
};
+
in
+
{
+
options.programs.foot = {
+
enable = lib.mkEnableOption "foot terminal emulator";
+
+
package = lib.mkPackageOption pkgs "foot" { };
+
+
settings = lib.mkOption {
+
inherit (settingsFormat) type;
+
default = { };
+
description = ''
+
Configuration for foot terminal emulator. Further information can be found in {command}`man 5 foot.ini`.
+
+
Global configuration has to be written under the [main] section.
+
'';
+
example = {
+
main.font = "FreeMono:size=12";
+
scrollback.lines = 100000;
+
};
+
};
+
+
theme = lib.mkOption {
+
type = with lib.types; nullOr str;
+
default = null;
+
description = ''
+
Theme name. Check <https://codeberg.org/dnkl/foot/src/branch/master/themes> for available themes.
+
'';
+
example = "aeroroot";
+
};
+
+
enableBashIntegration = lib.mkEnableOption "foot bash integration" // {
+
default = true;
+
};
+
+
enableFishIntegration = lib.mkEnableOption "foot fish integration" // {
+
default = true;
+
};
+
+
enableZshIntegration = lib.mkEnableOption "foot zsh integration" // {
+
default = true;
+
};
+
};
+
+
config = lib.mkIf cfg.enable {
+
environment = {
+
systemPackages = [ cfg.package ];
+
etc."xdg/foot/foot.ini".source = settingsFormat.generate "foot.ini" cfg.settings;
+
};
+
programs = {
+
foot.settings.main.include = lib.optionals (cfg.theme != null) [
+
"${pkgs.foot.themes}/share/foot/themes/${cfg.theme}"
+
];
+
# https://codeberg.org/dnkl/foot/wiki#user-content-shell-integration
+
bash.interactiveShellInit = lib.mkIf cfg.enableBashIntegration ". ${./bashrc} # enable shell integration for foot terminal";
+
fish.interactiveShellInit = lib.mkIf cfg.enableFishIntegration "source ${./config.fish} # enable shell integration for foot terminal";
+
zsh.interactiveShellInit = lib.mkIf cfg.enableZshIntegration ". ${./zshrc} # enable shell integration for foot terminal";
+
};
+
};
+
+
meta = {
+
maintainers = with lib.maintainers; [ linsui ];
+
};
+
}
+25
nixos/modules/programs/foot/zshrc
···
+
function osc7-pwd() {
+
emulate -L zsh # also sets localoptions for us
+
setopt extendedglob
+
local LC_ALL=C
+
printf '\e]7;file://%s%s\e\' $HOST ${PWD//(#m)([^@-Za-z&-;_~])/%${(l:2::0:)$(([##16]#MATCH))}}
+
}
+
+
function chpwd-osc7-pwd() {
+
(( ZSH_SUBSHELL )) || osc7-pwd
+
}
+
add-zsh-hook -Uz chpwd chpwd-osc7-pwd
+
+
precmd() {
+
print -Pn "\e]133;A\e\\"
+
}
+
+
function precmd {
+
if ! builtin zle; then
+
print -n "\e]133;D\e\\"
+
fi
+
}
+
+
function preexec {
+
print -n "\e]133;C\e\\"
+
}