feat(terminal): new terminal home

This commit is contained in:
Guz
2026-03-16 14:29:53 -03:00
parent f4d721172f
commit f3791d2823
5 changed files with 636 additions and 0 deletions

242
home/terminal/browser.nix Normal file
View File

@@ -0,0 +1,242 @@
{
config,
lib,
pkgs,
self,
...
}:
with lib; {
imports = [
self.homeManagerModules.qutebrowser-profiles
./scripts.nix
./profiles.nix
];
programs.qutebrowser = {
enable = true;
keyBindings = {
normal = {
",m" = "spawn umpv {url}";
",M" = "hint links spawn umpv {hint-url}";
";M" = "hint --rapid links spawn umpv {hint-url}";
"tD" = "config-cycle -t -u {url} colors.webpage.darkmode.enabled false true ;; reload";
};
};
settings = {
auto_save.session = true;
confirm_quit = ["downloads"];
tabs.width = builtins.floor (1920 * 0.1);
tabs.position = "left";
# Colors
colors.tabs.pinned.even.bg = mkForce "#181818";
colors.tabs.pinned.odd.bg = mkForce "#181818";
colors.tabs.selected.even.bg = mkForce "#CDD6F4"; # Catppuccin's Text
colors.tabs.selected.odd.bg = mkForce "#CDD6F4"; # Catppuccin's Text
colors.tabs.selected.even.fg = mkForce "#111111";
colors.tabs.selected.odd.fg = mkForce "#111111";
colors.tabs.pinned.selected.even.bg = mkForce "#CDD6F4"; # Catppuccin's Text
colors.tabs.pinned.selected.odd.bg = mkForce "#CDD6F4"; # Catppuccin's Text
## Darkmode
colors.webpage.darkmode.enabled = true;
colors.webpage.darkmode.algorithm = "lightness-cielab";
colors.webpage.darkmode.policy.images = "never";
# Prevent fingerprinting
content.canvas_reading = false;
content.cookies.accept = "all";
content.cookies.store = true;
content.geolocation = false;
content.webgl = false;
content.webrtc_ip_handling_policy = "default-public-interface-only";
};
extraConfig = ''
config.set('colors.webpage.darkmode.enabled', False, 'file://*')
config.set('colors.webpage.darkmode.enabled', False, 'http://*:*/*')
config.set('colors.webpage.darkmode.enabled', False, 'capytal.company')
config.set('colors.webpage.darkmode.enabled', False, '*.capytal.company')
config.set('colors.webpage.darkmode.enabled', False, 'capytal.cc')
config.set('colors.webpage.darkmode.enabled', False, '*.capytal.cc')
config.set('colors.webpage.darkmode.enabled', False, 'lored.dev')
config.set('colors.webpage.darkmode.enabled', False, '*.lored.dev')
config.set('colors.webpage.darkmode.enabled', False, 'guz.one')
config.set('colors.webpage.darkmode.enabled', False, '*.guz.one')
# Thanks to @hseg on GitHub (https://github.com/qutebrowser/qutebrowser/issues/6880#issuecomment-1815248845)
config.bind('o', 'cmd-set-text -s :open -s')
config.bind('go', 'cmd-set-text :open -s {url:pretty}')
config.bind('O', 'cmd-set-text -s :open -s -t')
config.bind('gO', 'cmd-set-text :open -s -t -r {url:pretty}')
config.bind('xo', 'cmd-set-text -s :open -s -b')
config.bind('xO', 'cmd-set-text :open -s -b -r {url:pretty}')
config.bind('wo', 'cmd-set-text -s :open -s -w')
config.bind('wO', 'cmd-set-text :open -s -w {url:pretty}')
config.bind('pp', 'open -s -- {clipboard}')
config.bind('pP', 'open -s -- {primary}')
config.bind('Pp', 'open -s -t -- {clipboard}')
config.bind('PP', 'open -s -t -- {primary}')
config.bind('wp', 'open -s -w -- {clipboard}')
config.bind('wP', 'open -s -w -- {primary}')
'';
searchEngines = {
DEFAULT = "https://search.brave.com/search?q={}";
# Nix
pkg = "https://search.nixos.org/packages?query={}";
opt = "https://search.nixos.org/options?query={}";
lib = "https://noogle.dev/q?term={}";
hm = "https://home-manager-options.extranix.com/?query={}";
wiki = "https://wiki.nixos.org/w/index.php?search={}";
# Wikipedia
w = "https://en.wikipedia.org/wiki/Special:Search?search={}&go=Go&ns0=1";
wpt = "https://pt.wikipedia.org/wiki/Special:Search?search={}&go=Go&ns0=1";
};
profiles = let
programmingSearchEngines = {
# Languages
go = "https://pkg.go.dev/search?q={}";
};
setColor = c: {
colors.tabs.selected.even.bg = c;
colors.tabs.selected.odd.bg = c;
colors.tabs.pinned.selected.even.bg = c;
colors.tabs.pinned.selected.odd.bg = c;
};
in {
"art".settings = setColor "#CBA6F7"; # Catppuccin's Mauve;
"personal".settings = setColor "#F5E0DC"; # Catppuccin's Rosewater
"work" = {
settings = setColor "#74C7EC"; # Catppuccin's Sapphire
searchEngines = programmingSearchEngines;
};
"job" = {
settings =
(config.programs.qutebrowser.profiles."work".settings)
// {
confirm_quit = ["always"];
content.webgl = true;
}
// (setColor "#A6E2A1"); # Catppuccin's Green
searchEngines = programmingSearchEngines;
};
"shopping".settings = setColor "#F9E2AF"; # Catppuccin's Yellow
"goverment".settings = setColor "#A6ADC8"; # Catppuccin's Subtext 1
"academic".settings =
{
confirm_quit = ["always"];
content.webgl = true;
}
// setColor "#19236F";
"facebook".settings = setColor "#1877F2"; # Facebook's Blue
"yt-music".settings =
{
tabs.width = 10;
}
// (setColor "#FF0000"); # Youtube's Red
};
greasemonkey = [
# Youtube Adblocking
(pkgs.fetchurl {
url = "https://raw.githubusercontent.com/afreakk/greasemonkeyscripts/refs/heads/master/youtube_adblock.js";
hash = "sha256-AyD9VoLJbKPfqmDEwFIEBMl//EIV/FYnZ1+ona+VU9c=";
})
# Youtube Sponsorblock
(pkgs.fetchurl {
url = "https://raw.githubusercontent.com/afreakk/greasemonkeyscripts/refs/heads/master/youtube_sponsorblock.js";
hash = "sha256-nwNade1oHP+w5LGUPJSgAX1+nQZli4Rhe8FFUoF5mLE=";
})
# Reddit adblock
(pkgs.fetchurl {
url = "https://github.com/afreakk/greasemonkeyscripts/raw/refs/heads/master/reddit_adblock.js";
hash = "sha256-KmCXL4GrZtwPLRyAvAxADpyjbdY5UFnS/XKZFKtg7tk=";
})
# Pinterest adblock
(pkgs.writeText "pinterest_adblock.js" ''
// ==UserScript==
// @name remove ads from pinterest
// @version 1.0.0
// @author guz
// @match *://*.pinterest.com/*
// ==/UserScript==
const removeShit = () => {
document.querySelectorAll('[data-grid-item]:has([title="Promoted by"])').forEach((e) => e.remove());
document.querySelectorAll('[data-grid-item]:has([data-test-id="oneTapPromotedPin"])').forEach((e) => e.remove());
document.querySelectorAll('[data-grid-item]:has([aria-label="Product Pin"])').forEach((e) => e.remove());
// document.querySelectorAll('[data-grid-item]:has-text(ideas you might love)').forEach((e) => e.remove());
// document.querySelectorAll('[data-grid-item]:has-text(Seaches to try)').forEach((e) => e.remove());
};
(trySetInterval = () => {
window.setInterval(removeShit, 1000);
})();
'')
# Privacy Redirector
(pkgs.substitute {
src = pkgs.fetchurl {
url = "https://github.com/dybdeskarphet/privacy-redirector/raw/refs/heads/main/privacy-redirector.user.js";
hash = "sha256-xj36+/3coiStIxftWCJUWHokSEmr+YRLOTktbmn5TkU=";
};
substitutions = [
# ON-OFF (Redirection / Farside)
"--replace"
"pinterest = [true, true]"
"pinterest = [false, false]"
"--replace"
"tumblr = [true, false]"
"tumblr = [false, false]"
"--replace"
"wikipedia = [true, false]"
"wikipedia = [false, false]"
"--replace"
"youtube = [true, false]"
"youtube = [false, false]"
"--replace"
"instagram = [true, true]"
"instagram = [false, false]"
];
})
];
};
programs.mpv.enable = true;
programs.mpv.scripts = with pkgs.mpvScripts; [
quality-menu
sponsorblock
];
xdg.mimeApps.defaultApplications = listToAttrs (map (name: {
inherit name;
value = config.programs.qutebrowser.package.meta.desktopFileName;
}) [
"application/x-extension-shtml"
"application/x-extension-xhtml"
"application/x-extension-html"
"application/x-extension-xhtm"
"application/x-extension-htm"
"x-scheme-handler/unknown"
"x-scheme-handler/mailto"
"x-scheme-handler/chrome"
"x-scheme-handler/about"
"x-scheme-handler/https"
"x-scheme-handler/http"
"application/xhtml+xml"
"application/json"
"text/plain"
"text/html"
]);
}

