diff --git a/afew.config b/afew.config new file mode 100644 index 0000000..8ce1a76 --- /dev/null +++ b/afew.config @@ -0,0 +1,364 @@ +[SpamFilter] + +[KillThreadsFilter] + +[HeaderMatchingFilter.1] +header = List-Id +pattern = main.agoranomic.groups.io +tags = +lists;+lists/agora-main-backup + +[HeaderMatchingFilter.2] +header = From +pattern = .*@noreply-pole-emploi.fr +tags = +lists;+lists/france-travail + +[HeaderMatchingFilter.3] +header = From +pattern = .*@stopkillinggames.com +tags = +lists;+lists/stop-killing-games + +[HeaderMatchingFilter.4] +header = From +pattern = newsletter@factorio.com +tags = +lists;+lists/factorio + +[HeaderMatchingFilter.5] +header = From +pattern = .*change.org +tags = +lists;+lists/change.org + +[HeaderMatchingFilter.6] +header = From +pattern = .*ea.com +tags = +lists;+lists/ea.com + +[HeaderMatchingFilter.7] +header = From +pattern = .*@roleplayingtips.com +tags = +lists;+lists/role-playing-tips + +[HeaderMatchingFilter.8] +header = From +pattern = .*@noreply.openstreetmap.org +tags = +lists;+lists/openstreetmap + +[HeaderMatchingFilter.9] +header = From +pattern = no-reply@(?P
.*).google.com +tags = +lists;+lists/google/{section} + +[HeaderMatchingFilter.10] +header = From +pattern = .*@welcometothejungle.com +tags = +lists;+lists/welcometothejungle + +[HeaderMatchingFilter.11] +header = From +pattern = .*@.*edenred.fr +tags = +lists;+lists/edenred + +[HeaderMatchingFilter.12] +header = From +pattern = .*@cnam-auvergnerhonealpes.com +tags = +lists;+lists/cnam;+lists/cnam/auvergnerhonealpes + +[HeaderMatchingFilter.13] +header = From +pattern = .*@.*.sncf.com +tags = +lists;+lists/sncf + +[HeaderMatchingFilter.14] +header = From +pattern = newsletters@trainzportal.com +tags = +lists;+lists/trainz + +[HeaderMatchingFilter.15] +header = From +pattern = .*@.*.xbox.com +tags = +lists;+lists/xbox + +[HeaderMatchingFilter.16] +header = From +pattern = jlfwong +tags = +lists;+lists/jlfwong + +[HeaderMatchingFilter.17] +header = From +pattern = noreply@webforce.life +tags = +lists;+lists/webforce3;+project/webforce3 + +[HeaderMatchingFilter.18] +header = From +pattern = infoemploi@wf3.fr +tags = +lists;+lists/webforce3;+project/webforce3 + +[HeaderMatchingFilter.19] +header = From +pattern = informatique@bm-grenoble.fr +tags = +lists;+lists/bibliotheques;+lists/bibliotheques/grenoble + +[HeaderMatchingFilter.20] +header = List-Id +pattern = public.listes.alolise.org +tags = +lists;+lists/alolise + +[HeaderMatchingFilter.21] +header = From +pattern = mail@typst.app +tags = +lists;+lists/typst + +[HeaderMatchingFilter.22] +header = From +pattern = noreply@discourse.doomemacs.org +tags = +lists;+lists/discourse;+lists/discours/doomemacs;+lists/doomemacs + +[HeaderMatchingFilter.23] +header = From +pattern = comic@mailing.xkcd.com +tags = +lists;+lists/comic;+lists/comic/xkcd + +[HeaderMatchingFilter.24] +header = From +pattern = info@info.alternatives-economiques.fr +tags = +lists;+lists/alternatives-economiques + +[HeaderMatchingFilter.25] +header = From +pattern = Email@CGPGrey.com +tags = +lists;+lists/cgp-grey + +[HeaderMatchingFilter.26] +header = From +pattern = roguelikecelebration@gmail.com +tags = +lists;+lists/roguelikecelebration + +[HeaderMatchingFilter.27] +header = From +pattern = googlealerts-noreply@google.com +tags = +lists;+lists/google/alerts + +[HeaderMatchingFilter.28] +header = List-Id +pattern = pmpc.community-emails.fsfe.org +tags = +lists;+lists/fsfe + +[HeaderMatchingFilter.29] +header = List-ID +pattern = logins.wakatime.com +tags = +lists;+lists/wakatime + +[HeaderMatchingFilter.30] +header = List-ID +pattern = end.of.year.report.wakatime.com +tags = +lists;+lists/wakatime + +[HeaderMatchingFilter.31] +header = List-Id +pattern = updates.wakatime.com +tags = +lists;+lists/wakatime + +[HeaderMatchingFilter.32] +header = From +pattern = do-no-reply@thangs.com +tags = +lists;+lists/thangs + +[HeaderMatchingFilter.33] +header = From +pattern = tinyprojectsdev@gmail.com +tags = +lists;+lists/tinyprojectsdev + +[HeaderMatchingFilter.34] +header = Subject +pattern = yearly.*report +tags = +report/yearly + +[HeaderMatchingFilter.35] +header = From +pattern = notifications@artstation.com +tags = +lists;+lists/artstation + +[HeaderMatchingFilter.36] +header = List-Id +pattern = troll.breizh-entropy.org +tags = +lists;+lists/breizh-entropy;+lists/breizh-entropy/troll + +[HeaderMatchingFilter.37] +header = From +pattern = robert@stuffwithstuff.com +tags = +lists;+lists/stuffwithstuff + +[HeaderMatchingFilter.38] +header = From +pattern = email@engage.windows.com +tags = +lists;+lists/microsoft + +[HeaderMatchingFilter.39] +header = From +pattern = support@worldbrain.io +tags = +lists;+lists/worldbrain;+lists/memex + +[HeaderMatchingFilter.40] +header = From +pattern = .*@.*mozilla.org +tags = +lists;+lists/mozilla + +[HeaderMatchingFilter.41] +header = From +pattern = googleaccount-noreply@google.com +tags = +lists;+lists/google/accounts + +[HeaderMatchingFilter.42] +header = From +pattern = .*@augobelinfarci.com +tags = +lists;+lists/gobelin-farci + +[HeaderMatchingFilter.43] +header = From +pattern = .*@pragmaticengineer.com +tags = +lists;+lists/pragmatic-engineer + +[HeaderMatchingFilter.44] +header = From +pattern = no-reply@youtube.com +tags = +lists;+lists/google/youtube + +[HeaderMatchingFilter.45] +header = From +pattern = .*@.*.cned.fr +tags = +lists;+lists/cned + +[HeaderMatchingFilter.46] +header = From +pattern = robert@lord.io +tags = +lists;+lists/lord + +[HeaderMatchingFilter.47] +header = From +pattern = crowdsource-noreply@google.com +tags = +lists;+lists/google/crowdsource + +[HeaderMatchingFilter.48] +header = From +pattern = .*@actux.eu.org +tags = +lists;+lists/actux + +[HeaderMatchingFilter.49] +header = List-Id +pattern = annonces.breizh-entropy.org +tags = +lists;+lists/breizh-entropy;+lists/breizh-entropy/annonces + +[ListMailsFilter] + +[ArchiveSentMailsFilter] + +[Filter.0] +message = Confirmation Codes +query = subject:"confirmation code" +tags = +confirmation-code + +[Filter.1] +message = Agora mail does not belong in the inbox +query = tag:(lists/agora-business lists/agora-official lists/agora-discussion) +tags = -new + +[Filter.2] +message = Someone signed in to your account +query = body:"Quelqu'un s'est connecté à votre compte" +tags = +notification;+notification/signin + +[Filter.3] +message = Roguelike Celebration +query = from:"Roguelike Celebration" +tags = +lists;+lists/roguelikecelebration + +[Filter.4] +message = Doctolib +query = from:no-reply@doctolib.fr +tags = +lists;+lists/doctolib;+medical + +[Filter.5] +message = Appointment Confirmed +query = subject:"RDV confirme" +tags = +appointment;+notification/appointment;+notification + +[Filter.6] +message = Linkedin +query = from:.*@linkedin.com +tags = +lists;+lists/linkedin;+subject:jobsearch + +[Filter.7] +message = Linkedin Invitation +query = from:invitations@linkedin.com +tags = +notification/linkedin/connection-request;+notification + +[Filter.8] +message = Bandcamp +query = from:noreply@bandcamp.com AND subject:"New release from" +tags = +notification/bandcamp/new-release;+notification;+lists;+lists/bandcamp + +[Filter.9] +message = BorgBase +query = from:support@borgbase.com +tags = +lists;+lists/borgbase + +[Filter.10] +message = BorgBase Monthly Report +query = from:support@borgbase.com AND subject:"Your monthly backup report" +tags = +report/borgbase/monthly + +[Filter.11] +message = Derin Edala +query = to:khais.colin+ttou@gmail.com +tags = +lists;+lists/derin-edala + +[Filter.12] +message = Charlie MacNamera +query = body:https://derinstories.com/2024/05/26/1-fuck-photography/ AND to:khais.colin+ttou@gmail.com AND tag:lists/derin-edala +tags = +stories;+stories/charlie-macnamera + +[Filter.13] +message = Amazon +query = from:.*@amazon.fr +tags = +lists;+lists/amazon + +[Filter.14] +message = Amazon Confirmation commande +tags = +notification;+notification/amazon;+notification/amazon/command-confirmation +query = from:confirmation-commande@amazon.fr + +[Filter.15] +message = New documents +tags = +task;+task/archive-document +query = subject:"Nouveaux documents partagés" subject:"Un document a été ajouté dans votre espace" + +[Filter.16] +message = From me +tags = +me +query = from:khais.colin@gmail.com from:kh.col@orange.fr from:logistic-bot@protonmail.com from:khais.colin@alolise.org + +[Filter.17] +message = 42 Le Havre +tags = +lists;+lists/42lehavre +query = from:no-reply@42lehavre.fr from:login@42lehavre.fr + +[Filter.18] +message = 42 event registration +tags = +notification;+notification/42lehavre;+notification/42lehavre/event/registration +query = from:no-reply@42lehavre.fr AND subject:"/^Inscription to.*/" + +[Filter.19] +message = 42 intra login +tags = +notification;+notification/42lehavre;+notification/42lehavre/intra/login +query = from:login@42lehavre.fr AND subject:"/^\[INTRA\]\[Sign In\] You signed in from.*/" + +[Filter.1000] +message = new tasks are todo +query = tag:task AND tag:new +tags = +todo + +[Filter.2000] +message = TEMP: Currently not reading derin edala stories +query = tag:lists/derin-edala +tags = -new + +[InboxFilter] diff --git a/common.nix b/common.nix index a12136a..8494911 100644 --- a/common.nix +++ b/common.nix @@ -43,6 +43,9 @@ # You can disable this if you're only using the Wayland session. services.xserver.enable = true; + # emable xmonad + services.xserver.windowManager.xmonad.enable = true; + # Enable the KDE Plasma Desktop Environment. services.displayManager.sddm.enable = true; services.desktopManager.plasma6.enable = true; @@ -91,7 +94,7 @@ initialPassword = "asunarovow"; isNormalUser = true; description = "Khaïs COLIN"; - extraGroups = ["networkmanager" "wheel" "podman" "libvirtd" "music" "cdrom"]; + extraGroups = ["networkmanager" "wheel" "podman" "libvirtd" "music" "cdrom" "scanner" "lp"]; shell = pkgs.fish; }; # access to /pile/Music @@ -263,6 +266,7 @@ # enable hardware acceleration for qemu virtualisation.libvirtd.enable = true; programs.virt-manager.enable = true; + virtualisation.spiceUSBRedirection.enable = true; services.syncthing = { enable = true; @@ -325,5 +329,10 @@ serviceConfig.ExecStart = "${pkgs.bluez}/bin/mpris-proxy"; }; + # scanner + # https://nixos.wiki/wiki/Scanners + hardware.sane.enable = true; + hardware.sane.drivers.scanSnap.enable = true; + home-manager.backupFileExtension = "backup"; } diff --git a/doom.d/init.el b/doom.d/init.el index 8625a0a..d25432e 100644 --- a/doom.d/init.el +++ b/doom.d/init.el @@ -136,7 +136,7 @@ ;;gdscript ; the language you waited for ;;(go +lsp) ; the hipster dialect ;;(graphql +lsp) ; Give queries a REST - ;;(haskell +lsp) ; a language that's lazier than I am + (haskell +lsp) ; a language that's lazier than I am ;;hy ; readability of scheme w/ speed of python ;;idris ; a language you can depend on ;;json ; At least it ain't XML @@ -178,7 +178,7 @@ :email ;;(mu4e +org +gmail) - ;;notmuch + (notmuch +org +afew) ;;(wanderlust +gmail) :app diff --git a/filters.notmuch b/filters.notmuch new file mode 100644 index 0000000..6e0a690 --- /dev/null +++ b/filters.notmuch @@ -0,0 +1,77 @@ +## lists + +# agora ++lists +lists/agora-main-backup -- tag:new to:main@agoranomic.groups.io + +# france travail ++lists +lists/france-travail -- tag:new from:.*@noreply-pole-emploi.fr + +# stop killing games ++lists +lists/stop-killing-games -- tag:new from:.*@stopkillinggames.com + +# factorio ++lists +lists/factorio -- tag:new from:newsletter@factorio.com + +# change.org ++lists +lists/change.org -- tag:new from:.*@change.org + +# ea.com ++lists +lists/ea.com -- tag:new from:.*@ea.com + +# ea.com ++lists +lists/ea.com -- tag:new from:.*@ea.com + +# roleplayingtips ++lists +lists/role-playing-tips -- tag:new from:.*@roleplayingtips.com + +# openstreetmap ++lists +lists/openstreetmap -- tag:new from:.*@noreply.openstreetmap.org + +# google ++lists +lists/google -- tag:new from:.*@.*google.com ++lists/google/gmail -- tag:new from:gmail-noreply@.*google.com ++lists/google/ads-support -- tag:new from:ads-support@google.com ++lists/google/crowdsource -- tag:new from:crowdsource-noreply@google.com ++lists/google/account -- tag:new from:googleaccount-noreply@google.com ++lists/google/account -- tag:new from:no-reply@accounts.google.com ++lists/google/calendar -- tag:new from:calendar-noreply@google.com ++lists/google/calendar +notification/calender -- tag:new from:calendar-notification@google.com ++lists/google/alerts -- tag:new from:googlealerts-noreply@google.com ++lists/google/cloud -- tag:new from:cloudplatform-noreply@google.com ++lists/google/docs -- tag:new from:.*@docs.google.com ++notifcation/google/docs/comment -- tag:new from:comment-noreply@docs.google.com ++lists/google/gemini -- tag:new from:google-gemini-noreply@google.com ++lists/google/location-history -- tag:new from:location-history-noreply@google.com ++lists/google/maps-timeline -- tag:new from:noreply-maps-timeline@google.com ++lists/google/photos -- tag:new from:noreply-photos@google.com ++lists/google/find-my-device -- tag:new from:noreply-findmydevice@google.com ++lists/google/play -- tag:new from:googleplay-noreply@google.com ++lists/google/store -- tag:new from:googlestore-noreply@google.com ++lists/google/meet -- tag:new from:googlemeet-noreply@google.com ++lists/google/meet -- tag:new from:meetings-noreply@google.com ++lists/google/nest -- tag:new from:googlenest@google.com ++lists/google/one -- tag:new from:googleone-noreply@google.com ++lists/google/takeout -- tag:new from:"Google Takeout" ++lists/google/community -- tag:new from:googlecommunityteam-noreply@google.com + +# welcome to the jungle ++lists +lists/welcometothejungle -- tag:new from:.*@welcometothejungle.com + ++lists +lists/edenred -- tag:new from:.*@.*edenred.fr + ++lists +lists/cnam +lists/cnam/auvergnerhonealpes -- tag:new from:.*@cnam-auvergnerhonealpes.com + ++lists +lists/sncf -- tag:new from:.*@.*sncf.com + ++lists +lists/trainz -- tag:new from:newsletters@trainzportal.com from:feedback@n3vgames.com + ++lists +lists/xbox -- tag:new from:*@*xbox.com + ++lists +lists/jlfwong -- tag:new from:"jlfwong " + ++project/webforce3 -- tag:new from:noreply@webforce.life from:*@wf3.fr ++lists +lists/webforce3 -- tag:new from:noreply@webforce.life from:be.the.change@wf3.fr from:info@wf3.fr from:infoemploi@wf3.fr OR from:"WF3 WEBINAIRE" + ++lists +lists/bibliotheques +lists/bibliotheques/grenoble -- tag:new from:informatique@bm-grenoble.fr from:bm.informatique@grenoble.fr + ++lists +lists/alolise -- tag:new to:*@listes.alolise.org diff --git a/flake.lock b/flake.lock index 2e28ff5..c0f1fb7 100644 --- a/flake.lock +++ b/flake.lock @@ -37,11 +37,11 @@ "base16-helix": { "flake": false, "locked": { - "lastModified": 1725860795, - "narHash": "sha256-Z2o8VBPW3I+KKTSfe25kskz0EUj7MpUh8u355Z1nVsU=", + "lastModified": 1736852337, + "narHash": "sha256-esD42YdgLlEh7koBrSqcT7p2fsMctPAcGl/+2sYJa2o=", "owner": "tinted-theming", "repo": "base16-helix", - "rev": "7f795bf75d38e0eea9fed287264067ca187b88a9", + "rev": "03860521c40b0b9c04818f2218d9cc9efc21e7a5", "type": "github" }, "original": { @@ -53,16 +53,17 @@ "base16-vim": { "flake": false, "locked": { - "lastModified": 1731949548, - "narHash": "sha256-XIDexXM66sSh5j/x70e054BnUsviibUShW7XhbDGhYo=", + "lastModified": 1732806396, + "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", "owner": "tinted-theming", "repo": "base16-vim", - "rev": "61165b1632409bd55e530f3dbdd4477f011cadc6", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", "type": "github" }, "original": { "owner": "tinted-theming", "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", "type": "github" } }, @@ -131,11 +132,11 @@ "doomemacs": { "flake": false, "locked": { - "lastModified": 1736881038, - "narHash": "sha256-i0GVHWoIqDcFB9JmEdd9T+qxrEx3ckBlPfTD/yLoNyg=", + "lastModified": 1741842488, + "narHash": "sha256-bqqnkoXND8Sfc2MnTIKBRQSYed0fjgMn481wiIhwyz4=", "owner": "doomemacs", "repo": "doomemacs", - "rev": "2bc052425ca45a41532be0648ebd976d1bd2e6c1", + "rev": "c95015d7066476d32784c6f0ed7463b92b931bec", "type": "github" }, "original": { @@ -154,11 +155,11 @@ ] }, "locked": { - "lastModified": 1737162568, - "narHash": "sha256-cwgeBqXtMKHoK+627GEGGkbIILxhP/OrqNMQhUp/6dQ=", + "lastModified": 1741831953, + "narHash": "sha256-ZJgTnduyZzNPPCEKxzKa0x1FhWLxlMgJzVdE89s+LWs=", "owner": "nix-community", "repo": "emacs-overlay", - "rev": "ac3dfdca835c5b8f7c27d5dcec2b9c4580299a7c", + "rev": "34c2a5d93606f6f952c34a85e5346029869bd8f0", "type": "github" }, "original": { @@ -170,11 +171,11 @@ "firefox-gnome-theme": { "flake": false, "locked": { - "lastModified": 1734969791, - "narHash": "sha256-A9PxLienMYJ/WUvqFie9qXrNC2MeRRYw7TG/q7DRjZg=", + "lastModified": 1741628778, + "narHash": "sha256-RsvHGNTmO2e/eVfgYK7g+eYEdwwh7SbZa+gZkT24MEA=", "owner": "rafaelmardojai", "repo": "firefox-gnome-theme", - "rev": "92f4890bd150fc9d97b61b3583680c0524a8cafe", + "rev": "5a81d390bb64afd4e81221749ec4bffcbeb5fa80", "type": "github" }, "original": { @@ -184,6 +185,22 @@ } }, "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1668681692, + "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "009399224d5e398d03b22badca40a37ac85412a1", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { "locked": { "lastModified": 1696426674, "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", @@ -197,14 +214,14 @@ "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" } }, - "flake-compat_2": { + "flake-compat_3": { "flake": false, "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "lastModified": 1733328505, + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", "owner": "edolstra", "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", "type": "github" }, "original": { @@ -254,6 +271,21 @@ } }, "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { "inputs": { "systems": "systems_2" }, @@ -271,7 +303,7 @@ "type": "github" } }, - "flake-utils_2": { + "flake-utils_3": { "inputs": { "systems": "systems_3" }, @@ -289,7 +321,7 @@ "type": "github" } }, - "flake-utils_3": { + "flake-utils_4": { "inputs": { "systems": [ "stylix", @@ -369,19 +401,14 @@ "nixpkgs": [ "stylix", "nixpkgs" - ], - "nixpkgs-stable": [ - "stylix", - "git-hooks", - "nixpkgs" ] }, "locked": { - "lastModified": 1731363552, - "narHash": "sha256-vFta1uHnD29VUY4HJOO/D6p6rxyObnf+InnSMT4jlMU=", + "lastModified": 1741379162, + "narHash": "sha256-srpAbmJapkaqGRE3ytf3bj4XshspVR5964OX5LfjDWc=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "cd1af27aa85026ac759d5d3fccf650abe7e1bbf0", + "rev": "b5a62751225b2f62ff3147d0a334055ebadcd5cc", "type": "github" }, "original": { @@ -459,11 +486,11 @@ ] }, "locked": { - "lastModified": 1736373539, - "narHash": "sha256-dinzAqCjenWDxuy+MqUQq0I4zUSfaCvN9rzuCmgMZJY=", + "lastModified": 1739757849, + "narHash": "sha256-Gs076ot1YuAAsYVcyidLKUMIc4ooOaRGO0PqTY7sBzA=", "owner": "nix-community", "repo": "home-manager", - "rev": "bd65bc3cde04c16755955630b344bc9e35272c56", + "rev": "9d3d080aec2a35e05a15cedd281c2384767c2cfe", "type": "github" }, "original": { @@ -503,11 +530,11 @@ ] }, "locked": { - "lastModified": 1733572789, - "narHash": "sha256-zjO6m5BqxXIyjrnUziAzk4+T4VleqjstNudSqWcpsHI=", + "lastModified": 1739757849, + "narHash": "sha256-Gs076ot1YuAAsYVcyidLKUMIc4ooOaRGO0PqTY7sBzA=", "owner": "nix-community", "repo": "home-manager", - "rev": "c7ffc9727d115e433fd884a62dc164b587ff651d", + "rev": "9d3d080aec2a35e05a15cedd281c2384767c2cfe", "type": "github" }, "original": { @@ -517,6 +544,63 @@ "type": "github" } }, + "lowdown-src": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "mms": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nix": "nix", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1669478601, + "narHash": "sha256-IQcS8IPeXvSoIrQRPgtnLxAs0Pkh8wmglDAtqE4ivNo=", + "owner": "mkaito", + "repo": "nixos-modded-minecraft-servers", + "rev": "68f2066499c035fd81c9dacfea2f512d6b0b62e5", + "type": "github" + }, + "original": { + "owner": "mkaito", + "repo": "nixos-modded-minecraft-servers", + "type": "github" + } + }, + "nix": { + "inputs": { + "lowdown-src": "lowdown-src", + "nixpkgs": "nixpkgs", + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1669449054, + "narHash": "sha256-aCpXrNpyFH6b1NFYGj2i/HecUvz2vZ88aEyDs1Xj8yM=", + "owner": "NixOS", + "repo": "nix", + "rev": "534332c8a03b64161ec795d1deb2ba3d48f27be1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nix", + "type": "github" + } + }, "nix-darwin": { "inputs": { "nixpkgs": [ @@ -549,11 +633,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1737189134, - "narHash": "sha256-On00k8gk76kiK+LEOq1/+6VaxLuPn4b7kOHtQPI4cRQ=", + "lastModified": 1741855244, + "narHash": "sha256-2HXXGM67yr4zZ0/d9ut51CUhizZrbzlIxNSsebtfQZ8=", "owner": "marienz", "repo": "nix-doom-emacs-unstraightened", - "rev": "e9f07ad62a068771c8854afb2bc0408fcc17ce39", + "rev": "605020bea4a461c9faafaece5274dcb3dbf105a3", "type": "github" }, "original": { @@ -564,7 +648,7 @@ }, "nixos-06cb-009a-fingerprint-sensor": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs_3" }, "locked": { "lastModified": 1734692513, @@ -582,17 +666,18 @@ }, "nixpkgs": { "locked": { - "lastModified": 1734323986, - "narHash": "sha256-m/lh6hYMIWDYHCAsn81CDAiXoT3gmxXI9J987W5tZrE=", + "lastModified": 1657693803, + "narHash": "sha256-G++2CJ9u0E7NNTAi9n5G8TdDmGJXcIjkJ3NF8cetQB8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "394571358ce82dff7411395829aa6a3aad45b907", + "rev": "365e1b3a859281cf11b94f87231adeabbdd878a2", "type": "github" }, "original": { - "id": "nixpkgs", - "ref": "nixos-24.11", - "type": "indirect" + "owner": "NixOS", + "ref": "nixos-22.05-small", + "repo": "nixpkgs", + "type": "github" } }, "nixpkgs-lib": { @@ -607,28 +692,76 @@ "url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz" } }, - "nixpkgs-unstable": { + "nixpkgs-regression": { "locked": { - "lastModified": 1737062831, - "narHash": "sha256-Tbk1MZbtV2s5aG+iM99U8FqwxU/YNArMcWAv6clcsBc=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5df43628fdf08d642be8ba5b3625a6c70731c19c", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1741513245, + "narHash": "sha256-7rTAMNTY1xoBwz0h7ZMtEcd8LELk9R5TzBPoHuhNSCk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e3e32b642a31e6714ec1b712de8c91a3352ce7e1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1741724370, + "narHash": "sha256-WsD+8uodhl58jzKKcPH4jH9dLTLFWZpVmGq4W1XDVF4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0faaf0a9bb6dedb69bfd43ac06fb27fadc476c51", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1734323986, + "narHash": "sha256-m/lh6hYMIWDYHCAsn81CDAiXoT3gmxXI9J987W5tZrE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "394571358ce82dff7411395829aa6a3aad45b907", "type": "github" }, "original": { "id": "nixpkgs", - "ref": "nixos-unstable", + "ref": "nixos-24.11", "type": "indirect" } }, - "nixpkgs_2": { + "nixpkgs_4": { "locked": { "lastModified": 1736916166, "narHash": "sha256-puPDoVKxkuNmYIGMpMQiK8bEjaACcCksolsG36gdaNQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e24b4c09e963677b1beea49d411cd315a024ad3a", + "rev": "95600680c021743fd87b3e2fe13be7c290e1cac4", "type": "github" }, "original": { @@ -638,7 +771,7 @@ "type": "github" } }, - "nixpkgs_3": { + "nixpkgs_5": { "locked": { "lastModified": 1721924956, "narHash": "sha256-Sb1jlyRO+N8jBXEX9Pg9Z1Qb8Bw9QyOgLDNMEpmjZ2M=", @@ -657,7 +790,7 @@ "nixvim": { "inputs": { "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs_3", + "nixpkgs": "nixpkgs_5", "nixvim": "nixvim_2" }, "locked": { @@ -677,7 +810,7 @@ "nixvim_2": { "inputs": { "devshell": "devshell", - "flake-compat": "flake-compat", + "flake-compat": "flake-compat_2", "flake-parts": "flake-parts_2", "git-hooks": "git-hooks", "home-manager": "home-manager_2", @@ -705,7 +838,7 @@ }, "nuschtosSearch": { "inputs": { - "flake-utils": "flake-utils", + "flake-utils": "flake-utils_2", "nixpkgs": [ "nixvim", "nixvim", @@ -728,7 +861,7 @@ }, "other-transcode": { "inputs": { - "flake-utils": "flake-utils_2", + "flake-utils": "flake-utils_3", "nixpkgs": [ "nixpkgs" ] @@ -772,9 +905,10 @@ "breezex-cursor": "breezex-cursor", "cassowary": "cassowary", "home-manager": "home-manager", + "mms": "mms", "nix-doom-emacs-unstraightened": "nix-doom-emacs-unstraightened", "nixos-06cb-009a-fingerprint-sensor": "nixos-06cb-009a-fingerprint-sensor", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs_4", "nixpkgs-unstable": "nixpkgs-unstable", "nixvim": "nixvim", "other-transcode": "other-transcode", @@ -789,8 +923,8 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-compat": "flake-compat_2", - "flake-utils": "flake-utils_3", + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_4", "git-hooks": "git-hooks_2", "gnome-shell": "gnome-shell", "home-manager": "home-manager_3", @@ -803,11 +937,11 @@ "tinted-tmux": "tinted-tmux" }, "locked": { - "lastModified": 1736955352, - "narHash": "sha256-VujiBKJYM32b7HZEVO3Txla989lE7HMNGhVomLtguB0=", + "lastModified": 1741703235, + "narHash": "sha256-3efck7239JPh6IHnqhETaoQejfxh4RBU16bE8IHOkto=", "owner": "danth", "repo": "stylix", - "rev": "ef93972237a82cc340e804a1d2d4140ad65fe81d", + "rev": "4a3ac9e30cd15b25a8b2e6cf0a7a047f454408bd", "type": "github" }, "original": { @@ -914,11 +1048,11 @@ "tinted-tmux": { "flake": false, "locked": { - "lastModified": 1729501581, - "narHash": "sha256-1ohEFMC23elnl39kxWnjzH1l2DFWWx4DhFNNYDTYt54=", + "lastModified": 1740877430, + "narHash": "sha256-zWcCXgdC4/owfH/eEXx26y5BLzTrefjtSLFHWVD5KxU=", "owner": "tinted-theming", "repo": "tinted-tmux", - "rev": "f0e7f7974a6441033eb0a172a0342e96722b4f14", + "rev": "d48ee86394cbe45b112ba23ab63e33656090edb4", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index e39a631..0133903 100644 --- a/flake.nix +++ b/flake.nix @@ -1,7 +1,7 @@ { inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; - nixpkgs-unstable.url = "nixpkgs/nixos-unstable"; + nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; home-manager = { url = "github:nix-community/home-manager/release-24.11"; @@ -45,6 +45,8 @@ nixos-06cb-009a-fingerprint-sensor = { url = "github:ahbnr/nixos-06cb-009a-fingerprint-sensor"; }; + + mms.url = "github:mkaito/nixos-modded-minecraft-servers"; }; outputs = { nixpkgs, @@ -58,6 +60,7 @@ nix-doom-emacs-unstraightened, nixos-06cb-009a-fingerprint-sensor, cassowary, + mms, ... }: let system = "x86_64-linux"; @@ -91,6 +94,7 @@ ]; specialArgs = { pkgs-unstable = nixpkgs-unstable.legacyPackages.${system}; + inherit mms; }; }; nixosConfigurations.t470 = nixpkgs.lib.nixosSystem { diff --git a/home.nix b/home.nix index 06525f9..21f23f0 100644 --- a/home.nix +++ b/home.nix @@ -29,12 +29,17 @@ in { trashy unzip parallel + tcpdump + libqalculate + ouch + inetutils # remote working remmina # communication discord # passwords bitwarden-desktop + bitwarden-cli # editors nixvim # make clipboard yanking work in neovim @@ -78,10 +83,20 @@ in { # games lutris wine + prismlauncher # ai ollama # windows cassowary + # xmonad + # apparently this is needed for the haskell lsp + ghc + i3lock + xmobar + # show volume in xmobar + alsa-utils + # remote + rustdesk ]; file = { @@ -118,21 +133,33 @@ in { programs.jujutsu = { enable = true; + ediff = true; settings = { user = { email = "khais.colin@gmail.com"; name = "Khaïs COLIN"; }; + signing = { + sign-all = true; + backend = "ssh"; + key = "/home/khais/.ssh/id_ed25519.pub"; + }; ui = { - editor = "emacsclient"; + editor = "emacsclient -a ''"; default-command = "log"; movement.edit = true; # do not page if output fits on one screen pager = "less -FRX"; }; - merge-tools.ediff = { - program = "sh"; - merge-args = ["-c" "emacsclient -c --eval (ediff-merge-files-with-anscestor \"$0\" \"$1\" \"$2\" nil \"$3\")" "$left" "$right" "$base" "$output"]; + fix.tools = { + clang-format = { + command = ["${pkgs.clang-tools}/bin/clang-format" "--assume-filename=$path"]; + patterns = ["glob:'**/*.cpp'" "glob:'**/*.hpp'"]; + }; + whitespace = { + command = ["${pkgs.perl}/bin/perl" "-p" "-e" "s/ +$//" "$path"]; + patterns = ["glob:'**/*'"]; + }; }; }; }; @@ -238,10 +265,101 @@ in { programs.doom-emacs = { enable = true; doomDir = ./doom.d; - extraBinPackages = with pkgs; [clang-tools nil nixd]; + extraBinPackages = with pkgs; [clang-tools nil nixd haskell-language-server ghc]; }; programs.yazi = { enable = true; }; + + xsession.windowManager.xmonad = { + enable = true; + config = ./xmonad.hs; + enableContribAndExtras = true; + }; + + programs.xmobar = { + enable = true; + extraConfig = builtins.readFile ./xmobarrc; + }; + + programs.rofi.enable = true; + + # email + programs.mbsync.enable = true; + programs.msmtp.enable = true; + programs.offlineimap.enable = true; + + programs.lieer = { + enable = true; + }; + + accounts.email.accounts.gmail = { + address = "khais.colin@gmail.com"; + lieer = { + enable = true; + settings.local_trash_tag = "killed"; + sync.enable = true; + }; + msmtp.enable = true; + notmuch.enable = true; + primary = true; + realName = "Khaïs COLIN"; + signature = { + text = '' + Cordialement, + -- Khaïs COLIN + ''; + showSignature = "append"; + }; + passwordCommand = "cat /home/khais/.home-manager-gmail-password"; + userName = "khais.colin@gmail.com"; + flavor = "gmail.com"; + }; + + accounts.email.accounts.orange = { + address = "kh.col@orange.fr"; + offlineimap = { + enable = true; + }; + msmtp.enable = true; + notmuch.enable = true; + realName = "Khaïs COLIN"; + signature = { + text = '' + Cordialement, + -- Khaïs COLIN + ''; + showSignature = "append"; + }; + passwordCommand = "cat /home/khais/.home-manager-orange-password"; + userName = "kh.col@orange.fr"; + imap = { + host = "imap.orange.fr"; + port = 993; + }; + smtp = { + host = "smtp.orange.fr"; + }; + }; + + programs.notmuch = { + enable = true; + new = { + tags = ["new" "unread"]; + }; + hooks = { + preNew = "gmi sync --path ~/Maildir/gmail; offlineimap"; + postNew = "afew --verbose --tag --new"; + }; + search.excludeTags = [ + "killed" + "spam" + ]; + }; + + programs.afew = { + enable = true; + extraConfig = builtins.readFile ./afew.config; + }; } diff --git a/void.nix b/void.nix index 9a116f4..9f7d6d0 100644 --- a/void.nix +++ b/void.nix @@ -1,11 +1,16 @@ # Edit this configuration file to define what should be installed on # your system. Help is available in the configuration.nix(5) man page # and in the NixOS manual (accessible by running ‘nixos-help’). -{ config, pkgs, ... }: { + config, + pkgs, + mms, + ... +}: { imports = [ ./hardware-configuration-void.nix ./common.nix + mms.module ]; networking.hostName = "void"; # Define your hostname. @@ -54,6 +59,7 @@ # mount external drive fileSystems."/external".label = "external"; + fileSystems."/external".options = ["nofail" "x-systemd.automount"]; # backup services.borgbackup.jobs."external" = { @@ -72,6 +78,7 @@ "/home/*/GOG Games" "**/target" "**/result" + "/var/log" ]; repo = "/external/voidbackup"; encryption = { @@ -81,6 +88,8 @@ compression = "auto,lzma"; startAt = "daily"; persistentTimer = true; + extraCreateArgs = ["--stats" "--info" "--list" "--filter=AMEC"]; + removableDevice = true; }; systemd.services."borgbackup-job-external" = { unitConfig = { @@ -88,4 +97,104 @@ Requires = "external.mount"; }; }; + + # postgresql backup + services.postgresqlBackup = { + enable = true; + backupAll = true; + location = "/var/backup/postgresql"; + }; + systemd.timers."postgresqlBackup".unitConfig.Persistent = true; + + # minecraft TerraFirmaGreg server + services.modded-minecraft-servers = { + eula = true; + instances.terrafirmagreg = { + enable = true; + rsyncSSHKeys = [""]; + serverConfig = { + server-port = 25565; + motd = "Welcome to logistic-bot's TerraFirmaGreg server"; + allow-flight = true; + allow-nether = false; + difficulty = 0; + enable-rcon = false; + level-type = "tfc\:overworld"; + view-distance = 24; + }; + + jvmPackage = pkgs.jdk17; + jvmMaxAllocation = "8196M"; + jvmInitialAllocation = "2048M"; + + # "Borrowed" from AllTheMods Discord + jvmOpts = builtins.concatStringsSep " " [ + "-XX:+UseG1GC" + "-XX:+ParallelRefProcEnabled" + "-XX:MaxGCPauseMillis=200" + "-XX:+UnlockExperimentalVMOptions" + "-XX:+DisableExplicitGC" + "-XX:+AlwaysPreTouch" + "-XX:G1NewSizePercent=40" + "-XX:G1MaxNewSizePercent=50" + "-XX:G1HeapRegionSize=16M" + "-XX:G1ReservePercent=15" + "-XX:G1HeapWastePercent=5" + "-XX:G1MixedGCCountTarget=4" + "-XX:InitiatingHeapOccupancyPercent=20" + "-XX:G1MixedGCLiveThresholdPercent=90" + "-XX:G1RSetUpdatingPauseTimePercent=5" + "-XX:SurvivorRatio=32" + "-XX:+PerfDisableSharedMem" + "-XX:MaxTenuringThreshold=1" + ]; + }; + }; + + services.jellyfin = { + enable = true; + openFirewall = true; + user = "khais"; + }; + + services.forgejo = { + enable = true; + database.type = "postgres"; + # Enable support for Git Large File Storage + lfs.enable = true; + settings = { + server = { + DOMAIN = "forgejo.005540.xyz"; + # You need to specify this to remove the port from URLs in the web UI. + ROOT_URL = "https://forgejo.005540.xyz/"; + HTTP_PORT = 3000; + }; + # You can temporarily allow registration to create an admin user. + service.DISABLE_REGISTRATION = false; + # Add support for actions, based on act: https://github.com/nektos/act + actions = { + ENABLED = true; + DEFAULT_ACTIONS_URL = "github"; + }; + }; + }; + + services.nginx = { + enable = true; + recommendedTlsSettings = true; + recommendedOptimisation = true; + recommendedGzipSettings = true; + recommendedProxySettings = true; + virtualHosts = { + "void.hummingbird-stork.ts.net" = { + locations."/".proxyPass = "http://localhost:8096"; + }; + "jellyfin.005540.xyz" = { + locations."/".proxyPass = "http://localhost:8096"; + }; + "forgejo.005540.xyz" = { + locations."/".proxyPass = "http://localhost:3000"; + }; + }; + }; } diff --git a/wm/river.nix b/wm/river.nix index eb0bc65..72294a8 100644 --- a/wm/river.nix +++ b/wm/river.nix @@ -165,10 +165,12 @@ in { "None Scroll_Lock" = "spawn 'playerctl previous'"; "None XF86AudioNext" = "spawn 'playerctl next'"; "None Pause" = "spawn 'cmus-remote -C player-next-album'"; + "None XF86Bluetooth" = "spawn 'playerctl play-pause'"; "None XF86Tools" = "spawn 'playerctl previous'"; "None XF86Keyboard" = "spawn 'playerctl next'"; "None XF86Favorites" = "spawn 'cmus-remote -C player-next-album'"; + "None XF86AudioMute" = "spawn 'wpctl set-mute @DEFAULT_SINK@ toggle'"; }; }; diff --git a/xmobarrc b/xmobarrc new file mode 100644 index 0000000..53555e2 --- /dev/null +++ b/xmobarrc @@ -0,0 +1,63 @@ +Config { overrideRedirect = False + , font = "xft:Victor Mono NerdFont-8" + , bgColor = "#07080d" + , fgColor = "#e0e2ea" + , position = TopW L 100 + , commands = [ Run MultiCoreTemp + [ "-t", "Temp:°C" + , "-L", "50" + , "-H", "80" + , "--low" , "#b6f0ff" + , "--normal", "#b3f6c0" + , "--high" , "#fcbeb7" + ] 50 + , Run Cpu + [ "-L", "3" + , "-H", "50" + , "--ppad", "3" + , "--low" , "#b6f0ff" + , "--normal", "#b3f6c0" + , "--high" , "#fcbeb7" + ] 10 + , Run Battery + [ "-L", "15" + , "-H", "80" + , "--ppad", "3" + , "--low", "#fcbeb7" + , "--normal", "#b6f0ff" + , "--high", "#b3f6c0" + ] 10 + , Run Alsa "default" "Master" + [ "--template", "" + , "--suffix" , "True" + , "--" + , "--on", "" + ] + , Run Memory + [ "--template", "Mem: %" + , "-L", "20" + , "-H", "50" + , "--ppad", "3" + , "--low" , "#b6f0ff" + , "--normal", "#b3f6c0" + , "--high" , "#fcbeb7" + ] 10 + , Run DateZone "%a %d %b %Y-%m-%d %H:%M:%S" + "fr_FR.UTF-8" + "Europe/Paris" + "date" 10 + , Run DiskIO [ ("/", "r: w:") ] + [ "-L", "300" + , "-H", "1000" + , "--ppad", "3" + , "--low" , "#b6f0ff" + , "--normal", "#b3f6c0" + , "--high" , "#fcbeb7" + ] 10 + , Run Mpris2 "cmus" [] 10 + , Run XMonadLog + ] + , sepChar = "%" + , alignSep = "}{" + , template = "%XMonadLog%}%mpris2%{%diskio% • %alsa:default:Master% • %battery% • %cpu% • %memory% • %multicoretemp% • %date%" + } diff --git a/xmonad.hs b/xmonad.hs new file mode 100644 index 0000000..3c632ef --- /dev/null +++ b/xmonad.hs @@ -0,0 +1,199 @@ +import XMonad +import XMonad.Util.EZConfig +import XMonad.Layout.ThreeColumns +import XMonad.Layout.WindowNavigation +import XMonad.Layout.MultiToggle.Instances +import XMonad.Layout.MultiToggle +import XMonad.Layout.NoBorders +import XMonad.Layout.IndependentScreens +import XMonad.Actions.CopyWindow +import XMonad.Actions.CycleWS +import XMonad.Actions.EasyMotion (selectWindow) +import XMonad.Hooks.EwmhDesktops +import XMonad.Hooks.DynamicLog +import XMonad.Hooks.StatusBar +import XMonad.Hooks.StatusBar.PP +import qualified XMonad.Layout.Magnifier as Mag +import qualified Data.Map as M +import qualified XMonad.StackSet as W +import System.Exit +import XMonad.Util.Loggers + +-- TODO: xmobar + +myWorkspaceNames = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] +myScreens = 2 +conf = def { layoutHook = myLayout + , workspaces = withScreens myScreens myWorkspaceNames + , modMask = mod4Mask + } + `additionalKeysP` + myKeys + +-- main :: IO () +main = + xmonad $ ewmh $ withEasySB (statusBarProp "xmobar" (pure myXmobarPP)) defToggleStrutsKey conf + +-- Define the status bars for each screen +-- myStatusBars :: [StatusBarConfig] +-- myStatusBars = [ statusBarProp ("xmobar -x " ++ show sc) (pure myXmobarPP) | sc <- [0..myScreens - 1] ] + +-- main :: IO () +-- main = xmonad . ewmh $ dynamicSBs myStatusBars conf + +myXmobarPP :: PP +myXmobarPP = def + { ppSep = magenta " • " + , ppTitleSanitize = xmobarStrip + , ppCurrent = xmobarBorder "Top" borderColor 2 . xmobarBorder "Bottom" borderColor 2 + , ppUrgent = red . wrap (yellow "!") (yellow "!") + , ppOrder = \[ws, l, _, wins] -> [ws, l, wins] + , ppExtras = [logTitles formatFocused formatUnfocused] + } + where + formatFocused = wrap (white "[") (white "]") . magenta . ppWindow + formatUnfocused = wrap (lowWhite "[") (lowWhite "]") . blue . ppWindow + + -- | Windows should have *some* title, which should not not exceed a + -- sane length. + ppWindow :: String -> String + ppWindow = xmobarRaw . (\w -> if null w then "untitled" else w) . shorten 30 + + blue, lowWhite, magenta, red, white, yellow :: String -> String + magenta = xmobarColor "#ff79c6" "" + blue = xmobarColor "#bd93f9" "" + white = xmobarColor "#f8f8f2" "" + yellow = xmobarColor "#f1fa8c" "" + red = xmobarColor "#ff5555" "" + lowWhite = xmobarColor "#bbbbbb" "" + borderColor = "#8be9fd" + +myKeys :: [(String, X ())] +myKeys = [ + -- Screen lock & suspend + ("C-M1-l" , spawn "i3lock" ) + , ("C-M1-S-l" , spawn "i3lock" *> spawn "systemctl suspend") + -- Terminal + , ("M4-", spawn "kitty -1") + -- Frequent programs + , ("M4-q", spawn "firefox" ) + , ("M4-a", runOrCopy "emacs" (className =? "Emacs")) + , ("M4-d", spawn "discord" ) + , ("M4-g", spawn "dolphin" ) + -- Program launcher + , ("M4-r", spawn "rofi -show drun -theme Paper" ) + -- Exit + , ("M4-M1-C-q", io (exitWith ExitSuccess) ) + -- Manipulate current client + , ("M4-w", kill1 ) + , ("M4-s", toggleFloat ) + -- focus client + , ("M4-h", sendMessage (Go L) ) + , ("M4-j", sendMessage (Go D) ) + , ("M4-k", sendMessage (Go U) ) + , ("M4-l", sendMessage (Go R) ) + -- focus client (easymotion) + , ("M4-;", selectWindow def >>= (`whenJust` windows . W.focusWindow)) + -- Swap client + , ("M4-S-h", sendMessage $ Swap L) + , ("M4-S-j", sendMessage $ Swap D) + , ("M4-S-k", sendMessage $ Swap U) + , ("M4-S-l", sendMessage $ Swap R) + , ("M4-S-", windows $ W.swapMaster) + -- Move client + , ("M4-M1-S-h", sendMessage (Move L) ) + , ("M4-M1-S-j", sendMessage (Move D) ) + , ("M4-M1-S-k", sendMessage (Move U) ) + , ("M4-M1-S-l", sendMessage (Move R) ) + -- Fullscreen + , ("M4-f", sendMessage (Toggle FULL) ) + -- Magnification + , ("M4-m", sendMessage (Mag.Toggle) ) + , ("M4-[", sendMessage (Mag.MagnifyLess) ) + , ("M4-]", sendMessage (Mag.MagnifyMore) ) + -- Modify number of master windows + , ("M4-M1-j", sendMessage (IncMasterN (-1))) + , ("M4-M1-k", sendMessage (IncMasterN 1 )) + -- Resize master area + , ("M4-C-h", sendMessage Shrink) + , ("M4-C-l", sendMessage Expand) + -- Cycle through workspaces + , ("M4-", moveTo Prev spacesOnCurrentScreen ) + , ("M4-", moveTo Next spacesOnCurrentScreen ) + -- Cycle through empty workspaces + , ("M4-M1-", moveTo Prev emptySpacesOnCurrentScreen) + , ("M4-M1-", moveTo Next emptySpacesOnCurrentScreen) + -- Send window through workspaces + , ("M4-S-", shiftTo Prev spacesOnCurrentScreen ) + , ("M4-S-", shiftTo Next spacesOnCurrentScreen ) + -- Music player control (void) + , ("", spawn "playerctl play-pause" ) + , ("", spawn "playerctl previous" ) + , ("", spawn "playerctl next" ) + , ("", spawn "cmus-remote -C player-next-album") + -- Music player control (t470) + , ("", spawn "playerctl play-pause") + , ("", spawn "playerctl previous") + , ("", spawn "playerctl next") -- Potentially broken key + , ("", spawn "cmus-remote -C player-next-album") + -- Audio control + , ("", spawn "wpctl set-mute @DEFAULT_SINK@ toggle") + , ("", spawn "wpctl set-volume @DEFAULT_SINK@ 1%-") + , ("", spawn "wpctl set-volume @DEFAULT_SINK@ 1%+") + -- Mic control + , ("", spawn "wpctl set-mute @DEFAULT_SOURCE@ toggle") + , ("M1-", spawn "wpctl set-volume @DEFAULT_SOURCE@ 1%-") + , ("M1-", spawn "wpctl set-volume @DEFAULT_SOURCE@ 1%+") + -- backlight control (t470) + , ("", spawn "brightnessctl set 1%-") + , ("", spawn "brightnessctl set 1%+") + -- backlight control (void) + , ("M4-", spawn "ddcutil setvcp 10 + 10") + , ("M4-", spawn "ddcutil setvcp 10 - 10") + -- Reload configuration + , ("M4-", spawn "xmonad --recompile; xmonad --restart") + ] ++ concat [ + -- Workspace switching + [ ("M4-" ++ i, windows $ onCurrentScreen W.view $ i) + -- Move window to workspace + , ("M4-S-" ++ i, windows $ onCurrentScreen W.shift $ i) + -- Copy window to workspace + , ("M4-M1-S-" ++ i, windows $ onCurrentScreen copy $ i) ] + | i <- myWorkspaceNames + ] + +-- https://stackoverflow.com/questions/33547168/xmonad-combine-dwm-style-workspaces-per-physical-screen-with-cycling-function +isOnScreen :: ScreenId -> WindowSpace -> Bool +isOnScreen s ws = s == unmarshallS (W.tag ws) + +currentScreen :: X ScreenId +currentScreen = gets (W.screen . W.current . windowset) + +spacesOnCurrentScreen :: WSType +spacesOnCurrentScreen = WSIs (isOnScreen <$> currentScreen) + +emptySpacesOnCurrentScreen :: WSType +emptySpacesOnCurrentScreen = spacesOnCurrentScreen :&: emptyWS + +myLayout = smartBorders + $ windowNavigation + $ mkToggle (single FULL) + $ (Mag.magnifiercz' 1.3 $ ThreeColMid 1 (3/100) (2/3)) + ||| Tall 1 (3/100) (2/3) + +-- https://www.reddit.com/r/xmonad/comments/hm2tg0/how_to_toggle_floating_state_on_a_window/ +-- Centre and float a window (retain size) +centreFloat win = do + (_, W.RationalRect x y w h) <- floatLocation win + windows $ W.float win (W.RationalRect ((1 - w) / 2) ((1 - h) / 2) w h) + return () + +-- If the window is floating then (f), if tiled then (n) +floatOrNot f n = withFocused $ \windowId -> do + floats <- gets (W.floating . windowset) + if windowId `M.member` floats -- if the current window is floating... + then f + else n + +-- Float and centre a tiled window, sink a floating window +toggleFloat = floatOrNot (withFocused $ windows . W.sink) (withFocused float)