From 10db59de2a805e1aa951aa1c9a4e6cb548a28f94 Mon Sep 17 00:00:00 2001 From: Evie Litherland-Smith Date: Sat, 11 May 2024 13:55:23 +0100 Subject: [PATCH] Initial add of copied files Probably not in a working state at the moment, but home-manager will build. Needs proper configuring to be used --- .gitignore | 9 + .stylua.toml | 3 + default.nix | 40 + desktop.nix | 86 + flake.lock | 136 ++ flake.nix | 71 + home.nix | 20 + programs/alacritty/catppuccin-mocha.toml | 75 + programs/alacritty/default.nix | 30 + programs/bat/catppuccinFrappe.tmTheme | 2021 ++++++++++++++++++ programs/bat/catppuccinLatte.tmTheme | 2021 ++++++++++++++++++ programs/bat/catppuccinMacchiato.tmTheme | 2021 ++++++++++++++++++ programs/bat/catppuccinMocha.tmTheme | 2021 ++++++++++++++++++ programs/bat/default.nix | 21 + programs/bottom/default.nix | 35 + programs/cava/default.nix | 17 + programs/emacs/default.nix | 172 ++ programs/git/default.nix | 39 + programs/obs/default.nix | 12 + programs/prog/default.nix | 25 + programs/prog/luarocks/graph-toolkit.nix | 41 + programs/prog/luarocks/scilua.nix | 33 + programs/prog/luarocks/xsys.nix | 30 + programs/prog/pypoetry.toml | 9 + programs/prog/ruff.toml | 37 + programs/rofi/default.nix | 140 ++ programs/ssh/default.nix | 40 + programs/starship/default.nix | 75 + programs/sway/default.nix | 180 ++ programs/swaylock/default.nix | 18 + programs/swaync/default.nix | 355 +++ programs/waybar/default.nix | 353 +++ programs/wlogout/default.nix | 79 + programs/wlogout/icons/hibernate.png | Bin 0 -> 17963 bytes programs/wlogout/icons/lock.png | Bin 0 -> 8108 bytes programs/wlogout/icons/logout.png | Bin 0 -> 6329 bytes programs/wlogout/icons/reboot.png | Bin 0 -> 16483 bytes programs/wlogout/icons/shutdown.png | Bin 0 -> 15698 bytes programs/wlogout/icons/suspend.png | Bin 0 -> 17256 bytes programs/zsh/default.nix | 38 + programs/zsh/transient.zsh | 31 + scripts/default.nix | 10 + scripts/git-sync-all.sh | 55 + scripts/rsync-local-config.sh | 25 + scripts/sync-all.lua | 38 + scripts/sync-all.py | 68 + scripts/xdg-query-program.sh | 3 + services/avizo/default.nix | 22 + services/email/davmail.properties | 39 + services/email/default.nix | 81 + services/email/signatures/personal | 3 + services/email/signatures/work | 5 + services/email/work.nix | 69 + services/password-store/default.nix | 41 + services/password-store/git-pass-mapping.ini | 6 + 55 files changed, 10799 insertions(+) create mode 100644 .gitignore create mode 100644 .stylua.toml create mode 100644 default.nix create mode 100644 desktop.nix create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 home.nix create mode 100644 programs/alacritty/catppuccin-mocha.toml create mode 100644 programs/alacritty/default.nix create mode 100644 programs/bat/catppuccinFrappe.tmTheme create mode 100644 programs/bat/catppuccinLatte.tmTheme create mode 100644 programs/bat/catppuccinMacchiato.tmTheme create mode 100644 programs/bat/catppuccinMocha.tmTheme create mode 100644 programs/bat/default.nix create mode 100644 programs/bottom/default.nix create mode 100644 programs/cava/default.nix create mode 100644 programs/emacs/default.nix create mode 100644 programs/git/default.nix create mode 100644 programs/obs/default.nix create mode 100644 programs/prog/default.nix create mode 100644 programs/prog/luarocks/graph-toolkit.nix create mode 100644 programs/prog/luarocks/scilua.nix create mode 100644 programs/prog/luarocks/xsys.nix create mode 100644 programs/prog/pypoetry.toml create mode 100644 programs/prog/ruff.toml create mode 100644 programs/rofi/default.nix create mode 100644 programs/ssh/default.nix create mode 100644 programs/starship/default.nix create mode 100644 programs/sway/default.nix create mode 100644 programs/swaylock/default.nix create mode 100644 programs/swaync/default.nix create mode 100644 programs/waybar/default.nix create mode 100644 programs/wlogout/default.nix create mode 100644 programs/wlogout/icons/hibernate.png create mode 100644 programs/wlogout/icons/lock.png create mode 100644 programs/wlogout/icons/logout.png create mode 100644 programs/wlogout/icons/reboot.png create mode 100644 programs/wlogout/icons/shutdown.png create mode 100644 programs/wlogout/icons/suspend.png create mode 100644 programs/zsh/default.nix create mode 100755 programs/zsh/transient.zsh create mode 100644 scripts/default.nix create mode 100755 scripts/git-sync-all.sh create mode 100755 scripts/rsync-local-config.sh create mode 100755 scripts/sync-all.lua create mode 100755 scripts/sync-all.py create mode 100755 scripts/xdg-query-program.sh create mode 100644 services/avizo/default.nix create mode 100644 services/email/davmail.properties create mode 100644 services/email/default.nix create mode 100644 services/email/signatures/personal create mode 100644 services/email/signatures/work create mode 100644 services/email/work.nix create mode 100644 services/password-store/default.nix create mode 100644 services/password-store/git-pass-mapping.ini diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9eb700d --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*~ +.\#* +\#*\# +*.swp +.python-version +.DS_Store +__pycache__ +.direnv +*.html diff --git a/.stylua.toml b/.stylua.toml new file mode 100644 index 0000000..440061b --- /dev/null +++ b/.stylua.toml @@ -0,0 +1,3 @@ +indent_type = "Spaces" +call_parentheses = "None" +collapse_simple_statement = "Always" diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..bb4363f --- /dev/null +++ b/default.nix @@ -0,0 +1,40 @@ +{pkgs, ...}: { + imports = [ + ./bat/default.nix + ./git/default.nix + ./ssh/default.nix + ./zsh/default.nix + ./starship/default.nix + ./bottom/default.nix + ./emacs/default.nix + ./scripts/default.nix + ]; + programs = { + bash.enable = true; + carapace.enable = true; + eza = { + enable = true; + enableAliases = true; + git = true; + icons = true; + extraOptions = ["--octal-permissions"]; + }; + readline = { + enable = true; + includeSystemConfig = true; + extraConfig = '' + set completion-ignore-case On + ''; + }; + direnv = { + enable = true; + nix-direnv.enable = true; + }; + fzf = { + enable = true; + defaultCommand = "${pkgs.fd}/bin/fd --type f"; + changeDirWidgetCommand = "${pkgs.fd}/bin/fd --type d"; + fileWidgetCommand = "${pkgs.fd}/bin/fd --type f"; + }; + }; +} diff --git a/desktop.nix b/desktop.nix new file mode 100644 index 0000000..ebfa828 --- /dev/null +++ b/desktop.nix @@ -0,0 +1,86 @@ +{ + config, + lib, + pkgs, + catppuccinVariant ? "Mocha", + ... +}: { + imports = [ + ./default.nix + ./email/default.nix + ./password-store/default.nix + ./wlogout/default.nix + ./waybar/default.nix + ./rofi/default.nix + ./swaylock/default.nix + ./swaync/default.nix + ./avizo/default.nix + ./alacritty/default.nix + ./emacs/default.nix + ./nyxt/default.nix + ./obs/default.nix + ./cava/default.nix + ./prog/default.nix + ]; + programs.rofi.terminal = "${config.programs.alacritty.package}/bin/alacritty"; + services = { + gpg-agent.pinentryFlavor = "gtk2"; + avizo.enable = true; + syncthing.enable = true; + udiskie = { + enable = true; + notify = true; + automount = true; + tray = "never"; + }; + }; + gtk = with lib.strings; let + accent = "Lavender"; + size = "Standard"; + in { + enable = true; + iconTheme = { + package = pkgs.catppuccin-papirus-folders.override { + accent = toLower accent; + flavor = toLower catppuccinVariant; + }; + name = "Papirus-Dark"; + }; + cursorTheme = let + variant = "${lib.strings.toLower catppuccinVariant}Dark"; + in { + package = pkgs.catppuccin-cursors.${variant}; + name = "Catppuccin-${catppuccinVariant}-Dark-Cursors"; + size = 32; + }; + theme = { + package = with lib.strings; + pkgs.catppuccin-gtk.override { + accents = [(toLower accent)]; + size = toLower size; + variant = toLower catppuccinVariant; + }; + name = "Catppuccin-${catppuccinVariant}-${size}-${accent}-Dark"; + }; + }; + xresources.properties = with config.scheme.withHashtag; { + "*background" = base00; + "*foreground" = base05; + "*color0" = base00; + "*color1" = red; + "*color2" = green; + "*color3" = yellow; + "*color4" = blue; + "*color5" = magenta; + "*color6" = cyan; + "*color7" = base04; + "*color8" = base01; + "*color9" = red; + "*color10" = green; + "*color11" = yellow; + "*color12" = blue; + "*color13" = magenta; + "*color14" = cyan; + "*color15" = base05; + }; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..50ad99e --- /dev/null +++ b/flake.lock @@ -0,0 +1,136 @@ +{ + "nodes": { + "base16": { + "inputs": { + "fromYaml": "fromYaml" + }, + "locked": { + "lastModified": 1709025227, + "narHash": "sha256-KXcORItjYJTdEO/BlBd0Uym1Xa3eBu43uvpFiWjJOdY=", + "owner": "SenchoPens", + "repo": "base16.nix", + "rev": "4e9b16c8b44958bc6bf46d99c3bb1b59c9c9c764", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "base16.nix", + "type": "github" + } + }, + "fromYaml": { + "flake": false, + "locked": { + "lastModified": 1689549921, + "narHash": "sha256-iX0pk/uB019TdBGlaJEWvBCfydT6sRq+eDcGPifVsCM=", + "owner": "SenchoPens", + "repo": "fromYaml", + "rev": "11fbbbfb32e3289d3c631e0134a23854e7865c84", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "fromYaml", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1715381426, + "narHash": "sha256-wPuqrAQGdv3ISs74nJfGb+Yprm23U/rFpcHFFNWgM94=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "ab5542e9dbd13d0100f8baae2bc2d68af901f4b4", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-23.11", + "repo": "home-manager", + "type": "github" + } + }, + "iosevka-custom": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1710589819, + "narHash": "sha256-fm69qycthevGExpbudpuCCSEBPuCOk/+d15382c37oE=", + "ref": "refs/heads/main", + "rev": "6e305fa1d05a97343d47f0b6865e10a870fc8d4e", + "revCount": 10, + "type": "git", + "url": "https://git.xenia.me.uk/pixelifytica/iosevka.git" + }, + "original": { + "type": "git", + "url": "https://git.xenia.me.uk/pixelifytica/iosevka.git" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1710451336, + "narHash": "sha256-pP86Pcfu3BrAvRO7R64x7hs+GaQrjFes+mEPowCfkxY=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d691274a972b3165335d261cc4671335f5c67de9", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1715218190, + "narHash": "sha256-R98WOBHkk8wIi103JUVQF3ei3oui4HvoZcz9tYOAwlk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "9a9960b98418f8c385f52de3b09a63f9c561427a", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-23.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "base16": "base16", + "home-manager": "home-manager", + "iosevka-custom": "iosevka-custom", + "nixpkgs": "nixpkgs_2", + "tt-schemes": "tt-schemes" + } + }, + "tt-schemes": { + "flake": false, + "locked": { + "lastModified": 1713388094, + "narHash": "sha256-wcotm0Ek2ISn8iJBzEujJQdcPLKWrPAOZ/dS/DLKafw=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "abcf2a055ae69f1bf047463332f83db3125aa8a5", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..f998ef3 --- /dev/null +++ b/flake.nix @@ -0,0 +1,71 @@ +{ + description = ""; + + nixConfig = { + extra-substituters = ["https://nix.xenia.me.uk"]; + extra-trusted-public-keys = ["nix.xenia.me.uk:tlgwOaG5KMLjQUk2YaErS8mAG69ZCr3PaHXZYi+Y5eI="]; + }; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11"; + home-manager = { + url = "github:nix-community/home-manager/release-23.11"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + iosevka-custom.url = "git+https://git.xenia.me.uk/pixelifytica/iosevka.git"; + base16.url = "github:SenchoPens/base16.nix"; + tt-schemes = { + url = "github:tinted-theming/schemes"; + flake = false; + }; + }; + + outputs = { + nixpkgs, + home-manager, + iosevka-custom, + base16, + tt-schemes, + ... + }: let + pkgs = import nixpkgs {system = "x86_64-linux";}; + extraSpecialArgs = { + inherit tt-schemes; + accentColour = "base07"; # catppuccin lavender + catppuccinVariant = "Mocha"; + fonts = with pkgs; + with iosevka-custom.outputs; rec { + sizes = { + applications = 12; + desktop = 10; + popups = 14; + terminal = 12; + }; + serif = sansSerif; + sansSerif = { + name = names."iosevka-custom-aile"; + package = packages.${system}."iosevka-custom-aile"; + }; + monospace = { + name = names."iosevka-custom-nerdfont"; + package = packages.${system}."iosevka-custom-nerdfont"; + }; + emoji = { + name = "Noto Color Emoji"; + package = noto-fonts-emoji; + }; + }; + }; + in { + inherit (home-manager) defaultPackage; + homeConfigurations = { + "pixelifytica" = home-manager.lib.homeManagerConfiguration { + inherit pkgs extraSpecialArgs; + modules = [ + base16.homeManagerModule + ./home.nix + ]; + }; + }; + }; +} diff --git a/home.nix b/home.nix new file mode 100644 index 0000000..91a7f46 --- /dev/null +++ b/home.nix @@ -0,0 +1,20 @@ +{ + lib, + config, + pkgs, + tt-schemes, + catppuccinVariant, + ... +}: { + imports = [ + ./home/default.nix + /etc/nixos/hosts/Northstar/home.nix + ]; + programs.home-manager.enable = true; + scheme = "${tt-schemes}/base16/catppuccin-${lib.strings.toLower catppuccinVariant}.yaml"; + home = rec { + username = "pixelifytica"; + homeDirectory = "/home/${username}"; + stateVersion = "23.05"; + }; +} diff --git a/programs/alacritty/catppuccin-mocha.toml b/programs/alacritty/catppuccin-mocha.toml new file mode 100644 index 0000000..1dfe857 --- /dev/null +++ b/programs/alacritty/catppuccin-mocha.toml @@ -0,0 +1,75 @@ +[colors.primary] +background = "#1E1E2E" +foreground = "#CDD6F4" +dim_foreground = "#CDD6F4" +bright_foreground = "#CDD6F4" + +[colors.cursor] +text = "#1E1E2E" +cursor = "#F5E0DC" + +[colors.vi_mode_cursor] +text = "#1E1E2E" +cursor = "#B4BEFE" + +[colors.search.matches] +foreground = "#1E1E2E" +background = "#A6ADC8" + +[colors.search.focused_match] +foreground = "#1E1E2E" +background = "#A6E3A1" + +[colors.footer_bar] +foreground = "#1E1E2E" +background = "#A6ADC8" + +[colors.hints.start] +foreground = "#1E1E2E" +background = "#F9E2AF" + +[colors.hints.end] +foreground = "#1E1E2E" +background = "#A6ADC8" + +[colors.selection] +text = "#1E1E2E" +background = "#F5E0DC" + +[colors.normal] +black = "#45475A" +red = "#F38BA8" +green = "#A6E3A1" +yellow = "#F9E2AF" +blue = "#89B4FA" +magenta = "#F5C2E7" +cyan = "#94E2D5" +white = "#BAC2DE" + +[colors.bright] +black = "#585B70" +red = "#F38BA8" +green = "#A6E3A1" +yellow = "#F9E2AF" +blue = "#89B4FA" +magenta = "#F5C2E7" +cyan = "#94E2D5" +white = "#A6ADC8" + +[colors.dim] +black = "#45475A" +red = "#F38BA8" +green = "#A6E3A1" +yellow = "#F9E2AF" +blue = "#89B4FA" +magenta = "#F5C2E7" +cyan = "#94E2D5" +white = "#BAC2DE" + +[[colors.indexed_colors]] +index = 16 +color = "#FAB387" + +[[colors.indexed_colors]] +index = 17 +color = "#F5E0DC" diff --git a/programs/alacritty/default.nix b/programs/alacritty/default.nix new file mode 100644 index 0000000..c84145d --- /dev/null +++ b/programs/alacritty/default.nix @@ -0,0 +1,30 @@ +{fonts, ...}: { + programs.alacritty = let + catppuccin-mocha = builtins.fromTOML (builtins.readFile ./catppuccin-mocha.toml); + in { + enable = true; + settings = + { + font = { + size = fonts.sizes.applications; + normal = { + family = fonts.monospace.name; + style = "Regular"; + }; + }; + window = { + opacity = 0.8; + dynamic_title = true; + padding = { + x = 10; + y = 10; + }; + decorations = "none"; + }; + live_config_reload = false; + selection.save_to_clipboard = true; + mouse.hide_when_typing = false; + } + // catppuccin-mocha; + }; +} diff --git a/programs/bat/catppuccinFrappe.tmTheme b/programs/bat/catppuccinFrappe.tmTheme new file mode 100644 index 0000000..7e74c6c --- /dev/null +++ b/programs/bat/catppuccinFrappe.tmTheme @@ -0,0 +1,2021 @@ + + + + + name + Catppuccin Frappé + semanticClass + theme.dark.catppuccin-frappé + uuid + e0ada983-8938-490c-86f0-97a1a0ec58e4 + author + Catppuccin Org + colorSpaceName + sRGB + settings + + + settings + + background + #303446 + foreground + #c6d0f5 + caret + #f2d5cf + lineHighlight + #c6d0f512 + misspelling + #e78284 + accent + #ca9ee6 + selection + #949cbb40 + activeGuide + #51576d + findHighlight + #506373 + gutterForeground + #838ba7 + + + + name + Basic text & variable names (incl. leading punctuation) + scope + text, source, variable.other.readwrite, punctuation.definition.variable + settings + + foreground + #c6d0f5 + + + + name + Parentheses, Brackets, Braces + scope + punctuation + settings + + foreground + #949cbb + fontStyle + + + + + name + Comments + scope + comment, punctuation.definition.comment + settings + + foreground + #737994 + fontStyle + italic + + + + scope + string, punctuation.definition.string + settings + + foreground + #a6d189 + + + + scope + constant.character.escape + settings + + foreground + #f4b8e4 + + + + name + Booleans, constants, numbers + scope + constant.numeric, variable.other.constant, entity.name.constant, constant.language.boolean, constant.language.false, constant.language.true, keyword.other.unit.user-defined, keyword.other.unit.suffix.floating-point + settings + + foreground + #ef9f76 + + + + scope + keyword, keyword.operator.word, keyword.operator.new, variable.language.super, support.type.primitive, storage.type, storage.modifier, punctuation.definition.keyword + settings + + foreground + #ca9ee6 + fontStyle + + + + + scope + entity.name.tag.documentation + settings + + foreground + #ca9ee6 + + + + name + Punctuation + scope + keyword.operator, punctuation.accessor, punctuation.definition.generic, meta.function.closure punctuation.section.parameters, punctuation.definition.tag, punctuation.separator.key-value + settings + + foreground + #81c8be + + + + scope + entity.name.function, meta.function-call.method, support.function, support.function.misc, variable.function + settings + + foreground + #8caaee + fontStyle + italic + + + + name + Classes + scope + entity.name.class, entity.other.inherited-class, support.class, meta.function-call.constructor, entity.name.struct + settings + + foreground + #e5c890 + fontStyle + italic + + + + name + Enum + scope + entity.name.enum + settings + + foreground + #e5c890 + fontStyle + italic + + + + name + Enum member + scope + meta.enum variable.other.readwrite, variable.other.enummember + settings + + foreground + #81c8be + + + + name + Object properties + scope + meta.property.object + settings + + foreground + #81c8be + + + + name + Types + scope + meta.type, meta.type-alias, support.type, entity.name.type + settings + + foreground + #e5c890 + fontStyle + italic + + + + name + Decorators + scope + meta.annotation variable.function, meta.annotation variable.annotation.function, meta.annotation punctuation.definition.annotation, meta.decorator, punctuation.decorator + settings + + foreground + #ef9f76 + + + + scope + variable.parameter, meta.function.parameters + settings + + foreground + #ea999c + fontStyle + italic + + + + name + Built-ins + scope + constant.language, support.function.builtin + settings + + foreground + #e78284 + + + + scope + entity.other.attribute-name.documentation + settings + + foreground + #e78284 + + + + name + Preprocessor directives + scope + keyword.control.directive, punctuation.definition.directive + settings + + foreground + #e5c890 + + + + name + Type parameters + scope + punctuation.definition.typeparameters + settings + + foreground + #99d1db + + + + name + Namespaces + scope + entity.name.namespace + settings + + foreground + #e5c890 + + + + name + Property names (left hand assignments in json/yaml/css) + scope + support.type.property-name.css + settings + + foreground + #8caaee + fontStyle + + + + + name + This/Self keyword + scope + variable.language.this, variable.language.this punctuation.definition.variable + settings + + foreground + #e78284 + + + + name + Object properties + scope + variable.object.property + settings + + foreground + #c6d0f5 + + + + name + String template interpolation + scope + string.template variable, string variable + settings + + foreground + #c6d0f5 + + + + name + `new` as bold + scope + keyword.operator.new + settings + + fontStyle + bold + + + + name + C++ extern keyword + scope + storage.modifier.specifier.extern.cpp + settings + + foreground + #ca9ee6 + + + + name + C++ scope resolution + scope + entity.name.scope-resolution.template.call.cpp, entity.name.scope-resolution.parameter.cpp, entity.name.scope-resolution.cpp, entity.name.scope-resolution.function.definition.cpp + settings + + foreground + #e5c890 + + + + name + C++ doc keywords + scope + storage.type.class.doxygen + settings + + fontStyle + + + + + name + C++ operators + scope + storage.modifier.reference.cpp + settings + + foreground + #81c8be + + + + name + C# Interpolated Strings + scope + meta.interpolation.cs + settings + + foreground + #c6d0f5 + + + + name + C# xml-style docs + scope + comment.block.documentation.cs + settings + + foreground + #c6d0f5 + + + + name + Classes, reflecting the className color in JSX + scope + source.css entity.other.attribute-name.class.css, entity.other.attribute-name.parent-selector.css punctuation.definition.entity.css + settings + + foreground + #e5c890 + + + + name + Operators + scope + punctuation.separator.operator.css + settings + + foreground + #81c8be + + + + name + Pseudo classes + scope + source.css entity.other.attribute-name.pseudo-class + settings + + foreground + #81c8be + + + + scope + source.css constant.other.unicode-range + settings + + foreground + #ef9f76 + + + + scope + source.css variable.parameter.url + settings + + foreground + #a6d189 + fontStyle + + + + + name + CSS vendored property names + scope + support.type.vendored.property-name + settings + + foreground + #99d1db + + + + name + Less/SCSS right-hand variables (@/$-prefixed) + scope + source.css meta.property-value variable, source.css meta.property-value variable.other.less, source.css meta.property-value variable.other.less punctuation.definition.variable.less, meta.definition.variable.scss + settings + + foreground + #ea999c + + + + name + CSS variables (--prefixed) + scope + source.css meta.property-list variable, meta.property-list variable.other.less, meta.property-list variable.other.less punctuation.definition.variable.less + settings + + foreground + #8caaee + + + + name + CSS Percentage values, styled the same as numbers + scope + keyword.other.unit.percentage.css + settings + + foreground + #ef9f76 + + + + name + CSS Attribute selectors, styled the same as strings + scope + source.css meta.attribute-selector + settings + + foreground + #a6d189 + + + + name + JSON/YAML keys, other left-hand assignments + scope + keyword.other.definition.ini, punctuation.support.type.property-name.json, support.type.property-name.json, punctuation.support.type.property-name.toml, support.type.property-name.toml, entity.name.tag.yaml, punctuation.support.type.property-name.yaml, support.type.property-name.yaml + settings + + foreground + #8caaee + fontStyle + + + + + name + JSON/YAML constants + scope + constant.language.json, constant.language.yaml + settings + + foreground + #ef9f76 + + + + name + YAML anchors + scope + entity.name.type.anchor.yaml, variable.other.alias.yaml + settings + + foreground + #e5c890 + fontStyle + + + + + name + TOML tables / ini groups + scope + support.type.property-name.table, entity.name.section.group-title.ini + settings + + foreground + #e5c890 + + + + name + TOML dates + scope + constant.other.time.datetime.offset.toml + settings + + foreground + #f4b8e4 + + + + name + YAML anchor puctuation + scope + punctuation.definition.anchor.yaml, punctuation.definition.alias.yaml + settings + + foreground + #f4b8e4 + + + + name + YAML triple dashes + scope + entity.other.document.begin.yaml + settings + + foreground + #f4b8e4 + + + + name + Markup Diff + scope + markup.changed.diff + settings + + foreground + #ef9f76 + + + + name + Diff + scope + meta.diff.header.from-file, meta.diff.header.to-file, punctuation.definition.from-file.diff, punctuation.definition.to-file.diff + settings + + foreground + #8caaee + + + + name + Diff Inserted + scope + markup.inserted.diff + settings + + foreground + #a6d189 + + + + name + Diff Deleted + scope + markup.deleted.diff + settings + + foreground + #e78284 + + + + name + dotenv left-hand side assignments + scope + variable.other.env + settings + + foreground + #8caaee + + + + name + dotenv reference to existing env variable + scope + string.quoted variable.other.env + settings + + foreground + #c6d0f5 + + + + name + GDScript functions + scope + support.function.builtin.gdscript + settings + + foreground + #8caaee + + + + name + GDScript constants + scope + constant.language.gdscript + settings + + foreground + #ef9f76 + + + + name + Comment keywords + scope + comment meta.annotation.go + settings + + foreground + #ea999c + + + + name + go:embed, go:build, etc. + scope + comment meta.annotation.parameters.go + settings + + foreground + #ef9f76 + + + + name + Go constants (nil, true, false) + scope + constant.language.go + settings + + foreground + #ef9f76 + + + + name + GraphQL variables + scope + variable.graphql + settings + + foreground + #c6d0f5 + + + + name + GraphQL aliases + scope + string.unquoted.alias.graphql + settings + + foreground + #eebebe + + + + name + GraphQL enum members + scope + constant.character.enum.graphql + settings + + foreground + #81c8be + + + + name + GraphQL field in types + scope + meta.objectvalues.graphql constant.object.key.graphql string.unquoted.graphql + settings + + foreground + #eebebe + + + + name + HTML/XML DOCTYPE as keyword + scope + keyword.other.doctype, meta.tag.sgml.doctype punctuation.definition.tag, meta.tag.metadata.doctype entity.name.tag, meta.tag.metadata.doctype punctuation.definition.tag + settings + + foreground + #ca9ee6 + + + + name + HTML/XML-like <tags/> + scope + entity.name.tag + settings + + foreground + #8caaee + fontStyle + + + + + name + Special characters like &amp; + scope + text.html constant.character.entity, text.html constant.character.entity punctuation, constant.character.entity.xml, constant.character.entity.xml punctuation, constant.character.entity.js.jsx, constant.charactger.entity.js.jsx punctuation, constant.character.entity.tsx, constant.character.entity.tsx punctuation + settings + + foreground + #e78284 + + + + name + HTML/XML tag attribute values + scope + entity.other.attribute-name + settings + + foreground + #e5c890 + + + + name + Components + scope + support.class.component, support.class.component.jsx, support.class.component.tsx, support.class.component.vue + settings + + foreground + #f4b8e4 + fontStyle + + + + + name + Annotations + scope + punctuation.definition.annotation, storage.type.annotation + settings + + foreground + #ef9f76 + + + + name + Java enums + scope + constant.other.enum.java + settings + + foreground + #81c8be + + + + name + Java imports + scope + storage.modifier.import.java + settings + + foreground + #c6d0f5 + + + + name + Javadoc + scope + comment.block.javadoc.java keyword.other.documentation.javadoc.java + settings + + fontStyle + + + + + name + Exported Variable + scope + meta.export variable.other.readwrite.js + settings + + foreground + #ea999c + + + + name + JS/TS constants & properties + scope + variable.other.constant.js, variable.other.constant.ts, variable.other.property.js, variable.other.property.ts + settings + + foreground + #c6d0f5 + + + + name + JSDoc; these are mainly params, so styled as such + scope + variable.other.jsdoc, comment.block.documentation variable.other + settings + + foreground + #ea999c + fontStyle + + + + + name + JSDoc keywords + scope + storage.type.class.jsdoc + settings + + fontStyle + + + + + scope + support.type.object.console.js + settings + + foreground + #c6d0f5 + + + + name + Node constants as keywords (module, etc.) + scope + support.constant.node, support.type.object.module.js + settings + + foreground + #ca9ee6 + + + + name + implements as keyword + scope + storage.modifier.implements + settings + + foreground + #ca9ee6 + + + + name + Builtin types + scope + constant.language.null.js, constant.language.null.ts, constant.language.undefined.js, constant.language.undefined.ts, support.type.builtin.ts + settings + + foreground + #ca9ee6 + + + + scope + variable.parameter.generic + settings + + foreground + #e5c890 + + + + name + Arrow functions + scope + keyword.declaration.function.arrow.js, storage.type.function.arrow.ts + settings + + foreground + #81c8be + + + + name + Decorator punctuations (decorators inherit from blue functions, instead of styleguide peach) + scope + punctuation.decorator.ts + settings + + foreground + #8caaee + fontStyle + italic + + + + name + Extra JS/TS keywords + scope + keyword.operator.expression.in.js, keyword.operator.expression.in.ts, keyword.operator.expression.infer.ts, keyword.operator.expression.instanceof.js, keyword.operator.expression.instanceof.ts, keyword.operator.expression.is, keyword.operator.expression.keyof.ts, keyword.operator.expression.of.js, keyword.operator.expression.of.ts, keyword.operator.expression.typeof.ts + settings + + foreground + #ca9ee6 + + + + name + Julia macros + scope + support.function.macro.julia + settings + + foreground + #81c8be + fontStyle + italic + + + + name + Julia language constants (true, false) + scope + constant.language.julia + settings + + foreground + #ef9f76 + + + + name + Julia other constants (these seem to be arguments inside arrays) + scope + constant.other.symbol.julia + settings + + foreground + #ea999c + + + + name + LaTeX preamble + scope + text.tex keyword.control.preamble + settings + + foreground + #81c8be + + + + name + LaTeX be functions + scope + text.tex support.function.be + settings + + foreground + #99d1db + + + + name + LaTeX math + scope + constant.other.general.math.tex + settings + + foreground + #eebebe + + + + name + Lua docstring keywords + scope + comment.line.double-dash.documentation.lua storage.type.annotation.lua + settings + + foreground + #ca9ee6 + fontStyle + + + + + name + Lua docstring variables + scope + comment.line.double-dash.documentation.lua entity.name.variable.lua, comment.line.double-dash.documentation.lua variable.lua + settings + + foreground + #c6d0f5 + + + + scope + heading.1.markdown punctuation.definition.heading.markdown, heading.1.markdown, markup.heading.atx.1.mdx, markup.heading.atx.1.mdx punctuation.definition.heading.mdx, markup.heading.setext.1.markdown, markup.heading.heading-0.asciidoc + settings + + foreground + #e78284 + + + + scope + heading.2.markdown punctuation.definition.heading.markdown, heading.2.markdown, markup.heading.atx.2.mdx, markup.heading.atx.2.mdx punctuation.definition.heading.mdx, markup.heading.setext.2.markdown, markup.heading.heading-1.asciidoc + settings + + foreground + #ef9f76 + + + + scope + heading.3.markdown punctuation.definition.heading.markdown, heading.3.markdown, markup.heading.atx.3.mdx, markup.heading.atx.3.mdx punctuation.definition.heading.mdx, markup.heading.heading-2.asciidoc + settings + + foreground + #e5c890 + + + + scope + heading.4.markdown punctuation.definition.heading.markdown, heading.4.markdown, markup.heading.atx.4.mdx, markup.heading.atx.4.mdx punctuation.definition.heading.mdx, markup.heading.heading-3.asciidoc + settings + + foreground + #a6d189 + + + + scope + heading.5.markdown punctuation.definition.heading.markdown, heading.5.markdown, markup.heading.atx.5.mdx, markup.heading.atx.5.mdx punctuation.definition.heading.mdx, markup.heading.heading-4.asciidoc + settings + + foreground + #8caaee + + + + scope + heading.6.markdown punctuation.definition.heading.markdown, heading.6.markdown, markup.heading.atx.6.mdx, markup.heading.atx.6.mdx punctuation.definition.heading.mdx, markup.heading.heading-5.asciidoc + settings + + foreground + #ca9ee6 + + + + scope + markup.bold + settings + + foreground + #e78284 + fontStyle + bold + + + + scope + markup.italic + settings + + foreground + #e78284 + fontStyle + italic + + + + scope + markup.strikethrough + settings + + foreground + #a5adce + fontStyle + strikethrough + + + + name + Markdown auto links + scope + punctuation.definition.link, markup.underline.link + settings + + foreground + #8caaee + + + + name + Markdown links + scope + text.html.markdown punctuation.definition.link.title, string.other.link.title.markdown, markup.link, punctuation.definition.constant.markdown, constant.other.reference.link.markdown, markup.substitution.attribute-reference + settings + + foreground + #babbf1 + + + + name + Markdown code spans + scope + punctuation.definition.raw.markdown, markup.inline.raw.string.markdown, markup.raw.block.markdown + settings + + foreground + #a6d189 + + + + name + Markdown triple backtick language identifier + scope + fenced_code.block.language + settings + + foreground + #99d1db + + + + name + Markdown triple backticks + scope + markup.fenced_code.block punctuation.definition, markup.raw support.asciidoc + settings + + foreground + #949cbb + + + + name + Markdown quotes + scope + markup.quote, punctuation.definition.quote.begin + settings + + foreground + #f4b8e4 + + + + name + Markdown separators + scope + meta.separator.markdown + settings + + foreground + #81c8be + + + + name + Markdown list bullets + scope + punctuation.definition.list.begin.markdown, markup.list.bullet + settings + + foreground + #81c8be + + + + name + Nix attribute names + scope + entity.other.attribute-name.multipart.nix, entity.other.attribute-name.single.nix + settings + + foreground + #8caaee + + + + name + Nix parameter names + scope + variable.parameter.name.nix + settings + + foreground + #c6d0f5 + fontStyle + + + + + name + Nix interpolated parameter names + scope + meta.embedded variable.parameter.name.nix + settings + + foreground + #babbf1 + fontStyle + + + + + name + Nix paths + scope + string.unquoted.path.nix + settings + + foreground + #f4b8e4 + fontStyle + + + + + name + PHP Attributes + scope + support.attribute.builtin, meta.attribute.php + settings + + foreground + #e5c890 + + + + name + PHP Parameters (needed for the leading dollar sign) + scope + meta.function.parameters.php punctuation.definition.variable.php + settings + + foreground + #ea999c + + + + name + PHP Constants (null, __FILE__, etc.) + scope + constant.language.php + settings + + foreground + #ca9ee6 + + + + name + PHP functions + scope + text.html.php support.function + settings + + foreground + #99d1db + + + + name + PHPdoc keywords + scope + keyword.other.phpdoc.php + settings + + fontStyle + + + + + name + Python argument functions reset to text, otherwise they inherit blue from function-call + scope + support.variable.magic.python, meta.function-call.arguments.python + settings + + foreground + #c6d0f5 + + + + name + Python double underscore functions + scope + support.function.magic.python + settings + + foreground + #99d1db + fontStyle + italic + + + + name + Python `self` keyword + scope + variable.parameter.function.language.special.self.python, variable.language.special.self.python + settings + + foreground + #e78284 + fontStyle + italic + + + + name + python keyword flow/logical (for ... in) + scope + keyword.control.flow.python, keyword.operator.logical.python + settings + + foreground + #ca9ee6 + + + + name + python storage type + scope + storage.type.function.python + settings + + foreground + #ca9ee6 + + + + name + python function support + scope + support.token.decorator.python, meta.function.decorator.identifier.python + settings + + foreground + #99d1db + + + + name + python function calls + scope + meta.function-call.python + settings + + foreground + #8caaee + + + + name + python function decorators + scope + entity.name.function.decorator.python, punctuation.definition.decorator.python + settings + + foreground + #ef9f76 + fontStyle + italic + + + + name + python placeholder reset to normal string + scope + constant.character.format.placeholder.other.python + settings + + foreground + #f4b8e4 + + + + name + Python exception & builtins such as exit() + scope + support.type.exception.python, support.function.builtin.python + settings + + foreground + #ef9f76 + + + + name + entity.name.type + scope + support.type.python + settings + + foreground + #ef9f76 + + + + name + python constants (True/False) + scope + constant.language.python + settings + + foreground + #ca9ee6 + + + + name + Arguments accessed later in the function body + scope + meta.indexed-name.python, meta.item-access.python + settings + + foreground + #ea999c + fontStyle + italic + + + + name + Python f-strings/binary/unicode storage types + scope + storage.type.string.python + settings + + foreground + #a6d189 + fontStyle + italic + + + + name + Python type hints + scope + meta.function.parameters.python + settings + + fontStyle + + + + + name + Regex string begin/end in JS/TS + scope + string.regexp punctuation.definition.string.begin, string.regexp punctuation.definition.string.end + settings + + foreground + #f4b8e4 + + + + name + Regex anchors (^, $) + scope + keyword.control.anchor.regexp + settings + + foreground + #ca9ee6 + + + + name + Regex regular string match + scope + string.regexp.ts + settings + + foreground + #c6d0f5 + + + + name + Regex group parenthesis & backreference (\1, \2, \3, ...) + scope + punctuation.definition.group.regexp, keyword.other.back-reference.regexp + settings + + foreground + #a6d189 + + + + name + Regex character class [] + scope + punctuation.definition.character-class.regexp + settings + + foreground + #e5c890 + + + + name + Regex character classes (\d, \w, \s) + scope + constant.other.character-class.regexp + settings + + foreground + #f4b8e4 + + + + name + Regex range + scope + constant.other.character-class.range.regexp + settings + + foreground + #f2d5cf + + + + name + Regex quantifier + scope + keyword.operator.quantifier.regexp + settings + + foreground + #81c8be + + + + name + Regex constant/numeric + scope + constant.character.numeric.regexp + settings + + foreground + #ef9f76 + + + + name + Regex lookaheads, negative lookaheads, lookbehinds, negative lookbehinds + scope + punctuation.definition.group.no-capture.regexp, meta.assertion.look-ahead.regexp, meta.assertion.negative-look-ahead.regexp + settings + + foreground + #8caaee + + + + name + Rust attribute + scope + meta.annotation.rust, meta.annotation.rust punctuation, meta.attribute.rust, punctuation.definition.attribute.rust + settings + + foreground + #e5c890 + fontStyle + italic + + + + name + Rust attribute strings + scope + meta.attribute.rust string.quoted.double.rust, meta.attribute.rust string.quoted.single.char.rust + settings + + fontStyle + + + + + name + Rust keyword + scope + entity.name.function.macro.rules.rust, storage.type.module.rust, storage.modifier.rust, storage.type.struct.rust, storage.type.enum.rust, storage.type.trait.rust, storage.type.union.rust, storage.type.impl.rust, storage.type.rust, storage.type.function.rust, storage.type.type.rust + settings + + foreground + #ca9ee6 + fontStyle + + + + + name + Rust u/i32, u/i64, etc. + scope + entity.name.type.numeric.rust + settings + + foreground + #ca9ee6 + fontStyle + + + + + name + Rust generic + scope + meta.generic.rust + settings + + foreground + #ef9f76 + + + + name + Rust impl + scope + entity.name.impl.rust + settings + + foreground + #e5c890 + fontStyle + italic + + + + name + Rust module + scope + entity.name.module.rust + settings + + foreground + #ef9f76 + + + + name + Rust trait + scope + entity.name.trait.rust + settings + + foreground + #e5c890 + fontStyle + italic + + + + name + Rust struct + scope + storage.type.source.rust + settings + + foreground + #e5c890 + + + + name + Rust union + scope + entity.name.union.rust + settings + + foreground + #e5c890 + + + + name + Rust enum member + scope + meta.enum.rust storage.type.source.rust + settings + + foreground + #81c8be + + + + name + Rust macro + scope + support.macro.rust, meta.macro.rust support.function.rust, entity.name.function.macro.rust + settings + + foreground + #8caaee + fontStyle + italic + + + + name + Rust lifetime + scope + storage.modifier.lifetime.rust, entity.name.type.lifetime + settings + + foreground + #8caaee + fontStyle + italic + + + + name + Rust string formatting + scope + string.quoted.double.rust constant.other.placeholder.rust + settings + + foreground + #f4b8e4 + + + + name + Rust return type generic + scope + meta.function.return-type.rust meta.generic.rust storage.type.rust + settings + + foreground + #c6d0f5 + + + + name + Rust functions + scope + meta.function.call.rust + settings + + foreground + #8caaee + + + + name + Rust angle brackets + scope + punctuation.brackets.angle.rust + settings + + foreground + #99d1db + + + + name + Rust constants + scope + constant.other.caps.rust + settings + + foreground + #ef9f76 + + + + name + Rust function parameters + scope + meta.function.definition.rust variable.other.rust + settings + + foreground + #ea999c + + + + name + Rust closure variables + scope + meta.function.call.rust variable.other.rust + settings + + foreground + #c6d0f5 + + + + name + Rust self + scope + variable.language.self.rust + settings + + foreground + #e78284 + + + + name + Rust metavariable names + scope + variable.other.metavariable.name.rust, meta.macro.metavariable.rust keyword.operator.macro.dollar.rust + settings + + foreground + #f4b8e4 + + + + name + Shell shebang + scope + comment.line.shebang, comment.line.shebang punctuation.definition.comment, comment.line.shebang, punctuation.definition.comment.shebang.shell, meta.shebang.shell + settings + + foreground + #f4b8e4 + fontStyle + italic + + + + name + Shell shebang command + scope + comment.line.shebang constant.language + settings + + foreground + #81c8be + fontStyle + italic + + + + name + Shell interpolated command + scope + meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation, meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation + settings + + foreground + #e78284 + + + + name + Shell interpolated command variable + scope + meta.string meta.interpolation.parameter.shell variable.other.readwrite + settings + + foreground + #ef9f76 + fontStyle + italic + + + + scope + source.shell punctuation.section.interpolation, punctuation.definition.evaluation.backticks.shell + settings + + foreground + #81c8be + + + + name + Shell EOF + scope + entity.name.tag.heredoc.shell + settings + + foreground + #ca9ee6 + + + + name + Shell quoted variable + scope + string.quoted.double.shell variable.other.normal.shell + settings + + foreground + #c6d0f5 + + + + scope + markup.heading.synopsis.man, markup.heading.title.man, markup.heading.other.man, markup.heading.env.man + settings + + foreground + #ca9ee6 + + + + scope + markup.heading.commands.man + settings + + foreground + #8caaee + + + + scope + markup.heading.env.man + settings + + foreground + #f4b8e4 + + + + + \ No newline at end of file diff --git a/programs/bat/catppuccinLatte.tmTheme b/programs/bat/catppuccinLatte.tmTheme new file mode 100644 index 0000000..ae4a0c0 --- /dev/null +++ b/programs/bat/catppuccinLatte.tmTheme @@ -0,0 +1,2021 @@ + + + + + name + Catppuccin Latte + semanticClass + theme.light.catppuccin-latte + uuid + 96a262cd-4b2f-49f5-9125-8dd0077cbfe1 + author + Catppuccin Org + colorSpaceName + sRGB + settings + + + settings + + background + #eff1f5 + foreground + #4c4f69 + caret + #dc8a78 + lineHighlight + #4c4f6912 + misspelling + #d20f39 + accent + #8839ef + selection + #7c7f934d + activeGuide + #bcc0cc + findHighlight + #a9daf0 + gutterForeground + #8c8fa1 + + + + name + Basic text & variable names (incl. leading punctuation) + scope + text, source, variable.other.readwrite, punctuation.definition.variable + settings + + foreground + #4c4f69 + + + + name + Parentheses, Brackets, Braces + scope + punctuation + settings + + foreground + #7c7f93 + fontStyle + + + + + name + Comments + scope + comment, punctuation.definition.comment + settings + + foreground + #9ca0b0 + fontStyle + italic + + + + scope + string, punctuation.definition.string + settings + + foreground + #40a02b + + + + scope + constant.character.escape + settings + + foreground + #ea76cb + + + + name + Booleans, constants, numbers + scope + constant.numeric, variable.other.constant, entity.name.constant, constant.language.boolean, constant.language.false, constant.language.true, keyword.other.unit.user-defined, keyword.other.unit.suffix.floating-point + settings + + foreground + #fe640b + + + + scope + keyword, keyword.operator.word, keyword.operator.new, variable.language.super, support.type.primitive, storage.type, storage.modifier, punctuation.definition.keyword + settings + + foreground + #8839ef + fontStyle + + + + + scope + entity.name.tag.documentation + settings + + foreground + #8839ef + + + + name + Punctuation + scope + keyword.operator, punctuation.accessor, punctuation.definition.generic, meta.function.closure punctuation.section.parameters, punctuation.definition.tag, punctuation.separator.key-value + settings + + foreground + #179299 + + + + scope + entity.name.function, meta.function-call.method, support.function, support.function.misc, variable.function + settings + + foreground + #1e66f5 + fontStyle + italic + + + + name + Classes + scope + entity.name.class, entity.other.inherited-class, support.class, meta.function-call.constructor, entity.name.struct + settings + + foreground + #df8e1d + fontStyle + italic + + + + name + Enum + scope + entity.name.enum + settings + + foreground + #df8e1d + fontStyle + italic + + + + name + Enum member + scope + meta.enum variable.other.readwrite, variable.other.enummember + settings + + foreground + #179299 + + + + name + Object properties + scope + meta.property.object + settings + + foreground + #179299 + + + + name + Types + scope + meta.type, meta.type-alias, support.type, entity.name.type + settings + + foreground + #df8e1d + fontStyle + italic + + + + name + Decorators + scope + meta.annotation variable.function, meta.annotation variable.annotation.function, meta.annotation punctuation.definition.annotation, meta.decorator, punctuation.decorator + settings + + foreground + #fe640b + + + + scope + variable.parameter, meta.function.parameters + settings + + foreground + #e64553 + fontStyle + italic + + + + name + Built-ins + scope + constant.language, support.function.builtin + settings + + foreground + #d20f39 + + + + scope + entity.other.attribute-name.documentation + settings + + foreground + #d20f39 + + + + name + Preprocessor directives + scope + keyword.control.directive, punctuation.definition.directive + settings + + foreground + #df8e1d + + + + name + Type parameters + scope + punctuation.definition.typeparameters + settings + + foreground + #04a5e5 + + + + name + Namespaces + scope + entity.name.namespace + settings + + foreground + #df8e1d + + + + name + Property names (left hand assignments in json/yaml/css) + scope + support.type.property-name.css + settings + + foreground + #1e66f5 + fontStyle + + + + + name + This/Self keyword + scope + variable.language.this, variable.language.this punctuation.definition.variable + settings + + foreground + #d20f39 + + + + name + Object properties + scope + variable.object.property + settings + + foreground + #4c4f69 + + + + name + String template interpolation + scope + string.template variable, string variable + settings + + foreground + #4c4f69 + + + + name + `new` as bold + scope + keyword.operator.new + settings + + fontStyle + bold + + + + name + C++ extern keyword + scope + storage.modifier.specifier.extern.cpp + settings + + foreground + #8839ef + + + + name + C++ scope resolution + scope + entity.name.scope-resolution.template.call.cpp, entity.name.scope-resolution.parameter.cpp, entity.name.scope-resolution.cpp, entity.name.scope-resolution.function.definition.cpp + settings + + foreground + #df8e1d + + + + name + C++ doc keywords + scope + storage.type.class.doxygen + settings + + fontStyle + + + + + name + C++ operators + scope + storage.modifier.reference.cpp + settings + + foreground + #179299 + + + + name + C# Interpolated Strings + scope + meta.interpolation.cs + settings + + foreground + #4c4f69 + + + + name + C# xml-style docs + scope + comment.block.documentation.cs + settings + + foreground + #4c4f69 + + + + name + Classes, reflecting the className color in JSX + scope + source.css entity.other.attribute-name.class.css, entity.other.attribute-name.parent-selector.css punctuation.definition.entity.css + settings + + foreground + #df8e1d + + + + name + Operators + scope + punctuation.separator.operator.css + settings + + foreground + #179299 + + + + name + Pseudo classes + scope + source.css entity.other.attribute-name.pseudo-class + settings + + foreground + #179299 + + + + scope + source.css constant.other.unicode-range + settings + + foreground + #fe640b + + + + scope + source.css variable.parameter.url + settings + + foreground + #40a02b + fontStyle + + + + + name + CSS vendored property names + scope + support.type.vendored.property-name + settings + + foreground + #04a5e5 + + + + name + Less/SCSS right-hand variables (@/$-prefixed) + scope + source.css meta.property-value variable, source.css meta.property-value variable.other.less, source.css meta.property-value variable.other.less punctuation.definition.variable.less, meta.definition.variable.scss + settings + + foreground + #e64553 + + + + name + CSS variables (--prefixed) + scope + source.css meta.property-list variable, meta.property-list variable.other.less, meta.property-list variable.other.less punctuation.definition.variable.less + settings + + foreground + #1e66f5 + + + + name + CSS Percentage values, styled the same as numbers + scope + keyword.other.unit.percentage.css + settings + + foreground + #fe640b + + + + name + CSS Attribute selectors, styled the same as strings + scope + source.css meta.attribute-selector + settings + + foreground + #40a02b + + + + name + JSON/YAML keys, other left-hand assignments + scope + keyword.other.definition.ini, punctuation.support.type.property-name.json, support.type.property-name.json, punctuation.support.type.property-name.toml, support.type.property-name.toml, entity.name.tag.yaml, punctuation.support.type.property-name.yaml, support.type.property-name.yaml + settings + + foreground + #1e66f5 + fontStyle + + + + + name + JSON/YAML constants + scope + constant.language.json, constant.language.yaml + settings + + foreground + #fe640b + + + + name + YAML anchors + scope + entity.name.type.anchor.yaml, variable.other.alias.yaml + settings + + foreground + #df8e1d + fontStyle + + + + + name + TOML tables / ini groups + scope + support.type.property-name.table, entity.name.section.group-title.ini + settings + + foreground + #df8e1d + + + + name + TOML dates + scope + constant.other.time.datetime.offset.toml + settings + + foreground + #ea76cb + + + + name + YAML anchor puctuation + scope + punctuation.definition.anchor.yaml, punctuation.definition.alias.yaml + settings + + foreground + #ea76cb + + + + name + YAML triple dashes + scope + entity.other.document.begin.yaml + settings + + foreground + #ea76cb + + + + name + Markup Diff + scope + markup.changed.diff + settings + + foreground + #fe640b + + + + name + Diff + scope + meta.diff.header.from-file, meta.diff.header.to-file, punctuation.definition.from-file.diff, punctuation.definition.to-file.diff + settings + + foreground + #1e66f5 + + + + name + Diff Inserted + scope + markup.inserted.diff + settings + + foreground + #40a02b + + + + name + Diff Deleted + scope + markup.deleted.diff + settings + + foreground + #d20f39 + + + + name + dotenv left-hand side assignments + scope + variable.other.env + settings + + foreground + #1e66f5 + + + + name + dotenv reference to existing env variable + scope + string.quoted variable.other.env + settings + + foreground + #4c4f69 + + + + name + GDScript functions + scope + support.function.builtin.gdscript + settings + + foreground + #1e66f5 + + + + name + GDScript constants + scope + constant.language.gdscript + settings + + foreground + #fe640b + + + + name + Comment keywords + scope + comment meta.annotation.go + settings + + foreground + #e64553 + + + + name + go:embed, go:build, etc. + scope + comment meta.annotation.parameters.go + settings + + foreground + #fe640b + + + + name + Go constants (nil, true, false) + scope + constant.language.go + settings + + foreground + #fe640b + + + + name + GraphQL variables + scope + variable.graphql + settings + + foreground + #4c4f69 + + + + name + GraphQL aliases + scope + string.unquoted.alias.graphql + settings + + foreground + #dd7878 + + + + name + GraphQL enum members + scope + constant.character.enum.graphql + settings + + foreground + #179299 + + + + name + GraphQL field in types + scope + meta.objectvalues.graphql constant.object.key.graphql string.unquoted.graphql + settings + + foreground + #dd7878 + + + + name + HTML/XML DOCTYPE as keyword + scope + keyword.other.doctype, meta.tag.sgml.doctype punctuation.definition.tag, meta.tag.metadata.doctype entity.name.tag, meta.tag.metadata.doctype punctuation.definition.tag + settings + + foreground + #8839ef + + + + name + HTML/XML-like <tags/> + scope + entity.name.tag + settings + + foreground + #1e66f5 + fontStyle + + + + + name + Special characters like &amp; + scope + text.html constant.character.entity, text.html constant.character.entity punctuation, constant.character.entity.xml, constant.character.entity.xml punctuation, constant.character.entity.js.jsx, constant.charactger.entity.js.jsx punctuation, constant.character.entity.tsx, constant.character.entity.tsx punctuation + settings + + foreground + #d20f39 + + + + name + HTML/XML tag attribute values + scope + entity.other.attribute-name + settings + + foreground + #df8e1d + + + + name + Components + scope + support.class.component, support.class.component.jsx, support.class.component.tsx, support.class.component.vue + settings + + foreground + #ea76cb + fontStyle + + + + + name + Annotations + scope + punctuation.definition.annotation, storage.type.annotation + settings + + foreground + #fe640b + + + + name + Java enums + scope + constant.other.enum.java + settings + + foreground + #179299 + + + + name + Java imports + scope + storage.modifier.import.java + settings + + foreground + #4c4f69 + + + + name + Javadoc + scope + comment.block.javadoc.java keyword.other.documentation.javadoc.java + settings + + fontStyle + + + + + name + Exported Variable + scope + meta.export variable.other.readwrite.js + settings + + foreground + #e64553 + + + + name + JS/TS constants & properties + scope + variable.other.constant.js, variable.other.constant.ts, variable.other.property.js, variable.other.property.ts + settings + + foreground + #4c4f69 + + + + name + JSDoc; these are mainly params, so styled as such + scope + variable.other.jsdoc, comment.block.documentation variable.other + settings + + foreground + #e64553 + fontStyle + + + + + name + JSDoc keywords + scope + storage.type.class.jsdoc + settings + + fontStyle + + + + + scope + support.type.object.console.js + settings + + foreground + #4c4f69 + + + + name + Node constants as keywords (module, etc.) + scope + support.constant.node, support.type.object.module.js + settings + + foreground + #8839ef + + + + name + implements as keyword + scope + storage.modifier.implements + settings + + foreground + #8839ef + + + + name + Builtin types + scope + constant.language.null.js, constant.language.null.ts, constant.language.undefined.js, constant.language.undefined.ts, support.type.builtin.ts + settings + + foreground + #8839ef + + + + scope + variable.parameter.generic + settings + + foreground + #df8e1d + + + + name + Arrow functions + scope + keyword.declaration.function.arrow.js, storage.type.function.arrow.ts + settings + + foreground + #179299 + + + + name + Decorator punctuations (decorators inherit from blue functions, instead of styleguide peach) + scope + punctuation.decorator.ts + settings + + foreground + #1e66f5 + fontStyle + italic + + + + name + Extra JS/TS keywords + scope + keyword.operator.expression.in.js, keyword.operator.expression.in.ts, keyword.operator.expression.infer.ts, keyword.operator.expression.instanceof.js, keyword.operator.expression.instanceof.ts, keyword.operator.expression.is, keyword.operator.expression.keyof.ts, keyword.operator.expression.of.js, keyword.operator.expression.of.ts, keyword.operator.expression.typeof.ts + settings + + foreground + #8839ef + + + + name + Julia macros + scope + support.function.macro.julia + settings + + foreground + #179299 + fontStyle + italic + + + + name + Julia language constants (true, false) + scope + constant.language.julia + settings + + foreground + #fe640b + + + + name + Julia other constants (these seem to be arguments inside arrays) + scope + constant.other.symbol.julia + settings + + foreground + #e64553 + + + + name + LaTeX preamble + scope + text.tex keyword.control.preamble + settings + + foreground + #179299 + + + + name + LaTeX be functions + scope + text.tex support.function.be + settings + + foreground + #04a5e5 + + + + name + LaTeX math + scope + constant.other.general.math.tex + settings + + foreground + #dd7878 + + + + name + Lua docstring keywords + scope + comment.line.double-dash.documentation.lua storage.type.annotation.lua + settings + + foreground + #8839ef + fontStyle + + + + + name + Lua docstring variables + scope + comment.line.double-dash.documentation.lua entity.name.variable.lua, comment.line.double-dash.documentation.lua variable.lua + settings + + foreground + #4c4f69 + + + + scope + heading.1.markdown punctuation.definition.heading.markdown, heading.1.markdown, markup.heading.atx.1.mdx, markup.heading.atx.1.mdx punctuation.definition.heading.mdx, markup.heading.setext.1.markdown, markup.heading.heading-0.asciidoc + settings + + foreground + #d20f39 + + + + scope + heading.2.markdown punctuation.definition.heading.markdown, heading.2.markdown, markup.heading.atx.2.mdx, markup.heading.atx.2.mdx punctuation.definition.heading.mdx, markup.heading.setext.2.markdown, markup.heading.heading-1.asciidoc + settings + + foreground + #fe640b + + + + scope + heading.3.markdown punctuation.definition.heading.markdown, heading.3.markdown, markup.heading.atx.3.mdx, markup.heading.atx.3.mdx punctuation.definition.heading.mdx, markup.heading.heading-2.asciidoc + settings + + foreground + #df8e1d + + + + scope + heading.4.markdown punctuation.definition.heading.markdown, heading.4.markdown, markup.heading.atx.4.mdx, markup.heading.atx.4.mdx punctuation.definition.heading.mdx, markup.heading.heading-3.asciidoc + settings + + foreground + #40a02b + + + + scope + heading.5.markdown punctuation.definition.heading.markdown, heading.5.markdown, markup.heading.atx.5.mdx, markup.heading.atx.5.mdx punctuation.definition.heading.mdx, markup.heading.heading-4.asciidoc + settings + + foreground + #1e66f5 + + + + scope + heading.6.markdown punctuation.definition.heading.markdown, heading.6.markdown, markup.heading.atx.6.mdx, markup.heading.atx.6.mdx punctuation.definition.heading.mdx, markup.heading.heading-5.asciidoc + settings + + foreground + #8839ef + + + + scope + markup.bold + settings + + foreground + #d20f39 + fontStyle + bold + + + + scope + markup.italic + settings + + foreground + #d20f39 + fontStyle + italic + + + + scope + markup.strikethrough + settings + + foreground + #6c6f85 + fontStyle + strikethrough + + + + name + Markdown auto links + scope + punctuation.definition.link, markup.underline.link + settings + + foreground + #1e66f5 + + + + name + Markdown links + scope + text.html.markdown punctuation.definition.link.title, string.other.link.title.markdown, markup.link, punctuation.definition.constant.markdown, constant.other.reference.link.markdown, markup.substitution.attribute-reference + settings + + foreground + #7287fd + + + + name + Markdown code spans + scope + punctuation.definition.raw.markdown, markup.inline.raw.string.markdown, markup.raw.block.markdown + settings + + foreground + #40a02b + + + + name + Markdown triple backtick language identifier + scope + fenced_code.block.language + settings + + foreground + #04a5e5 + + + + name + Markdown triple backticks + scope + markup.fenced_code.block punctuation.definition, markup.raw support.asciidoc + settings + + foreground + #7c7f93 + + + + name + Markdown quotes + scope + markup.quote, punctuation.definition.quote.begin + settings + + foreground + #ea76cb + + + + name + Markdown separators + scope + meta.separator.markdown + settings + + foreground + #179299 + + + + name + Markdown list bullets + scope + punctuation.definition.list.begin.markdown, markup.list.bullet + settings + + foreground + #179299 + + + + name + Nix attribute names + scope + entity.other.attribute-name.multipart.nix, entity.other.attribute-name.single.nix + settings + + foreground + #1e66f5 + + + + name + Nix parameter names + scope + variable.parameter.name.nix + settings + + foreground + #4c4f69 + fontStyle + + + + + name + Nix interpolated parameter names + scope + meta.embedded variable.parameter.name.nix + settings + + foreground + #7287fd + fontStyle + + + + + name + Nix paths + scope + string.unquoted.path.nix + settings + + foreground + #ea76cb + fontStyle + + + + + name + PHP Attributes + scope + support.attribute.builtin, meta.attribute.php + settings + + foreground + #df8e1d + + + + name + PHP Parameters (needed for the leading dollar sign) + scope + meta.function.parameters.php punctuation.definition.variable.php + settings + + foreground + #e64553 + + + + name + PHP Constants (null, __FILE__, etc.) + scope + constant.language.php + settings + + foreground + #8839ef + + + + name + PHP functions + scope + text.html.php support.function + settings + + foreground + #04a5e5 + + + + name + PHPdoc keywords + scope + keyword.other.phpdoc.php + settings + + fontStyle + + + + + name + Python argument functions reset to text, otherwise they inherit blue from function-call + scope + support.variable.magic.python, meta.function-call.arguments.python + settings + + foreground + #4c4f69 + + + + name + Python double underscore functions + scope + support.function.magic.python + settings + + foreground + #04a5e5 + fontStyle + italic + + + + name + Python `self` keyword + scope + variable.parameter.function.language.special.self.python, variable.language.special.self.python + settings + + foreground + #d20f39 + fontStyle + italic + + + + name + python keyword flow/logical (for ... in) + scope + keyword.control.flow.python, keyword.operator.logical.python + settings + + foreground + #8839ef + + + + name + python storage type + scope + storage.type.function.python + settings + + foreground + #8839ef + + + + name + python function support + scope + support.token.decorator.python, meta.function.decorator.identifier.python + settings + + foreground + #04a5e5 + + + + name + python function calls + scope + meta.function-call.python + settings + + foreground + #1e66f5 + + + + name + python function decorators + scope + entity.name.function.decorator.python, punctuation.definition.decorator.python + settings + + foreground + #fe640b + fontStyle + italic + + + + name + python placeholder reset to normal string + scope + constant.character.format.placeholder.other.python + settings + + foreground + #ea76cb + + + + name + Python exception & builtins such as exit() + scope + support.type.exception.python, support.function.builtin.python + settings + + foreground + #fe640b + + + + name + entity.name.type + scope + support.type.python + settings + + foreground + #fe640b + + + + name + python constants (True/False) + scope + constant.language.python + settings + + foreground + #8839ef + + + + name + Arguments accessed later in the function body + scope + meta.indexed-name.python, meta.item-access.python + settings + + foreground + #e64553 + fontStyle + italic + + + + name + Python f-strings/binary/unicode storage types + scope + storage.type.string.python + settings + + foreground + #40a02b + fontStyle + italic + + + + name + Python type hints + scope + meta.function.parameters.python + settings + + fontStyle + + + + + name + Regex string begin/end in JS/TS + scope + string.regexp punctuation.definition.string.begin, string.regexp punctuation.definition.string.end + settings + + foreground + #ea76cb + + + + name + Regex anchors (^, $) + scope + keyword.control.anchor.regexp + settings + + foreground + #8839ef + + + + name + Regex regular string match + scope + string.regexp.ts + settings + + foreground + #4c4f69 + + + + name + Regex group parenthesis & backreference (\1, \2, \3, ...) + scope + punctuation.definition.group.regexp, keyword.other.back-reference.regexp + settings + + foreground + #40a02b + + + + name + Regex character class [] + scope + punctuation.definition.character-class.regexp + settings + + foreground + #df8e1d + + + + name + Regex character classes (\d, \w, \s) + scope + constant.other.character-class.regexp + settings + + foreground + #ea76cb + + + + name + Regex range + scope + constant.other.character-class.range.regexp + settings + + foreground + #dc8a78 + + + + name + Regex quantifier + scope + keyword.operator.quantifier.regexp + settings + + foreground + #179299 + + + + name + Regex constant/numeric + scope + constant.character.numeric.regexp + settings + + foreground + #fe640b + + + + name + Regex lookaheads, negative lookaheads, lookbehinds, negative lookbehinds + scope + punctuation.definition.group.no-capture.regexp, meta.assertion.look-ahead.regexp, meta.assertion.negative-look-ahead.regexp + settings + + foreground + #1e66f5 + + + + name + Rust attribute + scope + meta.annotation.rust, meta.annotation.rust punctuation, meta.attribute.rust, punctuation.definition.attribute.rust + settings + + foreground + #df8e1d + fontStyle + italic + + + + name + Rust attribute strings + scope + meta.attribute.rust string.quoted.double.rust, meta.attribute.rust string.quoted.single.char.rust + settings + + fontStyle + + + + + name + Rust keyword + scope + entity.name.function.macro.rules.rust, storage.type.module.rust, storage.modifier.rust, storage.type.struct.rust, storage.type.enum.rust, storage.type.trait.rust, storage.type.union.rust, storage.type.impl.rust, storage.type.rust, storage.type.function.rust, storage.type.type.rust + settings + + foreground + #8839ef + fontStyle + + + + + name + Rust u/i32, u/i64, etc. + scope + entity.name.type.numeric.rust + settings + + foreground + #8839ef + fontStyle + + + + + name + Rust generic + scope + meta.generic.rust + settings + + foreground + #fe640b + + + + name + Rust impl + scope + entity.name.impl.rust + settings + + foreground + #df8e1d + fontStyle + italic + + + + name + Rust module + scope + entity.name.module.rust + settings + + foreground + #fe640b + + + + name + Rust trait + scope + entity.name.trait.rust + settings + + foreground + #df8e1d + fontStyle + italic + + + + name + Rust struct + scope + storage.type.source.rust + settings + + foreground + #df8e1d + + + + name + Rust union + scope + entity.name.union.rust + settings + + foreground + #df8e1d + + + + name + Rust enum member + scope + meta.enum.rust storage.type.source.rust + settings + + foreground + #179299 + + + + name + Rust macro + scope + support.macro.rust, meta.macro.rust support.function.rust, entity.name.function.macro.rust + settings + + foreground + #1e66f5 + fontStyle + italic + + + + name + Rust lifetime + scope + storage.modifier.lifetime.rust, entity.name.type.lifetime + settings + + foreground + #1e66f5 + fontStyle + italic + + + + name + Rust string formatting + scope + string.quoted.double.rust constant.other.placeholder.rust + settings + + foreground + #ea76cb + + + + name + Rust return type generic + scope + meta.function.return-type.rust meta.generic.rust storage.type.rust + settings + + foreground + #4c4f69 + + + + name + Rust functions + scope + meta.function.call.rust + settings + + foreground + #1e66f5 + + + + name + Rust angle brackets + scope + punctuation.brackets.angle.rust + settings + + foreground + #04a5e5 + + + + name + Rust constants + scope + constant.other.caps.rust + settings + + foreground + #fe640b + + + + name + Rust function parameters + scope + meta.function.definition.rust variable.other.rust + settings + + foreground + #e64553 + + + + name + Rust closure variables + scope + meta.function.call.rust variable.other.rust + settings + + foreground + #4c4f69 + + + + name + Rust self + scope + variable.language.self.rust + settings + + foreground + #d20f39 + + + + name + Rust metavariable names + scope + variable.other.metavariable.name.rust, meta.macro.metavariable.rust keyword.operator.macro.dollar.rust + settings + + foreground + #ea76cb + + + + name + Shell shebang + scope + comment.line.shebang, comment.line.shebang punctuation.definition.comment, comment.line.shebang, punctuation.definition.comment.shebang.shell, meta.shebang.shell + settings + + foreground + #ea76cb + fontStyle + italic + + + + name + Shell shebang command + scope + comment.line.shebang constant.language + settings + + foreground + #179299 + fontStyle + italic + + + + name + Shell interpolated command + scope + meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation, meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation + settings + + foreground + #d20f39 + + + + name + Shell interpolated command variable + scope + meta.string meta.interpolation.parameter.shell variable.other.readwrite + settings + + foreground + #fe640b + fontStyle + italic + + + + scope + source.shell punctuation.section.interpolation, punctuation.definition.evaluation.backticks.shell + settings + + foreground + #179299 + + + + name + Shell EOF + scope + entity.name.tag.heredoc.shell + settings + + foreground + #8839ef + + + + name + Shell quoted variable + scope + string.quoted.double.shell variable.other.normal.shell + settings + + foreground + #4c4f69 + + + + scope + markup.heading.synopsis.man, markup.heading.title.man, markup.heading.other.man, markup.heading.env.man + settings + + foreground + #8839ef + + + + scope + markup.heading.commands.man + settings + + foreground + #1e66f5 + + + + scope + markup.heading.env.man + settings + + foreground + #ea76cb + + + + + \ No newline at end of file diff --git a/programs/bat/catppuccinMacchiato.tmTheme b/programs/bat/catppuccinMacchiato.tmTheme new file mode 100644 index 0000000..a676454 --- /dev/null +++ b/programs/bat/catppuccinMacchiato.tmTheme @@ -0,0 +1,2021 @@ + + + + + name + Catppuccin Macchiato + semanticClass + theme.dark.catppuccin-macchiato + uuid + 02b2bdf3-9eb7-4396-bf04-f17f1468f99f + author + Catppuccin Org + colorSpaceName + sRGB + settings + + + settings + + background + #24273a + foreground + #cad3f5 + caret + #f4dbd6 + lineHighlight + #cad3f512 + misspelling + #ed8796 + accent + #c6a0f6 + selection + #939ab740 + activeGuide + #494d64 + findHighlight + #455c6d + gutterForeground + #8087a2 + + + + name + Basic text & variable names (incl. leading punctuation) + scope + text, source, variable.other.readwrite, punctuation.definition.variable + settings + + foreground + #cad3f5 + + + + name + Parentheses, Brackets, Braces + scope + punctuation + settings + + foreground + #939ab7 + fontStyle + + + + + name + Comments + scope + comment, punctuation.definition.comment + settings + + foreground + #6e738d + fontStyle + italic + + + + scope + string, punctuation.definition.string + settings + + foreground + #a6da95 + + + + scope + constant.character.escape + settings + + foreground + #f5bde6 + + + + name + Booleans, constants, numbers + scope + constant.numeric, variable.other.constant, entity.name.constant, constant.language.boolean, constant.language.false, constant.language.true, keyword.other.unit.user-defined, keyword.other.unit.suffix.floating-point + settings + + foreground + #f5a97f + + + + scope + keyword, keyword.operator.word, keyword.operator.new, variable.language.super, support.type.primitive, storage.type, storage.modifier, punctuation.definition.keyword + settings + + foreground + #c6a0f6 + fontStyle + + + + + scope + entity.name.tag.documentation + settings + + foreground + #c6a0f6 + + + + name + Punctuation + scope + keyword.operator, punctuation.accessor, punctuation.definition.generic, meta.function.closure punctuation.section.parameters, punctuation.definition.tag, punctuation.separator.key-value + settings + + foreground + #8bd5ca + + + + scope + entity.name.function, meta.function-call.method, support.function, support.function.misc, variable.function + settings + + foreground + #8aadf4 + fontStyle + italic + + + + name + Classes + scope + entity.name.class, entity.other.inherited-class, support.class, meta.function-call.constructor, entity.name.struct + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Enum + scope + entity.name.enum + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Enum member + scope + meta.enum variable.other.readwrite, variable.other.enummember + settings + + foreground + #8bd5ca + + + + name + Object properties + scope + meta.property.object + settings + + foreground + #8bd5ca + + + + name + Types + scope + meta.type, meta.type-alias, support.type, entity.name.type + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Decorators + scope + meta.annotation variable.function, meta.annotation variable.annotation.function, meta.annotation punctuation.definition.annotation, meta.decorator, punctuation.decorator + settings + + foreground + #f5a97f + + + + scope + variable.parameter, meta.function.parameters + settings + + foreground + #ee99a0 + fontStyle + italic + + + + name + Built-ins + scope + constant.language, support.function.builtin + settings + + foreground + #ed8796 + + + + scope + entity.other.attribute-name.documentation + settings + + foreground + #ed8796 + + + + name + Preprocessor directives + scope + keyword.control.directive, punctuation.definition.directive + settings + + foreground + #eed49f + + + + name + Type parameters + scope + punctuation.definition.typeparameters + settings + + foreground + #91d7e3 + + + + name + Namespaces + scope + entity.name.namespace + settings + + foreground + #eed49f + + + + name + Property names (left hand assignments in json/yaml/css) + scope + support.type.property-name.css + settings + + foreground + #8aadf4 + fontStyle + + + + + name + This/Self keyword + scope + variable.language.this, variable.language.this punctuation.definition.variable + settings + + foreground + #ed8796 + + + + name + Object properties + scope + variable.object.property + settings + + foreground + #cad3f5 + + + + name + String template interpolation + scope + string.template variable, string variable + settings + + foreground + #cad3f5 + + + + name + `new` as bold + scope + keyword.operator.new + settings + + fontStyle + bold + + + + name + C++ extern keyword + scope + storage.modifier.specifier.extern.cpp + settings + + foreground + #c6a0f6 + + + + name + C++ scope resolution + scope + entity.name.scope-resolution.template.call.cpp, entity.name.scope-resolution.parameter.cpp, entity.name.scope-resolution.cpp, entity.name.scope-resolution.function.definition.cpp + settings + + foreground + #eed49f + + + + name + C++ doc keywords + scope + storage.type.class.doxygen + settings + + fontStyle + + + + + name + C++ operators + scope + storage.modifier.reference.cpp + settings + + foreground + #8bd5ca + + + + name + C# Interpolated Strings + scope + meta.interpolation.cs + settings + + foreground + #cad3f5 + + + + name + C# xml-style docs + scope + comment.block.documentation.cs + settings + + foreground + #cad3f5 + + + + name + Classes, reflecting the className color in JSX + scope + source.css entity.other.attribute-name.class.css, entity.other.attribute-name.parent-selector.css punctuation.definition.entity.css + settings + + foreground + #eed49f + + + + name + Operators + scope + punctuation.separator.operator.css + settings + + foreground + #8bd5ca + + + + name + Pseudo classes + scope + source.css entity.other.attribute-name.pseudo-class + settings + + foreground + #8bd5ca + + + + scope + source.css constant.other.unicode-range + settings + + foreground + #f5a97f + + + + scope + source.css variable.parameter.url + settings + + foreground + #a6da95 + fontStyle + + + + + name + CSS vendored property names + scope + support.type.vendored.property-name + settings + + foreground + #91d7e3 + + + + name + Less/SCSS right-hand variables (@/$-prefixed) + scope + source.css meta.property-value variable, source.css meta.property-value variable.other.less, source.css meta.property-value variable.other.less punctuation.definition.variable.less, meta.definition.variable.scss + settings + + foreground + #ee99a0 + + + + name + CSS variables (--prefixed) + scope + source.css meta.property-list variable, meta.property-list variable.other.less, meta.property-list variable.other.less punctuation.definition.variable.less + settings + + foreground + #8aadf4 + + + + name + CSS Percentage values, styled the same as numbers + scope + keyword.other.unit.percentage.css + settings + + foreground + #f5a97f + + + + name + CSS Attribute selectors, styled the same as strings + scope + source.css meta.attribute-selector + settings + + foreground + #a6da95 + + + + name + JSON/YAML keys, other left-hand assignments + scope + keyword.other.definition.ini, punctuation.support.type.property-name.json, support.type.property-name.json, punctuation.support.type.property-name.toml, support.type.property-name.toml, entity.name.tag.yaml, punctuation.support.type.property-name.yaml, support.type.property-name.yaml + settings + + foreground + #8aadf4 + fontStyle + + + + + name + JSON/YAML constants + scope + constant.language.json, constant.language.yaml + settings + + foreground + #f5a97f + + + + name + YAML anchors + scope + entity.name.type.anchor.yaml, variable.other.alias.yaml + settings + + foreground + #eed49f + fontStyle + + + + + name + TOML tables / ini groups + scope + support.type.property-name.table, entity.name.section.group-title.ini + settings + + foreground + #eed49f + + + + name + TOML dates + scope + constant.other.time.datetime.offset.toml + settings + + foreground + #f5bde6 + + + + name + YAML anchor puctuation + scope + punctuation.definition.anchor.yaml, punctuation.definition.alias.yaml + settings + + foreground + #f5bde6 + + + + name + YAML triple dashes + scope + entity.other.document.begin.yaml + settings + + foreground + #f5bde6 + + + + name + Markup Diff + scope + markup.changed.diff + settings + + foreground + #f5a97f + + + + name + Diff + scope + meta.diff.header.from-file, meta.diff.header.to-file, punctuation.definition.from-file.diff, punctuation.definition.to-file.diff + settings + + foreground + #8aadf4 + + + + name + Diff Inserted + scope + markup.inserted.diff + settings + + foreground + #a6da95 + + + + name + Diff Deleted + scope + markup.deleted.diff + settings + + foreground + #ed8796 + + + + name + dotenv left-hand side assignments + scope + variable.other.env + settings + + foreground + #8aadf4 + + + + name + dotenv reference to existing env variable + scope + string.quoted variable.other.env + settings + + foreground + #cad3f5 + + + + name + GDScript functions + scope + support.function.builtin.gdscript + settings + + foreground + #8aadf4 + + + + name + GDScript constants + scope + constant.language.gdscript + settings + + foreground + #f5a97f + + + + name + Comment keywords + scope + comment meta.annotation.go + settings + + foreground + #ee99a0 + + + + name + go:embed, go:build, etc. + scope + comment meta.annotation.parameters.go + settings + + foreground + #f5a97f + + + + name + Go constants (nil, true, false) + scope + constant.language.go + settings + + foreground + #f5a97f + + + + name + GraphQL variables + scope + variable.graphql + settings + + foreground + #cad3f5 + + + + name + GraphQL aliases + scope + string.unquoted.alias.graphql + settings + + foreground + #f0c6c6 + + + + name + GraphQL enum members + scope + constant.character.enum.graphql + settings + + foreground + #8bd5ca + + + + name + GraphQL field in types + scope + meta.objectvalues.graphql constant.object.key.graphql string.unquoted.graphql + settings + + foreground + #f0c6c6 + + + + name + HTML/XML DOCTYPE as keyword + scope + keyword.other.doctype, meta.tag.sgml.doctype punctuation.definition.tag, meta.tag.metadata.doctype entity.name.tag, meta.tag.metadata.doctype punctuation.definition.tag + settings + + foreground + #c6a0f6 + + + + name + HTML/XML-like <tags/> + scope + entity.name.tag + settings + + foreground + #8aadf4 + fontStyle + + + + + name + Special characters like &amp; + scope + text.html constant.character.entity, text.html constant.character.entity punctuation, constant.character.entity.xml, constant.character.entity.xml punctuation, constant.character.entity.js.jsx, constant.charactger.entity.js.jsx punctuation, constant.character.entity.tsx, constant.character.entity.tsx punctuation + settings + + foreground + #ed8796 + + + + name + HTML/XML tag attribute values + scope + entity.other.attribute-name + settings + + foreground + #eed49f + + + + name + Components + scope + support.class.component, support.class.component.jsx, support.class.component.tsx, support.class.component.vue + settings + + foreground + #f5bde6 + fontStyle + + + + + name + Annotations + scope + punctuation.definition.annotation, storage.type.annotation + settings + + foreground + #f5a97f + + + + name + Java enums + scope + constant.other.enum.java + settings + + foreground + #8bd5ca + + + + name + Java imports + scope + storage.modifier.import.java + settings + + foreground + #cad3f5 + + + + name + Javadoc + scope + comment.block.javadoc.java keyword.other.documentation.javadoc.java + settings + + fontStyle + + + + + name + Exported Variable + scope + meta.export variable.other.readwrite.js + settings + + foreground + #ee99a0 + + + + name + JS/TS constants & properties + scope + variable.other.constant.js, variable.other.constant.ts, variable.other.property.js, variable.other.property.ts + settings + + foreground + #cad3f5 + + + + name + JSDoc; these are mainly params, so styled as such + scope + variable.other.jsdoc, comment.block.documentation variable.other + settings + + foreground + #ee99a0 + fontStyle + + + + + name + JSDoc keywords + scope + storage.type.class.jsdoc + settings + + fontStyle + + + + + scope + support.type.object.console.js + settings + + foreground + #cad3f5 + + + + name + Node constants as keywords (module, etc.) + scope + support.constant.node, support.type.object.module.js + settings + + foreground + #c6a0f6 + + + + name + implements as keyword + scope + storage.modifier.implements + settings + + foreground + #c6a0f6 + + + + name + Builtin types + scope + constant.language.null.js, constant.language.null.ts, constant.language.undefined.js, constant.language.undefined.ts, support.type.builtin.ts + settings + + foreground + #c6a0f6 + + + + scope + variable.parameter.generic + settings + + foreground + #eed49f + + + + name + Arrow functions + scope + keyword.declaration.function.arrow.js, storage.type.function.arrow.ts + settings + + foreground + #8bd5ca + + + + name + Decorator punctuations (decorators inherit from blue functions, instead of styleguide peach) + scope + punctuation.decorator.ts + settings + + foreground + #8aadf4 + fontStyle + italic + + + + name + Extra JS/TS keywords + scope + keyword.operator.expression.in.js, keyword.operator.expression.in.ts, keyword.operator.expression.infer.ts, keyword.operator.expression.instanceof.js, keyword.operator.expression.instanceof.ts, keyword.operator.expression.is, keyword.operator.expression.keyof.ts, keyword.operator.expression.of.js, keyword.operator.expression.of.ts, keyword.operator.expression.typeof.ts + settings + + foreground + #c6a0f6 + + + + name + Julia macros + scope + support.function.macro.julia + settings + + foreground + #8bd5ca + fontStyle + italic + + + + name + Julia language constants (true, false) + scope + constant.language.julia + settings + + foreground + #f5a97f + + + + name + Julia other constants (these seem to be arguments inside arrays) + scope + constant.other.symbol.julia + settings + + foreground + #ee99a0 + + + + name + LaTeX preamble + scope + text.tex keyword.control.preamble + settings + + foreground + #8bd5ca + + + + name + LaTeX be functions + scope + text.tex support.function.be + settings + + foreground + #91d7e3 + + + + name + LaTeX math + scope + constant.other.general.math.tex + settings + + foreground + #f0c6c6 + + + + name + Lua docstring keywords + scope + comment.line.double-dash.documentation.lua storage.type.annotation.lua + settings + + foreground + #c6a0f6 + fontStyle + + + + + name + Lua docstring variables + scope + comment.line.double-dash.documentation.lua entity.name.variable.lua, comment.line.double-dash.documentation.lua variable.lua + settings + + foreground + #cad3f5 + + + + scope + heading.1.markdown punctuation.definition.heading.markdown, heading.1.markdown, markup.heading.atx.1.mdx, markup.heading.atx.1.mdx punctuation.definition.heading.mdx, markup.heading.setext.1.markdown, markup.heading.heading-0.asciidoc + settings + + foreground + #ed8796 + + + + scope + heading.2.markdown punctuation.definition.heading.markdown, heading.2.markdown, markup.heading.atx.2.mdx, markup.heading.atx.2.mdx punctuation.definition.heading.mdx, markup.heading.setext.2.markdown, markup.heading.heading-1.asciidoc + settings + + foreground + #f5a97f + + + + scope + heading.3.markdown punctuation.definition.heading.markdown, heading.3.markdown, markup.heading.atx.3.mdx, markup.heading.atx.3.mdx punctuation.definition.heading.mdx, markup.heading.heading-2.asciidoc + settings + + foreground + #eed49f + + + + scope + heading.4.markdown punctuation.definition.heading.markdown, heading.4.markdown, markup.heading.atx.4.mdx, markup.heading.atx.4.mdx punctuation.definition.heading.mdx, markup.heading.heading-3.asciidoc + settings + + foreground + #a6da95 + + + + scope + heading.5.markdown punctuation.definition.heading.markdown, heading.5.markdown, markup.heading.atx.5.mdx, markup.heading.atx.5.mdx punctuation.definition.heading.mdx, markup.heading.heading-4.asciidoc + settings + + foreground + #8aadf4 + + + + scope + heading.6.markdown punctuation.definition.heading.markdown, heading.6.markdown, markup.heading.atx.6.mdx, markup.heading.atx.6.mdx punctuation.definition.heading.mdx, markup.heading.heading-5.asciidoc + settings + + foreground + #c6a0f6 + + + + scope + markup.bold + settings + + foreground + #ed8796 + fontStyle + bold + + + + scope + markup.italic + settings + + foreground + #ed8796 + fontStyle + italic + + + + scope + markup.strikethrough + settings + + foreground + #a5adcb + fontStyle + strikethrough + + + + name + Markdown auto links + scope + punctuation.definition.link, markup.underline.link + settings + + foreground + #8aadf4 + + + + name + Markdown links + scope + text.html.markdown punctuation.definition.link.title, string.other.link.title.markdown, markup.link, punctuation.definition.constant.markdown, constant.other.reference.link.markdown, markup.substitution.attribute-reference + settings + + foreground + #b7bdf8 + + + + name + Markdown code spans + scope + punctuation.definition.raw.markdown, markup.inline.raw.string.markdown, markup.raw.block.markdown + settings + + foreground + #a6da95 + + + + name + Markdown triple backtick language identifier + scope + fenced_code.block.language + settings + + foreground + #91d7e3 + + + + name + Markdown triple backticks + scope + markup.fenced_code.block punctuation.definition, markup.raw support.asciidoc + settings + + foreground + #939ab7 + + + + name + Markdown quotes + scope + markup.quote, punctuation.definition.quote.begin + settings + + foreground + #f5bde6 + + + + name + Markdown separators + scope + meta.separator.markdown + settings + + foreground + #8bd5ca + + + + name + Markdown list bullets + scope + punctuation.definition.list.begin.markdown, markup.list.bullet + settings + + foreground + #8bd5ca + + + + name + Nix attribute names + scope + entity.other.attribute-name.multipart.nix, entity.other.attribute-name.single.nix + settings + + foreground + #8aadf4 + + + + name + Nix parameter names + scope + variable.parameter.name.nix + settings + + foreground + #cad3f5 + fontStyle + + + + + name + Nix interpolated parameter names + scope + meta.embedded variable.parameter.name.nix + settings + + foreground + #b7bdf8 + fontStyle + + + + + name + Nix paths + scope + string.unquoted.path.nix + settings + + foreground + #f5bde6 + fontStyle + + + + + name + PHP Attributes + scope + support.attribute.builtin, meta.attribute.php + settings + + foreground + #eed49f + + + + name + PHP Parameters (needed for the leading dollar sign) + scope + meta.function.parameters.php punctuation.definition.variable.php + settings + + foreground + #ee99a0 + + + + name + PHP Constants (null, __FILE__, etc.) + scope + constant.language.php + settings + + foreground + #c6a0f6 + + + + name + PHP functions + scope + text.html.php support.function + settings + + foreground + #91d7e3 + + + + name + PHPdoc keywords + scope + keyword.other.phpdoc.php + settings + + fontStyle + + + + + name + Python argument functions reset to text, otherwise they inherit blue from function-call + scope + support.variable.magic.python, meta.function-call.arguments.python + settings + + foreground + #cad3f5 + + + + name + Python double underscore functions + scope + support.function.magic.python + settings + + foreground + #91d7e3 + fontStyle + italic + + + + name + Python `self` keyword + scope + variable.parameter.function.language.special.self.python, variable.language.special.self.python + settings + + foreground + #ed8796 + fontStyle + italic + + + + name + python keyword flow/logical (for ... in) + scope + keyword.control.flow.python, keyword.operator.logical.python + settings + + foreground + #c6a0f6 + + + + name + python storage type + scope + storage.type.function.python + settings + + foreground + #c6a0f6 + + + + name + python function support + scope + support.token.decorator.python, meta.function.decorator.identifier.python + settings + + foreground + #91d7e3 + + + + name + python function calls + scope + meta.function-call.python + settings + + foreground + #8aadf4 + + + + name + python function decorators + scope + entity.name.function.decorator.python, punctuation.definition.decorator.python + settings + + foreground + #f5a97f + fontStyle + italic + + + + name + python placeholder reset to normal string + scope + constant.character.format.placeholder.other.python + settings + + foreground + #f5bde6 + + + + name + Python exception & builtins such as exit() + scope + support.type.exception.python, support.function.builtin.python + settings + + foreground + #f5a97f + + + + name + entity.name.type + scope + support.type.python + settings + + foreground + #f5a97f + + + + name + python constants (True/False) + scope + constant.language.python + settings + + foreground + #c6a0f6 + + + + name + Arguments accessed later in the function body + scope + meta.indexed-name.python, meta.item-access.python + settings + + foreground + #ee99a0 + fontStyle + italic + + + + name + Python f-strings/binary/unicode storage types + scope + storage.type.string.python + settings + + foreground + #a6da95 + fontStyle + italic + + + + name + Python type hints + scope + meta.function.parameters.python + settings + + fontStyle + + + + + name + Regex string begin/end in JS/TS + scope + string.regexp punctuation.definition.string.begin, string.regexp punctuation.definition.string.end + settings + + foreground + #f5bde6 + + + + name + Regex anchors (^, $) + scope + keyword.control.anchor.regexp + settings + + foreground + #c6a0f6 + + + + name + Regex regular string match + scope + string.regexp.ts + settings + + foreground + #cad3f5 + + + + name + Regex group parenthesis & backreference (\1, \2, \3, ...) + scope + punctuation.definition.group.regexp, keyword.other.back-reference.regexp + settings + + foreground + #a6da95 + + + + name + Regex character class [] + scope + punctuation.definition.character-class.regexp + settings + + foreground + #eed49f + + + + name + Regex character classes (\d, \w, \s) + scope + constant.other.character-class.regexp + settings + + foreground + #f5bde6 + + + + name + Regex range + scope + constant.other.character-class.range.regexp + settings + + foreground + #f4dbd6 + + + + name + Regex quantifier + scope + keyword.operator.quantifier.regexp + settings + + foreground + #8bd5ca + + + + name + Regex constant/numeric + scope + constant.character.numeric.regexp + settings + + foreground + #f5a97f + + + + name + Regex lookaheads, negative lookaheads, lookbehinds, negative lookbehinds + scope + punctuation.definition.group.no-capture.regexp, meta.assertion.look-ahead.regexp, meta.assertion.negative-look-ahead.regexp + settings + + foreground + #8aadf4 + + + + name + Rust attribute + scope + meta.annotation.rust, meta.annotation.rust punctuation, meta.attribute.rust, punctuation.definition.attribute.rust + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Rust attribute strings + scope + meta.attribute.rust string.quoted.double.rust, meta.attribute.rust string.quoted.single.char.rust + settings + + fontStyle + + + + + name + Rust keyword + scope + entity.name.function.macro.rules.rust, storage.type.module.rust, storage.modifier.rust, storage.type.struct.rust, storage.type.enum.rust, storage.type.trait.rust, storage.type.union.rust, storage.type.impl.rust, storage.type.rust, storage.type.function.rust, storage.type.type.rust + settings + + foreground + #c6a0f6 + fontStyle + + + + + name + Rust u/i32, u/i64, etc. + scope + entity.name.type.numeric.rust + settings + + foreground + #c6a0f6 + fontStyle + + + + + name + Rust generic + scope + meta.generic.rust + settings + + foreground + #f5a97f + + + + name + Rust impl + scope + entity.name.impl.rust + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Rust module + scope + entity.name.module.rust + settings + + foreground + #f5a97f + + + + name + Rust trait + scope + entity.name.trait.rust + settings + + foreground + #eed49f + fontStyle + italic + + + + name + Rust struct + scope + storage.type.source.rust + settings + + foreground + #eed49f + + + + name + Rust union + scope + entity.name.union.rust + settings + + foreground + #eed49f + + + + name + Rust enum member + scope + meta.enum.rust storage.type.source.rust + settings + + foreground + #8bd5ca + + + + name + Rust macro + scope + support.macro.rust, meta.macro.rust support.function.rust, entity.name.function.macro.rust + settings + + foreground + #8aadf4 + fontStyle + italic + + + + name + Rust lifetime + scope + storage.modifier.lifetime.rust, entity.name.type.lifetime + settings + + foreground + #8aadf4 + fontStyle + italic + + + + name + Rust string formatting + scope + string.quoted.double.rust constant.other.placeholder.rust + settings + + foreground + #f5bde6 + + + + name + Rust return type generic + scope + meta.function.return-type.rust meta.generic.rust storage.type.rust + settings + + foreground + #cad3f5 + + + + name + Rust functions + scope + meta.function.call.rust + settings + + foreground + #8aadf4 + + + + name + Rust angle brackets + scope + punctuation.brackets.angle.rust + settings + + foreground + #91d7e3 + + + + name + Rust constants + scope + constant.other.caps.rust + settings + + foreground + #f5a97f + + + + name + Rust function parameters + scope + meta.function.definition.rust variable.other.rust + settings + + foreground + #ee99a0 + + + + name + Rust closure variables + scope + meta.function.call.rust variable.other.rust + settings + + foreground + #cad3f5 + + + + name + Rust self + scope + variable.language.self.rust + settings + + foreground + #ed8796 + + + + name + Rust metavariable names + scope + variable.other.metavariable.name.rust, meta.macro.metavariable.rust keyword.operator.macro.dollar.rust + settings + + foreground + #f5bde6 + + + + name + Shell shebang + scope + comment.line.shebang, comment.line.shebang punctuation.definition.comment, comment.line.shebang, punctuation.definition.comment.shebang.shell, meta.shebang.shell + settings + + foreground + #f5bde6 + fontStyle + italic + + + + name + Shell shebang command + scope + comment.line.shebang constant.language + settings + + foreground + #8bd5ca + fontStyle + italic + + + + name + Shell interpolated command + scope + meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation, meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation + settings + + foreground + #ed8796 + + + + name + Shell interpolated command variable + scope + meta.string meta.interpolation.parameter.shell variable.other.readwrite + settings + + foreground + #f5a97f + fontStyle + italic + + + + scope + source.shell punctuation.section.interpolation, punctuation.definition.evaluation.backticks.shell + settings + + foreground + #8bd5ca + + + + name + Shell EOF + scope + entity.name.tag.heredoc.shell + settings + + foreground + #c6a0f6 + + + + name + Shell quoted variable + scope + string.quoted.double.shell variable.other.normal.shell + settings + + foreground + #cad3f5 + + + + scope + markup.heading.synopsis.man, markup.heading.title.man, markup.heading.other.man, markup.heading.env.man + settings + + foreground + #c6a0f6 + + + + scope + markup.heading.commands.man + settings + + foreground + #8aadf4 + + + + scope + markup.heading.env.man + settings + + foreground + #f5bde6 + + + + + \ No newline at end of file diff --git a/programs/bat/catppuccinMocha.tmTheme b/programs/bat/catppuccinMocha.tmTheme new file mode 100644 index 0000000..364617b --- /dev/null +++ b/programs/bat/catppuccinMocha.tmTheme @@ -0,0 +1,2021 @@ + + + + + name + Catppuccin Mocha + semanticClass + theme.dark.catppuccin-mocha + uuid + 627ce890-fabb-4d39-9819-7be71f4bdca7 + author + Catppuccin Org + colorSpaceName + sRGB + settings + + + settings + + background + #1e1e2e + foreground + #cdd6f4 + caret + #f5e0dc + lineHighlight + #cdd6f412 + misspelling + #f38ba8 + accent + #cba6f7 + selection + #9399b240 + activeGuide + #45475a + findHighlight + #3e5767 + gutterForeground + #7f849c + + + + name + Basic text & variable names (incl. leading punctuation) + scope + text, source, variable.other.readwrite, punctuation.definition.variable + settings + + foreground + #cdd6f4 + + + + name + Parentheses, Brackets, Braces + scope + punctuation + settings + + foreground + #9399b2 + fontStyle + + + + + name + Comments + scope + comment, punctuation.definition.comment + settings + + foreground + #6c7086 + fontStyle + italic + + + + scope + string, punctuation.definition.string + settings + + foreground + #a6e3a1 + + + + scope + constant.character.escape + settings + + foreground + #f5c2e7 + + + + name + Booleans, constants, numbers + scope + constant.numeric, variable.other.constant, entity.name.constant, constant.language.boolean, constant.language.false, constant.language.true, keyword.other.unit.user-defined, keyword.other.unit.suffix.floating-point + settings + + foreground + #fab387 + + + + scope + keyword, keyword.operator.word, keyword.operator.new, variable.language.super, support.type.primitive, storage.type, storage.modifier, punctuation.definition.keyword + settings + + foreground + #cba6f7 + fontStyle + + + + + scope + entity.name.tag.documentation + settings + + foreground + #cba6f7 + + + + name + Punctuation + scope + keyword.operator, punctuation.accessor, punctuation.definition.generic, meta.function.closure punctuation.section.parameters, punctuation.definition.tag, punctuation.separator.key-value + settings + + foreground + #94e2d5 + + + + scope + entity.name.function, meta.function-call.method, support.function, support.function.misc, variable.function + settings + + foreground + #89b4fa + fontStyle + italic + + + + name + Classes + scope + entity.name.class, entity.other.inherited-class, support.class, meta.function-call.constructor, entity.name.struct + settings + + foreground + #f9e2af + fontStyle + italic + + + + name + Enum + scope + entity.name.enum + settings + + foreground + #f9e2af + fontStyle + italic + + + + name + Enum member + scope + meta.enum variable.other.readwrite, variable.other.enummember + settings + + foreground + #94e2d5 + + + + name + Object properties + scope + meta.property.object + settings + + foreground + #94e2d5 + + + + name + Types + scope + meta.type, meta.type-alias, support.type, entity.name.type + settings + + foreground + #f9e2af + fontStyle + italic + + + + name + Decorators + scope + meta.annotation variable.function, meta.annotation variable.annotation.function, meta.annotation punctuation.definition.annotation, meta.decorator, punctuation.decorator + settings + + foreground + #fab387 + + + + scope + variable.parameter, meta.function.parameters + settings + + foreground + #eba0ac + fontStyle + italic + + + + name + Built-ins + scope + constant.language, support.function.builtin + settings + + foreground + #f38ba8 + + + + scope + entity.other.attribute-name.documentation + settings + + foreground + #f38ba8 + + + + name + Preprocessor directives + scope + keyword.control.directive, punctuation.definition.directive + settings + + foreground + #f9e2af + + + + name + Type parameters + scope + punctuation.definition.typeparameters + settings + + foreground + #89dceb + + + + name + Namespaces + scope + entity.name.namespace + settings + + foreground + #f9e2af + + + + name + Property names (left hand assignments in json/yaml/css) + scope + support.type.property-name.css + settings + + foreground + #89b4fa + fontStyle + + + + + name + This/Self keyword + scope + variable.language.this, variable.language.this punctuation.definition.variable + settings + + foreground + #f38ba8 + + + + name + Object properties + scope + variable.object.property + settings + + foreground + #cdd6f4 + + + + name + String template interpolation + scope + string.template variable, string variable + settings + + foreground + #cdd6f4 + + + + name + `new` as bold + scope + keyword.operator.new + settings + + fontStyle + bold + + + + name + C++ extern keyword + scope + storage.modifier.specifier.extern.cpp + settings + + foreground + #cba6f7 + + + + name + C++ scope resolution + scope + entity.name.scope-resolution.template.call.cpp, entity.name.scope-resolution.parameter.cpp, entity.name.scope-resolution.cpp, entity.name.scope-resolution.function.definition.cpp + settings + + foreground + #f9e2af + + + + name + C++ doc keywords + scope + storage.type.class.doxygen + settings + + fontStyle + + + + + name + C++ operators + scope + storage.modifier.reference.cpp + settings + + foreground + #94e2d5 + + + + name + C# Interpolated Strings + scope + meta.interpolation.cs + settings + + foreground + #cdd6f4 + + + + name + C# xml-style docs + scope + comment.block.documentation.cs + settings + + foreground + #cdd6f4 + + + + name + Classes, reflecting the className color in JSX + scope + source.css entity.other.attribute-name.class.css, entity.other.attribute-name.parent-selector.css punctuation.definition.entity.css + settings + + foreground + #f9e2af + + + + name + Operators + scope + punctuation.separator.operator.css + settings + + foreground + #94e2d5 + + + + name + Pseudo classes + scope + source.css entity.other.attribute-name.pseudo-class + settings + + foreground + #94e2d5 + + + + scope + source.css constant.other.unicode-range + settings + + foreground + #fab387 + + + + scope + source.css variable.parameter.url + settings + + foreground + #a6e3a1 + fontStyle + + + + + name + CSS vendored property names + scope + support.type.vendored.property-name + settings + + foreground + #89dceb + + + + name + Less/SCSS right-hand variables (@/$-prefixed) + scope + source.css meta.property-value variable, source.css meta.property-value variable.other.less, source.css meta.property-value variable.other.less punctuation.definition.variable.less, meta.definition.variable.scss + settings + + foreground + #eba0ac + + + + name + CSS variables (--prefixed) + scope + source.css meta.property-list variable, meta.property-list variable.other.less, meta.property-list variable.other.less punctuation.definition.variable.less + settings + + foreground + #89b4fa + + + + name + CSS Percentage values, styled the same as numbers + scope + keyword.other.unit.percentage.css + settings + + foreground + #fab387 + + + + name + CSS Attribute selectors, styled the same as strings + scope + source.css meta.attribute-selector + settings + + foreground + #a6e3a1 + + + + name + JSON/YAML keys, other left-hand assignments + scope + keyword.other.definition.ini, punctuation.support.type.property-name.json, support.type.property-name.json, punctuation.support.type.property-name.toml, support.type.property-name.toml, entity.name.tag.yaml, punctuation.support.type.property-name.yaml, support.type.property-name.yaml + settings + + foreground + #89b4fa + fontStyle + + + + + name + JSON/YAML constants + scope + constant.language.json, constant.language.yaml + settings + + foreground + #fab387 + + + + name + YAML anchors + scope + entity.name.type.anchor.yaml, variable.other.alias.yaml + settings + + foreground + #f9e2af + fontStyle + + + + + name + TOML tables / ini groups + scope + support.type.property-name.table, entity.name.section.group-title.ini + settings + + foreground + #f9e2af + + + + name + TOML dates + scope + constant.other.time.datetime.offset.toml + settings + + foreground + #f5c2e7 + + + + name + YAML anchor puctuation + scope + punctuation.definition.anchor.yaml, punctuation.definition.alias.yaml + settings + + foreground + #f5c2e7 + + + + name + YAML triple dashes + scope + entity.other.document.begin.yaml + settings + + foreground + #f5c2e7 + + + + name + Markup Diff + scope + markup.changed.diff + settings + + foreground + #fab387 + + + + name + Diff + scope + meta.diff.header.from-file, meta.diff.header.to-file, punctuation.definition.from-file.diff, punctuation.definition.to-file.diff + settings + + foreground + #89b4fa + + + + name + Diff Inserted + scope + markup.inserted.diff + settings + + foreground + #a6e3a1 + + + + name + Diff Deleted + scope + markup.deleted.diff + settings + + foreground + #f38ba8 + + + + name + dotenv left-hand side assignments + scope + variable.other.env + settings + + foreground + #89b4fa + + + + name + dotenv reference to existing env variable + scope + string.quoted variable.other.env + settings + + foreground + #cdd6f4 + + + + name + GDScript functions + scope + support.function.builtin.gdscript + settings + + foreground + #89b4fa + + + + name + GDScript constants + scope + constant.language.gdscript + settings + + foreground + #fab387 + + + + name + Comment keywords + scope + comment meta.annotation.go + settings + + foreground + #eba0ac + + + + name + go:embed, go:build, etc. + scope + comment meta.annotation.parameters.go + settings + + foreground + #fab387 + + + + name + Go constants (nil, true, false) + scope + constant.language.go + settings + + foreground + #fab387 + + + + name + GraphQL variables + scope + variable.graphql + settings + + foreground + #cdd6f4 + + + + name + GraphQL aliases + scope + string.unquoted.alias.graphql + settings + + foreground + #f2cdcd + + + + name + GraphQL enum members + scope + constant.character.enum.graphql + settings + + foreground + #94e2d5 + + + + name + GraphQL field in types + scope + meta.objectvalues.graphql constant.object.key.graphql string.unquoted.graphql + settings + + foreground + #f2cdcd + + + + name + HTML/XML DOCTYPE as keyword + scope + keyword.other.doctype, meta.tag.sgml.doctype punctuation.definition.tag, meta.tag.metadata.doctype entity.name.tag, meta.tag.metadata.doctype punctuation.definition.tag + settings + + foreground + #cba6f7 + + + + name + HTML/XML-like <tags/> + scope + entity.name.tag + settings + + foreground + #89b4fa + fontStyle + + + + + name + Special characters like &amp; + scope + text.html constant.character.entity, text.html constant.character.entity punctuation, constant.character.entity.xml, constant.character.entity.xml punctuation, constant.character.entity.js.jsx, constant.charactger.entity.js.jsx punctuation, constant.character.entity.tsx, constant.character.entity.tsx punctuation + settings + + foreground + #f38ba8 + + + + name + HTML/XML tag attribute values + scope + entity.other.attribute-name + settings + + foreground + #f9e2af + + + + name + Components + scope + support.class.component, support.class.component.jsx, support.class.component.tsx, support.class.component.vue + settings + + foreground + #f5c2e7 + fontStyle + + + + + name + Annotations + scope + punctuation.definition.annotation, storage.type.annotation + settings + + foreground + #fab387 + + + + name + Java enums + scope + constant.other.enum.java + settings + + foreground + #94e2d5 + + + + name + Java imports + scope + storage.modifier.import.java + settings + + foreground + #cdd6f4 + + + + name + Javadoc + scope + comment.block.javadoc.java keyword.other.documentation.javadoc.java + settings + + fontStyle + + + + + name + Exported Variable + scope + meta.export variable.other.readwrite.js + settings + + foreground + #eba0ac + + + + name + JS/TS constants & properties + scope + variable.other.constant.js, variable.other.constant.ts, variable.other.property.js, variable.other.property.ts + settings + + foreground + #cdd6f4 + + + + name + JSDoc; these are mainly params, so styled as such + scope + variable.other.jsdoc, comment.block.documentation variable.other + settings + + foreground + #eba0ac + fontStyle + + + + + name + JSDoc keywords + scope + storage.type.class.jsdoc + settings + + fontStyle + + + + + scope + support.type.object.console.js + settings + + foreground + #cdd6f4 + + + + name + Node constants as keywords (module, etc.) + scope + support.constant.node, support.type.object.module.js + settings + + foreground + #cba6f7 + + + + name + implements as keyword + scope + storage.modifier.implements + settings + + foreground + #cba6f7 + + + + name + Builtin types + scope + constant.language.null.js, constant.language.null.ts, constant.language.undefined.js, constant.language.undefined.ts, support.type.builtin.ts + settings + + foreground + #cba6f7 + + + + scope + variable.parameter.generic + settings + + foreground + #f9e2af + + + + name + Arrow functions + scope + keyword.declaration.function.arrow.js, storage.type.function.arrow.ts + settings + + foreground + #94e2d5 + + + + name + Decorator punctuations (decorators inherit from blue functions, instead of styleguide peach) + scope + punctuation.decorator.ts + settings + + foreground + #89b4fa + fontStyle + italic + + + + name + Extra JS/TS keywords + scope + keyword.operator.expression.in.js, keyword.operator.expression.in.ts, keyword.operator.expression.infer.ts, keyword.operator.expression.instanceof.js, keyword.operator.expression.instanceof.ts, keyword.operator.expression.is, keyword.operator.expression.keyof.ts, keyword.operator.expression.of.js, keyword.operator.expression.of.ts, keyword.operator.expression.typeof.ts + settings + + foreground + #cba6f7 + + + + name + Julia macros + scope + support.function.macro.julia + settings + + foreground + #94e2d5 + fontStyle + italic + + + + name + Julia language constants (true, false) + scope + constant.language.julia + settings + + foreground + #fab387 + + + + name + Julia other constants (these seem to be arguments inside arrays) + scope + constant.other.symbol.julia + settings + + foreground + #eba0ac + + + + name + LaTeX preamble + scope + text.tex keyword.control.preamble + settings + + foreground + #94e2d5 + + + + name + LaTeX be functions + scope + text.tex support.function.be + settings + + foreground + #89dceb + + + + name + LaTeX math + scope + constant.other.general.math.tex + settings + + foreground + #f2cdcd + + + + name + Lua docstring keywords + scope + comment.line.double-dash.documentation.lua storage.type.annotation.lua + settings + + foreground + #cba6f7 + fontStyle + + + + + name + Lua docstring variables + scope + comment.line.double-dash.documentation.lua entity.name.variable.lua, comment.line.double-dash.documentation.lua variable.lua + settings + + foreground + #cdd6f4 + + + + scope + heading.1.markdown punctuation.definition.heading.markdown, heading.1.markdown, markup.heading.atx.1.mdx, markup.heading.atx.1.mdx punctuation.definition.heading.mdx, markup.heading.setext.1.markdown, markup.heading.heading-0.asciidoc + settings + + foreground + #f38ba8 + + + + scope + heading.2.markdown punctuation.definition.heading.markdown, heading.2.markdown, markup.heading.atx.2.mdx, markup.heading.atx.2.mdx punctuation.definition.heading.mdx, markup.heading.setext.2.markdown, markup.heading.heading-1.asciidoc + settings + + foreground + #fab387 + + + + scope + heading.3.markdown punctuation.definition.heading.markdown, heading.3.markdown, markup.heading.atx.3.mdx, markup.heading.atx.3.mdx punctuation.definition.heading.mdx, markup.heading.heading-2.asciidoc + settings + + foreground + #f9e2af + + + + scope + heading.4.markdown punctuation.definition.heading.markdown, heading.4.markdown, markup.heading.atx.4.mdx, markup.heading.atx.4.mdx punctuation.definition.heading.mdx, markup.heading.heading-3.asciidoc + settings + + foreground + #a6e3a1 + + + + scope + heading.5.markdown punctuation.definition.heading.markdown, heading.5.markdown, markup.heading.atx.5.mdx, markup.heading.atx.5.mdx punctuation.definition.heading.mdx, markup.heading.heading-4.asciidoc + settings + + foreground + #89b4fa + + + + scope + heading.6.markdown punctuation.definition.heading.markdown, heading.6.markdown, markup.heading.atx.6.mdx, markup.heading.atx.6.mdx punctuation.definition.heading.mdx, markup.heading.heading-5.asciidoc + settings + + foreground + #cba6f7 + + + + scope + markup.bold + settings + + foreground + #f38ba8 + fontStyle + bold + + + + scope + markup.italic + settings + + foreground + #f38ba8 + fontStyle + italic + + + + scope + markup.strikethrough + settings + + foreground + #a6adc8 + fontStyle + strikethrough + + + + name + Markdown auto links + scope + punctuation.definition.link, markup.underline.link + settings + + foreground + #89b4fa + + + + name + Markdown links + scope + text.html.markdown punctuation.definition.link.title, string.other.link.title.markdown, markup.link, punctuation.definition.constant.markdown, constant.other.reference.link.markdown, markup.substitution.attribute-reference + settings + + foreground + #b4befe + + + + name + Markdown code spans + scope + punctuation.definition.raw.markdown, markup.inline.raw.string.markdown, markup.raw.block.markdown + settings + + foreground + #a6e3a1 + + + + name + Markdown triple backtick language identifier + scope + fenced_code.block.language + settings + + foreground + #89dceb + + + + name + Markdown triple backticks + scope + markup.fenced_code.block punctuation.definition, markup.raw support.asciidoc + settings + + foreground + #9399b2 + + + + name + Markdown quotes + scope + markup.quote, punctuation.definition.quote.begin + settings + + foreground + #f5c2e7 + + + + name + Markdown separators + scope + meta.separator.markdown + settings + + foreground + #94e2d5 + + + + name + Markdown list bullets + scope + punctuation.definition.list.begin.markdown, markup.list.bullet + settings + + foreground + #94e2d5 + + + + name + Nix attribute names + scope + entity.other.attribute-name.multipart.nix, entity.other.attribute-name.single.nix + settings + + foreground + #89b4fa + + + + name + Nix parameter names + scope + variable.parameter.name.nix + settings + + foreground + #cdd6f4 + fontStyle + + + + + name + Nix interpolated parameter names + scope + meta.embedded variable.parameter.name.nix + settings + + foreground + #b4befe + fontStyle + + + + + name + Nix paths + scope + string.unquoted.path.nix + settings + + foreground + #f5c2e7 + fontStyle + + + + + name + PHP Attributes + scope + support.attribute.builtin, meta.attribute.php + settings + + foreground + #f9e2af + + + + name + PHP Parameters (needed for the leading dollar sign) + scope + meta.function.parameters.php punctuation.definition.variable.php + settings + + foreground + #eba0ac + + + + name + PHP Constants (null, __FILE__, etc.) + scope + constant.language.php + settings + + foreground + #cba6f7 + + + + name + PHP functions + scope + text.html.php support.function + settings + + foreground + #89dceb + + + + name + PHPdoc keywords + scope + keyword.other.phpdoc.php + settings + + fontStyle + + + + + name + Python argument functions reset to text, otherwise they inherit blue from function-call + scope + support.variable.magic.python, meta.function-call.arguments.python + settings + + foreground + #cdd6f4 + + + + name + Python double underscore functions + scope + support.function.magic.python + settings + + foreground + #89dceb + fontStyle + italic + + + + name + Python `self` keyword + scope + variable.parameter.function.language.special.self.python, variable.language.special.self.python + settings + + foreground + #f38ba8 + fontStyle + italic + + + + name + python keyword flow/logical (for ... in) + scope + keyword.control.flow.python, keyword.operator.logical.python + settings + + foreground + #cba6f7 + + + + name + python storage type + scope + storage.type.function.python + settings + + foreground + #cba6f7 + + + + name + python function support + scope + support.token.decorator.python, meta.function.decorator.identifier.python + settings + + foreground + #89dceb + + + + name + python function calls + scope + meta.function-call.python + settings + + foreground + #89b4fa + + + + name + python function decorators + scope + entity.name.function.decorator.python, punctuation.definition.decorator.python + settings + + foreground + #fab387 + fontStyle + italic + + + + name + python placeholder reset to normal string + scope + constant.character.format.placeholder.other.python + settings + + foreground + #f5c2e7 + + + + name + Python exception & builtins such as exit() + scope + support.type.exception.python, support.function.builtin.python + settings + + foreground + #fab387 + + + + name + entity.name.type + scope + support.type.python + settings + + foreground + #fab387 + + + + name + python constants (True/False) + scope + constant.language.python + settings + + foreground + #cba6f7 + + + + name + Arguments accessed later in the function body + scope + meta.indexed-name.python, meta.item-access.python + settings + + foreground + #eba0ac + fontStyle + italic + + + + name + Python f-strings/binary/unicode storage types + scope + storage.type.string.python + settings + + foreground + #a6e3a1 + fontStyle + italic + + + + name + Python type hints + scope + meta.function.parameters.python + settings + + fontStyle + + + + + name + Regex string begin/end in JS/TS + scope + string.regexp punctuation.definition.string.begin, string.regexp punctuation.definition.string.end + settings + + foreground + #f5c2e7 + + + + name + Regex anchors (^, $) + scope + keyword.control.anchor.regexp + settings + + foreground + #cba6f7 + + + + name + Regex regular string match + scope + string.regexp.ts + settings + + foreground + #cdd6f4 + + + + name + Regex group parenthesis & backreference (\1, \2, \3, ...) + scope + punctuation.definition.group.regexp, keyword.other.back-reference.regexp + settings + + foreground + #a6e3a1 + + + + name + Regex character class [] + scope + punctuation.definition.character-class.regexp + settings + + foreground + #f9e2af + + + + name + Regex character classes (\d, \w, \s) + scope + constant.other.character-class.regexp + settings + + foreground + #f5c2e7 + + + + name + Regex range + scope + constant.other.character-class.range.regexp + settings + + foreground + #f5e0dc + + + + name + Regex quantifier + scope + keyword.operator.quantifier.regexp + settings + + foreground + #94e2d5 + + + + name + Regex constant/numeric + scope + constant.character.numeric.regexp + settings + + foreground + #fab387 + + + + name + Regex lookaheads, negative lookaheads, lookbehinds, negative lookbehinds + scope + punctuation.definition.group.no-capture.regexp, meta.assertion.look-ahead.regexp, meta.assertion.negative-look-ahead.regexp + settings + + foreground + #89b4fa + + + + name + Rust attribute + scope + meta.annotation.rust, meta.annotation.rust punctuation, meta.attribute.rust, punctuation.definition.attribute.rust + settings + + foreground + #f9e2af + fontStyle + italic + + + + name + Rust attribute strings + scope + meta.attribute.rust string.quoted.double.rust, meta.attribute.rust string.quoted.single.char.rust + settings + + fontStyle + + + + + name + Rust keyword + scope + entity.name.function.macro.rules.rust, storage.type.module.rust, storage.modifier.rust, storage.type.struct.rust, storage.type.enum.rust, storage.type.trait.rust, storage.type.union.rust, storage.type.impl.rust, storage.type.rust, storage.type.function.rust, storage.type.type.rust + settings + + foreground + #cba6f7 + fontStyle + + + + + name + Rust u/i32, u/i64, etc. + scope + entity.name.type.numeric.rust + settings + + foreground + #cba6f7 + fontStyle + + + + + name + Rust generic + scope + meta.generic.rust + settings + + foreground + #fab387 + + + + name + Rust impl + scope + entity.name.impl.rust + settings + + foreground + #f9e2af + fontStyle + italic + + + + name + Rust module + scope + entity.name.module.rust + settings + + foreground + #fab387 + + + + name + Rust trait + scope + entity.name.trait.rust + settings + + foreground + #f9e2af + fontStyle + italic + + + + name + Rust struct + scope + storage.type.source.rust + settings + + foreground + #f9e2af + + + + name + Rust union + scope + entity.name.union.rust + settings + + foreground + #f9e2af + + + + name + Rust enum member + scope + meta.enum.rust storage.type.source.rust + settings + + foreground + #94e2d5 + + + + name + Rust macro + scope + support.macro.rust, meta.macro.rust support.function.rust, entity.name.function.macro.rust + settings + + foreground + #89b4fa + fontStyle + italic + + + + name + Rust lifetime + scope + storage.modifier.lifetime.rust, entity.name.type.lifetime + settings + + foreground + #89b4fa + fontStyle + italic + + + + name + Rust string formatting + scope + string.quoted.double.rust constant.other.placeholder.rust + settings + + foreground + #f5c2e7 + + + + name + Rust return type generic + scope + meta.function.return-type.rust meta.generic.rust storage.type.rust + settings + + foreground + #cdd6f4 + + + + name + Rust functions + scope + meta.function.call.rust + settings + + foreground + #89b4fa + + + + name + Rust angle brackets + scope + punctuation.brackets.angle.rust + settings + + foreground + #89dceb + + + + name + Rust constants + scope + constant.other.caps.rust + settings + + foreground + #fab387 + + + + name + Rust function parameters + scope + meta.function.definition.rust variable.other.rust + settings + + foreground + #eba0ac + + + + name + Rust closure variables + scope + meta.function.call.rust variable.other.rust + settings + + foreground + #cdd6f4 + + + + name + Rust self + scope + variable.language.self.rust + settings + + foreground + #f38ba8 + + + + name + Rust metavariable names + scope + variable.other.metavariable.name.rust, meta.macro.metavariable.rust keyword.operator.macro.dollar.rust + settings + + foreground + #f5c2e7 + + + + name + Shell shebang + scope + comment.line.shebang, comment.line.shebang punctuation.definition.comment, comment.line.shebang, punctuation.definition.comment.shebang.shell, meta.shebang.shell + settings + + foreground + #f5c2e7 + fontStyle + italic + + + + name + Shell shebang command + scope + comment.line.shebang constant.language + settings + + foreground + #94e2d5 + fontStyle + italic + + + + name + Shell interpolated command + scope + meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation, meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation + settings + + foreground + #f38ba8 + + + + name + Shell interpolated command variable + scope + meta.string meta.interpolation.parameter.shell variable.other.readwrite + settings + + foreground + #fab387 + fontStyle + italic + + + + scope + source.shell punctuation.section.interpolation, punctuation.definition.evaluation.backticks.shell + settings + + foreground + #94e2d5 + + + + name + Shell EOF + scope + entity.name.tag.heredoc.shell + settings + + foreground + #cba6f7 + + + + name + Shell quoted variable + scope + string.quoted.double.shell variable.other.normal.shell + settings + + foreground + #cdd6f4 + + + + scope + markup.heading.synopsis.man, markup.heading.title.man, markup.heading.other.man, markup.heading.env.man + settings + + foreground + #cba6f7 + + + + scope + markup.heading.commands.man + settings + + foreground + #89b4fa + + + + scope + markup.heading.env.man + settings + + foreground + #f5c2e7 + + + + + \ No newline at end of file diff --git a/programs/bat/default.nix b/programs/bat/default.nix new file mode 100644 index 0000000..45a6330 --- /dev/null +++ b/programs/bat/default.nix @@ -0,0 +1,21 @@ +{ + lib, + catppuccinVariant ? "Mocha", + ... +}: { + xdg.configFile = let + variants = ["Latte" "Frappe" "Macchiato" "Mocha"]; + mkVariant = variant: let + fname = "catppuccin${variant}.tmTheme"; + in { + name = "bat/themes/${fname}"; + value = {source = ./. + "/${fname}";}; + }; + in + builtins.listToAttrs + (lib.lists.forEach variants mkVariant); + programs.bat = { + enable = true; + config.theme = "catppuccin${catppuccinVariant}"; + }; +} diff --git a/programs/bottom/default.nix b/programs/bottom/default.nix new file mode 100644 index 0000000..09c35c4 --- /dev/null +++ b/programs/bottom/default.nix @@ -0,0 +1,35 @@ +{ + config, + accentColour ? "base07", + ... +}: { + programs.bottom = { + enable = true; + settings.colors = with config.scheme.withHashtag; let + rainbow = [red yellow green cyan blue magenta]; + in { + table_header_color = base05; + all_cpu_color = base05; + avg_cpu_color = base05; + cpu_core_colors = rainbow; + ram_color = red; + cache_color = green; + swap_color = blue; + rx_color = green; + tx_color = blue; + widget_title_color = config.scheme.withHashtag.${accentColour}; + border_color = base02; + highlighted_border_color = config.scheme.withHashtag.${accentColour}; + text_color = base05; + graph_color = base04; + cursor_color = base02; + selected_text_color = base05; + selected_bg_color = base01; + high_battery_color = green; + medium_battery_color = yellow; + low_battery_color = red; + gpu_core_colors = rainbow; + arc_color = cyan; + }; + }; +} diff --git a/programs/cava/default.nix b/programs/cava/default.nix new file mode 100644 index 0000000..7f61e7d --- /dev/null +++ b/programs/cava/default.nix @@ -0,0 +1,17 @@ +{config, ...}: { + programs.cava = { + enable = true; + settings = { + color = with config.scheme.withHashtag; { + gradient = 1; + gradient_count = 6; + gradient_color_1 = "'${red}'"; + gradient_color_2 = "'${yellow}'"; + gradient_color_3 = "'${green}'"; + gradient_color_4 = "'${cyan}'"; + gradient_color_5 = "'${blue}'"; + gradient_color_6 = "'${magenta}'"; + }; + }; + }; +} diff --git a/programs/emacs/default.nix b/programs/emacs/default.nix new file mode 100644 index 0000000..eac920a --- /dev/null +++ b/programs/emacs/default.nix @@ -0,0 +1,172 @@ +{ + config, + pkgs, + fonts, + ... +}: { + imports = [../git/default.nix]; + programs.git.extraConfig.core.editor = "$EDITOR"; + programs.emacs = { + # Clone emacs config from https://git.xenia.me.uk/pixelifytica/emacs.git + # git clone https://git.xenia.me.uk/pixelifytica/emacs.git ~/.config/emacs + enable = true; + package = pkgs.emacs29-pgtk; + extraConfig = let + shell = "${pkgs.zsh}/bin/zsh"; + font = "${fonts.monospace.name}-${toString fonts.sizes.applications}"; + fixed-font-family = "${fonts.monospace.name}"; + variable-font-family = "${fonts.sansSerif.name}"; + alpha = "80"; + in '' + (customize-set-variable 'shell-file-name "${shell}") + (add-to-list 'initial-frame-alist '(font . "${font}")) + (add-to-list 'default-frame-alist '(font . "${font}")) + (set-face-attribute 'fixed-pitch nil :family "${fixed-font-family}") + (set-face-attribute 'fixed-pitch-serif nil :family "${fixed-font-family}") + (set-face-attribute 'variable-pitch nil :family "${variable-font-family}") + (add-to-list 'initial-frame-alist '(alpha-background . ${alpha})) + (add-to-list 'default-frame-alist '(alpha-background . ${alpha})) + (scroll-bar-mode -1) + (tab-bar-mode -1) + (menu-bar-mode -1) + ''; + extraPackages = epkgs: + with epkgs; [ + # Theme + base16-theme + + # UI + all-the-icons + nerd-icons + nerd-icons-completion + nerd-icons-corfu + nerd-icons-dired + nerd-icons-ibuffer + doom-modeline + diminish + ligature + page-break-lines + helpful + which-key + link-hint + diff-hl + + # Completion + cape + consult + consult-eglot + consult-flyspell + corfu + corfu-terminal + embark + embark-consult + marginalia + orderless + vertico + + # Snippets + tempel + tempel-collection + + # spell-checking + flyspell-correct + + # password-store + pass + password-store + password-store-otp + + # IDE + treesit-grammars.with-all-grammars + treesit-auto + flymake-popon + flymake-collection + flymake-eslint + flymake-shellcheck + apheleia + direnv + rainbow-delimiters + aggressive-indent + nix-mode + python-docstring + + # Media + emms + + # org-mode + org-roam + org-noter + org-journal + + # org-cite + citar + citar-embark + + # org-plot + gnuplot + + # org-mode HTML export + htmlize + + # Projects + ibuffer-project + magit + forge + + # Writing + markdown-mode + pandoc-mode + auctex + auctex-latexmk + latex-preview-pane + + # Email + mu4e + + # RSS feeds + elfeed + elfeed-org + elfeed-tube + ]; + }; + services = { + emacs = { + enable = true; + package = config.programs.emacs.finalPackage; + defaultEditor = true; + client.enable = true; + socketActivation.enable = true; + startWithUserSession = false; + }; + git-sync.repositories = with config.xdg.userDirs; { + org = { + path = "${documents}/Org"; + uri = "git+https://git.xenia.me.uk/xenia/org.git"; + }; + references = { + path = "${documents}/References"; + uri = "git+https://git.xenia.me.uk/xenia/references.git"; + }; + }; + }; + home.packages = with pkgs; [ + # Emacs requirements + imagemagick + languagetool + wordnet + gnuplot # For org-plot + graphviz # For org-roam graph + mp3info # For EMMS + + # Language-specific requirements + sqlite + pandoc + ghostscript + poppler_utils + + # Customised LaTeX install + (texlive.combine { + inherit (pkgs.texlive) scheme-medium dvisvgm dvipng wrapfig amsmath ulem hyperref capt-of; + }) + ]; +} diff --git a/programs/git/default.nix b/programs/git/default.nix new file mode 100644 index 0000000..60f3b22 --- /dev/null +++ b/programs/git/default.nix @@ -0,0 +1,39 @@ +{ + config, + lib, + ... +}: { + services.git-sync.enable = false; # Can't find pass for some reason... + programs.git = { + enable = true; + userName = "Evie Litherland-Smith"; + userEmail = lib.mkDefault "evie@xenia.me.uk"; + delta = { + enable = true; + options = { + line-numbers = true; + hyprlinks = true; + navigate = true; + side-by-side = true; + syntax-theme = with config.programs; lib.mkIf bat.enable bat.config.theme; + }; + }; + attributes = [ + "*.gpg filter=gpg diff=gpg" + "*.asc filter=gpg diff=gpg" + ]; + extraConfig = let + user = "pixelifytica"; + in { + github = {inherit user;}; + gitea = {inherit user;}; + pull.rebase = false; + init.defaultBranch = "main"; + merge.conflictstyle = "diff3"; + diff = { + colorMoved = "default"; + gpg.textconv = "gpg --no-tty --decrypt"; + }; + }; + }; +} diff --git a/programs/obs/default.nix b/programs/obs/default.nix new file mode 100644 index 0000000..c251e0d --- /dev/null +++ b/programs/obs/default.nix @@ -0,0 +1,12 @@ +{pkgs, ...}: { + home.packages = with pkgs; [helvum]; + programs.obs-studio = { + enable = true; + plugins = with pkgs.obs-studio-plugins; [ + wlrobs + obs-vkcapture + obs-pipewire-audio-capture + input-overlay + ]; + }; +} diff --git a/programs/prog/default.nix b/programs/prog/default.nix new file mode 100644 index 0000000..399906c --- /dev/null +++ b/programs/prog/default.nix @@ -0,0 +1,25 @@ +{pkgs, ...}: { + xdg.configFile = { + "ruff/pyproject.toml".source = ./ruff.toml; + "pypoetry/config.toml".source = ./pypoetry.toml; + }; + home.packages = with pkgs; [ + # Nix + nil + alejandra + + # Shell + shfmt + shellcheck + nodePackages.prettier + + # Python + (python3.withPackages + (ps: with ps; [python-lsp-server flake8 mypy])) + black + isort + + # FORTRAN + fortls + ]; +} diff --git a/programs/prog/luarocks/graph-toolkit.nix b/programs/prog/luarocks/graph-toolkit.nix new file mode 100644 index 0000000..c0c8dd5 --- /dev/null +++ b/programs/prog/luarocks/graph-toolkit.nix @@ -0,0 +1,41 @@ +{ + agg, + freetype, + buildLuarocksPackage, + fetchgit, + fetchurl, + lua, + luaOlder, +}: +buildLuarocksPackage { + pname = "graph-toolkit"; + version = "scm-1"; + knownRockspec = + (fetchurl { + url = "mirror://luarocks/graph-toolkit-scm-1.rockspec"; + sha256 = "0hsrf7k45w8ri18mdrx44mv1kr4zfr5mg76cxi8nnr30ssrblvgb"; + }) + .outPath; + src = fetchgit (removeAttrs (builtins.fromJSON '' { + "url": "https://github.com/franko/graph-toolkit", + "rev": "126a11bdbb98faf785c373516a288b7fa609f824", + "date": "2015-01-02T08:44:01-08:00", + "path": "/nix/store/gbwbjrl4j42kaqk3pjzvmckmr6dimkd0-graph-toolkit", + "sha256": "1pqjpqfandi7brk2213vlq891bl8drb0q32m5wmf0l21li0l4zrp", + "hash": "sha256-N39CQaRBUOAqL1UMDFZuiK6QEKZ7BCFmXic2qxy+Et8=", + "fetchLFS": false, + "fetchSubmodules": true, + "deepClone": false, + "leaveDotGit": false + } + '') ["date" "path" "sha256"]); + + disabled = luaOlder "5.1"; + propagatedBuildInputs = [lua agg freetype]; + + meta = { + homepage = "http://franko.github.io/graph-toolkit/"; + description = "Lua Graphics Toolkit"; + license.fullName = "GPL-3"; + }; +} diff --git a/programs/prog/luarocks/scilua.nix b/programs/prog/luarocks/scilua.nix new file mode 100644 index 0000000..f816bb6 --- /dev/null +++ b/programs/prog/luarocks/scilua.nix @@ -0,0 +1,33 @@ +{ + buildLuarocksPackage, + fetchurl, + lua, + luaAtLeast, + luaOlder, + luaPackages, +}: let + xsys = luaPackages.callPackage ./xsys.nix {}; +in + buildLuarocksPackage { + pname = "sci"; + version = "1.0.0.beta12-1"; + knownRockspec = + (fetchurl { + url = "mirror://luarocks/sci-1.0.0.beta12-1.rockspec"; + sha256 = "0lprn9x4zw767hdz8lyxmwrrfyn5xj3x50pm9b4qiwy8992mg00r"; + }) + .outPath; + src = fetchurl { + url = "https://github.com/stepelu/lua-sci/archive/v1.0.0-beta12.tar.gz"; + sha256 = "0a45r7n13gfqckpdp1bmizqvjadn8nc5d6ff9gjw860g3i75sy2h"; + }; + + disabled = (luaOlder "5.1") || (luaAtLeast "5.4"); + propagatedBuildInputs = [lua xsys]; + + meta = { + homepage = "https://github.com/stepelu/lua-sci"; + description = "Scientific Computing with LuaJIT"; + license.fullName = "MIT"; + }; + } diff --git a/programs/prog/luarocks/xsys.nix b/programs/prog/luarocks/xsys.nix new file mode 100644 index 0000000..d3b88bc --- /dev/null +++ b/programs/prog/luarocks/xsys.nix @@ -0,0 +1,30 @@ +{ + buildLuarocksPackage, + fetchurl, + lua, + luaAtLeast, + luaOlder, +}: +buildLuarocksPackage { + pname = "xsys"; + version = "1.0.2-1"; + knownRockspec = + (fetchurl { + url = "mirror://luarocks/xsys-1.0.2-1.rockspec"; + sha256 = "0jlyrwbzh6fi68msdynp4bbihyww4i3yk0qh859xlwqhfy5cza7p"; + }) + .outPath; + src = fetchurl { + url = "https://github.com/stepelu/lua-xsys/archive/v1.0.2.tar.gz"; + sha256 = "1zwrlp6bghq8c12kyqc1ic7mrn8lf3d42755h8q2wxwhy1i3xqyh"; + }; + + disabled = (luaOlder "5.1") || (luaAtLeast "5.4"); + propagatedBuildInputs = [lua]; + + meta = { + homepage = "http://scilua.org/xsys.html"; + description = "LuaJIT General Purpose Routines"; + license.fullName = "MIT"; + }; +} diff --git a/programs/prog/pypoetry.toml b/programs/prog/pypoetry.toml new file mode 100644 index 0000000..acda707 --- /dev/null +++ b/programs/prog/pypoetry.toml @@ -0,0 +1,9 @@ +[virtualenvs] +create = true +in-project = true + +[virtualenvs.options] +always-copy = true +no-pip = true +no-setuptools = true +system-site-packages = true diff --git a/programs/prog/ruff.toml b/programs/prog/ruff.toml new file mode 100644 index 0000000..fa952f6 --- /dev/null +++ b/programs/prog/ruff.toml @@ -0,0 +1,37 @@ +[lint] +select = [ + "F", "E4", "E7", "E9", # Defaults + "W", # pycodestyle warnings + "B", # Flake8 bugbear rules + "PD", # Pandas vet rules + "NPY", # NumPy specific rules + "RUF", # Ruff specific rules + "PERF1", "PERF2", # Performance lints from Perflint + "E101", # Mixed spaces and tabs + "E501", # Line too long + "C901", # Complex structure + "I001", # Import block un-sorted / un-formatted + "I002", # Missing required import + "N804", # First argument of class method should be cls + "N805" # First argument of method should be self +] +ignore = [ + "W191", # Ignore due to conflict with ruff formatter + "E111", # Ignore due to conflict with ruff formatter + "E114", # Ignore due to conflict with ruff formatter + "E117", # Ignore due to conflict with ruff formatter + "D206", # Ignore due to conflict with ruff formatter + "D300", # Ignore due to conflict with ruff formatter + "Q000", # Ignore due to conflict with ruff formatter + "Q001", # Ignore due to conflict with ruff formatter + "Q002", # Ignore due to conflict with ruff formatter + "Q003", # Ignore due to conflict with ruff formatter + "COM812", # Ignore due to conflict with ruff formatter + "COM819", # Ignore due to conflict with ruff formatter + "ISC001", # Ignore due to conflict with ruff formatter + "ISC002" # Ignore due to conflict with ruff formatter +] +unfixable = ["W", "B", "PD", "NPY", "RUF", "E101", "E501", "C901", "I001", "I002"] + +# [format] +# docstring-code-format = true diff --git a/programs/rofi/default.nix b/programs/rofi/default.nix new file mode 100644 index 0000000..97876d2 --- /dev/null +++ b/programs/rofi/default.nix @@ -0,0 +1,140 @@ +{ + config, + pkgs, + fonts, + accentColour ? "base07", + ... +}: { + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + font = fonts.monospace.name; + location = "center"; + plugins = with pkgs; [rofi-emoji]; + pass = { + enable = true; + extraConfig = '' + USERNAME_field='login' + ''; + }; + extraConfig = { + modi = "run,drun,ssh,window,emoji,combi"; + combi-modi = "drun,ssh,window,emoji"; + sidebar-mode = true; + sort = true; + sorting-method = "fzf"; + matching = "fuzzy"; + icon-theme = config.gtk.iconTheme.name; + show-icons = true; + application-fallback-icon = "application-x-addon"; + drun-display-format = "{icon} {name} ({categories})"; + disable-history = false; + hide-scrollbar = true; + display-run = " 󰅴 Run "; + display-drun = " 󱓞 Apps "; + display-ssh = " 󰢹 SSH "; + display-window = " 󰧨 Move "; + display-emoji = " 󰞅 Emoji "; + display-combi = " 󰛡 Combi "; + }; + theme = with builtins; + with config.scheme; let + inherit (config.lib.formats.rasi) mkLiteral; + bg = mkLiteral "rgba (${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 80%)"; + bg2 = mkLiteral "rgba (${base01-rgb-r}, ${base01-rgb-g}, ${base01-rgb-b}, 100%)"; + fg = mkLiteral withHashtag.base05; + fg2 = mkLiteral withHashtag.base04; + border = mkLiteral withHashtag.${accentColour}; + blue = mkLiteral withHashtag.blue; + in { + "*" = { + background-color = mkLiteral "transparent"; + text-color = fg; + font = with fonts; "${monospace.name} ${toString sizes.popups}"; + }; + + window = { + height = mkLiteral "75%"; + width = mkLiteral "75%"; + border = mkLiteral "1px"; + border-color = border; + border-radius = mkLiteral "10px"; + background-color = bg; + }; + + inputbar = { + children = map mkLiteral ["prompt" "entry"]; + padding = mkLiteral "2px"; + }; + + prompt = { + background-color = bg2; + padding = mkLiteral "6px"; + text-color = blue; + border-radius = mkLiteral "10px"; + margin = mkLiteral "20px 0px 0px 20px"; + }; + + textbox-prompt-colon = { + expand = false; + str = "="; + }; + + entry = { + padding = mkLiteral "6px"; + margin = mkLiteral "20px 0px 0px 10px"; + }; + + listview = { + border = mkLiteral "0px 0px 0px"; + padding = mkLiteral "6px 0px 0px"; + margin = mkLiteral "10px 0px 0px 20px"; + columns = 2; + lines = 5; + }; + + element = { + padding = mkLiteral "5px"; + }; + + "element-icon" = { + size = mkLiteral "25px"; + }; + + "element selected" = { + background-color = bg2; + text-color = blue; + border-radius = mkLiteral "10px"; + }; + + mode-switcher = { + spacing = 0; + }; + + button = { + padding = mkLiteral "10px"; + text-color = fg2; + border-radius = mkLiteral "10px"; + vertical-align = mkLiteral "0.5"; + horizontal-align = mkLiteral "0.5"; + }; + + "button selected" = { + background-color = bg2; + text-color = blue; + }; + + message = { + margin = mkLiteral "2px"; + padding = mkLiteral "2px"; + border-radius = mkLiteral "5px"; + }; + + textbox = { + padding = mkLiteral "6px"; + margin = mkLiteral "20px 0px 0px 20px"; + text-color = blue; + }; + }; + }; +} diff --git a/programs/ssh/default.nix b/programs/ssh/default.nix new file mode 100644 index 0000000..7358329 --- /dev/null +++ b/programs/ssh/default.nix @@ -0,0 +1,40 @@ +{...}: { + programs.ssh = { + enable = true; + forwardAgent = true; + compression = true; + serverAliveInterval = 15; + serverAliveCountMax = 3; + controlMaster = "auto"; + controlPersist = "10s"; + extraConfig = '' + AddKeysToAgent=yes + SetEnv TERM=xterm-256color + ''; + matchBlocks = { + "git*".user = "git"; + "legion" = { + user = "pixelifytica"; + hostname = "192.168.0.31"; + }; + "vanguard" = { + user = "pixelifytica"; + hostname = "192.168.0.90"; + }; + "ionos" = { + user = "root"; + hostname = "77.68.67.133"; + }; + "freia" = { + user = "elitherl"; + hostname = "freia020.hpc.l"; + forwardX11Trusted = true; + }; + "heimdall" = { + user = "elitherl"; + hostname = "heimdall003.jet.uk"; + forwardX11Trusted = true; + }; + }; + }; +} diff --git a/programs/starship/default.nix b/programs/starship/default.nix new file mode 100644 index 0000000..ae5c2c7 --- /dev/null +++ b/programs/starship/default.nix @@ -0,0 +1,75 @@ +{...}: { + programs.starship = { + enable = true; + enableTransience = true; + settings = { + add_newline = false; + character = { + success_symbol = "[󰁔 ](bold green)"; + error_symbol = "[󰁔 ](bold red)"; + }; + command_timeout = 2000; + container = {symbol = " ";}; + directory = { + truncation_length = 2; + fish_style_pwd_dir_length = 1; + truncate_to_repo = false; + }; + direnv = {disabled = false;}; + git_branch = { + symbol = " "; + only_attached = true; + ignore_branches = ["master" "main"]; + }; + git_commit = { + format = "[ $hash | $tag]($style) "; + tag_symbol = " "; + tag_disabled = false; + }; + git_metrics = {disabled = false;}; + git_status = { + stashed = " "; + ahead = " "; + behind = " "; + up_to_date = ""; + diverged = " "; + conflicted = " "; + deleted = " "; + renamed = " "; + modified = " "; + staged = " "; + untracked = " "; + typechanged = " "; + }; + hostname = { + ssh_only = true; + ssh_symbol = "󰢹 "; + }; + jobs = {symbol = "󰈏 ";}; + line_break = {disabled = false;}; + localip = {disabled = false;}; + memory_usage = {disabled = false;}; + os = { + disabled = false; + format = "on [$symbol]($style) "; + }; + python = {python_binary = "python3";}; + shell = { + disabled = false; + format = "using [$indicator ]($style)"; + }; + status = { + disabled = false; + map_symbol = true; + pipestatus = true; + symbol = " "; + success_symbol = ""; + not_executable_symbol = " "; + not_found_symbol = " "; + sigint_symbol = " "; + signal_symbol = " "; + }; + sudo = {disabled = false;}; + }; + }; +} diff --git a/programs/sway/default.nix b/programs/sway/default.nix new file mode 100644 index 0000000..0b229d8 --- /dev/null +++ b/programs/sway/default.nix @@ -0,0 +1,180 @@ +{ + config, + lib, + pkgs, + fonts, + accentColour ? "base07", + ... +}: { + imports = [../desktop.nix]; + home.packages = with pkgs; [ + (writeShellScriptBin "protonmail-setup-bridge" '' + pkill -9 -f protonmail-bridge + ${protonmail-bridge}/bin/protonmail-bridge -c + swaymsg exec "${protonmail-bridge}/bin/protonmail-bridge -n" + '') + (writeShellScriptBin "davmail-setup" '' + systemctl --user restart davmail # Ensure config file is present + systemctl --user stop davmail + ${davmail}/bin/davmail -n ~/.davmail.properties + systemctl --user restart davmail + '') + ]; + wayland.windowManager.sway = { + enable = true; + package = null; + swaynag.enable = true; + systemd.enable = true; + xwayland = true; + config = { + input = { + "*" = { + xkb_layout = "gb"; + xkb_options = "ctrl:nocaps"; + }; + "type:touchpad" = { + tap = "enabled"; + natural_scroll = "enabled"; + }; + }; + seat = { + "seat0" = { + xcursor_theme = with config.gtk.cursorTheme; "${name} ${toString size}"; + }; + }; + modifier = "Mod4"; + terminal = "${config.programs.alacritty.package}/bin/alacritty"; + menu = "${config.programs.rofi.finalPackage}/bin/rofi -show drun"; + workspaceAutoBackAndForth = true; + bars = []; + gaps = { + inner = 5; + outer = 0; + }; + fonts = { + names = [fonts.monospace.name]; + style = "regular"; + size = fonts.sizes.desktop * 1.0; + }; + colors = with config.scheme.withHashtag; let + text = toString base05; + indicator = toString cyan; + in rec { + background = toString base00; + focused = rec { + inherit background text indicator; + border = toString config.scheme.withHashtag.${accentColour}; + childBorder = border; + }; + focusedInactive = rec { + inherit background text indicator; + border = toString base04; + childBorder = border; + }; + unfocused = rec { + inherit background text indicator; + border = toString base03; + childBorder = border; + }; + urgent = rec { + inherit background text indicator; + border = toString red; + childBorder = border; + }; + }; + startup = [ + {command = "${pkgs.swaynotificationcenter}/bin/swaync";} + {command = "${pkgs.swaybg}/bin/swaybg -m fill -i ${../../wallpapers/waves/cat-waves.png}";} + {command = "${pkgs.libsForQt5.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1";} + {command = "${pkgs.protonmail-bridge}/bin/protonmail-bridge -n";} + ]; + window = { + border = 1; + commands = [ + { + criteria = {app_id = "org.kde.polkit-kde-authentication-agent-1";}; + command = "floating enable"; + } + { + criteria = {app_id = "Pinentry";}; + command = "floating enable"; + } + { + criteria = {app_id = "pavucontrol";}; + command = "floating enable"; + } + { + criteria = {app_id = ".blueman-manager-wrapped";}; + command = "floating enable"; + } + { + criteria = {app_id = "nm-connection-editor";}; + command = "floating enable"; + } + { + criteria = {class = "steam";}; + command = "layout tabbed"; + } + ]; + }; + floating.border = 1; + keybindings = with config; let + modifier = wayland.windowManager.sway.config.modifier; + in + lib.mkOptionDefault { + # Movement + "${modifier}+comma" = "workspace prev"; + "${modifier}+period" = "workspace next"; + "${modifier}+shift+comma" = "move workspace prev"; + "${modifier}+shift+period" = "move workspace next"; + "${modifier}+bracketleft" = "move workspace to output left"; + "${modifier}+bracketright" = "move workspace to output right"; + + # Function keys + ## Sound + "XF86AudioMute" = "exec ${services.avizo.package}/bin/volumectl %"; + "XF86AudioMicMute" = "exec ${services.avizo.package}/bin/volumectl -m %"; + "XF86AudioRaiseVolume" = "exec ${services.avizo.package}/bin/volumectl -u + 5"; + "XF86AudioLowerVolume" = "exec ${services.avizo.package}/bin/volumectl -u - 5"; + + ## Playback + "XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause"; + "XF86AudioStop" = "exec ${pkgs.playerctl}/bin/playerctl play-pause"; + "XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous"; + "XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next"; + + ## Brightness + "XF86MonBrightnessUp" = "exec ${services.avizo.package}/bin/lightctl + 5"; + "XF86MonBrightnessDown" = "exec ${services.avizo.package}/bin/lightctl - 5"; + + # System utilities + "${modifier}+F1" = "exec ${programs.swaylock.package}/bin/swaylock --screenshots --clock --indicator --grace-no-mouse"; + "${modifier}+p" = "exec ${programs.wlogout.package}/bin/wlogout"; + "${modifier}+z" = "exec ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw"; + "${modifier}+Shift+z" = "exec ${pkgs.swaynotificationcenter}/bin/swaync-client -d -sw"; + "${modifier}+Shift+Return" = "exec ${programs.emacs.finalPackage}/bin/emacsclient -c"; + }; + }; + extraConfig = '' + bindgesture swipe:right workspace prev + bindgesture swipe:left workspace next + corner_radius 10 + blur enable + blur_xray disable + blur_passes 3 + blur_radius 5 + corner_radius 10 + shadows enable + shadow_blur_radius 4 + layer_effects "system-menu" blur enable; blur_ignore_transparent enable; shadows disable + layer_effects "gtk-layer-shell" blur enable; blur_ignore_transparent enable; shadows disable + layer_effects "waybar" blur enable; blur_ignore_transparent enable; shadows disable + layer_effects "rofi" blur enable; blur_ignore_transparent enable; shadows disable + layer_effects "avizo" blur enable; blur_ignore_transparent enable; shadows disable + layer_effects "swaync-notification-window" blur enable; blur_ignore_transparent enable; shadows disable + layer_effects "swaync-control-center" blur enable; blur_ignore_transparent enable; shadows disable + titlebar_separator enable + scratchpad_minimize enable + ''; + }; +} diff --git a/programs/swaylock/default.nix b/programs/swaylock/default.nix new file mode 100644 index 0000000..685e871 --- /dev/null +++ b/programs/swaylock/default.nix @@ -0,0 +1,18 @@ +{pkgs, ...}: { + programs.swaylock = { + enable = true; + package = pkgs.swaylock-effects; + # Settings are specifically for swaylock-effects + settings = { + indicator-radius = 100; + indicator-thickness = 10; + indicator-caps-lock = true; + ignore-empty-password = true; + show-failed-attempts = true; + effect-blur = "5x3"; + effect-vignette = "0.5:0.5"; + grace = 2; + fade-in = 0.2; + }; + }; +} diff --git a/programs/swaync/default.nix b/programs/swaync/default.nix new file mode 100644 index 0000000..4e07488 --- /dev/null +++ b/programs/swaync/default.nix @@ -0,0 +1,355 @@ +{ + config, + pkgs, + fonts, + accentColour ? "base07", + ... +}: { + home.packages = [pkgs.swaynotificationcenter]; + xdg.configFile."swaync/style.css".text = with config.scheme; '' + * { + all: unset; + font-size: 1.2rem; + font-family: "${fonts.monospace.name}"; + transition: 200ms; + } + + .floating-notifications.background .notification-row .notification-background { + border-radius: 10px; + border: 1px solid ${withHashtag.${accentColour}}; + margin: 18px; + background-color: rgba(${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 0.8); + color: ${withHashtag.base05}; + padding: 0; + } + + .floating-notifications.background + .notification-row + .notification-background + .notification { + padding: 7px; + border-radius: 10px; + } + + .floating-notifications.background + .notification-row + .notification-background + .notification + .notification-content { + margin: 7px; + } + + .floating-notifications.background + .notification-row + .notification-background + .notification + .notification-content + .summary { + color: ${withHashtag.base05}; + } + + .floating-notifications.background + .notification-row + .notification-background + .notification + .notification-content + .time { + color: ${withHashtag.base04}; + } + + .floating-notifications.background + .notification-row + .notification-background + .notification + .notification-content + .body { + color: ${withHashtag.base05}; + } + + .floating-notifications.background + .notification-row + .notification-background + .notification + > *:last-child + > * { + min-height: 3.4em; + } + + .floating-notifications.background + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action { + border-radius: 10px; + background-color: ${withHashtag.base01}; + color: ${withHashtag.base05}; + margin: 7px; + } + + .floating-notifications.background + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action:hover { + background-color: ${withHashtag.base01}; + color: ${withHashtag.base05}; + } + + .floating-notifications.background + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action:active { + background-color: ${withHashtag.blue}; + color: ${withHashtag.base00}; + } + + .floating-notifications.background + .notification-row + .notification-background + .close-button { + margin: 7px; + padding: 2px; + border-radius: 10px; + background-color: ${withHashtag.red}; + color: ${withHashtag.base00}; + } + + .floating-notifications.background + .notification-row + .notification-background + .close-button:hover { + background-color: ${withHashtag.red}; + color: ${withHashtag.base00}; + } + + .floating-notifications.background + .notification-row + .notification-background + .close-button:active { + background-color: ${withHashtag.red}; + color: ${withHashtag.base00}; + } + + .control-center { + border-radius: 10px; + border: 1px solid ${withHashtag.${accentColour}}; + margin: 18px; + background-color: rgba(${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 0.8); + color: ${withHashtag.base05}; + padding: 14px; + } + + .control-center .widget-title { + color: ${withHashtag.base05}; + font-size: 1.3em; + } + + .control-center .widget-title button { + border-radius: 7px; + background-color: ${withHashtag.base01}; + color: ${withHashtag.base05}; + padding: 8px; + } + + .control-center .widget-title button:hover { + background-color: ${withHashtag.base02}; + color: ${withHashtag.base05}; + } + + .control-center .widget-title button:active { + background-color: ${withHashtag.base03}; + color: ${withHashtag.base05}; + } + + .control-center .notification-row .notification-background { + border-radius: 10px; + background-color: ${withHashtag.base01}; + color: ${withHashtag.base05}; + margin-top: 14px; + } + + .control-center .notification-row .notification-background .notification { + padding: 7px; + border-radius: 7px; + } + + .control-center + .notification-row + .notification-background + .notification + .notification-content { + margin: 7px; + } + + .control-center + .notification-row + .notification-background + .notification + .notification-content + .summary { + color: ${withHashtag.base05}; + } + + .control-center + .notification-row + .notification-background + .notification + .notification-content + .time { + color: ${withHashtag.base04}; + } + + .control-center + .notification-row + .notification-background + .notification + .notification-content + .body { + color: ${withHashtag.base05}; + } + + .control-center + .notification-row + .notification-background + .notification + > *:last-child + > * { + min-height: 3.4em; + } + + .control-center + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action { + border-radius: 7px; + background-color: ${withHashtag.base00}; + color: ${withHashtag.base05}; + margin: 7px; + } + + .control-center + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action:hover { + background-color: ${withHashtag.base01};; + color: ${withHashtag.base05}; + } + + .control-center + .notification-row + .notification-background + .notification + > *:last-child + > * + .notification-action:active { + background-color: ${withHashtag.blue}; + color: ${withHashtag.base05}; + } + + .control-center .notification-row .notification-background .close-button { + margin: 7px; + padding: 2px; + border-radius: 6.3px; + background-color: ${withHashtag.red}; + color: ${withHashtag.base00}; + } + + .control-center .notification-row .notification-background .close-button:hover { + background-color: ${withHashtag.red}; + color: ${withHashtag.base00}; + } + + .control-center + .notification-row + .notification-background + .close-button:active { + background-color: ${withHashtag.red}; + color: ${withHashtag.base00}; + } + + .control-center .notification-row .notification-background:hover { + background-color: ${withHashtag.base00}; + color: ${withHashtag.base05}; + } + + .control-center .notification-row .notification-background:active { + background-color: ${withHashtag.blue}; + color: ${withHashtag.base05}; + } + + progressbar, + progress, + trough { + border-radius: 12.6px; + } + + .notification.critical progress { + background-color: ${withHashtag.red}; + } + + .notification.low progress, + .notification.normal progress { + background-color: ${withHashtag.blue}; + } + + trough { + background-color: ${withHashtag.base00}; + } + + .control-center trough { + background-color: ${withHashtag.base03}; + } + + .control-center-dnd { + margin-top: 5px; + border-radius: 8px; + background: ${withHashtag.base00}; + border: 1px solid ${withHashtag.base03}; + } + + .control-center-dnd:checked { + background: ${withHashtag.base00}; + } + + .control-center-dnd slider { + background: ${withHashtag.base03}; + border-radius: 8px; + } + + .widget-dnd { + margin: 0px; + font-size: 1.1rem; + } + + .widget-dnd > switch { + font-size: initial; + border-radius: 8px; + background: ${withHashtag.base00}; + border: 1px solid ${withHashtag.base03}; + } + + .widget-dnd > switch:checked { + background: ${withHashtag.base00}; + } + + .widget-dnd > switch slider { + background: ${withHashtag.base01}; + border-radius: 8px; + border: 1px solid ${withHashtag.${accentColour}}; + } + + ''; +} diff --git a/programs/waybar/default.nix b/programs/waybar/default.nix new file mode 100644 index 0000000..7dcdfb4 --- /dev/null +++ b/programs/waybar/default.nix @@ -0,0 +1,353 @@ +{ + config, + lib, + pkgs, + hostName, + fonts, + accentColour ? "base07", + ... +}: { + systemd.user.targets.tray.Unit = { + Description = "Home Manager System Tray"; + Requires = ["graphical-session-pre.target"]; + }; + programs.waybar = { + enable = true; + systemd = { + enable = true; + target = "sway-session.target"; + }; + settings = rec { + main = { + name = "main"; + layer = "top"; + position = "top"; + # Layout + "modules-left" = ["mpris"]; + "modules-center" = ["sway/workspaces"]; + "modules-right" = [ + "custom/notification" + "pulseaudio" + "network" + "bluetooth" + "clock#calendar" + "clock" + "backlight" + "battery" + "custom/weather" + "tray" + ]; + # Module config + "sway/workspaces" = { + format = "{icon}"; + format-icons = { + "1" = "󰫃 "; + "2" = "󰫄 "; + "3" = "󰫅 "; + "4" = "󰫆 "; + "5" = "󰫇 "; + "6" = "󰫈 "; + default = "󰋙 "; + urgent = "󰁡 "; + }; + # show-special = false; + # sort-by-number = true; + all-outputs = false; + persistent-workspaces = { + "1" = []; + "2" = []; + "3" = []; + "4" = []; + "5" = []; + "6" = []; + }; + }; + "sway/window" = { + "format" = "{title}"; + "max-length" = 50; + "rewrite" = { + "(.*) - GNU Emacs at (.*)" = " $1 [$2]"; + "(Alacritty.*)" = " $1"; + "(.*) - mpv" = "󰦟 $1"; + "swayimg: (.*)" = "󰋩 $1"; + "(btm)" = " Resource Usage [$1]"; + "(cava)" = "󰝚 Music Visualiser [$1]"; + "(.*) - Thunar" = "󰝰 $1"; + "Mozilla Firefox" = "󰈹 $1"; + "(.*) — Mozilla Firefox" = "󰈹 $1"; + "Nyxt - (.*)" = "󰀹 $1"; + "(.*) - Chromium" = "󰊯 $1"; + "((?:.*)WebCord.*)" = "󰙯 $1"; + "(Signal.*)" = "󰭹 $1"; + "([Ss]team)" = "󰓓 $1"; + "(Prism Launcher.*)" = "󰍳 Minecraft ($1)"; + "(X2Go Client)" = "󰢹 $1"; + "(NoMachine|Nxplayer.bin) (.*)" = "󰢹 $1 $2"; + }; + }; + mpris = { + "format" = "{status_icon} {player_icon} {artist} - {title}"; + "tooltip-format" = "{player_icon} ({player}) {dynamic}"; + "title-len" = 64; + "interval" = 1; + "dynamic-order" = [ + "album" + "artist" + "title" + "position" + "length" + ]; + "player-icons" = { + "default" = "󰲸 "; + "emms" = " "; + "firefox" = "󰈹 "; + "mpv" = "󰦟 "; + }; + "status-icons" = { + "playing" = "󰐊"; + "paused" = "󰏤"; + "stopped" = "󰓛"; + }; + "ignored-players" = []; + }; + pulseaudio = { + scroll-step = 5; + format = "{format_source}{icon}{volume}%"; + format-muted = "{format_source} 󰝟 "; + format-source = "󰍬 "; + format-source-muted = "󰍭 "; + format-icons = { + car = "󰄍 "; + default = ["󰕿 " "󰖀 " "󰕾 "]; + hands-free = "󰥰 "; + headset = "󰋎 "; + phone = "󰏲 "; + portable = "󰏳 "; + headphone = "󰋋 "; + }; + on-click = "${pkgs.pavucontrol}/bin/pavucontrol"; + on-click-right = "${pkgs.pamixer}/bin/pamixer -t"; + on-scroll-up = "${pkgs.pamixer}/bin/pamixer -i 5"; + on-scroll-down = "${pkgs.pamixer}/bin/pamixer -d 5"; + }; + disk = { + format = "󰋊 {percentage_used}%"; + path = config.home.homeDirectory; + }; + cpu = { + format = "󰻠 {usage}%"; + tooltip = false; + }; + memory = {format = "󰍛 {}%";}; + temperature = { + critical-threshold = 80; + format = "{icon} {temperatureC}°C"; + format-icons = ["󱃃" "󰔏" "󱃂"]; + }; + network = { + format-icons = ["󰤟 " "󰤢 " "󰤥 " "󰤨 "]; + format-wifi = "{icon}"; + format-ethernet = "󰈁 "; + tooltip-format = "{essid} ({signalStrength}%)"; + format-linked = "󰈂 "; + format-disconnected = "󰈂 "; + }; + bluetooth = { + format = "󰂯"; + format-disabled = "󰂲"; + format-off = "󰂲"; + format-on = "󰂯"; + format-connected = "󰂱"; + tooltip-format = "{status} | {device_alias}"; + on-click = "${pkgs.bluez}/bin/bluetoothctl power on"; + on-click-right = "${pkgs.bluez}/bin/bluetoothctl power off"; + }; + "clock#calendar" = { + # format = "{:󰃭 %Y-%m-%d}"; + format = "{:%Y-%m-%d}"; # TEMP, see https://github.com/Alexays/Waybar/issues/3021 + tooltip-format = "{calendar}"; + calendar = { + mode = "month"; + mode-mon-col = 3; + weeks-pos = "left"; + on-scroll = 1; + on-click-right = "mode"; + format = { + months = "{}"; + days = "{}"; + weeks = "W{}"; + weekdays = "{}"; + today = "{}"; + }; + }; + actions = { + on-click-right = "mode"; + on-scroll-up = "shift_up"; + on-scroll-down = "shift_down"; + }; + }; + clock = { + # format = "{:󰥔 %R}"; + format = "{:%R}"; # TEMP, see https://github.com/Alexays/Waybar/issues/3021 + }; + backlight = { + format = "{icon}"; + tooltip-format = "{percent}%"; + format-icons = [" " " " " " " " " " " " " " " " " "]; + }; + battery = { + states = { + warning = 30; + critical = 20; + }; + format = "{icon}"; + format-charging = "󰂄 "; + format-plugged = "󰚥 "; + tooltip-format = "{capacity}% {time}"; + format-icons = ["󱃍 " "󰁺 " "󰁻 " "󰁼 " "󰁽 " "󰁾 " "󰁿 " "󰂀 " "󰂁 " "󰂂 " "󰁹 "]; + }; + "custom/notification" = let + swaync = pkgs.swaynotificationcenter; + in { + "tooltip" = false; + "format" = "{icon}{}"; + "format-icons" = { + "notification" = "󱅫 "; + "none" = "󰂚 "; + "dnd-notification" = "󰅸 "; + "dnd-none" = "󰂜 "; + "inhibited-notification" = "󰅸 "; + "inhibited-none" = "󰂜 "; + "dnd-inhibited-notification" = "󰅸 "; + "dnd-inhibited-none" = "󰂜 "; + }; + "return-type" = "json"; + "exec-if" = "which ${swaync}/bin/swaync-client"; + "exec" = "${swaync}/bin/swaync-client -swb"; + "on-click" = "${swaync}/bin/swaync-client -t -sw"; + "on-click-right" = "${swaync}/bin/swaync-client -d -sw"; + "escape" = true; + }; + "custom/weather" = let + date-format = "%Y-%m-%d"; + custom-indicator = "{ICON}{temp_C}({FeelsLikeC})"; + in { + "format" = "{}°"; + "tooltip" = true; + "interval" = 900; # Every 15 minutes + "exec" = ''${pkgs.wttrbar}/bin/wttrbar --location Didcot --date-format "${date-format}" --custom-indicator "${custom-indicator}"''; + "return-type" = "json"; + }; + tray = { + icon-size = builtins.floor fonts.sizes.popups; + show-passive-items = true; + spacing = 5; + }; + }; + # TEMP FIX + alt = lib.mkIf (hostName == "Vanguard") { + inherit (main) layer position "sway/workspaces"; + name = "alt"; + "modules-left" = []; + "modules-center" = ["sway/workspaces"]; + "modules-right" = []; + }; + }; + style = with config.scheme.withHashtag; let + accent = config.scheme.withHashtag.${accentColour}; + in '' + * { + all: unset; + font-size: 1em; + font-family: ${fonts.monospace.name}; + } + + window { + background: transparent; + } + + window > box { + color: ${base05}; + background: alpha(${base00}, 0.8); + margin: 5px 5px 0px; + padding: 0px; + border: 1px solid ${accent}; + border-radius: 10px; + } + + tooltip { + background: alpha(${base00}, 0.8); + border: 1px solid ${accent}; + border-radius: 10px; + } + + tooltip label { + color: ${base05}; + border: none; + padding: 5px; + margin: 0px; + } + + #workspaces, + #window, + #mpris, + #pulseaudio, + #network, + #bluetooth, + #backlight, + #battery, + #clock, + #custom-notification, + #custom-weather, + #tray { + margin: 0px; + padding: 1px 5px; + } + + #workspaces, + #window, + #mpris, + #tray, + #backlight, + #battery, + #custom-weather { + color: ${base05}; + } + + #workspaces button { + background: transparent; + color: ${base05}; + margin: 0px; + padding: 0px 5px; + } + #workspaces button.persistent { + color: ${base03}; + } + #workspaces button.focused { + color: ${accent}; + } + #workspaces button.urgent { + color: ${base09}; + } + + #custom-notification { + color: ${base08}; + } + #pulseaudio { + color: ${base09}; + } + #network { + color: ${base0A}; + } + #bluetooth { + color: ${base0B}; + } + #clock.calendar { + color: ${base0C}; + } + #clock { + color: ${base0D}; + } + ''; + }; +} diff --git a/programs/wlogout/default.nix b/programs/wlogout/default.nix new file mode 100644 index 0000000..7105446 --- /dev/null +++ b/programs/wlogout/default.nix @@ -0,0 +1,79 @@ +{ + config, + fonts, + accentColour ? "base07", + ... +}: { + programs.wlogout = { + enable = true; + layout = [ + { + label = "reboot"; + action = "systemctl reboot"; + text = "Reboot"; + keybind = "r"; + } + { + label = "shutdown"; + action = "systemctl poweroff"; + text = "Shutdown"; + keybind = "s"; + } + { + label = "logout"; + action = "swaymsg exit"; + text = "Logout"; + keybind = "l"; + } + ]; + style = with config.scheme.withHashtag; let + accent = config.scheme.withHashtag.${accentColour}; + shutdownIcon = ./icons/shutdown.png; + rebootIcon = ./icons/reboot.png; + logoutIcon = ./icons/logout.png; + in '' + * { + font-size: ${toString fonts.sizes.popups}px; + font-family: "${fonts.sansSerif.name}"; + } + + window { + border: none; + background-color: transparent; + } + + button { + border: ${accent}; + background-color: ${base00}; + background-repeat: no-repeat; + background-position: center; + background-size: 25%; + box-shadow: none; + margin: 5px; + color: ${base05}; + } + + button:hover { + background-color: ${base01}; + color: ${base05}; + } + + button:focus { + background-color: ${base03}; + color: ${base05}; + } + + #shutdown { + background-image: url("${shutdownIcon}"); + } + + #reboot { + background-image: url("${rebootIcon}"); + } + + #logout { + background-image: url("${logoutIcon}"); + } + ''; + }; +} diff --git a/programs/wlogout/icons/hibernate.png b/programs/wlogout/icons/hibernate.png new file mode 100644 index 0000000000000000000000000000000000000000..a6322aa2ccd9ed61f8defad1c5c6d3d58fe962ce GIT binary patch literal 17963 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 RE%^Knn64XK%GLxP`X9s7Az=Uj literal 0 HcmV?d00001 diff --git a/programs/wlogout/icons/logout.png b/programs/wlogout/icons/logout.png new file mode 100644 index 0000000000000000000000000000000000000000..345a8aa82689ce6b120f7d81a3f600b520ac6e4b GIT binary patch literal 6329 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 literal 0 HcmV?d00001 diff --git a/programs/wlogout/icons/reboot.png b/programs/wlogout/icons/reboot.png new file mode 100644 index 0000000000000000000000000000000000000000..29cfa2ff671d6b1577fdb72221285363664d38c2 GIT binary patch literal 16483 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 literal 0 HcmV?d00001 diff --git a/programs/wlogout/icons/shutdown.png b/programs/wlogout/icons/shutdown.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7d49956c0f70b8897452f865f4c73b34fcb004 GIT binary patch literal 15698 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 literal 0 HcmV?d00001 diff --git a/programs/wlogout/icons/suspend.png b/programs/wlogout/icons/suspend.png new file mode 100644 index 0000000000000000000000000000000000000000..647bd663db44379ae18acb879ad50d8e7ae930b0 GIT binary patch literal 17256 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 Je9-Ok{{r_JM^gX* literal 0 HcmV?d00001 diff --git a/programs/zsh/default.nix b/programs/zsh/default.nix new file mode 100644 index 0000000..cec66c8 --- /dev/null +++ b/programs/zsh/default.nix @@ -0,0 +1,38 @@ +{...}: { + programs.zsh = { + enable = true; + enableCompletion = true; + enableAutosuggestions = true; + syntaxHighlighting.enable = true; + enableVteIntegration = true; + autocd = true; + historySubstringSearch.enable = true; + history = { + extended = true; + ignoreDups = true; + ignoreSpace = true; + }; + shellAliases = { + nixos-repl = "nixos-rebuild repl"; + nixos-test = "sudo nixos-rebuild test"; + nixos-boot = "sudo nixos-rebuild boot"; + nixos-switch = "sudo nixos-rebuild switch"; + nixos-reboot = "sudo nixos-rebuild boot && sudo reboot now"; + nixos-shutdown = "sudo nixos-rebuild boot && sudo shutdown now"; + gsa = "git-sync-all"; + }; + oh-my-zsh = { + enable = true; + plugins = ["colored-man-pages" "lol" "rand-quote"]; + theme = ""; + }; + completionInit = '' + autoload -Uz +X compinit && compinit + + ## case insensitive path-completion + zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' + zstyle ':completion:*' menu select + ''; + initExtra = "source ${./transient.zsh}\n"; + }; +} diff --git a/programs/zsh/transient.zsh b/programs/zsh/transient.zsh new file mode 100755 index 0000000..1f7bbd8 --- /dev/null +++ b/programs/zsh/transient.zsh @@ -0,0 +1,31 @@ +#!/usr/bin/env zsh + +zle-line-init() { + emulate -L zsh + + [[ $CONTEXT == start ]] || return 0 + + while true; do + zle .recursive-edit + local -i ret=$? + [[ $ret == 0 && $KEYS == $'\4' ]] || break + [[ -o ignore_eof ]] || exit 0 + done + + local saved_prompt=$PROMPT + local saved_rprompt=$RPROMPT + PROMPT='󰁔 ' + RPROMPT='' + zle .reset-prompt + PROMPT=$saved_prompt + RPROMPT=$saved_rprompt + + if ((ret)); then + zle .send-break + else + zle .accept-line + fi + return ret +} + +zle -N zle-line-init diff --git a/scripts/default.nix b/scripts/default.nix new file mode 100644 index 0000000..20aedf5 --- /dev/null +++ b/scripts/default.nix @@ -0,0 +1,10 @@ +{pkgs, ...}: { + home.packages = [ + (pkgs.writeShellScriptBin "git-sync-all" + (builtins.readFile ./git-sync-all.sh)) + (pkgs.writeShellScriptBin "rsync-local-config" + (builtins.readFile ./rsync-local-config.sh)) + (pkgs.writeShellScriptBin "xdg-query-program" + (builtins.readFile ./xdg-query-program.sh)) + ]; +} diff --git a/scripts/git-sync-all.sh b/scripts/git-sync-all.sh new file mode 100755 index 0000000..73af165 --- /dev/null +++ b/scripts/git-sync-all.sh @@ -0,0 +1,55 @@ +# Sync common directories, setting url to ensure it's up-to-date first +SYNC_DIRS=( + "$HOME/.password-store/" + "$HOME/.elfeed/" + "$HOME/Documents/Org/" + "$HOME/Documents/References/" +) +SYNC_URLS=( + "https://git.xenia.me.uk/pixelifytica/pass.git" + "https://git.xenia.me.uk/pixelifytica/elfeed.git" + "https://git.xenia.me.uk/pixelifytica/org.git" + "https://git.xenia.me.uk/pixelifytica/references.git" +) + +for i in "${!SYNC_DIRS[@]}"; do + DIRECTORY="${SYNC_DIRS[$i]}" + URL="${SYNC_URLS[$i]}" + echo "--- sync: $DIRECTORY ---" + if [ ! -d "$DIRECTORY" ]; then + git clone "$URL" "$DIRECTORY" + fi + ( + cd "$DIRECTORY" || exit + git remote set-url origin "$URL" + git-sync -ns + ) +done + +# Pull NixOS and Emacs config if simple fast-forward +PULL_DIRS=( + "/etc/nixos" + "${XDG_CONFIG_HOME:-$HOME/.config}/emacs" +) +PULL_URLS=( + "https://git.xenia.me.uk/pixelifytica/nixos.git" + "https://git.xenia.me.uk/pixelifytica/emacs.git" +) +for i in "${!PULL_DIRS[@]}"; do + DIRECTORY="${PULL_DIRS[$i]}" + URL="${PULL_URLS[$i]}" + echo "--- pull: $DIRECTORY ---" + if [ ! -d "$DIRECTORY" ]; then + git clone "$URL" "$DIRECTORY" + fi + ( + cd "$DIRECTORY" || exit + if [ "$(git branch --show-current)" = "main" ]; then + git remote set-url origin "$URL" + git pull --ff-only + git push + else + echo "Not syncing repo $DIRECTORY on branch $(git branch --show-current)" + fi + ) +done diff --git a/scripts/rsync-local-config.sh b/scripts/rsync-local-config.sh new file mode 100755 index 0000000..6de2682 --- /dev/null +++ b/scripts/rsync-local-config.sh @@ -0,0 +1,25 @@ +HOST=$1 +# Config files +for TARGET in bat bottom git starship.toml; do + SOURCE="$HOME/.config/$TARGET" + echo "--- $SOURCE ---" + TMP_TARGET=/tmp/rsync-local-config + TMP_SOURCE=$TMP_TARGET + NIX_SED="sed -i 's|/nix/.*/bin/||g'" + NIX_REPLACE="$NIX_SED $TMP_TARGET" + if [[ -e $SOURCE ]]; then + if [[ -d $SOURCE ]]; then + SOURCE=$SOURCE/ + TMP_SOURCE=$TMP_SOURCE/ + NIX_REPLACE="fd -g '**' $TMP_TARGET -tfile -x $NIX_SED {};" + fi + rsync -avzL --exclude=".git*" --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r "$SOURCE" $TMP_TARGET + sh -c "$NIX_REPLACE" + rsync -avzL --delete --exclude=".git*" $TMP_SOURCE "$HOST:.config/$TARGET" + rm -rf $TMP_SOURCE + fi +done + +# Fonts +rsync -avzL --delete --exclude=".git*" --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r "$(nix path-info flake:iosevka#packages.x86_64-linux.iosevka-custom-nerdfont)/share/fonts/truetype/" "$HOST:.fonts/IosevkaCustomNerdFont" +rsync -avzL --delete --exclude=".git*" --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r "$(nix path-info flake:iosevka#packages.x86_64-linux.iosevka-custom-aile)/share/fonts/truetype/" "$HOST:.fonts/IosevkaCustomAile" diff --git a/scripts/sync-all.lua b/scripts/sync-all.lua new file mode 100755 index 0000000..36eda13 --- /dev/null +++ b/scripts/sync-all.lua @@ -0,0 +1,38 @@ +#!/usr/bin/env nix-shell +--[[ +#!nix-shell -i lua -p git git-sync +]] +local config_home +if os.getenv("XDG_CONFIG_HOME") then + config_home = os.getenv("XDG_CONFIG_HOME") +else + config_home = "~/.config/" +end + +local sync_mapping = { + ["~/.password-store"] = "https://git.xenia.me.uk/pixelifytica/pass.git", + ["~/.elfeed"] = "https://git.xenia.me.uk/pixelifytica/elfeed.git", + ["~/Documents/Org"] = "https://git.xenia.me.uk/pixelifytica/org.git", + ["~/Documents/References"] = "https://git.xenia.me.uk/pixelifytica/references.git", +} + +local pull_mapping = { + ["/etc/nixos"] = "https://git.xenia.me.uk/pixelifytica/nixos.git", + [config_home .. "/emacs"] = "https://git.xenia.me.uk/pixelifytica/emacs.git", +} + +local function git_sync(directory, url) + print("--- sync: " .. directory .. " ---") +end + +local function git_pull(directory, url, ff_only) + print("--- pull: " .. directory .. " ---") +end + +for directory, url in pairs(sync_mapping) do + git_sync(directory, url) +end + +for directory, url in pairs(pull_mapping) do + git_pull(directory, url, true) +end diff --git a/scripts/sync-all.py b/scripts/sync-all.py new file mode 100755 index 0000000..4171ea6 --- /dev/null +++ b/scripts/sync-all.py @@ -0,0 +1,68 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p git git-sync + +import os +import queue +import subprocess +from pathlib import Path +from typing import Dict + +HOME = Path("~").expanduser().resolve() + +SYNC_MAPPING: Dict[Path, str] = { + Path( + "~/.password-store" + ).expanduser(): "https://git.xenia.me.uk/pixelifytica/pass.git", + Path("~/.elfeed").expanduser(): "https://git.xenia.me.uk/pixelifytica/elfeed.git", + Path( + "~/Documents/Org" + ).expanduser(): "https://git.xenia.me.uk/pixelifytica/org.git", + Path( + "~/Documents/References" + ).expanduser(): "https://git.xenia.me.uk/pixelifytica/references.git", +} + +PULL_MAPPINGS: Dict[Path, str] = { + Path("/etc/nixos"): "https://git.xenia.me.uk/pixelifytica/nixos.git", + Path(os.getenv("XDG_CONFIG_HOME", "~/.config")).expanduser() + / "emacs": "https://git.xenia.me.uk/pixelifytica/emacs.git", +} + + +def git_set_url(directory: Path, url: str) -> None: + """Set url for directory""" + comp = subprocess.run(f"git remote set-url origin {url}".split(), cwd=directory) + if comp.returncode != 0: + raise UserWarning(f"{comp.returncode} from {' '.join(comp.args)}") + subprocess.run("git remote -v".split(), cwd=directory) + + +def git_sync(directory: Path, url: str) -> subprocess.CompletedProcess: + """Sync status of repository""" + print(f"--- sync: ${directory} ---") + if not directory.exists(): + return subprocess.run("exit 1".split()) # TODO + git_set_url(directory, url) + return subprocess.run("git-sync -ns".split(), cwd=directory) + + +def git_pull( + directory: Path, url: str, ff_only: bool = True +) -> subprocess.CompletedProcess: + """Pull updates for directory from url""" + print(f"--- pull: {directory} ---") + if not directory.exists(): + return subprocess.run("exit 1".split()) # TODO + git_set_url(directory, url) + return subprocess.run("git pull --ff-only".split(), cwd=directory) + + +def main(*args, **kwargs) -> None: + for directory, url in SYNC_MAPPING.items(): + print(git_sync(directory, url)) + for directory, url in PULL_MAPPINGS.items(): + print(git_pull(directory, url)) + + +if __name__ == "__main__": + main() diff --git a/scripts/xdg-query-program.sh b/scripts/xdg-query-program.sh new file mode 100755 index 0000000..54c696c --- /dev/null +++ b/scripts/xdg-query-program.sh @@ -0,0 +1,3 @@ +FILETYPE=$(xdg-mime query filetype $@) +DEFAULT=$(xdg-mime query default $FILETYPE) +echo "$FILETYPE -> $DEFAULT" diff --git a/services/avizo/default.nix b/services/avizo/default.nix new file mode 100644 index 0000000..8bcb869 --- /dev/null +++ b/services/avizo/default.nix @@ -0,0 +1,22 @@ +{ + config, + accentColour ? "base07", + ... +}: { + services.avizo = { + enable = true; + settings.default = with config.scheme; let + accent = { + r = config.scheme."${accentColour}-rgb-r"; + g = config.scheme."${accentColour}-rgb-g"; + b = config.scheme."${accentColour}-rgb-b"; + }; + in { + background = "rgba(${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 0.8)"; + bar-bg-color = "rgba(${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 0.8)"; + bar-fg-color = "rgba(${base05-rgb-r}, ${base05-rgb-g}, ${base05-rgb-b}, 1.0)"; + border-color = "rgba(${accent.r}, ${accent.g}, ${accent.b}, 1.0)"; + image-opacity = "1.0"; + }; + }; +} diff --git a/services/email/davmail.properties b/services/email/davmail.properties new file mode 100644 index 0000000..c61dddb --- /dev/null +++ b/services/email/davmail.properties @@ -0,0 +1,39 @@ +davmail.server=true +davmail.mode=O365Manual +davmail.url=https://outlook.office365.com/EWS/Exchange.asmx +davmail.imapPort=1144 +davmail.smtpPort=1026 +davmail.caldavPort=1080 +davmail.enableKeepAlive=true +davmail.logFilePath=/tmp/davmail.log +davmail.enableKerberos=false +davmail.forceActiveSyncUpdate=false +davmail.imapAutoExpunge=true +davmail.useSystemProxies=false +davmail.caldavEditNotifications=false +davmail.ssl.nosecuresmtp=false +davmail.caldavPastDelay=0 +log4j.logger.httpclient.wire=WARN +davmail.popMarkReadOnRetr=false +davmail.ssl.nosecureimap=false +davmail.disableTrayActivitySwitch=true +davmail.caldavAutoSchedule=true +davmail.enableProxy=false +davmail.smtpSaveInSent=false +davmail.ssl.nosecurepop=false +log4j.rootLogger=WARN +log4j.logger.davmail=DEBUG +davmail.ssl.clientKeystorePass= +log4j.logger.org.apache.http.conn.ssl=WARN +davmail.sentKeepDelay=0 +davmail.ssl.nosecureldap=false +davmail.imapAlwaysApproxMsgSize=true +davmail.ssl.nosecurecaldav=false +davmail.showStartupBanner=false +log4j.logger.httpclient=WARN +log4j.logger.org.apache.http.wire=WARN +davmail.disableGuiNotifications=true +davmail.disableUpdateCheck=true +log4j.logger.org.apache.http=WARN +davmail.carddavReadPhoto=true +davmail.keepDelay=30 diff --git a/services/email/default.nix b/services/email/default.nix new file mode 100644 index 0000000..5267545 --- /dev/null +++ b/services/email/default.nix @@ -0,0 +1,81 @@ +{ + pkgs, + hostName, + ... +}: { + accounts.email = { + maildirBasePath = "Mail"; + accounts = let + realName = "Evie Litherland-Smith"; + in { + proton = let + host = "127.0.0.1"; + tls.enable = false; + in rec { + inherit realName; + primary = true; + maildir.path = "Proton"; + imap = { + inherit host tls; + port = 1143; + }; + smtp = { + inherit host tls; + port = 1025; + }; + address = "e.litherlandsmith@proton.me"; + aliases = ["evie@xenia.me.uk" "evie@litherlandsmith.slmail.me"]; + userName = address; + passwordCommand = "${pkgs.pass}/bin/pass show mbsync/${hostName}/proton | head -n1"; + mu.enable = true; + msmtp = { + enable = true; + extraConfig = { + tls = "off"; + auth = "login"; + }; + }; + mbsync = { + enable = true; + create = "both"; + expunge = "both"; + remove = "both"; + patterns = ["*" "!All Mail" "!Labels*" "!Starred" "!Recovered Messages"]; + subFolders = "Verbatim"; + extraConfig.account.AuthMechs = "LOGIN"; + }; + }; + icloud = rec { + inherit realName; + primary = false; + maildir.path = "iCloud"; + imap.host = "imap.mail.me.com"; + smtp.host = "smtp.mail.me.com"; + address = "e.litherlandsmith@icloud.com"; + userName = address; + passwordCommand = "${pkgs.pass}/bin/pass show mbsync/${hostName}/icloud | head -n1"; + mu.enable = true; + msmtp.enable = true; + mbsync = { + enable = true; + create = "both"; + expunge = "both"; + remove = "both"; + patterns = ["*" "!Notes"]; + subFolders = "Verbatim"; + }; + }; + }; + }; + programs = { + mu.enable = true; + msmtp.enable = true; + mbsync = { + enable = true; + groups.inboxes = { + proton = ["INBOX"]; + icloud = ["INBOX"]; + }; + }; + }; +} diff --git a/services/email/signatures/personal b/services/email/signatures/personal new file mode 100644 index 0000000..5d7ac1d --- /dev/null +++ b/services/email/signatures/personal @@ -0,0 +1,3 @@ +-- +Evelyn Litherland-Smith (she/they) +email: evie@xenia.me.uk diff --git a/services/email/signatures/work b/services/email/signatures/work new file mode 100644 index 0000000..86cebce --- /dev/null +++ b/services/email/signatures/work @@ -0,0 +1,5 @@ +-- +Evelyn Litherland-Smith (she/they) +Spectroscopy Diagnostic Physicist +Plasma Science and Fusion Operations +UK Atomic Energy Authority diff --git a/services/email/work.nix b/services/email/work.nix new file mode 100644 index 0000000..adf9b0a --- /dev/null +++ b/services/email/work.nix @@ -0,0 +1,69 @@ +{ + config, + pkgs, + hostName, + ... +}: { + imports = [./default.nix]; + accounts.email.accounts.outlook = let + host = "127.0.0.1"; + tls.enable = false; + in rec { + inherit (config.accounts.email.accounts.proton) realName; + primary = false; + maildir.path = "Outlook"; + imap = { + inherit host tls; + port = 1144; + }; + smtp = { + inherit host tls; + port = 1026; + }; + address = "evie.litherland-smith@ukaea.uk"; + aliases = ["elitherl@jet.uk"]; + userName = address; + passwordCommand = "${pkgs.pass}/bin/pass show mbsync/${hostName}/outlook | head -n1"; + mu.enable = true; + msmtp = { + enable = true; + extraConfig = { + tls = "off"; + auth = "login"; + }; + }; + mbsync = { + enable = true; + create = "both"; + expunge = "both"; + remove = "both"; + patterns = [ + "*" + "!Conversation History" + "!Snoozed" + "!Social Activity Notifications" + "!Sync Issues*" + "!Unsent Messages" + ]; + subFolders = "Verbatim"; + extraConfig.account.AuthMechs = "LOGIN"; + }; + }; + programs.mbsync.groups.inboxes.outlook = ["INBOX"]; + systemd.user.services.davmail = { + Unit = { + Description = "Davmail server"; + Wants = ["network-online.target"]; + After = ["network-online.target"]; + }; + Service = { + Environment = ["PATH=/run/current-system/sw/bin/:$PATH"]; + Restart = "always"; + ExecStartPre = with config.home; '' + /bin/sh -c "if [ ! -f ${homeDirectory}/.davmail.properties ]; then cp ${./davmail.properties} ${homeDirectory}/.davmail.properties; fi; chmod 644 ${homeDirectory}/.davmail.properties" + ''; + ExecStart = "${pkgs.davmail}/bin/davmail -notray ${config.home.homeDirectory}/.davmail.properties"; + }; + Install.WantedBy = ["default.target"]; + }; +} diff --git a/services/password-store/default.nix b/services/password-store/default.nix new file mode 100644 index 0000000..4d60e3a --- /dev/null +++ b/services/password-store/default.nix @@ -0,0 +1,41 @@ +{ + config, + lib, + pkgs, + ... +}: { + xdg.configFile."pass-git-helper/git-pass-mapping.ini".source = + ./git-pass-mapping.ini; + programs = { + gpg.enable = true; + password-store = { + enable = true; + package = + pkgs.pass-nodmenu.withExtensions + (exts: with exts; [pass-otp pass-update pass-import]); # pass-audit + settings = { + PASSWORD_STORE_DIR = "${config.home.homeDirectory}/.password-store"; + PASSWORD_STORE_ENABLE_EXTENSIONS = "true"; + }; + }; + git.extraConfig.credential = { + helper = "${pkgs.pass-git-helper}/bin/pass-git-helper"; + }; + }; + services = { + gpg-agent = rec { + enable = true; + maxCacheTtl = 86400; + defaultCacheTtl = maxCacheTtl; + defaultCacheTtlSsh = maxCacheTtl; + pinentryFlavor = lib.mkDefault "curses"; + extraConfig = '' + no-allow-external-cache + ''; + }; + git-sync.repositories.password-store = { + path = "${config.home.homeDirectory}/.password-store"; + uri = "git+https://git.xenia.me.uk/xenia/pass.git"; + }; + }; +} diff --git a/services/password-store/git-pass-mapping.ini b/services/password-store/git-pass-mapping.ini new file mode 100644 index 0000000..23e6239 --- /dev/null +++ b/services/password-store/git-pass-mapping.ini @@ -0,0 +1,6 @@ +[DEFAULT] +username_extractor=regex_search +regex_username=^login: (.*)$ + +[*] +target=git/${host} \ No newline at end of file