Unverified Commit 51550ed1 authored by Lin Jian's avatar Lin Jian Committed by GitHub
Browse files

nixos/foot: init (#333390)

parents 2f9f9c83 89f10dc1
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -100,6 +100,8 @@

- [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 −0
Original line number Diff line number Diff line
@@ -193,6 +193,7 @@
  ./programs/fish.nix
  ./programs/flashrom.nix
  ./programs/flexoptix-app.nix
  ./programs/foot
  ./programs/freetds.nix
  ./programs/fuse.nix
  ./programs/fzf.nix
+27 −0
Original line number Diff line number Diff line
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 −0
Original line number Diff line number Diff line
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 −0
Original line number Diff line number Diff line
{
  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 ];
  };
}
Loading