View File

@@ -0,0 +1,44 @@
{
config,
inputs,
pkgs,
pkgs-unstable,
self,
...
}: {
imports = [
inputs.home-manager.nixosModules.default
];
# User
users.users."guz" = {
extraGroups = ["wheel" "guz"];
isNormalUser = true;
hashedPasswordFile = builtins.toString config.sops.secrets."guz/password".path;
shell = self.packages.${pkgs.stdenv.hostPlatform.system}.devkit.zsh;
};
users.groups."guz" = {};
home-manager.backupFileExtension = "bkp";
home-manager.extraSpecialArgs = {inherit inputs self pkgs-unstable;};
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users."guz" = ./home.nix;
services.displayManager.sddm = {
enable = true;
wayland.enable = true;
};
programs.hyprland = {
enable = true;
withUWSM = true;
xwayland.enable = true;
};
xdg.portal.xdgOpenUsePortal = true;
xdg.portal.extraPortals = with pkgs; [xdg-desktop-portal-gtk];
# Shell
programs.zsh.enable = true;
}

285
home/terminal/desktop.nix Normal file
View File

@@ -0,0 +1,285 @@
{
config,
lib,
osConfig,
pkgs,
...
}:
with lib; {
xdg.configFile."uwsm/env".source = "${config.home.sessionVariablesPackage}/etc/profile.d/hm-session-vars.sh"; # Set environment variables
wayland.windowManager.hyprland = {
enable = true;
systemd.enable = mkForce false; # Incompatible with UWSM
package = null; # Use the package from the NixOS module
portalPackage = null; # Use the package from the NixOS module
settings = {
"$MONITOR-1" = mkDefault "";
"$MONITOR-2" = mkDefault "";
animations.enabled = true;
decoration.rounding = 5;
decoration.dim_inactive = true;
decoration.dim_strength = 0.2;
decoration.dim_around = 0.4;
exec-once = [
"wl-paste --type text --watch cliphist store"
"wl-paste --type image --watch cliphist store"
];
dwindle.pseudotile = true;
dwindle.preserve_split = true;
general.gaps_in = 5;
general.gaps_out = 10;
general.border_size = 0;
general.layout = "dwindle";
input.kb_layout = elemAt 0 (strings.splitString "-" osConfig.console.keyMap);
input.kb_variant = elemAt 1 (strings.splitString "-" osConfig.console.keyMap);
input.follow_mouse = 1;
input.sensitivity = 0;
monitor = [", preferred, auto, 1"];
workspace = [
# Primary monitor
"1,monitor:$MONITOR-1,default:true"
"2,monitor:$MONITOR-1"
"3,monitor:$MONITOR-1"
"4,monitor:$MONITOR-1"
"5,monitor:$MONITOR-1"
# Second monitor
"6,monitor:$MONITOR-2"
"7,monitor:$MONITOR-2"
"8,monitor:$MONITOR-2"
"9,monitor:$MONITOR-2"
"10,monitor:$MONITOR-2,default:true"
];
# Keymaps
bind = [
# Applications shortcut
"SUPER, Q, exec, ${config.home.sessionVariables.TERMINAL}" # Terminal
# TODO: "SUPER, E, exec, " # File manager
"SUPER, W, exec, xdg-open https://search.brave.com"
# Launcher
# TODO: "SUPER, S, exec, "
"SUPER, I, exec, ${getExe pkgs.rofimoji}" # Emoji Picker
# Navigation
"SUPER, C, killactive"
"SUPER, F, fullscreen"
"SUPER_SHIFT, F, togglefloating"
"SUPER, h, movefocus l"
"SUPER, l, movefocus r"
"SUPER, k, movefocus u"
"SUPER, j, movefocus d"
"SUPER, 1, workspace 1"
"SUPER, 2, workspace 2"
"SUPER, 3, workspace 3"
"SUPER, 4, workspace 4"
"SUPER, 5, workspace 5"
"SUPER, 6, workspace 6"
"SUPER, 7, workspace 7"
"SUPER, 8, workspace 8"
"SUPER, 9, workspace 9"
"SUPER, 0, workspace 10"
"SUPER_SHIFT, 1, movetoworkspace 1"
"SUPER_SHIFT, 2, movetoworkspace 2"
"SUPER_SHIFT, 3, movetoworkspace 3"
"SUPER_SHIFT, 4, movetoworkspace 4"
"SUPER_SHIFT, 5, movetoworkspace 5"
"SUPER_SHIFT, 6, movetoworkspace 6"
"SUPER_SHIFT, 7, movetoworkspace 7"
"SUPER_SHIFT, 8, movetoworkspace 8"
"SUPER_SHIFT, 9, movetoworkspace 9"
"SUPER_SHIFT, 0, movetoworkspace 10"
# Clipboard manager
"SUPER, V, exec, cliphist list | rofi -dmenu -display-columns 2 | cliphist decode | wl-copy"
# Print region
",Print, exec, ${getExe pkgs.grim} -g \"$(${getExe slurp} -d)\" - | wl-copy"
# Copy color
"SUPER, P, exec, ${getExe pkgs.hyprpicker} | wl-copy"
];
# Mouse Keymaps
bindm = [
"SUPER, mouse:272, movewindow" # Left-click
"SUPER, mouse:273, resizewindow" # Right-click
];
};
};
# Application Launcher
programs.rofi = {
enable = true;
modes = ["drun" "emoji"];
};
# Clipboard
services.cliphist = {
enable = true;
allowImages = true;
};
home.packages = with pkgs; [
wl-clipboard
];
# Notifications
services.dunst = {
enable = true;
settings = {
global.follow = "mouse";
};
};
# Bar
programs.waybar.settings = let
layer = "top";
position = "top";
height = 25;
spacing = 5;
margin-top = 5;
margin-x = 10;
margin-right = margin-x;
margin-left = margin-x;
in {
main = let
monitor = config.wayland.windowManager.hyprland.settings."$MONITOR-1";
in {
inherit
layer
position
height
spacing
margin-top
margin-right
margin-left
;
output = [monitor];
modules-left = [
"hyprland/workspaces"
];
"hyprland/workspaces" = {
active-only = false;
persistent-workspaces = {
"${monitor}" = [1 2 3 4 5];
};
format = "{icon}";
format-icons = {
default = "";
active = "";
};
};
modules-center = [
"clock"
];
modules-right = [
"pulseaudio"
];
"clock" = {
format = "{:%d 󰥔 %R}";
format-alt = "{:%B %d, 12.0%y (%A)}";
tooltip-format = "<tt><small>{calendar}</small></tt>";
calendar = {
mode = "year";
mode-mon-col = 3;
weeks-pos = "left";
on-scroll = 1;
format = with config.lib.stylix.colors.withHashtag; {
months = "<span color='${base09}'><b>{}</b></span>";
days = "<span color='${base05}'><b>{}</b></span>";
weeks = "<span color='${base09}'><b>W{}</b></span>";
weeksdays = "<span color='${base09}'><b>{}</b></span>";
today = "<span color='${base07}'><b>{}</b></span>";
};
};
};
"pulseaudio" = {
format = "{icon} {volume}%";
format-muted = "";
format-icons = {
default = ["" ""];
};
onclick = "${lib.getExe pkgs.pwvucontrol}";
};
};
secondary = let
monitor = config.wayland.windowManager.hyprland.settings."$MONITOR-2";
in {
inherit
layer
position
height
spacing
margin-top
margin-right
margin-left
;
output = [monitor];
modules-left = [
"cpu"
"memory"
"disk"
];
"cpu" = {
format = " {usage}%";
};
"memory" = {
format = " {percentage}%";
};
"disk" = {
interval = 30;
format = "󰨣 {specific_free:0.2f}";
unit = "GB";
};
modules-center = [
"hyprland/window"
];
"hyprland/window" = {
format = "{title}";
};
modules-right = [
"hyprland/workspaces"
];
"hyprland/workspaces" = {
active-only = false;
persistent-workspaces = {
"${monitor}" = [6 7 8 9 10];
};
format = "{icon}";
format-icons = {
default = "";
active = "";
};
};
};
};
}

