2017-01-07 18:16:26 +00:00
|
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
|
|
let
|
|
|
|
|
|
|
|
|
|
cfg = config.programs.gnome-terminal;
|
|
|
|
|
|
2020-09-28 20:56:48 +00:00
|
|
|
|
eraseBinding = types.enum [
|
|
|
|
|
"auto"
|
|
|
|
|
"ascii-backspace"
|
|
|
|
|
"ascii-delete"
|
|
|
|
|
"delete-sequence"
|
|
|
|
|
"tty"
|
|
|
|
|
];
|
|
|
|
|
|
2020-02-01 23:39:17 +00:00
|
|
|
|
backForeSubModule = types.submodule ({ ... }: {
|
|
|
|
|
options = {
|
|
|
|
|
foreground = mkOption {
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = "The foreground color.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
background = mkOption {
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = "The background color.";
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
profileColorsSubModule = types.submodule ({ ... }: {
|
|
|
|
|
options = {
|
|
|
|
|
foregroundColor = mkOption {
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = "The foreground color.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
backgroundColor = mkOption {
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = "The background color.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
boldColor = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
|
description = "The bold color, null to use same as foreground.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
palette = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
description = "The terminal palette.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
cursor = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
type = types.nullOr backForeSubModule;
|
|
|
|
|
description = "The color for the terminal cursor.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
highlight = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
type = types.nullOr backForeSubModule;
|
|
|
|
|
description = "The colors for the terminal’s highlighted area.";
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
profileSubModule = types.submodule ({ name, config, ... }: {
|
|
|
|
|
options = {
|
|
|
|
|
default = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = "Whether this should be the default profile.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
visibleName = mkOption {
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = "The profile name.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
colors = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
type = types.nullOr profileColorsSubModule;
|
|
|
|
|
description = "The terminal colors, null to use system default.";
|
|
|
|
|
};
|
|
|
|
|
|
2020-04-10 13:56:47 +00:00
|
|
|
|
cursorBlinkMode = mkOption {
|
|
|
|
|
default = "system";
|
|
|
|
|
type = types.enum [ "system" "on" "off" ];
|
|
|
|
|
description = "The cursor blink mode.";
|
|
|
|
|
};
|
|
|
|
|
|
2020-02-01 23:39:17 +00:00
|
|
|
|
cursorShape = mkOption {
|
|
|
|
|
default = "block";
|
|
|
|
|
type = types.enum [ "block" "ibeam" "underline" ];
|
|
|
|
|
description = "The cursor shape.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
font = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
|
description = "The font name, null to use system default.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
allowBold = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
type = types.nullOr types.bool;
|
|
|
|
|
description = ''
|
|
|
|
|
If <literal>true</literal>, allow applications in the
|
|
|
|
|
terminal to make text boldface.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
scrollOnOutput = mkOption {
|
|
|
|
|
default = true;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = "Whether to scroll when output is written.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
showScrollbar = mkOption {
|
|
|
|
|
default = true;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = "Whether the scroll bar should be visible.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
scrollbackLines = mkOption {
|
|
|
|
|
default = 10000;
|
|
|
|
|
type = types.nullOr types.int;
|
|
|
|
|
description = ''
|
|
|
|
|
The number of scrollback lines to keep, null for infinite.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2020-08-01 23:57:42 +00:00
|
|
|
|
|
|
|
|
|
customCommand = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
|
description = ''
|
|
|
|
|
The command to use to start the shell, or null for default shell.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
loginShell = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = "Run command as a login shell.";
|
|
|
|
|
};
|
2020-09-28 20:56:48 +00:00
|
|
|
|
|
|
|
|
|
backspaceBinding = mkOption {
|
|
|
|
|
default = "ascii-delete";
|
|
|
|
|
type = eraseBinding;
|
|
|
|
|
description = ''
|
|
|
|
|
Which string the terminal should send to an application when the user
|
|
|
|
|
presses the <emphasis>Backspace</emphasis> key.
|
|
|
|
|
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>auto</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Attempt to determine the right value from the terminal's IO settings.
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>ascii-backspace</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Send an ASCII backspace character (0x08).
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>ascii-delete</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Send an ASCII delete character (0x7F).
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>delete-sequence</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Send the <quote>@7</quote> control sequence.
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>tty</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Send terminal’s <quote>erase</quote> setting.
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 21:39:56 +00:00
|
|
|
|
boldIsBright = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
type = types.nullOr types.bool;
|
|
|
|
|
description = "Whether bold text is shown in bright colors.";
|
|
|
|
|
};
|
|
|
|
|
|
2020-09-28 20:56:48 +00:00
|
|
|
|
deleteBinding = mkOption {
|
|
|
|
|
default = "delete-sequence";
|
|
|
|
|
type = eraseBinding;
|
|
|
|
|
description = ''
|
|
|
|
|
Which string the terminal should send to an application when the user
|
|
|
|
|
presses the <emphasis>Delete</emphasis> key.
|
|
|
|
|
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>auto</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Send the <quote>@7</quote> control sequence.
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>ascii-backspace</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Send an ASCII backspace character (0x08).
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>ascii-delete</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Send an ASCII delete character (0x7F).
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>delete-sequence</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Send the <quote>@7</quote> control sequence.
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term><literal>tty</literal></term>
|
|
|
|
|
<listitem><para>
|
|
|
|
|
Send terminal’s <quote>erase</quote> setting.
|
|
|
|
|
</para></listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
</variablelist>
|
|
|
|
|
'';
|
|
|
|
|
};
|
2020-12-27 15:09:59 +00:00
|
|
|
|
|
|
|
|
|
audibleBell = mkOption {
|
|
|
|
|
default = true;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = "Turn on/off the terminal's bell.";
|
|
|
|
|
};
|
2021-06-15 21:39:56 +00:00
|
|
|
|
|
|
|
|
|
transparencyPercent = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
type = types.nullOr (types.ints.between 0 100);
|
|
|
|
|
description = "Background transparency in percent.";
|
|
|
|
|
};
|
2020-02-01 23:39:17 +00:00
|
|
|
|
};
|
|
|
|
|
});
|
2017-01-07 18:16:26 +00:00
|
|
|
|
|
|
|
|
|
buildProfileSet = pcfg:
|
|
|
|
|
{
|
2020-12-27 15:09:59 +00:00
|
|
|
|
audible-bell = pcfg.audibleBell;
|
2017-01-07 18:16:26 +00:00
|
|
|
|
visible-name = pcfg.visibleName;
|
2021-06-15 21:39:56 +00:00
|
|
|
|
scroll-on-output = pcfg.scrollOnOutput;
|
2017-01-07 18:16:26 +00:00
|
|
|
|
scrollbar-policy = if pcfg.showScrollbar then "always" else "never";
|
|
|
|
|
scrollback-lines = pcfg.scrollbackLines;
|
|
|
|
|
cursor-shape = pcfg.cursorShape;
|
2020-04-10 13:56:47 +00:00
|
|
|
|
cursor-blink-mode = pcfg.cursorBlinkMode;
|
2020-08-01 23:57:42 +00:00
|
|
|
|
login-shell = pcfg.loginShell;
|
2020-09-28 20:56:48 +00:00
|
|
|
|
backspace-binding = pcfg.backspaceBinding;
|
|
|
|
|
delete-binding = pcfg.deleteBinding;
|
2020-08-01 23:57:42 +00:00
|
|
|
|
} // (if (pcfg.customCommand != null) then {
|
|
|
|
|
use-custom-command = true;
|
|
|
|
|
custom-command = pcfg.customCommand;
|
|
|
|
|
} else {
|
|
|
|
|
use-custom-command = false;
|
|
|
|
|
}) // (if (pcfg.font == null) then {
|
2020-02-01 23:39:17 +00:00
|
|
|
|
use-system-font = true;
|
|
|
|
|
} else {
|
|
|
|
|
use-system-font = false;
|
|
|
|
|
font = pcfg.font;
|
|
|
|
|
}) // (if (pcfg.colors == null) then {
|
|
|
|
|
use-theme-colors = true;
|
|
|
|
|
} else
|
|
|
|
|
({
|
|
|
|
|
use-theme-colors = false;
|
|
|
|
|
foreground-color = pcfg.colors.foregroundColor;
|
|
|
|
|
background-color = pcfg.colors.backgroundColor;
|
|
|
|
|
palette = pcfg.colors.palette;
|
|
|
|
|
} // optionalAttrs (pcfg.allowBold != null) {
|
|
|
|
|
allow-bold = pcfg.allowBold;
|
|
|
|
|
} // (if (pcfg.colors.boldColor == null) then {
|
|
|
|
|
bold-color-same-as-fg = true;
|
|
|
|
|
} else {
|
|
|
|
|
bold-color-same-as-fg = false;
|
|
|
|
|
bold-color = pcfg.colors.boldColor;
|
2021-06-15 21:39:56 +00:00
|
|
|
|
}) // optionalAttrs (pcfg.boldIsBright != null) {
|
|
|
|
|
bold-is-bright = pcfg.boldIsBright;
|
|
|
|
|
} // (if (pcfg.colors.cursor != null) then {
|
2020-02-01 23:39:17 +00:00
|
|
|
|
cursor-colors-set = true;
|
|
|
|
|
cursor-foreground-color = pcfg.colors.cursor.foreground;
|
|
|
|
|
cursor-background-color = pcfg.colors.cursor.background;
|
|
|
|
|
} else {
|
|
|
|
|
cursor-colors-set = false;
|
|
|
|
|
}) // (if (pcfg.colors.highlight != null) then {
|
|
|
|
|
highlight-colors-set = true;
|
|
|
|
|
highlight-foreground-color = pcfg.colors.highlight.foreground;
|
|
|
|
|
highlight-background-color = pcfg.colors.highlight.background;
|
|
|
|
|
} else {
|
|
|
|
|
highlight-colors-set = false;
|
2021-06-15 21:39:56 +00:00
|
|
|
|
}) // optionalAttrs (pcfg.transparencyPercent != null) {
|
|
|
|
|
background-transparency-percent = pcfg.transparencyPercent;
|
|
|
|
|
use-theme-transparency = false;
|
|
|
|
|
use-transparent-background = true;
|
|
|
|
|
}));
|
2020-02-01 23:39:17 +00:00
|
|
|
|
|
|
|
|
|
in {
|
2021-06-15 21:39:56 +00:00
|
|
|
|
meta.maintainers = with maintainers; [ kamadorueda rycee ];
|
2017-09-26 21:40:31 +00:00
|
|
|
|
|
2017-01-07 18:16:26 +00:00
|
|
|
|
options = {
|
|
|
|
|
programs.gnome-terminal = {
|
|
|
|
|
enable = mkEnableOption "Gnome Terminal";
|
|
|
|
|
|
|
|
|
|
showMenubar = mkOption {
|
|
|
|
|
default = true;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = "Whether to show the menubar by default";
|
|
|
|
|
};
|
|
|
|
|
|
2019-02-24 04:53:46 +00:00
|
|
|
|
themeVariant = mkOption {
|
|
|
|
|
default = "default";
|
2020-05-10 14:20:40 +00:00
|
|
|
|
type = types.enum [ "default" "light" "dark" "system" ];
|
2019-02-24 04:53:46 +00:00
|
|
|
|
description = "The theme variation to request";
|
|
|
|
|
};
|
|
|
|
|
|
2017-01-07 18:16:26 +00:00
|
|
|
|
profile = mkOption {
|
2020-02-01 23:39:17 +00:00
|
|
|
|
default = { };
|
2017-05-09 22:20:15 +00:00
|
|
|
|
type = types.attrsOf profileSubModule;
|
2017-01-15 19:03:55 +00:00
|
|
|
|
description = "A set of Gnome Terminal profiles.";
|
2017-01-07 18:16:26 +00:00
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
2021-05-30 20:47:03 +00:00
|
|
|
|
home.packages = [ pkgs.gnome.gnome-terminal ];
|
2017-01-09 23:35:54 +00:00
|
|
|
|
|
2020-02-01 23:39:17 +00:00
|
|
|
|
dconf.settings = let dconfPath = "org/gnome/terminal/legacy";
|
|
|
|
|
in {
|
|
|
|
|
"${dconfPath}" = {
|
|
|
|
|
default-show-menubar = cfg.showMenubar;
|
|
|
|
|
theme-variant = cfg.themeVariant;
|
|
|
|
|
schema-version = 3;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
"${dconfPath}/profiles:" = {
|
|
|
|
|
default = head (attrNames (filterAttrs (n: v: v.default) cfg.profile));
|
|
|
|
|
list = attrNames cfg.profile;
|
|
|
|
|
};
|
|
|
|
|
} // mapAttrs'
|
|
|
|
|
(n: v: nameValuePair ("${dconfPath}/profiles:/:${n}") (buildProfileSet v))
|
|
|
|
|
cfg.profile;
|
2019-01-03 15:35:15 +00:00
|
|
|
|
|
2020-06-14 10:20:12 +00:00
|
|
|
|
programs.bash.enableVteIntegration = true;
|
|
|
|
|
programs.zsh.enableVteIntegration = true;
|
2017-01-07 18:16:26 +00:00
|
|
|
|
};
|
|
|
|
|
}
|