summaryrefslogtreecommitdiff
path: root/modules/home-manager/personal/programs
diff options
context:
space:
mode:
Diffstat (limited to 'modules/home-manager/personal/programs')
-rw-r--r--modules/home-manager/personal/programs/alacritty.nix21
-rw-r--r--modules/home-manager/personal/programs/default.nix13
-rw-r--r--modules/home-manager/personal/programs/direnv.nix31
-rw-r--r--modules/home-manager/personal/programs/emacs.nix59
-rw-r--r--modules/home-manager/personal/programs/firefox/default.nix139
-rw-r--r--modules/home-manager/personal/programs/firefox/engines.nix8
-rw-r--r--modules/home-manager/personal/programs/firefox/userjs.nix66
-rw-r--r--modules/home-manager/personal/programs/git.nix21
-rw-r--r--modules/home-manager/personal/programs/rofi.nix8
-rw-r--r--modules/home-manager/personal/programs/thunderbird.nix35
10 files changed, 401 insertions, 0 deletions
diff --git a/modules/home-manager/personal/programs/alacritty.nix b/modules/home-manager/personal/programs/alacritty.nix
new file mode 100644
index 0000000..afecfc9
--- /dev/null
+++ b/modules/home-manager/personal/programs/alacritty.nix
@@ -0,0 +1,21 @@
+{ config, lib, ... }:
+
+{
+ programs.alacritty.settings = {
+ window = {
+ padding = {
+ x = 10;
+ y = 10;
+ };
+ dimensions = {
+ lines = 75;
+ columns = 100;
+ };
+ };
+
+ font = { size = 8.0; };
+ };
+
+ xsession.windowManager.i3.config.terminal = lib.mkIf config.programs.alacritty.enable "alacritty";
+}
+
diff --git a/modules/home-manager/personal/programs/default.nix b/modules/home-manager/personal/programs/default.nix
new file mode 100644
index 0000000..8b3ba16
--- /dev/null
+++ b/modules/home-manager/personal/programs/default.nix
@@ -0,0 +1,13 @@
+{ ... }:
+
+{
+ imports = [
+ ./alacritty.nix
+ ./direnv.nix
+ ./emacs.nix
+ ./firefox
+ ./git.nix
+ ./rofi.nix
+ ./thunderbird.nix
+ ];
+}
diff --git a/modules/home-manager/personal/programs/direnv.nix b/modules/home-manager/personal/programs/direnv.nix
new file mode 100644
index 0000000..7d87dc2
--- /dev/null
+++ b/modules/home-manager/personal/programs/direnv.nix
@@ -0,0 +1,31 @@
+{ config, lib, pkgs, ... }:
+
+let cfg = config.programs.direnv;
+in {
+ programs.direnv.nix-direnv.enable = true;
+
+ systemd.user = lib.mkIf cfg.enable
+ (pkgs.personal.lib.homeManager.serviceWithTimer "direnv-clean-update" {
+ Unit = {
+ Description =
+ "Remove old virtual environments and update the current ones";
+ After = [ "network-online.target" ];
+ };
+ Service = {
+ Type = "oneshot";
+ ExecSearchPath =
+ "${pkgs.coreutils}/bin:${pkgs.findutils}/bin:${pkgs.direnv}/bin:/bin/sh";
+ WorkingDirectory = "${config.home.homeDirectory}";
+ ExecStart = ''
+ find -type d -name .direnv \
+ -execdir /bin/sh -c "rm -f .direnv/{nix,flake}-profile*" \; \
+ -execdir direnv exec . true \;
+ '';
+ };
+ Timer = {
+ Persistent = true;
+ OnCalendar = "daily";
+ };
+ Install = { WantedBy = [ "default.target " ]; };
+ });
+}
diff --git a/modules/home-manager/personal/programs/emacs.nix b/modules/home-manager/personal/programs/emacs.nix
new file mode 100644
index 0000000..2189541
--- /dev/null
+++ b/modules/home-manager/personal/programs/emacs.nix
@@ -0,0 +1,59 @@
+{ config, lib, pkgs, ... }:
+
+let
+ cfg = config.programs.emacs;
+ spacemacs-update-script = pkgs.callPackage ({ emacs, git }:
+ pkgs.writeShellApplication {
+ name = "spacemacs-update";
+
+ runtimeInputs = [ emacs git ];
+
+ text = ''
+ git checkout develop
+ git pull
+ git checkout local
+ git merge develop
+ emacs --fg-daemon=update-daemon \
+ --eval '(progn
+ (configuration-layer/update-packages "no-confirmation")
+ (spacemacs/kill-emacs))'
+ '';
+ }) { emacs = cfg.package; };
+in {
+ config = lib.mkIf cfg.enable {
+ services.emacs = {
+ enable = lib.mkDefault true;
+ client.enable = lib.mkDefault true;
+ startWithUserSession = lib.mkDefault true;
+ };
+ home.sessionVariables.EDITOR = "emacsclient --create-frame";
+
+ # add some packages necessary in spacemacs
+ programs.emacs.extraPackages =
+ lib.mkDefault (ep: with ep; [ emacsql-sqlite emacsql-sqlite3 ]);
+ home.packages = with pkgs; [ gnutar source-code-pro ];
+
+ # spacemacs dotfile
+ home.file.".spacemacs.d/init.el".source =
+ lib.mkDefault config.personal.home.dotfiles.spacemacs;
+
+ # service to update spacemacs
+ systemd.user =
+ (pkgs.personal.lib.homeManager.serviceWithTimer "spacemacs-update" {
+ Unit = {
+ Description = "Update Spacemacs by pulling the develop branch";
+ After = [ "network-online.target" "emacs.service" ];
+ };
+ Service = {
+ Type = "oneshot";
+ WorkingDirectory = "${config.home.homeDirectory}/.emacs.d/";
+ ExecStart = "${spacemacs-update-script}";
+ };
+ Timer = {
+ Persistent = true;
+ OnCalendar = "daily";
+ };
+ Install = { WantedBy = [ "default.target" ]; };
+ });
+ };
+}
diff --git a/modules/home-manager/personal/programs/firefox/default.nix b/modules/home-manager/personal/programs/firefox/default.nix
new file mode 100644
index 0000000..1e97c40
--- /dev/null
+++ b/modules/home-manager/personal/programs/firefox/default.nix
@@ -0,0 +1,139 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+let
+ cfg = config.personal.firefox;
+ userjs = pkgs.callPackage ./userjs.nix {
+ inherit (pkgs.personal) arkenfoxUserJS;
+ inherit (pkgs.lib.personal) toUserJS;
+ };
+ engines = import ./engines.nix;
+ userchrome-treestyletabs = ''
+ /* Hide main tabs toolbar */
+ #TabsToolbar {
+ visibility: collapse;
+ }
+ /* Sidebar min and max width removal */
+ #sidebar {
+ max-width: none !important;
+ min-width: 0px !important;
+ }
+ /* Hide sidebar header, when using Tree Style Tab. */
+ #sidebar-box[sidebarcommand="treestyletab_piro_sakura_ne_jp-sidebar-action"] #sidebar-header {
+ visibility: collapse;
+ }
+ '';
+ extensions = with pkgs.personal; [
+ canvasblocker
+ clearurls
+ darkreader
+ neat-url
+ redirector
+ smart-referer
+ temporary-containers
+ tree-style-tab
+ ublock-origin
+ unpaywall
+ url-in-title
+ ];
+ webappsWithIds = (builtins.foldl' ({ counter, value }:
+ { name, ... }@next: {
+ counter = counter + 1;
+ value = value ++ [
+ (next // {
+ id = counter;
+ profileName = lib.toLower name;
+ })
+ ];
+ }) {
+ counter = 0;
+ value = [ ];
+ } cfg.webapps).value;
+in {
+ options.personal.firefox = {
+ webapps = lib.mkOption {
+ type = with lib.types;
+ listOf (submodule {
+ options = let mkTypedOption = type: lib.mkOption { inherit type; };
+ in {
+ name = mkTypedOption str;
+ genericName = mkTypedOption str // { default = ""; };
+ url = mkTypedOption str;
+ comment = mkTypedOption str // { default = ""; };
+ extraUserJS = mkTypedOption lines // { default = ""; };
+ categories = mkTypedOption (listOf str) // { default = [ ]; };
+ icon = mkTypedOption path;
+ };
+ });
+ default = [ ];
+ };
+ };
+
+ config = lib.mkMerge [
+ {
+ programs.firefox.profiles = builtins.foldl' (prev:
+ { name, id, profileName, extraUserJS, ... }:
+ prev // {
+ "${profileName}" = {
+ inherit extensions;
+ id = id + 2;
+ extraConfig = userjs.streaming + extraUserJS;
+ };
+ }) {
+ default = {
+ inherit extensions;
+ id = 0; # isDefault = true
+
+ extraConfig = userjs.default;
+ userChrome = userchrome-treestyletabs;
+ search = {
+ force = lib.mkDefault true;
+ engines = {
+ inherit (engines) Searx;
+ "Bing".metaData.hidden = true;
+ "Google".metaData.hidden = true;
+ "Amazon.fr".metaData.hidden = true;
+ };
+ default = "Searx";
+ order = [ "Searx" "Wikipedia" ];
+ };
+ };
+
+ videoconferencing = {
+ inherit extensions;
+ id = 1;
+
+ extraConfig = userjs.videoconferencing;
+ userChrome = userchrome-treestyletabs;
+ };
+ } webappsWithIds;
+ }
+
+ (lib.mkIf config.programs.firefox.enable {
+ xdg.desktopEntries = let
+ firefoxProfilesDir = "${config.home.homeDirectory}/.mozilla/firefox";
+ firefoxInProfile = profile:
+ ''
+ ${config.programs.firefox.package}/bin/firefox --profile "${firefoxProfilesDir}/${profile}"'';
+ in builtins.foldl' (prev:
+ { name, profileName, url, genericName, icon, comment, categories, ... }:
+ prev // {
+ "${profileName}" = {
+ inherit name genericName icon comment categories;
+ exec = "${firefoxInProfile profileName} ${url}";
+ };
+ }) {
+ videoconferences = {
+ name = "Video Conferences";
+ genericName = "Video conference";
+ comment = "Use video conferencing software in a browser.";
+ exec = "${firefoxInProfile "videoconferencing"}";
+ categories = [ "Network" "VideoConference" ];
+ };
+ } webappsWithIds;
+
+ home.shellAliases.fftmp = "firefox --profile $(mktemp -d)";
+ home.sessionVariables.BROWSER = "firefox";
+ })
+ ];
+}
diff --git a/modules/home-manager/personal/programs/firefox/engines.nix b/modules/home-manager/personal/programs/firefox/engines.nix
new file mode 100644
index 0000000..7ea2830
--- /dev/null
+++ b/modules/home-manager/personal/programs/firefox/engines.nix
@@ -0,0 +1,8 @@
+{
+ Searx = {
+ urls = [{ template = "https://searx.aristote.fr/search?q={searchTerms}"; }];
+ iconUpdateURL =
+ "https://searx.aristote.fr/static/themes/oscar/img/favicon.png";
+ updateInterval = 24 * 60 * 60 * 1000; # every day
+ };
+}
diff --git a/modules/home-manager/personal/programs/firefox/userjs.nix b/modules/home-manager/personal/programs/firefox/userjs.nix
new file mode 100644
index 0000000..ee105b3
--- /dev/null
+++ b/modules/home-manager/personal/programs/firefox/userjs.nix
@@ -0,0 +1,66 @@
+{ arkenfoxUserJS, toUserJS }:
+
+rec {
+ arkenfox = builtins.readFile "${arkenfoxUserJS}";
+ default = arkenfox + toUserJS {
+ "keyword.enabled" = true; # 0801
+ "signon.rememberSignons" = false; # 0901
+ "security.nocertdb" = true; # 1222
+ "media.peerconnection.enabled" = false; # 2001
+ "media.peerconnection.ice.no_host" = true; # 2004
+ "dom.allow_cut_copy" = true; # 2404
+ "dom.battery.enabled" = false; # 2502
+ "permissions.default.xr" = 2; # 2521
+ "privacy.clearOnShutdown.siteSettings" = true; # 2811
+
+ # Personal
+ ## Warnings
+ "browser.tabs.warnOnClose" = false;
+ "browser.tabs.warnOnCloseOtherTabs" = false;
+ ## Updates
+ "app.update.auto" = false;
+ "browser.search.update" = false;
+ ## Appearance
+ "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
+ ## Content behavior
+ "clipboard.autocopy" = false;
+ ## UX behavior
+ "browser.quitShortcut.disabled" = true;
+ "browser.tabs.closeWindowWithLastTab" = false;
+ ## UX features
+ "extensions.pocket.enabled" = false;
+ "identity.fxaccounts.enabled" = false;
+ };
+
+ streaming = default + toUserJS {
+ # Widevine (DRMs)
+ "media.gmp-widevinecdm.enabled" = true;
+ "media.eme.enabled" = true;
+ # Cache
+ "browser.cache.disk.enable" = true;
+ "browser.cache.offline.storage" = true;
+ # Privacy
+ "privacy.clearOnShutdown.cache" = false;
+ "privacy.clearOnShutdown.cookies" = false;
+ "privacy.clearOnShutdown.siteSettings" = false;
+ "privacy.clearOnShutdown.offlineApps" = false;
+ "privacy.resistFingerprinting" = false; # Netflix is whining
+ };
+
+ videoconferencing = default + toUserJS {
+ # IMPORTANT: uncheck "Prevent WebRTC from leaking local IP addresses" in uBlock Origin's settings
+ # NOTE: if using RFP (4501)
+ # some sites, e.g. Zoom, need a canvas site exception [Right Click>View Page Info>Permissions]
+ # Discord video does not work: it thinks you are FF78: use a separate profile or spoof the user agent
+ "media.peerconnection.enabled" = true;
+ "media.peerconnection.ice.no_host" = false; # may or may not be required
+ "webgl.disabled" = false; # required for Zoom
+ "webgl.min_capability_mode" = false;
+ "media.getusermedia.screensharing.enabled" = true; # optional
+ "media.autoplay.blocking_policy" =
+ 0; # optional (otherwise add site exceptions)
+ "javascript.options.wasm" =
+ true; # optional (some platforms may require this)
+ "dom.webaudio.enabled" = true;
+ };
+}
diff --git a/modules/home-manager/personal/programs/git.nix b/modules/home-manager/personal/programs/git.nix
new file mode 100644
index 0000000..5d272dc
--- /dev/null
+++ b/modules/home-manager/personal/programs/git.nix
@@ -0,0 +1,21 @@
+{ lib, pkgs, ... }:
+
+{
+ programs.git = {
+ userName = lib.mkDefault "Quentin Aristote";
+ userEmail = lib.mkDefault "quentin@aristote.fr";
+
+ ignores = builtins.map builtins.readFile
+ (with pkgs.personal; [ emacsGitignore linuxGitignore direnvGitignore ])
+ ++ [
+ # Personal rules
+ ''
+ # Nix
+ shell.nix
+ .nix-gc-roots
+ .tmp
+ result
+ ''
+ ];
+ };
+}
diff --git a/modules/home-manager/personal/programs/rofi.nix b/modules/home-manager/personal/programs/rofi.nix
new file mode 100644
index 0000000..141339c
--- /dev/null
+++ b/modules/home-manager/personal/programs/rofi.nix
@@ -0,0 +1,8 @@
+{ config, lib, ... }:
+
+{
+ programs.rofi = {
+ cycle = lib.mkDefault true;
+ theme = lib.mkDefault config.personal.home.dotfiles.rofi;
+ };
+}
diff --git a/modules/home-manager/personal/programs/thunderbird.nix b/modules/home-manager/personal/programs/thunderbird.nix
new file mode 100644
index 0000000..c3450af
--- /dev/null
+++ b/modules/home-manager/personal/programs/thunderbird.nix
@@ -0,0 +1,35 @@
+{ config, lib, pkgs, ... }:
+
+let
+ configDefault = builtins.readFile "${pkgs.personal.thunderbirdUserJS}"
+ + pkgs.lib.personal.toUserJS {
+ # 0391
+ "mail.bii.alert.show_preview" = false;
+ # 0610
+ "browser.send_pings" = false;
+ # 5004
+ "permissions.memory_only" = false;
+ # 5016
+ "browser.download.folderList" = 1;
+ # 9000
+ "app.update.auto" = false;
+ # 9131
+ "extensions.cardbook.useOnlyEmail" = false;
+ # 9312
+ "calendar.timezone.local" = "Europe/Paris";
+ };
+ profiles = {
+ all = { };
+ personal = { };
+ work = { };
+ };
+in {
+ config = lib.mkMerge [
+ { programs.thunderbird = { inherit profiles; }; }
+ (lib.mkIf config.programs.thunderbird.enable {
+ home.file = lib.concatMapAttrs
+ (name: _: { ".thunderbird/${name}/user.js".text = configDefault; })
+ profiles;
+ })
+ ];
+}