25
home/terminal/home.nix Normal file
View File

@@ -0,0 +1,25 @@
{
lib,
options,
...
}:
with lib; {
imports =
[
./browser.nix
./desktop.nix
]
++ (optionals (options.home?persistence) [
./impermanence.nix
]);
# This value determines the Home Manager release that your
# configuration is compatible with. This helps avoid breakage
# when a new Home Manager release introduces backwards
# incompatible changes.
#
# You can update Home Manager without changing this value. See
# the Home Manager release notes for a list of state version
# changes in each release.
home.stateVersion = "25.11";
}

View File

@@ -0,0 +1,40 @@
{lib, ...}:
with lib; {
home.persistence."/persist" = {
directories = map (d:
if isList d
then {
directory = elemAt 1 d;
mode = elemAt 0 d;
}
else d) [
["0755" "Documents"]
["0755" "Downloads"]
["0755" "KritaRecorder"]
["0755" "Music"]
["0755" "Nextcloud"]
["0755" "Projects"]
["0755" "Pictures"]
["0755" "Videos"]
["0755" "go"]
["0700" ".gnupg"]
["0700" ".ssh"]
["0755" ".cache/blender"]
["0755" ".cache/go-build"]
["0755" ".cache/godot"]
["0700" ".cache/gopls"]
["0755" ".cache/nvim"]
["0700" ".cache/qutebrowser"]
["0755" ".cache/starship"]
["0700" ".cache/wezterm"]
["0755" ".cache/zellij"]
["0755" ".config/blender"]
["0751" ".config/inkscape"]
["0600" ".config/kritarc"]
["0644" ".config/kritadisplayrc"]
["0755" ".config/qutebrowser"]
["0755" ".local/share/direnv"]
["0700" ".local/share/keyrings"]
];
};
}