From 26162df66cd42b2ff6ab6a96ab65dc0282fe4122 Mon Sep 17 00:00:00 2001 From: Emmet Date: Fri, 8 Nov 2024 14:41:54 -0600 Subject: [PATCH] Updated system, fixes, culled lots of old config --- flake.lock | 753 +----- flake.nix | 79 +- patches/emacs-no-version-check.patch | 23 - patches/nixpkgs-348697.patch | 76 - patches/nixpkgs-354095.patch | 87 + profiles/nix-on-droid/configuration.nix | 3 +- profiles/nix-on-droid/home.nix | 1 - profiles/work/home.nix | 5 +- user/README.org | 4 +- user/app/doom-emacs/README.org | 23 - user/app/doom-emacs/config.el | 1642 ------------ user/app/doom-emacs/doom.nix | 148 -- user/app/doom-emacs/doom.org | 2330 ----------------- user/app/doom-emacs/init.el | 175 -- user/app/doom-emacs/nix-dark.png | Bin 57446 -> 0 bytes user/app/doom-emacs/nix-dark.webp | Bin 26946 -> 0 bytes user/app/doom-emacs/nix-light.png | Bin 48334 -> 0 bytes user/app/doom-emacs/nix-light.webp | Bin 22286 -> 0 bytes user/app/doom-emacs/packages.el | 38 - user/app/doom-emacs/pkgs/org-analyzer.nix | 24 - .../copy-link-or-file-to-clipboard.sh | 20 - .../themes/doom-stylix-theme.el.mustache | 177 -- user/app/emacsng/default.nix | 8 - user/pkgs/rogauracore.nix | 17 - user/wm/hyprland/hyprland.nix | 87 +- 25 files changed, 122 insertions(+), 5598 deletions(-) delete mode 100644 patches/emacs-no-version-check.patch delete mode 100644 patches/nixpkgs-348697.patch create mode 100644 patches/nixpkgs-354095.patch delete mode 100644 user/app/doom-emacs/README.org delete mode 100644 user/app/doom-emacs/config.el delete mode 100644 user/app/doom-emacs/doom.nix delete mode 100644 user/app/doom-emacs/doom.org delete mode 100644 user/app/doom-emacs/init.el delete mode 100644 user/app/doom-emacs/nix-dark.png delete mode 100644 user/app/doom-emacs/nix-dark.webp delete mode 100644 user/app/doom-emacs/nix-light.png delete mode 100644 user/app/doom-emacs/nix-light.webp delete mode 100644 user/app/doom-emacs/packages.el delete mode 100644 user/app/doom-emacs/pkgs/org-analyzer.nix delete mode 100755 user/app/doom-emacs/scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh delete mode 100644 user/app/doom-emacs/themes/doom-stylix-theme.el.mustache delete mode 100644 user/app/emacsng/default.nix delete mode 100644 user/pkgs/rogauracore.nix diff --git a/flake.lock b/flake.lock index 9c12db2..a295841 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ ] }, "locked": { - "lastModified": 1729527199, - "narHash": "sha256-D5/YksfRga8Akd04ZtIkuYSIOjXVrAzQIQBSeplokzU=", + "lastModified": 1730968822, + "narHash": "sha256-NocDjINsh6ismkhb0Xr6xPRksmhuB2WGf8ZmXMhxu7Y=", "owner": "hyprwm", "repo": "aquamarine", - "rev": "8d732fa8aff8b12ef2b1e2f00fc8153e41312b72", + "rev": "a49bc3583ff223f426cb3526fdaa4bcaa247ec14", "type": "github" }, "original": { @@ -102,11 +102,11 @@ "blocklist-hosts": { "flake": false, "locked": { - "lastModified": 1730406687, - "narHash": "sha256-Tv85Ctg3P51UBAT6lIy5RfH335edeEKuaA5XUYcsXU8=", + "lastModified": 1731033962, + "narHash": "sha256-1LO6MzklwZ3ry3gi8ET129L7P2aRsAWOj1XeiNM6qHM=", "owner": "StevenBlack", "repo": "hosts", - "rev": "bbb43907e5ced864b3763005b0988e61104eba6a", + "rev": "a9296b0d324a66ae0a5cad3c1f3d2afcf3d09eb8", "type": "github" }, "original": { @@ -115,199 +115,6 @@ "type": "github" } }, - "doom-emacs": { - "flake": false, - "locked": { - "lastModified": 1662497747, - "narHash": "sha256-4n7E1fqda7cn5/F2jTkOnKw1juG6XMS/FI9gqODL3aU=", - "owner": "doomemacs", - "repo": "doomemacs", - "rev": "3853dff5e11655e858d0bfae64b70cb12ef685ac", - "type": "github" - }, - "original": { - "owner": "doomemacs", - "repo": "doomemacs", - "rev": "3853dff5e11655e858d0bfae64b70cb12ef685ac", - "type": "github" - } - }, - "doom-snippets": { - "flake": false, - "locked": { - "lastModified": 1694887483, - "narHash": "sha256-KlKhruPSLPSKqUnr5/U65arm16VrY9ORzm+XKNZhpTQ=", - "owner": "doomemacs", - "repo": "snippets", - "rev": "f022984ee1318a4015d5d081b3c3dab5a60dc6ff", - "type": "github" - }, - "original": { - "owner": "doomemacs", - "repo": "snippets", - "type": "github" - } - }, - "eaf": { - "flake": false, - "locked": { - "lastModified": 1728651925, - "narHash": "sha256-NQV4MXynuxjg4u9V7UGSCyavqx9DWxJCA7nm1GD0f3s=", - "owner": "emacs-eaf", - "repo": "emacs-application-framework", - "rev": "60466a72a8b0688ccded87bb25879348911f162b", - "type": "github" - }, - "original": { - "owner": "emacs-eaf", - "repo": "emacs-application-framework", - "type": "github" - } - }, - "eaf-browser": { - "flake": false, - "locked": { - "lastModified": 1715466525, - "narHash": "sha256-jcCn16lXqcq1UcekekJiTfRBjjgaY0Hkz69ycElSzuA=", - "owner": "emacs-eaf", - "repo": "eaf-browser", - "rev": "9761f7bd22aa69f144a0a032643b0834dde6cb60", - "type": "github" - }, - "original": { - "owner": "emacs-eaf", - "repo": "eaf-browser", - "type": "github" - } - }, - "emacs-overlay": { - "flake": false, - "locked": { - "lastModified": 1676366521, - "narHash": "sha256-i4UAY8t9Au9SJtsgYppa3NHSVf1YkV6yqnNIQd+Km4g=", - "owner": "nix-community", - "repo": "emacs-overlay", - "rev": "c16be6de78ea878aedd0292aa5d4a1ee0a5da501", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "emacs-overlay", - "rev": "c16be6de78ea878aedd0292aa5d4a1ee0a5da501", - "type": "github" - } - }, - "emacs-pin-nixpkgs": { - "locked": { - "lastModified": 1711731143, - "narHash": "sha256-P3rID/C2N9+emVlCr4ta0X591usRvFxqk1wON/2j+Dg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "f72123158996b8d4449de481897d855bc47c7bf6", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "f72123158996b8d4449de481897d855bc47c7bf6", - "type": "indirect" - } - }, - "emacs-so-long": { - "flake": false, - "locked": { - "lastModified": 1575031854, - "narHash": "sha256-xIa5zO0ZaToDrec1OFjBK6l39AbA4l/CE4LInVu2hi0=", - "owner": "hlissner", - "repo": "emacs-so-long", - "rev": "ed666b0716f60e8988c455804de24b55919e71ca", - "type": "github" - }, - "original": { - "owner": "hlissner", - "repo": "emacs-so-long", - "type": "github" - } - }, - "evil-escape": { - "flake": false, - "locked": { - "lastModified": 1588439096, - "narHash": "sha256-aB2Ge5o/93B18tPf4fN1c+O46CNh/nOqwLJbox4c8Gw=", - "owner": "hlissner", - "repo": "evil-escape", - "rev": "819f1ee1cf3f69a1ae920e6004f2c0baeebbe077", - "type": "github" - }, - "original": { - "owner": "hlissner", - "repo": "evil-escape", - "type": "github" - } - }, - "evil-markdown": { - "flake": false, - "locked": { - "lastModified": 1626852210, - "narHash": "sha256-HBBuZ1VWIn6kwK5CtGIvHM1+9eiNiKPH0GUsyvpUVN8=", - "owner": "Somelauw", - "repo": "evil-markdown", - "rev": "8e6cc68af83914b2fa9fd3a3b8472573dbcef477", - "type": "github" - }, - "original": { - "owner": "Somelauw", - "repo": "evil-markdown", - "type": "github" - } - }, - "evil-org-mode": { - "flake": false, - "locked": { - "lastModified": 1607203864, - "narHash": "sha256-JxwqVYDN6OIJEH15MVI6XOZAPtUWUhJQWHyzcrUvrFg=", - "owner": "hlissner", - "repo": "evil-org-mode", - "rev": "a9706da260c45b98601bcd72b1d2c0a24a017700", - "type": "github" - }, - "original": { - "owner": "hlissner", - "repo": "evil-org-mode", - "type": "github" - } - }, - "evil-quick-diff": { - "flake": false, - "locked": { - "lastModified": 1575189609, - "narHash": "sha256-oGzl1ayW9rIuq0haoiFS7RZsS8NFMdEA7K1BSozgnJU=", - "owner": "rgrinberg", - "repo": "evil-quick-diff", - "rev": "69c883720b30a892c63bc89f49d4f0e8b8028908", - "type": "github" - }, - "original": { - "owner": "rgrinberg", - "repo": "evil-quick-diff", - "type": "github" - } - }, - "explain-pause-mode": { - "flake": false, - "locked": { - "lastModified": 1595842060, - "narHash": "sha256-++znrjiDSx+cy4okFBBXUBkRFdtnE2x+trkmqjB3Njs=", - "owner": "lastquestion", - "repo": "explain-pause-mode", - "rev": "2356c8c3639cbeeb9751744dbe737267849b4b51", - "type": "github" - }, - "original": { - "owner": "lastquestion", - "repo": "explain-pause-mode", - "type": "github" - } - }, "flake-compat": { "flake": false, "locked": { @@ -324,22 +131,6 @@ "type": "github" } }, - "flake-compat_2": { - "flake": false, - "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, "flake-utils": { "inputs": { "systems": "systems_3" @@ -359,24 +150,6 @@ } }, "flake-utils_2": { - "inputs": { - "systems": "systems_4" - }, - "locked": { - "lastModified": 1694529238, - "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_3": { "inputs": { "systems": [ "stylix", @@ -412,23 +185,6 @@ "type": "github" } }, - "format-all": { - "flake": false, - "locked": { - "lastModified": 1581716637, - "narHash": "sha256-ul7LCe60W8TIvUmUtZtZRo8489TK9iTPDsLHmzxY57M=", - "owner": "lassik", - "repo": "emacs-format-all-the-code", - "rev": "47d862d40a088ca089c92cd393c6dca4628f87d3", - "type": "github" - }, - "original": { - "owner": "lassik", - "repo": "emacs-format-all-the-code", - "rev": "47d862d40a088ca089c92cd393c6dca4628f87d3", - "type": "github" - } - }, "fromYaml": { "flake": false, "locked": { @@ -511,11 +267,11 @@ ] }, "locked": { - "lastModified": 1730490306, - "narHash": "sha256-AvCVDswOUM9D368HxYD25RsSKp+5o0L0/JHADjLoD38=", + "lastModified": 1730837930, + "narHash": "sha256-0kZL4m+bKBJUBQse0HanewWO0g8hDdCvBhudzxgehqc=", "owner": "nix-community", "repo": "home-manager", - "rev": "1743615b61c7285976f85b303a36cdf88a556503", + "rev": "2f607e07f3ac7e53541120536708e824acccfaa8", "type": "github" }, "original": { @@ -756,7 +512,6 @@ "locked": { "lastModified": 1725203994, "narHash": "sha256-N7Kfq8tpOWjtRKBnH5RqcDtQFGZPZ5vXgmxbnZVPCuU=", - "ref": "refs/heads/main", "rev": "73b0fc26c0e2f6f82f9d9f5b02e660a958902763", "revCount": 248, "type": "git", @@ -843,21 +598,6 @@ "type": "github" } }, - "kdenlive-pin-nixpkgs": { - "locked": { - "lastModified": 1709012981, - "narHash": "sha256-/D10ohogluwFIl5NXQxJx6ag6fuwA1KEAO8Ia5GDhhM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "cfec6d9203a461d9d698d8a60ef003cac6d0da94", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "cfec6d9203a461d9d698d8a60ef003cac6d0da94", - "type": "indirect" - } - }, "lix": { "flake": false, "locked": { @@ -893,85 +633,6 @@ "url": "https://git.lix.systems/lix-project/nixos-module/archive/2.90.0.tar.gz" } }, - "magit-file-icons": { - "flake": false, - "locked": { - "lastModified": 1719595750, - "narHash": "sha256-n/uXppejl6js/wrvEEIKmfmCh7ssbSBMMZWYrrvG1JQ=", - "owner": "librephoenix", - "repo": "magit-file-icons", - "rev": "6c90eb03eb8a382110d862ec792ae50556bffd6e", - "type": "github" - }, - "original": { - "owner": "librephoenix", - "ref": "abstract-icon-getters-compat", - "repo": "magit-file-icons", - "type": "github" - } - }, - "mini-frame": { - "flake": false, - "locked": { - "lastModified": 1685981796, - "narHash": "sha256-HsGEu37oq2uuQFfE2m++VH1SwyGC89ChnmrBVFC/WME=", - "owner": "muffinmad", - "repo": "emacs-mini-frame", - "rev": "f420020aa33a1b00407000addd995170a36e026e", - "type": "github" - }, - "original": { - "owner": "muffinmad", - "repo": "emacs-mini-frame", - "type": "github" - } - }, - "nix-doom-emacs": { - "inputs": { - "doom-emacs": "doom-emacs", - "doom-snippets": "doom-snippets", - "emacs-overlay": "emacs-overlay", - "emacs-so-long": "emacs-so-long", - "evil-escape": "evil-escape", - "evil-markdown": "evil-markdown", - "evil-org-mode": "evil-org-mode", - "evil-quick-diff": "evil-quick-diff", - "explain-pause-mode": "explain-pause-mode", - "flake-compat": "flake-compat", - "flake-utils": "flake-utils_2", - "format-all": "format-all", - "nix-straight": [ - "nix-straight" - ], - "nixpkgs": [ - "emacs-pin-nixpkgs" - ], - "nose": "nose", - "ob-racket": "ob-racket", - "org": "org", - "org-contrib": "org-contrib", - "org-yt": "org-yt", - "php-extras": "php-extras", - "revealjs": "revealjs", - "rotate-text": "rotate-text", - "sln-mode": "sln-mode", - "ts-fold": "ts-fold", - "ws-butler": "ws-butler" - }, - "locked": { - "lastModified": 1701264882, - "narHash": "sha256-MBXR7x7Ua8qystlGr+lenwjQd7dsFNFpEFmtHhh10zM=", - "owner": "nix-community", - "repo": "nix-doom-emacs", - "rev": "f7413022370f24bb53cb450bfb2803233510113e", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nix-doom-emacs", - "type": "github" - } - }, "nix-formatter-pack": { "inputs": { "nixpkgs": [ @@ -1026,30 +687,13 @@ "type": "github" } }, - "nix-straight": { - "flake": false, - "locked": { - "lastModified": 1692033740, - "narHash": "sha256-oCd0yJiMArPr20nYVz/HGU1bmZnmiS30n9Z4MKZUHj0=", - "owner": "librephoenix", - "repo": "nix-straight.el", - "rev": "1e4a1375b04acb8a88d123a91585734410192d42", - "type": "github" - }, - "original": { - "owner": "librephoenix", - "ref": "pgtk-patch", - "repo": "nix-straight.el", - "type": "github" - } - }, "nixpkgs": { "locked": { - "lastModified": 1730200266, - "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=", + "lastModified": 1730785428, + "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "807e9154dcb16384b1b765ebe9cd2bba2ac287fd", + "rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7", "type": "github" }, "original": { @@ -1092,11 +736,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1730327045, - "narHash": "sha256-xKel5kd1AbExymxoIfQ7pgcX6hjw9jCgbiBjiUfSVJ8=", + "lastModified": 1730883749, + "narHash": "sha256-mwrFF0vElHJP8X3pFCByJR365Q2463ATp2qGIrDUdlE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "080166c15633801df010977d9d7474b4a6c549d7", + "rev": "dba414932936fde69f0606b4f1d87c5bc0003ede", "type": "github" }, "original": { @@ -1175,22 +819,6 @@ "type": "gitlab" } }, - "nose": { - "flake": false, - "locked": { - "lastModified": 1400604510, - "narHash": "sha256-daEi8Kta1oGaDEmUUDDQMahTTPOpvNpDKk22rlr7cB0=", - "owner": "emacsattic", - "repo": "nose", - "rev": "f8528297519eba911696c4e68fa88892de9a7b72", - "type": "github" - }, - "original": { - "owner": "emacsattic", - "repo": "nose", - "type": "github" - } - }, "nvchad": { "flake": false, "locked": { @@ -1207,306 +835,34 @@ "type": "github" } }, - "nwg-dock-hyprland-pin-nixpkgs": { - "locked": { - "lastModified": 1716385560, - "narHash": "sha256-xuFXyvvrDXx5A56uo8D+YmHqsmPscsjBh279P44Z5bE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "2098d845d76f8a21ae4fe12ed7c7df49098d3f15", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "2098d845d76f8a21ae4fe12ed7c7df49098d3f15", - "type": "indirect" - } - }, - "ob-racket": { - "flake": false, - "locked": { - "lastModified": 1584656173, - "narHash": "sha256-rBUYDDCXb+3D4xTPQo9UocbTPZ32kWV1Uya/1DmZknU=", - "owner": "xchrishawk", - "repo": "ob-racket", - "rev": "83457ec9e1e96a29fd2086ed19432b9d75787673", - "type": "github" - }, - "original": { - "owner": "xchrishawk", - "repo": "ob-racket", - "type": "github" - } - }, - "org": { - "flake": false, - "locked": { - "lastModified": 1695726851, - "narHash": "sha256-qgbjspklSoI8M3cbCJOcUdjuijRgsL/+PSyEOW9VX4I=", - "owner": "emacs-straight", - "repo": "org-mode", - "rev": "aa9177e1a8b039c357d369c1c9aaab710bb247a9", - "type": "github" - }, - "original": { - "owner": "emacs-straight", - "repo": "org-mode", - "type": "github" - } - }, - "org-contrib": { - "flake": false, - "locked": { - "lastModified": 1694946041, - "narHash": "sha256-X/HFG6NZe5BY00KvGbcsIuf9R6Lg8x7Uhd0Y5+Q3qZU=", - "owner": "emacsmirror", - "repo": "org-contrib", - "rev": "5eabbf22bdd4523c922a30787e98ee66c24221aa", - "type": "github" - }, - "original": { - "owner": "emacsmirror", - "repo": "org-contrib", - "type": "github" - } - }, - "org-krita": { - "flake": false, - "locked": { - "lastModified": 1713038273, - "narHash": "sha256-ZoigcRMetn2ZY9uvcR3iLnPsf9ys2rHuUD9yv3+u7KM=", - "owner": "librephoenix", - "repo": "org-krita", - "rev": "9a1d917d2ee0fb7d2403186a0e6a15e23089c9fb", - "type": "github" - }, - "original": { - "owner": "librephoenix", - "repo": "org-krita", - "type": "github" - } - }, - "org-nursery": { - "flake": false, - "locked": { - "lastModified": 1714726259, - "narHash": "sha256-x+/TTSdHzQ+GKHV6jgvoQrwZCH4cZQfQGKDIBzFbJRw=", - "owner": "chrisbarrett", - "repo": "nursery", - "rev": "00a169c75b934a2eb42ea8620e8eebf34577d4ca", - "type": "github" - }, - "original": { - "owner": "chrisbarrett", - "repo": "nursery", - "type": "github" - } - }, - "org-side-tree": { - "flake": false, - "locked": { - "lastModified": 1717236106, - "narHash": "sha256-b30Yl378DaRQl8DAsAaeyf+WYz0y7L5h0EsbBQGvdjE=", - "owner": "localauthor", - "repo": "org-side-tree", - "rev": "e8da5217ce23440a62f4a46ef60e2082b6284b28", - "type": "github" - }, - "original": { - "owner": "localauthor", - "repo": "org-side-tree", - "type": "github" - } - }, - "org-sliced-images": { - "flake": false, - "locked": { - "lastModified": 1719203338, - "narHash": "sha256-wi8G6AHWWbAFBPGsZSSOVIOBqrzfdOhzgTfUNe4fAEc=", - "owner": "jcfk", - "repo": "org-sliced-images", - "rev": "b98b88a55eff07e998e7789e0bf7307dd71db050", - "type": "github" - }, - "original": { - "owner": "jcfk", - "repo": "org-sliced-images", - "type": "github" - } - }, - "org-timeblock": { - "flake": false, - "locked": { - "lastModified": 1730016337, - "narHash": "sha256-NOc45zpfvia61YpLiggP/YgJeLttNAd/Cdeh1CfxGdw=", - "owner": "ichernyshovvv", - "repo": "org-timeblock", - "rev": "e61e5734b49f933ed178029f804a0499f3308e1e", - "type": "github" - }, - "original": { - "owner": "ichernyshovvv", - "repo": "org-timeblock", - "type": "github" - } - }, - "org-xournalpp": { - "flake": false, - "locked": { - "lastModified": 1625233179, - "narHash": "sha256-c0AYWMkBb7wdl7SWTffjWSXwXbq1PGov2vT8A1pdqpQ=", - "owner": "vherrmann", - "repo": "org-xournalpp", - "rev": "c09bd8b99d36c355d632b85ecbffb3b275802381", - "type": "gitlab" - }, - "original": { - "owner": "vherrmann", - "repo": "org-xournalpp", - "type": "gitlab" - } - }, - "org-yaap": { - "flake": false, - "locked": { - "lastModified": 1711640914, - "narHash": "sha256-eWoRaE10QPOPeE0TnHBn3o+Hz6fX0yDZnfrqVlj1De8=", - "owner": "tygrdev", - "repo": "org-yaap", - "rev": "fcf675382d914f369591052ddb8440cfc714ce74", - "type": "gitlab" - }, - "original": { - "owner": "tygrdev", - "repo": "org-yaap", - "type": "gitlab" - } - }, - "org-yt": { - "flake": false, - "locked": { - "lastModified": 1527381913, - "narHash": "sha256-dzQ6B7ryzatHCTLyEnRSbWO0VUiX/FHYnpHTs74aVUs=", - "owner": "TobiasZawada", - "repo": "org-yt", - "rev": "40cc1ac76d741055cbefa13860d9f070a7ade001", - "type": "github" - }, - "original": { - "owner": "TobiasZawada", - "repo": "org-yt", - "type": "github" - } - }, - "php-extras": { - "flake": false, - "locked": { - "lastModified": 1573312690, - "narHash": "sha256-r4WyVbzvT0ra4Z6JywNBOw5RxOEYd6Qe2IpebHXkj1U=", - "owner": "arnested", - "repo": "php-extras", - "rev": "d410c5af663c30c01d461ac476d1cbfbacb49367", - "type": "github" - }, - "original": { - "owner": "arnested", - "repo": "php-extras", - "type": "github" - } - }, - "phscroll": { - "flake": false, - "locked": { - "lastModified": 1697087101, - "narHash": "sha256-LklBCgDYnC1SF2MD5LDI/CoQVSWlmrG83JGa155z4DI=", - "owner": "misohena", - "repo": "phscroll", - "rev": "582abedb4cf6aba216cdb5fe7217d612a1d68d5a", - "type": "github" - }, - "original": { - "owner": "misohena", - "repo": "phscroll", - "type": "github" - } - }, - "revealjs": { - "flake": false, - "locked": { - "lastModified": 1695738029, - "narHash": "sha256-Z9c9Q41jMkj/DyXOiZYyIa7Gmn8VB8yauTyWrSsT+ps=", - "owner": "hakimel", - "repo": "reveal.js", - "rev": "88fbfc5751ad01e3f6adee5819eabeb9e73c3757", - "type": "github" - }, - "original": { - "owner": "hakimel", - "repo": "reveal.js", - "type": "github" - } - }, "root": { "inputs": { "blocklist-hosts": "blocklist-hosts", - "eaf": "eaf", - "eaf-browser": "eaf-browser", - "emacs-pin-nixpkgs": "emacs-pin-nixpkgs", "home-manager-stable": "home-manager-stable", "home-manager-unstable": "home-manager-unstable", "hyprgrass": "hyprgrass", "hyprland": "hyprland", "hyprland-plugins": "hyprland-plugins", "hyprlock": "hyprlock", - "kdenlive-pin-nixpkgs": "kdenlive-pin-nixpkgs", "lix-module": "lix-module", - "magit-file-icons": "magit-file-icons", - "mini-frame": "mini-frame", - "nix-doom-emacs": "nix-doom-emacs", "nix-on-droid": "nix-on-droid", - "nix-straight": "nix-straight", "nixpkgs": "nixpkgs", "nixpkgs-stable": "nixpkgs-stable", "nvchad": "nvchad", - "nwg-dock-hyprland-pin-nixpkgs": "nwg-dock-hyprland-pin-nixpkgs", - "org-krita": "org-krita", - "org-nursery": "org-nursery", - "org-side-tree": "org-side-tree", - "org-sliced-images": "org-sliced-images", - "org-timeblock": "org-timeblock", - "org-xournalpp": "org-xournalpp", - "org-yaap": "org-yaap", - "phscroll": "phscroll", "rust-overlay": "rust-overlay", "stylix": "stylix" } }, - "rotate-text": { - "flake": false, - "locked": { - "lastModified": 1322962747, - "narHash": "sha256-SOeOgSlcEIsKhUiYDJv0p+mLUb420s9E2BmvZQvZ0wk=", - "owner": "debug-ito", - "repo": "rotate-text.el", - "rev": "48f193697db996855aee1ad2bc99b38c6646fe76", - "type": "github" - }, - "original": { - "owner": "debug-ito", - "repo": "rotate-text.el", - "type": "github" - } - }, "rust-overlay": { "inputs": { "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1730428392, - "narHash": "sha256-2aRfq1P0usr+TlW9LUCoefqqpPum873ac0TgZzXYHKI=", + "lastModified": 1731032894, + "narHash": "sha256-dQSyYPmrQiPr+PGEd+K8038rubFGz7G/dNXVeaGWE0w=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "17eda17f5596a84e92ba94160139eb70f3c3e734", + "rev": "d52f2a4c103a0acf09ded857b9e2519ae2360e59", "type": "github" }, "original": { @@ -1531,44 +887,28 @@ "type": "github" } }, - "sln-mode": { - "flake": false, - "locked": { - "lastModified": 1423727528, - "narHash": "sha256-XqkqPyEJuTtFslOz1fpTf/Klbd/zA7IGpzpmum/MGao=", - "owner": "sensorflo", - "repo": "sln-mode", - "rev": "0f91d1b957c7d2a7bab9278ec57b54d57f1dbd9c", - "type": "github" - }, - "original": { - "owner": "sensorflo", - "repo": "sln-mode", - "type": "github" - } - }, "stylix": { "inputs": { "base16": "base16", "base16-fish": "base16-fish", "base16-helix": "base16-helix", "base16-vim": "base16-vim", - "flake-compat": "flake-compat_2", - "flake-utils": "flake-utils_3", + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_2", "gnome-shell": "gnome-shell", "home-manager": "home-manager", "nixpkgs": "nixpkgs_3", - "systems": "systems_5", + "systems": "systems_4", "tinted-foot": "tinted-foot", "tinted-kitty": "tinted-kitty", "tinted-tmux": "tinted-tmux" }, "locked": { - "lastModified": 1729963473, + "lastModified": 1731002033, "narHash": "sha256-uGjTjvvlGQfQ0yypVP+at0NizI2nrb6kz4wGAqzRGbY=", "owner": "danth", "repo": "stylix", - "rev": "04afcfc0684d9bbb24bb1dc77afda7c1843ec93b", + "rev": "f71c2effed1ce4f9fbeefe402e4e431428ffe93a", "type": "github" }, "original": { @@ -1637,21 +977,6 @@ "type": "github" } }, - "systems_5": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, "tinted-foot": { "flake": false, "locked": { @@ -1701,38 +1026,6 @@ "type": "github" } }, - "ts-fold": { - "flake": false, - "locked": { - "lastModified": 1695278494, - "narHash": "sha256-O4NcUC1u08W8ZslqoA/i+iTaLotKwheURXQWBxLLMFc=", - "owner": "jcs-elpa", - "repo": "ts-fold", - "rev": "70b2c79ff4daa7351d4e2917b0343b9a18d4d4f2", - "type": "github" - }, - "original": { - "owner": "jcs-elpa", - "repo": "ts-fold", - "type": "github" - } - }, - "ws-butler": { - "flake": false, - "locked": { - "lastModified": 1634511126, - "narHash": "sha256-c0y0ZPtxxICPk+eaNbbQf6t+FRCliNY54CCz9QHQ8ZI=", - "owner": "hlissner", - "repo": "ws-butler", - "rev": "572a10c11b6cb88293de48acbb59a059d36f9ba5", - "type": "github" - }, - "original": { - "owner": "hlissner", - "repo": "ws-butler", - "type": "github" - } - }, "xdph": { "inputs": { "hyprland-protocols": "hyprland-protocols_2", diff --git a/flake.nix b/flake.nix index cd4b3bc..6fe8cad 100644 --- a/flake.nix +++ b/flake.nix @@ -56,9 +56,7 @@ (import inputs.nixpkgs { system = systemSettings.system; rocmSupport = (if systemSettings.gpu == "amd" then true else false); }).applyPatches { name = "nixpkgs-patched"; src = inputs.nixpkgs; - patches = [ #./patches/emacs-no-version-check.patch - #./patches/nixpkgs-348697.patch - ]; + patches = [ ./patches/nixpkgs-354095.patch ]; }; # configure pkgs @@ -94,18 +92,6 @@ overlays = [ inputs.rust-overlay.overlays.default ]; }; - pkgs-emacs = import inputs.emacs-pin-nixpkgs { - system = systemSettings.system; - }; - - pkgs-kdenlive = import inputs.kdenlive-pin-nixpkgs { - system = systemSettings.system; - }; - - pkgs-nwg-dock-hyprland = import inputs.nwg-dock-hyprland-pin-nixpkgs { - system = systemSettings.system; - }; - # configure lib # use nixpkgs if running a server (homelab or worklab profile) # otherwise use patched nixos-unstable nixpkgs @@ -143,9 +129,6 @@ extraSpecialArgs = { # pass config variables from above inherit pkgs-stable; - inherit pkgs-emacs; - inherit pkgs-kdenlive; - inherit pkgs-nwg-dock-hyprland; inherit systemSettings; inherit userSettings; inherit inputs; @@ -177,7 +160,6 @@ extraSpecialArgs = { # pass config variables from above inherit pkgs-stable; - inherit pkgs-emacs; inherit systemSettings; inherit userSettings; inherit inputs; @@ -213,9 +195,6 @@ }; nixpkgs.url = "nixpkgs/nixos-unstable"; nixpkgs-stable.url = "nixpkgs/nixos-24.05"; - emacs-pin-nixpkgs.url = "nixpkgs/f72123158996b8d4449de481897d855bc47c7bf6"; - kdenlive-pin-nixpkgs.url = "nixpkgs/cfec6d9203a461d9d698d8a60ef003cac6d0da94"; - nwg-dock-hyprland-pin-nixpkgs.url = "nixpkgs/2098d845d76f8a21ae4fe12ed7c7df49098d3f15"; home-manager-unstable.url = "github:nix-community/home-manager/master"; home-manager-unstable.inputs.nixpkgs.follows = "nixpkgs"; @@ -248,67 +227,11 @@ hyprgrass.url = "github:horriblename/hyprgrass/427690aec574fec75f5b7b800ac4a0b4c8e4b1d5"; hyprgrass.inputs.hyprland.follows = "hyprland"; - nix-doom-emacs.url = "github:nix-community/nix-doom-emacs"; - nix-doom-emacs.inputs.nixpkgs.follows = "emacs-pin-nixpkgs"; - - nix-straight.url = "github:librephoenix/nix-straight.el/pgtk-patch"; - nix-straight.flake = false; - nix-doom-emacs.inputs.nix-straight.follows = "nix-straight"; - nvchad = { url = "github:NvChad/starter"; flake = false; }; - eaf = { - url = "github:emacs-eaf/emacs-application-framework"; - flake = false; - }; - eaf-browser = { - url = "github:emacs-eaf/eaf-browser"; - flake = false; - }; - org-nursery = { - url = "github:chrisbarrett/nursery"; - flake = false; - }; - org-yaap = { - url = "gitlab:tygrdev/org-yaap"; - flake = false; - }; - org-side-tree = { - url = "github:localauthor/org-side-tree"; - flake = false; - }; - org-timeblock = { - url = "github:ichernyshovvv/org-timeblock"; - flake = false; - }; - org-krita = { - url = "github:librephoenix/org-krita"; - flake = false; - }; - org-xournalpp = { - url = "gitlab:vherrmann/org-xournalpp"; - flake = false; - }; - org-sliced-images = { - url = "github:jcfk/org-sliced-images"; - flake = false; - }; - magit-file-icons = { - url = "github:librephoenix/magit-file-icons/abstract-icon-getters-compat"; - flake = false; - }; - phscroll = { - url = "github:misohena/phscroll"; - flake = false; - }; - mini-frame = { - url = "github:muffinmad/emacs-mini-frame"; - flake = false; - }; - stylix.url = "github:danth/stylix"; rust-overlay.url = "github:oxalica/rust-overlay"; diff --git a/patches/emacs-no-version-check.patch b/patches/emacs-no-version-check.patch deleted file mode 100644 index 5e66bd0..0000000 --- a/patches/emacs-no-version-check.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/pkgs/applications/editors/emacs/build-support/generic.nix b/pkgs/applications/editors/emacs/build-support/generic.nix -index 3ff10ee86..56d03b6e6 100644 ---- a/pkgs/applications/editors/emacs/build-support/generic.nix -+++ b/pkgs/applications/editors/emacs/build-support/generic.nix -@@ -25,7 +25,8 @@ in - - libBuildHelper.extendMkDerivation' stdenv.mkDerivation (finalAttrs: - --{ buildInputs ? [] -+{ version ? null -+, buildInputs ? [] - , nativeBuildInputs ? [] - , packageRequires ? [] - , propagatedBuildInputs ? [] -@@ -38,7 +39,7 @@ libBuildHelper.extendMkDerivation' stdenv.mkDerivation (finalAttrs: - }@args: - - { -- name = args.name or "emacs-${finalAttrs.pname}-${finalAttrs.version}"; -+ name = args.name or "emacs-${finalAttrs.pname}${lib.optionalString (version != null) "-${version}"}"; - - unpackCmd = args.unpackCmd or '' - case "$curSrc" in diff --git a/patches/nixpkgs-348697.patch b/patches/nixpkgs-348697.patch deleted file mode 100644 index b0494ac..0000000 --- a/patches/nixpkgs-348697.patch +++ /dev/null @@ -1,76 +0,0 @@ -diff --git a/pkgs/development/python-modules/pyqt/6.x.nix b/pkgs/development/python-modules/pyqt/6.x.nix -index 9f031347d354e..6356eeb9637f0 100644 ---- a/pkgs/development/python-modules/pyqt/6.x.nix -+++ b/pkgs/development/python-modules/pyqt/6.x.nix -@@ -25,17 +25,15 @@ - - buildPythonPackage rec { - pname = "pyqt6"; -- version = "6.7.0.dev2404081550"; -+ version = "6.8.0.dev2410141303"; - format = "pyproject"; - - disabled = pythonOlder "3.6"; - -+ # This is dangerous, how can we get web archive to archive the URL? - src = fetchurl { -- urls = [ -- "https://riverbankcomputing.com/pypi/packages/PyQt6/PyQt6-${version}.tar.gz" -- "http://web.archive.org/web/20240411124842if_/https://riverbankcomputing.com/pypi/packages/PyQt6/PyQt6-${version}.tar.gz" -- ]; -- hash = "sha256-H5qZ/rnruGh+UVSXLZyTSvjagmmli/iYq+7BaIzl1YQ="; -+ url = "https://riverbankcomputing.com/pypi/packages/PyQt6/PyQt6-${version}.tar.gz"; -+ hash = "sha256-eHYqj22us07uFkErJD2d0y0wueZxtQTwTFW9cI7yoK4="; - }; - - patches = [ -@@ -55,8 +53,11 @@ buildPythonPackage rec { - verbose = true - EOF - -+ # pythonRelaxDeps doesn't work and the wanted versions are not released AFAIK - substituteInPlace pyproject.toml \ -- --replace-fail 'version = "${version}"' 'version = "${lib.versions.pad 3 version}"' -+ --replace-fail 'version = "${version}"' 'version = "${lib.versions.pad 3 version}"' \ -+ --replace-fail "sip >=6.9, <7" "sip >=6.8.6, <7" \ -+ --replace-fail 'PyQt-builder >=1.17, <2' "PyQt-builder >=1.16, <2" - ''; - - enableParallelBuilding = true; -diff --git a/pkgs/development/python-modules/sip/default.nix b/pkgs/development/python-modules/sip/default.nix -index 8a398654b08ce..8fd6240e4a512 100644 ---- a/pkgs/development/python-modules/sip/default.nix -+++ b/pkgs/development/python-modules/sip/default.nix -@@ -4,6 +4,7 @@ - fetchPypi, - pythonOlder, - setuptools, -+ setuptools-scm, - packaging, - tomli, - -@@ -15,17 +16,20 @@ - - buildPythonPackage rec { - pname = "sip"; -- version = "6.8.3"; -+ version = "6.8.6"; - pyproject = true; - - src = fetchPypi { - inherit pname version; -- hash = "sha256-iIVHsBi7JMNq3tUZ6T0+UT1MaqC6VbfMGv+9Rc8Qdiw="; -+ hash = "sha256-f8lZ5I5uxdWvi9Am9p9eJNCLPLirs0IXb1q4AwzAfXo="; - }; - -- nativeBuildInputs = [ setuptools ]; -+ build-system = [ -+ setuptools -+ setuptools-scm -+ ]; - -- propagatedBuildInputs = [ -+ dependencies = [ - packaging - setuptools - ] ++ lib.optionals (pythonOlder "3.11") [ tomli ]; diff --git a/patches/nixpkgs-354095.patch b/patches/nixpkgs-354095.patch new file mode 100644 index 0000000..3d01906 --- /dev/null +++ b/patches/nixpkgs-354095.patch @@ -0,0 +1,87 @@ +From 13af81da96c4b706e3262f1424d1d26b3db315d1 Mon Sep 17 00:00:00 2001 +From: Andrew Marshall +Date: Wed, 6 Nov 2024 17:24:11 -0500 +Subject: [PATCH 1/2] openvdb_11: init at 11.0.0 + +There are many breaking changes in v12, which some consumers are not +ready for and would require complex changes. This is expected to go away +once it becomes unused in nixpkgs. +--- + pkgs/development/libraries/openvdb/11.nix | 19 +++++++++++++++++++ + pkgs/top-level/all-packages.nix | 1 + + 2 files changed, 20 insertions(+) + create mode 100644 pkgs/development/libraries/openvdb/11.nix + +diff --git a/pkgs/development/libraries/openvdb/11.nix b/pkgs/development/libraries/openvdb/11.nix +new file mode 100644 +index 0000000000000..a65bb286ae2e2 +--- /dev/null ++++ b/pkgs/development/libraries/openvdb/11.nix +@@ -0,0 +1,19 @@ ++{ ++ lib, ++ fetchFromGitHub, ++ openvdb, ++}: ++ ++openvdb.overrideAttrs (old: rec { ++ name = "${old.pname}-${version}"; ++ version = "11.0.0"; ++ src = fetchFromGitHub { ++ owner = "AcademySoftwareFoundation"; ++ repo = "openvdb"; ++ rev = "v${version}"; ++ sha256 = "sha256-wDDjX0nKZ4/DIbEX33PoxR43dJDj2NF3fm+Egug62GQ="; ++ }; ++ meta = old.meta // { ++ license = lib.licenses.mpl20; ++ }; ++}) +diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix +index 55968eed13554..428a42210da40 100644 +--- a/pkgs/top-level/all-packages.nix ++++ b/pkgs/top-level/all-packages.nix +@@ -22214,6 +22214,7 @@ with pkgs; + zunclient = with python311Packages; toPythonApplication python-zunclient; + + openvdb = callPackage ../development/libraries/openvdb { }; ++ openvdb_11 = callPackage ../development/libraries/openvdb/11.nix { }; + + openvr = callPackage ../by-name/op/openvr/package.nix { + inherit (darwin.apple_sdk.frameworks) Foundation AppKit; + +From 33e09c6eea89ae1d1145f2f4527f98fd7b87865b Mon Sep 17 00:00:00 2001 +From: Andrew Marshall +Date: Wed, 6 Nov 2024 17:25:29 -0500 +Subject: [PATCH 2/2] blender: fix build by using openvdb_11 + +openvdb is now v12, and has many breaking API changes. Upstream has not +yet adapted to them yet, so there is no patch to backport. Further, +OpenVDB 12 is not currently part of the anticipated upstream library +updates for Blender 4.3 or 4.4. +--- + pkgs/applications/misc/blender/default.nix | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pkgs/applications/misc/blender/default.nix b/pkgs/applications/misc/blender/default.nix +index 7d89339da1026..e2af0b3f93384 100644 +--- a/pkgs/applications/misc/blender/default.nix ++++ b/pkgs/applications/misc/blender/default.nix +@@ -64,7 +64,7 @@ + openjpeg, + openpgl, + opensubdiv, +- openvdb, ++ openvdb_11, + openxr-loader, + pkg-config, + potrace, +@@ -276,7 +276,7 @@ stdenv.mkDerivation (finalAttrs: { + openjpeg + openpgl + (opensubdiv.override { inherit cudaSupport; }) +- openvdb ++ openvdb_11 + potrace + pugixml + python3 diff --git a/profiles/nix-on-droid/configuration.nix b/profiles/nix-on-droid/configuration.nix index 9ca3597..ad9ed92 100644 --- a/profiles/nix-on-droid/configuration.nix +++ b/profiles/nix-on-droid/configuration.nix @@ -1,4 +1,4 @@ -{ config, lib, pkgs, pkgs-stable, pkgs-emacs, systemSettings, userSettings, inputs, ... }: +{ config, lib, pkgs, pkgs-stable, systemSettings, userSettings, inputs, ... }: { # Simply install just the packages @@ -51,7 +51,6 @@ extraSpecialArgs = { # pass config variables from above inherit pkgs-stable; - inherit pkgs-emacs; inherit systemSettings; inherit userSettings; inherit inputs; diff --git a/profiles/nix-on-droid/home.nix b/profiles/nix-on-droid/home.nix index 65aea7a..c2f896c 100644 --- a/profiles/nix-on-droid/home.nix +++ b/profiles/nix-on-droid/home.nix @@ -6,7 +6,6 @@ imports = [ ../../user/shell/sh.nix # My zsh and bash config ../../user/shell/cli-collection.nix # Useful CLI apps - ../../user/app/doom-emacs/doom.nix # My doom emacs config ../../user/app/ranger/ranger.nix # My ranger file manager config ../../user/app/git/git.nix # My git config ../../user/style/stylix.nix # Styling and themes for my apps diff --git a/profiles/work/home.nix b/profiles/work/home.nix index dec50c5..32e137e 100644 --- a/profiles/work/home.nix +++ b/profiles/work/home.nix @@ -1,4 +1,4 @@ -{ config, pkgs, pkgs-stable, pkgs-kdenlive, userSettings, ... }: +{ config, pkgs, pkgs-stable, userSettings, ... }: { # Home Manager needs a bit of information about you and the paths it should @@ -12,9 +12,7 @@ (./. + "../../../user/wm"+("/"+userSettings.wm+"/"+userSettings.wm)+".nix") # My window manager selected from flake ../../user/shell/sh.nix # My zsh and bash config ../../user/shell/cli-collection.nix # Useful CLI apps - #../../user/app/doom-emacs/doom.nix # My doom emacs config ../../user/app/nvim/nvim.nix # My doom emacs config - #../../user/app/emacsng # Me experimenting with emacsng and a vanilla config ../../user/app/ranger/ranger.nix # My ranger file manager config ../../user/app/git/git.nix # My git config ../../user/app/keepass/keepass.nix # My password manager @@ -24,7 +22,6 @@ ../../user/style/stylix.nix # Styling and themes for my apps ../../user/lang/cc/cc.nix # C and C++ tools ../../user/lang/godot/godot.nix # Game development - #../../user/pkgs/blockbench.nix # Blockbench ## marked as insecure ../../user/hardware/bluetooth.nix # Bluetooth ]; diff --git a/user/README.org b/user/README.org index d6e1a6e..cf24b50 100644 --- a/user/README.org +++ b/user/README.org @@ -42,6 +42,6 @@ I use this to pass a few attribute sets: - =userSettings= - Settings for the normal user (see [[../flake.nix][flake.nix]] for more details) - =systemSettings= - Settings for the system (see [[../flake.nix][flake.nix]] for more details) - =inputs= - Flake inputs (see [[../flake.nix][flake.nix]] for more details) +- =pkgs= - Set to unstable for client devices and stable for server devices - =pkgs-stable= - Allows me to include stable versions of packages along with (my default) unstable versions of packages -- =pkgs-emacs= - Pinned version of nixpkgs I use for Emacs and its dependencies -- =pkgs-kdenlive= - Pinned version of nixpkgs I use for kdenlive +- =pkgs-unstable= - Allows me to force unstable versions of packages on server devices diff --git a/user/app/doom-emacs/README.org b/user/app/doom-emacs/README.org deleted file mode 100644 index d8dde8c..0000000 --- a/user/app/doom-emacs/README.org +++ /dev/null @@ -1,23 +0,0 @@ -#+title: Doom Emacs - -* What is Doom Emacs? -[[https://github.com/doomemacs/doomemacs][Doom Emacs]] is a distribution of the [[https://www.gnu.org/software/emacs/][Emacs Text Editor]] designed for [[https://www.vim.org/][Vim]] users. I like to use Emacs due to its extensibility and extra features it is capable of (besides text editing). Some of these extra features include: -- [[https://orgmode.org/][Org Mode]] (Hierarchical text-based document format) -- [[https://www.orgroam.com/][Org Roam]] (A second brain / personal wiki) -- [[https://orgmode.org/][Org Agenda]] (Calendar and todo list) -- [[https://magit.vc/][magit]] (Git Client) - -[[https://raw.githubusercontent.com/librephoenix/nixos-config-screenshots/main/app/doom.png]] - -I have found Emacs to be incredibly efficient, and transferring my workflow to fit inside of Emacs has allowed me to get much more work done. I primarily use Emacs for writing, note-taking, task/project management and organizing information. - -* My Config -This directory includes my Doom Emacs configuration, which consists of: -- [[./config.el][config.el]] - Main configuration -- [[./init.el][init.el]] - Doom modules (easy sets of packages curated by Doom) -- [[./packages.el][packages.el]] - Additional packages from Melpa (Emacs package manager). -- [[./themes/doom-stylix-theme.el.mustache][doom-stylix-theme.el.mustache]] - Mustache Doom Emacs template to be used with stylix, requires my [[../../style/stylix.nix][stylix.nix module]] as well -- [[./doom.nix][doom.nix]] - Loads Nix Doom Emacs and my configuration into my flake when imported -- A few other [[./scripts][random scripts]] - -My full config is a [[./doom.org][literate org document (doom.org)]]. diff --git a/user/app/doom-emacs/config.el b/user/app/doom-emacs/config.el deleted file mode 100644 index 91ba209..0000000 --- a/user/app/doom-emacs/config.el +++ /dev/null @@ -1,1642 +0,0 @@ -;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- - -;;;------ User configuration ------;;; -(setq use-package-always-defer t) - -;; Import relevant system variables from flake (see doom.nix) -;; includes variables like user-full-name, user-username, user-home-directory, user-email-address, doom-font, -;; and a few other custom variables I use later -(load! "~/.emacs.d/system-vars.el") -;; custom variables include: -;; dotfiles-dir, absolute path to home directory -;; user-default-roam-dir, name of default org-roam directory for the machine (relative to ~/Org) -;; system-nix-profile, profile selected from my dotfiles ("personal" "work" "wsl" etc...) -;; system-wm-type, wayland or x11? only should be considered if system-nix-profile is "personal" or "work" - -;; I prefer visual lines -(setq display-line-numbers-type 'visual - line-move-visual t) -(use-package-hook! evil - :pre-init - (setq evil-respect-visual-line-mode t) ;; sane j and k behavior - t) - -;; I also like evil mode visual movement -(map! :map evil-normal-state-map - :desc "Move to next visual line" - "j" 'evil-next-visual-line - :desc "Move to previous visual line" - "k" 'evil-previous-visual-line) - -;; Theme -(setq custom-theme-directory "~/.emacs.d/themes") -(setq doom-theme 'doom-stylix) -;; +unicode-init-fonts-h often errors out -(remove-hook 'doom-init-ui-hook '+unicode-init-fonts-h) - -;; Transparent background -(if (string= system-nix-profile "wsl") - ;; Can't be that tranparent under wsl because no blur - (funcall (lambda () - (set-frame-parameter nil 'alpha-background 98) - (add-to-list 'default-frame-alist '(alpha-background . 98)) - )) - ;; On Linux I can enable blur, however - (funcall (lambda () - (set-frame-parameter nil 'alpha-background 85) - (add-to-list 'default-frame-alist '(alpha-background . 85)) - )) -) - -(add-to-list 'default-frame-alist '(inhibit-double-buffering . t)) - -;; Icons in completion buffers -(add-hook 'marginalia-mode-hook #'all-the-icons-completion-marginalia-setup) -(all-the-icons-completion-mode) - -;; Grammar tasing should be voluntary -(setq writegood-mode nil) - -;; Beacon shows where the cursor is, even when fast scrolling -(setq beacon-mode t) - -(setq company-idle-delay 0.05) - -;; Quicker window management keybindings -(bind-key* "C-j" #'evil-window-down) -(bind-key* "C-k" #'evil-window-up) -(bind-key* "C-h" #'evil-window-left) -(bind-key* "C-l" #'evil-window-right) -(bind-key* "C-q" #'evil-window-delete) -(bind-key* "M-q" #'kill-current-buffer) -(bind-key* "M-w" #'+workspace/close-window-or-workspace) -(bind-key* "M-n" #'next-buffer) -(bind-key* "M-p" #'previous-buffer) -(bind-key* "M-z" #'+vterm/toggle) -(bind-key* "M-e" #'+eshell/toggle) -(bind-key* (kbd "M-") #'+vterm/here) -(bind-key* (kbd "M-E") #'+eshell/here) - -;; Buffer management -(bind-key* "" #'next-buffer) -(bind-key* "" #'previous-buffer) - -;; Disables custom.el -(setq custom-file null-device) - -;; emacs-dashboard setup -(require 'all-the-icons) -(require 'dashboard) -(setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*")) - doom-fallback-buffer-name "*dashboard*") -(setq image-scaling-factor 1) - -;; emacs-dashboard variables -(setq dashboard-banner-logo-title "Welcome to Nix Doom Emacs") -(setq dashboard-startup-banner "~/.emacs.d/dashboard-logo.webp") -(setq dashboard-icon-type 'all-the-icons) ;; use `all-the-icons' package -(setq dashboard-set-heading-icons t) -(setq dashboard-set-file-icons t) -(setq dashboard-set-navigator t) -(setq dashboard-items '()) -(setq dashboard-center-content t) -(setq dashboard-footer-messages '("Here to do customizing, or actual work?" - "M-x insert-inspiring-message" - "My software never has bugs. It just develops random features." - "Dad, what are clouds made of? Linux servers, mostly." - "There is no place like ~" - "~ sweet ~" - "sudo chown -R us ./allyourbase" - "I’ll tell you a DNS joke but it could take 24 hours for everyone to get it." - "I'd tell you a UDP joke, but you might not get it." - "I'll tell you a TCP joke. Do you want to hear it?")) - -;; Remove basic evil input and cursors from dashboard -(defun disable-cursor() - (setq-local evil-normal-state-cursor '(bar . 0)) - (hl-line-mode -1) -) -(add-hook 'dashboard-mode-hook 'disable-cursor) -(evil-define-key 'normal dashboard-mode-map - "j" 'evil-normal-state - "k" 'evil-normal-state - "h" 'evil-normal-state - "l" 'evil-normal-state) -(setq dashboard-navigator-buttons - `(;; line1 - ( (,"Roam" "" "" (lambda (&rest _)) 'org-formula) - (,(all-the-icons-octicon "globe" :height 1.0 :v-adjust 0.0) - "Notes overview" "" (lambda (&rest _) (org-roam-default-overview)) 'org-formula) - (,(all-the-icons-fileicon "org" :height 1.0 :v-adjust 0.0) - "Switch roam db" "" (lambda (&rest _) (org-roam-switch-db)) 'org-formula) - ) - ;; line 2 - ( (,"Git" "" "" (lambda (&rest _)) 'diredfl-exec-priv) - (,(all-the-icons-octicon "mark-github" :height 1.0 :v-adjust 0.0) - "GitHub" "" (lambda (&rest _) (browse-url "https://github.com/librephoenix")) 'diredfl-exec-priv) - (,(all-the-icons-faicon "gitlab" :height 1.0 :v-adjust 0.0) - "GitLab" "" (lambda (&rest _) (browse-url "https://gitlab.com/librephoenix")) 'diredfl-exec-priv) - (,(all-the-icons-faicon "coffee" :height 1.0 :v-adjust 0.0) - "Gitea" "" (lambda (&rest _) (browse-url my-gitea-domain)) 'diredfl-exec-priv) - (,(all-the-icons-octicon "triangle-up" :height 1.2 :v-adjust -0.1) - "Codeberg" "" (lambda (&rest _) (browse-url "https://codeberg.org/librephoenix")) 'diredfl-exec-priv) - ) - ;; line 3 - ( (,"Agenda" "" "" (lambda (&rest _)) 'dired-warning) - (,(all-the-icons-octicon "checklist" :height 1.0 :v-adjust 0.0) - "Agenda todos" "" (lambda (&rest _) (org-agenda-list)) 'dired-warning) - (,(all-the-icons-octicon "calendar" :height 1.0 :v-adjust 0.0) - "Agenda calendar" "" (lambda (&rest _) (cfw:open-org-calendar)) 'dired-warning) - ) - ;; line 4 - ( (,"Config" "" "" (lambda (&rest _)) 'dired-mark) - (,(all-the-icons-faicon "cogs" :height 1.0 :v-adjust 0.0) - "System config" "" (lambda (&rest _) (projectile-switch-project-by-name "~/.dotfiles" t)) 'dired-mark) - (,(all-the-icons-material "help" :height 1.0 :v-adjust -0.2) - "Doom documentation" "" (lambda (&rest _) (doom/help)) 'dired-mark) - ))) - -(setq dashboard-footer-icon - (all-the-icons-faicon "list-alt" - :height 1.0 - :v-adjust -0.15 - :face 'font-lock-keyword-face)) -(dashboard-setup-startup-hook) - -(map! :leader :desc "Open dashboard" "b b" #'dashboard-refresh-buffer) - -(setq scroll-conservatively 101) - -;; Smooth scrolling -;; requires good-scroll.el -;;(good-scroll-mode 1) -;;(setq good-scroll-duration 0.4 -;; good-scroll-step 270 -;; good-scroll-render-rate 0.03) -;; -;;(global-set-key (kbd "") #'good-scroll-up-full-screen) -;;(global-set-key (kbd "") #'good-scroll-down-full-screen) - -(setq scroll-margin 30) -(setq hscroll-margin 10) - -;; Requires for faster loading -(require 'org-agenda) -(require 'dired) - -;; Garbage collection to speed things up -(add-hook 'after-init-hook - #'(lambda () - (setq gc-cons-threshold (* 100 1024 1024)))) -(add-hook 'focus-out-hook 'garbage-collect) -(run-with-idle-timer 5 t 'garbage-collect) - -;; Enable autorevert globally so that buffers update when files change on disk. -;; Very useful when used with file syncing (i.e. syncthing) -(setq global-auto-revert-mode nil) -(setq auto-revert-use-notify t) - -;; Neotree fun -(defun neotree-snipe-dir () - (interactive) - (if (projectile-project-root) - (neotree-dir (projectile-project-root)) - (neotree-dir (file-name-directory (file-truename (buffer-name)))) - ) -) - -(map! :leader :desc "Open neotree here" "o n" #'neotree-snipe-dir - :desc "Hide neotree" "o N" #'neotree-hide) - -;; For camelCase -(global-subword-mode 1) - -;; ripgrep as grep -(setq grep-command "rg -nS --no-heading " - grep-use-null-device nil) - -;; Mini-frames ;; cool but kinda suboptimal atm -;(add-load-path! "~/.emacs.d/mini-frame") -;(require 'mini-frame) -;(setq mini-frame-ignore-commands '(evil-ex-search-forward helpful-variable helpful-callable)) -;(setq mini-frame-show-parameters -; '((left . 216) -; (top . 240) -; (width . 0.78) -; (height . 20) -; (alpha-background . 90)) -;) -;(setq mini-frame-detach-on-hide nil) -;(setq mini-frame-resize t) -;(setq resize-mini-frames t) -;(setq mini-frame-standalone nil) -;(mini-frame-mode 1) - -;;;------ Registers ------;;; - -(map! :leader - :desc "Jump to register" - "r" 'jump-to-register) - -(if (string= system-nix-profile "personal") (set-register ?f (cons 'file (concat user-home-directory "/Org/Family.s/Notes/hledger.org")))) -(set-register ?h (cons 'file user-home-directory)) -(set-register ?r (cons 'file (concat dotfiles-dir "/README.org"))) - -;;;------ Org mode configuration ------;;; - -;; Set default org directory -(setq org-directory "~/Org") -(setq org-attach-directory "~/Org/.attach") -(setq org-attach-id-dir "~/Org/.attach") -(setq org-id-locations-file "~/Org/.orgids") -(setq org-cycle-include-plain-lists 'integrate) - -(remove-hook 'after-save-hook #'+literate|recompile-maybe) -(set-company-backend! 'org-mode nil) - -;; Automatically show images but manually control their size -(setq org-startup-with-inline-images t - org-image-actual-width nil) - -(require 'evil-org) -(require 'evil-org-agenda) -(add-hook 'org-mode-hook 'evil-org-mode -100) - -;; Top-level headings should be bigger! -(custom-set-faces! - `(outline-1 :height 1.3 :foreground ,(nth 1 (nth 14 doom-themes--colors))) - `(outline-2 :height 1.25 :foreground ,(nth 1 (nth 15 doom-themes--colors))) - `(outline-3 :height 1.2 :foreground ,(nth 1 (nth 19 doom-themes--colors))) - `(outline-4 :height 1.1 :foreground ,(nth 1 (nth 23 doom-themes--colors))) - `(outline-5 :height 1.1 :foreground ,(nth 1 (nth 24 doom-themes--colors))) - `(outline-6 :height 1.1 :foreground ,(nth 1 (nth 16 doom-themes--colors))) - `(outline-7 :height 1.05 :foreground ,(nth 1 (nth 18 doom-themes--colors))) - `(outline-8 :height 1.05 :foreground ,(nth 1 (nth 11 doom-themes--colors))) - '(variable-pitch :family "Intel One Mono") - `(org-agenda-date :inherit 'unspecified :foreground ,(nth 1 (nth 19 doom-themes--colors)) :weight bold :height 1.1) - `(org-agenda-date-today :inherit 'unspecified :foreground ,(nth 1 (nth 15 doom-themes--colors)) :weight bold :height 1.1) - `(org-agenda-date-weekend :inherit 'unspecified :foreground ,(nth 1 (nth 24 doom-themes--colors)) :weight bold :height 1.1) - `(org-agenda-date-weekend-today :inherit 'unspecified :foreground ,(nth 1 (nth 15 doom-themes--colors)) :weight bold :height 1.1) -) - -(after! org (org-eldoc-load)) - -(with-eval-after-load 'org (global-org-modern-mode)) - -;; Add frame borders and window dividers -(modify-all-frames-parameters - '((right-divider-width . 5) - (internal-border-width . 5))) -(dolist (face '(window-divider - window-divider-first-pixel - window-divider-last-pixel)) - (face-spec-reset-face face) - (set-face-foreground face (face-attribute 'default :background))) -(set-face-background 'fringe (face-attribute 'default :background)) - -(setq - ;; Edit settings - org-auto-align-tags nil - org-tags-column 0 - org-catch-invisible-edits 'show-and-error - org-special-ctrl-a/e t - org-insert-heading-respect-content t - - ;; Org styling, hide markup etc. - org-hide-emphasis-markers t - org-pretty-entities t - org-ellipsis "…") - -(setq-default line-spacing 0) - -; Automatic table of contents is nice -(if (require 'toc-org nil t) - (progn - (add-hook 'org-mode-hook 'toc-org-mode) - (add-hook 'markdown-mode-hook 'toc-org-mode)) - (warn "toc-org not found")) - -;;---- this block from http://fgiasson.com/blog/index.php/2016/06/21/optimal-emacs-settings-for-org-mode-for-literate-programming/ ----;; -;; Tangle Org files when we save them -(defun tangle-on-save-org-mode-file() - (when (string= (message "%s" major-mode) "org-mode") - (org-babel-tangle))) - -(add-hook 'after-save-hook 'tangle-on-save-org-mode-file) -;; ---- end block ---- ;; - -;; Better org table editing -;; This breaks multiline visual block edits -;;(setq-default evil-insert-state-exit-hook '(org-update-parent-todo-statistics -;; t)) -;;(setq org-table-automatic-realign nil) - -;; Better for org source blocks -(setq electric-indent-mode nil) -(setq org-src-window-setup 'current-window) -(set-popup-rule! "^\\*Org Src" - :side 'top' - :size 0.9) - -;; Horizontal scrolling tables -(add-load-path! "~/.emacs.d/phscroll") -(setq org-startup-truncated nil) -(with-eval-after-load "org" - (require 'org-phscroll)) -(setq phscroll-calculate-in-pixels t) - -;; Org side tree outline -(add-load-path! "~/.emacs.d/org-side-tree") -(require 'org-side-tree) -(setq org-side-tree-persistent nil) -(setq org-side-tree-fontify t) -(setq org-side-tree-enable-folding t) -(defun org-side-tree-create-or-toggle () - (interactive) - (if (or (org-side-tree-has-tree-p) (eq major-mode 'org-side-tree-mode)) - (org-side-tree-toggle) - (org-side-tree))) -(map! :leader - "O t" #'org-side-tree-create-or-toggle) -(map! :map org-side-tree-mode-map - "SPC" nil) - -(require 'org-download) - -;; Drag-and-drop to `dired` -(add-hook 'dired-mode-hook 'org-download-enable) - -;; system-wm-type, wayland or x11? only should be considered if system-nix-profile is "personal" or "work" -(if (string= system-wm-type "wayland") - (setq org-download-screenshot-method "grim -g \"$(slurp)\" %s") - (setq org-download-screenshot-method "flameshot gui -p %s") -) - -(after! org-download - (setq org-download-method 'directory)) - -(after! org - (setq-default org-download-image-dir "img/" - org-download-heading-lvl nil)) - -(add-to-list 'display-buffer-alist '("^*Async Shell Command*" . (display-buffer-no-window))) - -(defun org-download-clipboard-basename () - (interactive) - (setq org-download-path-last-dir org-download-image-dir) - (setq org-download-image-dir (completing-read "directory: " (-filter #'f-directory-p (directory-files-recursively "." "" t)) nil t)) - (org-download-clipboard (completing-read "basename: " '() nil nil)) - (setq org-download-image-dir org-download-path-last-dir) -) - -(map! :leader - :desc "Insert a screenshot" - "i s" 'org-download-screenshot - :desc "Insert image from clipboard" - "i p" 'org-download-clipboard - "i P" 'org-download-clipboard-basename) - -(defun org-new-file-from-template() - "Copy a template from ~/Templates into a time stamped unique-named file in the -same directory as the org-buffer and insert a link to this file." - (interactive) - (setq template-file (completing-read "Template file:" (directory-files "~/Templates"))) - (setq filename - (concat - (make-temp-name - (concat (file-name-directory (buffer-file-name)) - "files/" - (file-name-nondirectory (buffer-file-name)) - "_" - (format-time-string "%Y%m%d_%H%M%S_")) ) (file-name-extension template-file t))) - (copy-file (concat user-home-directory "/Templates/" template-file) filename) - (setq prettyname (read-from-minibuffer "Pretty name:")) - (insert (concat "[[./files/" (file-name-nondirectory filename) "][" prettyname "]]")) - (org-display-inline-images)) - -(map! :leader - :desc "Create a new file from a template and insert a link at point" - "i t" 'my-org-new-file-from-template) - -(if (not (string= system-nix-profile "wsl")) - (when (require 'openwith nil 'noerror) - (setq openwith-associations - (list - (list (openwith-make-extension-regexp - '("mpg" "mpeg" "mp3" "mp4" - "avi" "wmv" "wav" "mov" "flv" - "ogm" "ogg" "mkv")) - "mpv" - '(file)) - (list (openwith-make-extension-regexp - '("doc" "xls" "ppt" "odt" "ods" "odg" "odp")) - "libreoffice" - '(file)) - '("\\.lyx" "lyx" (file)) - '("\\.chm" "kchmviewer" (file)) - (list (openwith-make-extension-regexp - '("pdf" "ps" "ps.gz" "dvi")) - "atril" - '(file)) - (list (openwith-make-extension-regexp - '("kdenlive")) - "kdenlive-accel" - '(file)) - (list (openwith-make-extension-regexp - '("kra")) - "krita" - '(file)) - (list (openwith-make-extension-regexp - '("blend" "blend1")) - "blender" - '(file)) - (list (openwith-make-extension-regexp - '("helio")) - "helio" - '(file)) - (list (openwith-make-extension-regexp - '("svg")) - "inkscape" - '(file)) - (list (openwith-make-extension-regexp - '("flp")) - "flstudio" - '(file)) - (list (openwith-make-extension-regexp - '("mid")) - "rosegarden" - '(file)) - )) - (openwith-mode 1))) - -(add-load-path! "~/.emacs.d/org-krita") -(require 'org-krita) -(add-hook 'org-mode-hook 'org-krita-mode) -(setq org-krita-extract-filename "preview.png") -(setq org-krita-scale 1) - -(add-load-path! "~/.emacs.d/org-xournalpp") -(require 'org-xournalpp) -(add-hook 'org-mode-hook 'org-xournalpp-mode) -(setq org-xournalpp-template-getter - '(closure - (t) - nil - (file-truename "~/Templates/template.xopp") ; use my own template - ) -) - -;; override width to static 250 for now -;; so I don't have massive images in org mode (scrolling not fun) -(defun org-xournalpp--create-image (link refresh) - "Extract svg/png from given LINK and return image. - -Regenerate the cached inline image, if REFRESH is true. - -If the path from LINK does not exist, nil is returned." - (let ((width 250) - (xopp-path (f-expand (org-element-property :path link)))) - (when (f-exists? xopp-path) - (if width - (create-image (org-xournalpp--get-image xopp-path refresh) - org-xournalpp-image-type - nil - :width width) - (create-image (org-xournalpp--get-image xopp-path refresh) - org-xournalpp-image-type - nil))))) - -(defun org-copy-link-to-clipboard-at-point () - "Copy current link at point into clipboard (useful for images and links)" - ;; Remember to press C-g to kill this foreground process if it hangs! - (interactive) - (if (eq major-mode #'org-mode) - (link-hint-copy-link-at-point) - ) - (if (eq major-mode #'ranger-mode) - (ranger-copy-absolute-file-paths) - ) - (if (eq major-mode #'image-mode) - (image-mode-copy-file-name-as-kill) - ) - (shell-command "~/.emacs.d/scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh " nil nil) -) - -(if (string= system-nix-profile "wsl") - (map! :leader - :desc "Copy link at point" - "y y" 'link-hint-copy-link-at-point) - (map! :leader - :desc "Copy link/file at point into system clipbord (C-g to escape if copying a file)" - "y y" 'org-copy-link-to-clipboard-at-point)) - -;; Online images inside of org mode is pretty cool -;; This snippit is from Tobias on Stack Exchange -;; https://emacs.stackexchange.com/questions/42281/org-mode-is-it-possible-to-display-online-images -(require 'org-yt) - -(defun org-image-link (protocol link _description) - "Interpret LINK as base64-encoded image data." - (cl-assert (string-match "\\`img" protocol) nil - "Expected protocol type starting with img") - (let ((buf (url-retrieve-synchronously (concat (substring protocol 3) ":" link)))) - (cl-assert buf nil - "Download of image \"%s\" failed." link) - (with-current-buffer buf - (goto-char (point-min)) - (re-search-forward "\r?\n\r?\n") - (buffer-substring-no-properties (point) (point-max))))) - -(org-link-set-parameters - "imghttp" - :image-data-fun #'org-image-link) - -(org-link-set-parameters - "imghttps" - :image-data-fun #'org-image-link) - -;; Mermaid diagrams -(setq ob-mermaid-cli-path "~/.nix-profile/bin/mmdc") - -;; Print org mode -(defun org-simple-print-buffer () - "Open an htmlized form of current buffer and open in a web browser to print" - (interactive) - (htmlize-buffer) - (browse-url-of-buffer (concat (buffer-name) ".html")) - (sleep-for 1) - (kill-buffer (concat (buffer-name) ".html"))) - -;; Doesn't work yet, bc htmlize-region takes arguments BEG and END -;(defun org-simple-print-region() -; "Open an htmlized form of current region and open in a web browser to print" -; (interactive) -; (htmlize-region ) -; (browse-url-of-buffer (concat (buffer-name) ".html")) -; (sleep-for 1) -; (kill-buffer (concat (buffer-name) ".html"))) - -(map! :leader - :prefix ("P" . "Print") - :desc "Simple print buffer in web browser" - "p" 'org-simple-print-buffer) - -(map! :leader - :prefix ("P" . "Print") - :desc "Simple print buffer in web browser" - "b" 'org-simple-print-buffer) - -;(map! :leader -; :prefix ("P" . "Print") -; :desc "Simple print region in web browser" -; "r" 'org-simple-print-region) - -;; Display macros inline in buffers -(add-to-list 'font-lock-extra-managed-props 'display) - -(font-lock-add-keywords - 'org-mode - '(("\\({{{[a-zA-Z#%)(_-+0-9]+}}}\\)" 0 - `(face nil display - ,(format "%s" - (let* ((input-str (match-string 0)) - (el (with-temp-buffer - (insert input-str) - (goto-char (point-min)) - (org-element-context))) - (text (org-macro-expand el org-macro-templates))) - (if text - text - input-str))))))) - -;; Org transclusion -(require 'org-transclusion) -(after! org - (map! :map global-map "" #'org-transclusion-add :leader :prefix "n" :desc "Org Transclusion Mode" "t" #'org-transclusion-mode) - (map! :leader :prefix "n" "l" #'org-transclusion-live-sync-start) - (setq org-transclusion-exclude-elements '(property-drawer keyword)) - (add-hook 'org-mode-hook #'org-transclusion-mode) -) - -(defun org-jekyll-new-post () - (interactive) - (setq new-blog-post-title (read-from-minibuffer "Post name: ")) - (setq new-blog-post-date (format-time-string "%Y-%m-%d" (date-to-time (org-read-date)))) - (setq new-blog-post-slug (downcase (replace-regexp-in-string "[^[:alpha:][:digit:]_-]" "" (string-replace " " "-" new-blog-post-title)))) - (setq new-blog-post-file (concat (projectile-project-root) "org/_posts/" new-blog-post-date "-" new-blog-post-slug ".org")) - (let ((org-capture-templates - `(("p" "New Jekyll blog post" plain (file new-blog-post-file) - ,(concat "#+title: " new-blog-post-title "\n#+options: toc:nil num:nil\n#+begin_export html\n---\nlayout: post\ntitle: " new-blog-post-title "\nexcerpt: %?\ntags: \npermalink: " new-blog-post-date "-" new-blog-post-slug "\n---\n#+end_export\n\n#+attr_html: :alt " new-blog-post-title " :align center\n[[../assets/" new-blog-post-date "-" new-blog-post-slug ".png]]"))) - )) (org-capture)) -) - -(defun org-jekyll-rename-post () - (interactive) - (setq new-blog-post-title (read-from-minibuffer "Post name: ")) - (setq new-blog-post-date (format-time-string "%Y-%m-%d" (date-to-time (org-read-date)))) - (setq new-blog-post-slug (downcase (replace-regexp-in-string "[^[:alpha:][:digit:]_-]" "" (string-replace " " "-" new-blog-post-title)))) - (org-roam-set-keyword "title" new-blog-post-title) - (replace-regexp "permalink: .*\n" (concat "permalink: " new-blog-post-date "-" new-blog-post-slug "\n") nil (point-min) (point-max)) - (replace-regexp "title: .*\n" (concat "title: " new-blog-post-title "\n") nil (point-min) (point-max)) - (setq prev-blog-post-filename-base (file-name-base (buffer-file-name))) - (doom/move-this-file (concat new-blog-post-date "-" new-blog-post-slug ".org")) - (shell-command (concat "sed -i s/" prev-blog-post-filename-base "/" (file-name-base (buffer-file-name)) "/g *.org") nil) - (replace-regexp prev-blog-post-filename-base (file-name-base (buffer-file-name)) nil (point-min) (point-max)) - (save-buffer) -) - -(map! :leader - :prefix ("N") - - :desc "New blog post" - "p" #'org-jekyll-new-post - - :desc "Rename or redate blog post and update links accordingly" - "e" #'org-jekyll-rename-post -) - -(require 'crdt) -(setq crdt-default-tls t) -(setq crdt-use-stunnel t) -(setq crdt-default-name "Emmet") -(if (file-exists-p "~/.emacs.d/crdt-private.el") (load! "~/.emacs.d/crdt-private.el")) -(defun crdt-connect-default () - (interactive) - (crdt-connect crdt-default-server-address crdt-default-name) -) -(map! :leader - :desc "crdt" - :prefix ("C") - - :desc "Connect to a crdt server" - "c" #'crdt-connect-default - - :desc "Connect to default crdt server" - "C" #'crdt-connect-default - - :desc "Disconnect from a crdt server" - "d" #'crdt-disconnect - - :desc "Add buffer to a session" - "a" #'crdt-share-buffer - - :desc "Stop sharing buffer when running a server" - "s" #'crdt-stop-share-buffer - - :desc "Run M-x on the (remote) crdt session" - "x" #'crdt-M-x - - :desc "List crdt buffers in a session" - "l" #'crdt-list-buffers - - :desc "List crdt users in a session" - "u" #'crdt-list-users -) - -(require 'org-analyzer) -(setq org-analyzer-wrapper-command "org-analyzer") -(setq org-analyzer-jar-file-name "~/.nix-profile/bin/org-analyzer.jar") -(setq org-analyzer-java-program "~/.nix-profile/bin/org-analyzer") ;; Is not actually java, buta wrapper shell script - -(defun org-analyzer-start-process (org-dir) - "Start the org analyzer process . -Argument ORG-DIR is where the org-files are located." - (org-analyzer-cleanup-process-state) - (unless (file-exists-p org-dir) - (warn "org-analyzer was started with org-directory set to - \"%s\"\nbut this directory does not exist. -Please set the variable `org-directory' to the location where you keep your org files." - org-directory)) - (let* ((name (format " *org-analyzer [org-dir:%s]*" org-dir)) - (proc-buffer (generate-new-buffer name)) - (proc nil)) - (setq org-analyzer-process-buffer proc-buffer) - (with-current-buffer proc-buffer - (setq default-directory (if (file-exists-p org-dir) - org-dir default-directory) - proc (condition-case err - (let ((process-connection-type nil) - (process-environment process-environment)) - (start-process name - (current-buffer) - org-analyzer-wrapper-command - "--port" - (format "%d" org-analyzer-http-port) - "--started-from-emacs" - (if (file-exists-p org-dir) org-dir ""))) - (error - (concat "Can't start org-analyzer (%s: %s)" - (car err) (cadr err))))) - (set-process-query-on-exit-flag proc nil) - (set-process-filter proc #'org-analyzer-process-filter)) - proc-buffer)) - -;;;------ Org roam configuration ------;;; -(require 'org-roam) -(require 'org-roam-dailies) - -(setq org-roam-directory (concat "~/Org/" user-default-roam-dir "/Notes") - org-roam-db-location (concat "~/Org/" user-default-roam-dir "/Notes/org-roam.db")) - -(setq org-roam-node-display-template - "${title:65}📝${tags:*}") - -(org-roam-db-autosync-mode) - -(setq mode-line-misc-info '((which-function-mode - (which-func-mode - ("" which-func-format " "))) - ("" so-long-mode-line-info) - (global-mode-string - ("" global-mode-string)) - " " - org-roam-db-choice) -) - -(setq org-roam-list-files-commands '(rg)) - -(setq full-org-roam-db-list nil) - -(setq full-org-roam-db-list (directory-files "~/Org" t "\\.[p,s]$")) -(dolist (item full-org-roam-db-list) - (setq full-org-roam-db-list - (append (directory-files item t "\\.[p,s]$") full-org-roam-db-list))) - -(setq org-roam-db-choice user-default-roam-dir) -(setq full-org-roam-db-list-pretty (list)) -(dolist (item full-org-roam-db-list) - (setq full-org-roam-db-list-pretty - (append (list - (replace-regexp-in-string (concat "\\/home\\/" user-username "\\/Org\\/") "" item)) full-org-roam-db-list-pretty))) - -(defun org-roam-open-dashboard () - "Open ${org-roam-directory}/dashboard.org (I use this naming convention to create dashboards for each of my org roam maps)" - (interactive) - (if (org-roam-node-from-title-or-alias "Overview") - (org-roam-node-open (org-roam-node-from-title-or-alias "Overview")) - (dired org-roam-directory)) -) - -(defun org-roam-open-inbox () - "Open ${org-roam-directory}/dashboard.org (I use this naming convention to create dashboards for each of my org roam maps)" - (interactive) - (if (org-roam-node-from-title-or-alias "Inbox") - (org-roam-node-open (org-roam-node-from-title-or-alias "Inbox")) - (message "No inbox found, capture something with M-x org-roam-capture-inbox")) -) - -(defun org-roam-capture-inbox () - (interactive) - (org-roam-capture- :node (org-roam-node-from-title-or-alias "Inbox") - :templates '(("i" "inbox" plain "* %?" - :if-new (file+head "%<%Y%m%d%H%M%S>-inbox.org" "#+title: Inbox\n"))))) - -(defun org-roam-switch-db (&optional arg silent) - "Switch to a different org-roam database, arg" - (interactive) - (when (not arg) - (setq full-org-roam-db-list nil) - - (setq full-org-roam-db-list (directory-files "~/Org" t "\\.[p,s]$")) - (dolist (item full-org-roam-db-list) - (setq full-org-roam-db-list - (append (directory-files item t "\\.[p,s]$") full-org-roam-db-list))) - - (setq full-org-roam-db-list-pretty (list)) - (dolist (item full-org-roam-db-list) - (setq full-org-roam-db-list-pretty - (append (list - (replace-regexp-in-string (concat "\\/home\\/" user-username "\\/Org\\/") "" item)) full-org-roam-db-list-pretty))) - - (setq org-roam-db-choice (completing-read "Select org roam database: " - full-org-roam-db-list-pretty nil t))) - (when arg - (setq org-roam-db-choice arg)) - - (setq org-roam-directory (file-truename (concat "~/Org/" org-roam-db-choice "/Notes")) - org-roam-db-location (file-truename (concat "~/Org/" org-roam-db-choice "/Notes/org-roam.db")) - org-directory (file-truename (concat "~/Org/" org-roam-db-choice "/Notes"))) - (when (not silent) - (org-roam-open-dashboard)) - - (org-roam-db-sync) - - (message (concat "Switched to " org-roam-db-choice " org-roam database!"))) - -(defun org-roam-default-overview () - (interactive) - (org-roam-switch-db user-default-roam-dir)) - -(defun org-roam-switch-db-id-open (arg ID &optional switchpersist) - "Switch to another org-roam db and visit file with id arg" - "If switchpersist is non-nil, stay in the new org-roam db after visiting file" - (interactive) - (setq prev-org-roam-db-choice org-roam-db-choice) - (org-roam-switch-db arg 1) - (org-roam-id-open ID) - (when (not switchpersist) - (org-roam-switch-db prev-org-roam-db-choice 1))) - -;;;------ Org-roam-agenda configuration ------;;; -(defun text-in-buffer-p (TEXT) -(save-excursion (goto-char (point-min)) (search-forward TEXT nil t))) - -(defun apply-old-todos-tag-maybe (&optional FILE) - (interactive) - (if (stringp FILE) - (setq the-daily-node-filename FILE) - (setq the-daily-node-filename buffer-file-name)) - (if (org-roam-dailies--daily-note-p the-daily-node-filename) - (if (<= (nth 2 (org-roam-dailies-calendar--file-to-date the-daily-node-filename)) (nth 2 org-agenda-current-date)) - (if (<= (nth 1 (org-roam-dailies-calendar--file-to-date the-daily-node-filename)) (nth 1 org-agenda-current-date)) - (if (<= (nth 0 (org-roam-dailies-calendar--file-to-date the-daily-node-filename)) (nth 0 org-agenda-current-date)) - (funcall (lambda () - (with-current-buffer (get-file-buffer the-daily-node-filename) (org-roam-tag-add '("old-todos"))) - (with-current-buffer (get-file-buffer the-daily-node-filename) (org-roam-tag-remove '("todos"))) - ) - ) - ) - ) - ) - ) -) - -(defun apply-old-todos-tag-maybe-and-save (FILE) - (interactive) - (find-file-noselect FILE) - (apply-old-todos-tag-maybe FILE) - (with-current-buffer (get-file-buffer the-daily-node-filename) (save-buffer)) - (with-current-buffer (get-file-buffer the-daily-node-filename) (kill-buffer)) -) - -(defun org-current-buffer-has-todos () - "Return non-nil if current buffer has any todo entry." - - (org-element-map ; (2) - (org-element-parse-buffer 'headline) ; (1) - 'headline - (lambda (h) - (eq (org-element-property :todo-type h) - 'todo)) - nil 'first-match)) ; (3) - -(defun org-has-recent-timestamps (OLD-DAYS) - "Return non-nil only if current buffer has entries with timestamps - more recent than OLD-DAYS days" - (interactive) - (if (org-element-map (org-element-parse-buffer) 'timestamp - (lambda (h) - (org-element-property :raw-value h))) - (org-element-map ; (2) - (org-element-parse-buffer) ; (1) - 'timestamp - (lambda (h) - (time-less-p (time-subtract (current-time) (* 60 60 24 OLD-DAYS)) (date-to-time (org-element-property :raw-value h)))) - nil 'first-match) nil)) - -(setq org-timestamps-days-for-old 21) - -; This has a bug where it won't sync a new agenda file -; if I'm editing an org roam node file while set to another -; org roam db -(defun add-todos-tag-on-save-org-mode-file() - (interactive) - (when (string= (message "%s" major-mode) "org-mode") - (if (org-roam-node-p (org-roam-node-at-point)) - (funcall (lambda() - (if (or (org-current-buffer-has-todos) (org-has-recent-timestamps org-timestamps-days-for-old)) - (org-roam-tag-add '("todos")) - (org-roam-tag-remove '("todos")) - ) - (apply-old-todos-tag-maybe) - ) - ) - ) - ) -) - -(add-hook 'before-save-hook 'add-todos-tag-on-save-org-mode-file) - -(defun org-roam-filter-by-tag (tag-name) - (lambda (node) - (member tag-name (org-roam-node-tags node)))) - -(defun org-roam-list-notes-by-tag (tag-name) - (mapcar #'org-roam-node-file - (seq-filter - (org-roam-filter-by-tag tag-name) - (org-roam-node-list)))) - -(defun org-roam-dailies-apply-old-todos-tags-to-all () -; (dolist (daily-node org-roam-dailies-files) -; (apply-old-todos-tag-maybe-and-save daily-node) -; ) - (setq num 0) - (while (< num (list-length (org-roam-list-notes-by-tag "todos"))) - (apply-old-todos-tag-maybe-and-save (nth num (org-roam-list-notes-by-tag "todos"))) - (setq num (1+ num)) - ) -) - -;; Refreshing org roam agenda -(defun org-roam-refresh-agenda-list () - (interactive) - (setq prev-org-roam-db-choice org-roam-db-choice) - (setq org-agenda-files '()) - (setq org-id-files '()) - (setq org-roam-directory (file-truename "~/Org") - org-roam-db-location (file-truename "~/Org/org-roam.db") - org-directory (file-truename "~/Org/")) - (org-roam-db-sync) - (setq org-agenda-files (org-roam-list-notes-by-tag "todos")) - (setq org-id-files (org-roam-list-files)) - (setq org-agenda-files (-uniq org-agenda-files)) - (org-roam-switch-db prev-org-roam-db-choice 1) -) - -;; Build agenda only when org agenda first opened for session -(setq org-roam-agenda-initialized nil) -(defun org-roam-refresh-agenda-list-init () - (if (not org-roam-agenda-initialized) - (funcall - (lambda () - (org-roam-refresh-agenda-list) - (setq org-roam-agenda-initialized t) - ) - ) - ) -) -(add-hook 'org-agenda-mode-hook 'org-roam-refresh-agenda-list-init) - -(map! :leader - :prefix ("o a") - - :desc "Refresh org agenda from roam dbs" - "r" 'org-roam-refresh-agenda-list) - -(map! :leader - :prefix ("N" . "org-roam notes") - - :desc "Capture new roam node" - "c" 'org-roam-capture - - :desc "Open org roam inbox" - "I o" 'org-roam-open-inbox - - :desc "Capture stuff in inbox" - "I c" 'org-roam-capture-inbox - - :desc "Insert roam node link at point" - "i" 'org-roam-node-insert - - :desc "Find roam node" - "." 'org-roam-node-find - - :desc "Switch org-roam database" - "s" 'org-roam-switch-db - - :desc "Update current org-roam database" - "u" 'org-roam-db-sync - - :desc "Re-zoom on current node in org-roam-ui" - "z" 'org-roam-ui-node-zoom - - :desc "Visualize org-roam database with org-roam-ui" - "O" 'org-roam-default-overview - - :desc "Visualize org-roam database with org-roam-ui" - "o" 'org-roam-open-dashboard) - -(after! org-roam - (setq org-roam-capture-templates - '(("d" "default" plain "%?" :target - (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n") - :unnarrowed t)))) - -(setq olivetti-style 'fancy - olivetti-margin-width 100) -(setq-default olivetti-body-width 100) -(defun org-roam-olivetti-mode () - (interactive) - (if (org-roam-file-p) - (olivetti-mode)) - (if (org-roam-file-p) - (doom-disable-line-numbers-h))) - -(add-hook 'org-mode-hook 'org-roam-olivetti-mode) - -(add-load-path! "~/.emacs.d/org-nursery/lisp") -(require 'org-roam-dblocks) -(add-hook 'org-mode-hook 'org-roam-dblocks-autoupdate-mode) - -(setq org-id-extra-files 'org-agenda-text-search-extra-files) - -;(add-to-list 'display-buffer-alist '("^\\ORUI" display-buffer-in-side-window -; '(side . right) -; (window-width . 50) -;)) -;(add-to-list 'display-buffer-alist '("^\\localhost:35901" display-buffer-in-side-window -; '(side . right) -; (window-width . 50) -;)) - -;;(setq org-roam-ui-browser-function 'eaf-open-browser) ; xorg -(setq org-roam-ui-browser-function 'browse-url) ; wayland - -(defun open-org-roam-ui () - (interactive) - (+evil/window-vsplit-and-follow) - (org-roam-ui-open) - (evil-window-left 1)) - -(defun kill-org-roam-ui () - (interactive) -;; (delete-window (get-buffer-window "ORUI" t)) ; xorg -;; (kill-buffer "ORUI") ; xorg - (kill-buffer "*httpd*") -) - -; xorg -;;(map! :leader -;; :prefix ("N" . "org-roam notes") -;; :desc "Visualize org-roam database with org-roam-ui" -;; "v" 'open-org-roam-ui) - -; wayland -(map! :leader - :prefix ("N" . "org-roam notes") - :desc "Visualize org-roam database with org-roam-ui" - "v" 'org-roam-ui-open) - -(map! :leader - :prefix ("N" . "org-roam notes") - :desc "Kill all org roam ui buffers" - "V" 'kill-org-roam-ui) - -;;;------ Org agenda configuration ------;;; -;; Set span for agenda to be just daily -(setq org-agenda-span 1 - org-agenda-start-day "+0d" - org-agenda-skip-timestamp-if-done t - org-agenda-skip-deadline-if-done t - org-agenda-skip-scheduled-if-done t - org-agenda-skip-scheduled-if-deadline-is-shown t - org-agenda-skip-timestamp-if-deadline-is-shown t - org-log-into-drawer t) - -;; Custom styles for dates in agenda -(custom-set-faces! - '(org-agenda-date :inherit outline-1 :height 1.15) - '(org-agenda-date-today :inherit outline-2 :height 1.15) - '(org-agenda-date-weekend :inherit outline-1 :height 1.15) - '(org-agenda-date-weekend-today :inherit outline-2 :height 1.15) - '(org-super-agenda-header :inherit custom-button :weight bold :height 1.05) - `(link :foreground unspecified :underline nil :background ,(nth 1 (nth 7 doom-themes--colors))) - '(org-link :foreground unspecified)) - -;; Toggle completed entries function -(defun org-agenda-toggle-completed () - (interactive) - (setq org-agenda-skip-timestamp-if-done (not org-agenda-skip-timestamp-if-done) - org-agenda-skip-deadline-if-done (not org-agenda-skip-timestamp-if-done) - org-agenda-skip-scheduled-if-done (not org-agenda-skip-timestamp-if-done)) - (org-agenda-redo)) - -(map! - :map evil-org-agenda-mode-map - :after org-agenda - :nvmeg "s d" #'org-agenda-toggle-completed) - -;; Ricing org agenda -(setq org-agenda-current-time-string "") -(setq org-agenda-time-grid '((daily) () "" "")) - -(setq org-agenda-prefix-format '( -(agenda . " %?-2i %t ") - (todo . " %i %-12:c") - (tags . " %i %-12:c") - (search . " %i %-12:c"))) - -(setq org-agenda-hide-tags-regexp ".*") - -(setq org-agenda-category-icon-alist - `(("Teaching.p" ,(list (all-the-icons-faicon "graduation-cap" :height 0.8)) nil nil :ascent center) - ("Family.s" ,(list (all-the-icons-faicon "home" :v-adjust 0.005)) nil nil :ascent center) - ("Producer.p" ,(list (all-the-icons-faicon "youtube-play" :height 0.9)) nil nil :ascent center) - ("Bard.p" ,(list (all-the-icons-faicon "music" :height 0.9)) nil nil :ascent center) - ("Stories.s" ,(list (all-the-icons-faicon "book" :height 0.9)) nil nil :ascent center) - ("Author.p" ,(list (all-the-icons-faicon "pencil" :height 0.9)) nil nil :ascent center) - ("Gamedev.s" ,(list (all-the-icons-faicon "gamepad" :height 0.9)) nil nil :ascent center) - ("Knowledge.p" ,(list (all-the-icons-faicon "database" :height 0.8)) nil nil :ascent center) - ("Personal.p" ,(list (all-the-icons-material "person" :height 0.9)) nil nil :ascent center) -)) - -(defalias 'org-timestamp-down 'org-timestamp-down-day) -(defalias 'org-timestamp-up 'org-timestamp-up-day) - -(defun org-categorize-by-roam-db-on-save () - (interactive) - (when (string= (message "%s" major-mode) "org-mode") - (when - (string-prefix-p (concat "/home/" user-username "/Org") (expand-file-name (buffer-file-name))) - (setq categorizer-old-line (line-number-at-pos)) - (evil-goto-first-line) - (org-set-property "CATEGORY" (substring (string-trim-left (expand-file-name (buffer-file-name)) (concat "/home/" user-username "/Org/")) 0 (string-match "/" (string-trim-left (expand-file-name (buffer-file-name)) (concat "/home/" user-username "/Org/"))))) - (evil-goto-line categorizer-old-line) - ) - ) -) - -(add-hook 'after-save-hook 'org-categorize-by-roam-db-on-save) - -;; Function to be run when org-agenda is opened -(defun org-agenda-open-hook () - "Hook to be run when org-agenda is opened" - (olivetti-mode)) - -;; Adds hook to org agenda mode, making follow mode active in org agenda -(add-hook 'org-agenda-mode-hook 'org-agenda-open-hook) - -;; Easy refreshes on org agenda for syncthing file changes -;; adapted from https://www.reddit.com/r/orgmode/comments/mu6n5b/org_agenda_auto_updating/ -;; and https://lists.gnu.org/archive/html/help-gnu-emacs/2008-12/msg00435.html -(defadvice org-agenda-list (before refresh-org-agenda-on-revert activate) - (mapc (lambda (file) - (unless (verify-visited-file-modtime (get-file-buffer file)) - (with-current-buffer (get-file-buffer file) - (when (eq major-mode 'org-mode) - (revert-buffer nil 'noconfirm))))) - (org-agenda-files))) -(defadvice org-agenda-redo (before refresh-org-agenda-on-revert activate) - (mapc (lambda (file) - (unless (verify-visited-file-modtime (get-file-buffer file)) - (with-current-buffer (get-file-buffer file) - (when (eq major-mode 'org-mode) - (revert-buffer nil 'noconfirm))))) - (org-agenda-files))) -(defadvice org-agenda-redo-all (before refresh-org-agenda-on-revert activate) - (mapc (lambda (file) - (unless (verify-visited-file-modtime (get-file-buffer file)) - (with-current-buffer (get-file-buffer file) - (when (eq major-mode 'org-mode) - (revert-buffer nil 'noconfirm))))) - (org-agenda-files))) - -;; Function to list all my available org agenda files and switch to them -(defun list-and-switch-to-agenda-file () - "Lists all available agenda files and switches to desired one" - (interactive) - (setq full-agenda-file-list nil) - (setq choice (completing-read "Select agenda file:" org-agenda-files nil t)) - (find-file choice)) - -(map! :leader - :desc "Switch to specific org agenda file" - "o a s" 'list-and-switch-to-agenda-file) - -(defun org-agenda-switch-with-roam () - "Switches to org roam node file and database from org agenda view" - (interactive) - (org-agenda-switch-to) - (if (f-exists-p (concat (dir!) "/org-roam.db")) - (org-roam-switch-db (replace-regexp-in-string (concat "\\/home\\/" user-username "\\/Org\\/") "" (f-parent (dir!))) t)) - (if (f-exists-p (concat (f-parent (dir!)) "/org-roam.db")) - (org-roam-switch-db (replace-regexp-in-string (concat "\\/home\\/" user-username "\\/Org\\/") "" (f-parent (f-parent (dir!)))) t)) - (org-roam-olivetti-mode) -) - -(map! - :map evil-org-agenda-mode-map - :after org-agenda - :nvmeg "" #'org-agenda-switch-with-roam - :nvmeg "" #'org-agenda-switch-with-roam) -(map! - :map org-agenda-mode-map - :after org-agenda - :nvmeg "" #'org-agenda-switch-with-roam - :nvmeg "" #'org-agenda-switch-with-roam) - -(require 'org-super-agenda) - -(setq org-super-agenda-groups - '(;; Each group has an implicit boolean OR operator between its selectors. - (:name " Overdue " ; Optionally specify section name - :scheduled past - :order 2 - :face 'error) - - (:name "Personal " - :and(:file-path "Personal.p" :not (:tag "event")) - :order 3) - - (:name "Family " - :and(:file-path "Family.s" :not (:tag "event")) - :order 3) - - (:name "Teaching " - :and(:file-path "Teaching.p" :not (:tag "event")) - :order 3) - - (:name "Gamedev " - :and(:file-path "Gamedev.s" :not (:tag "event")) - :order 3) - - (:name "Youtube " - :and(:file-path "Producer.p" :not (:tag "event")) - :order 3) - - (:name "Music " - :and(:file-path "Bard.p" :not (:tag "event")) - :order 3) - - (:name "Storywriting " - :and(:file-path "Stories.s" :not (:tag "event")) - :order 3) - - (:name "Writing " - :and(:file-path "Author.p" :not (:tag "event")) - :order 3) - - (:name "Learning " - :and(:file-path "Knowledge.p" :not (:tag "event")) - :order 3) - - (:name " Today " ; Optionally specify section name - :time-grid t - :date today - :scheduled today - :order 1 - :face 'warning) - -)) - -(org-super-agenda-mode t) - -(map! :desc "Next line" - :map org-super-agenda-header-map - "j" 'org-agenda-next-line) - -(map! :desc "Next line" - :map org-super-agenda-header-map - "k" 'org-agenda-previous-line) - -(require 'calfw) -(require 'calfw-org) -(setq cfw:org-agenda-schedule-args '(:timestamp)) - -(map! :leader :desc "Open org calendar" - "O c" 'cfw:open-org-calendar) - -;;;------ magit configuration ------;;; -;; Need the following two blocks to make magit work with git bare repos -(require 'magit-todos) -(setq magit-todos-keywords-list '("TODO" "FIXME" "HACK" "REVIEW" "DEPRECATED" "BUG")) -(magit-todos-mode 1) - -(add-load-path! "~/.emacs.d/magit-file-icons") -(require 'magit-file-icons) -(setq magit-file-icons-icon-for-file-func 'all-the-icons-icon-for-file) -(setq magit-file-icons-icon-for-dir-func 'all-the-icons-icon-for-dir) -(magit-file-icons-mode 1) - -(require 'all-the-icons-ibuffer) -(add-hook 'ibuffer-mode-hook #'all-the-icons-ibuffer-mode) -(setq all-the-icons-ibuffer-color-icon t) -(evil-set-initial-state 'ibuffer-mode 'normal) - -;;;------ dired configuration ------;;; - -(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) -(setq all-the-icons-dired-monochrome nil) - -(map! :desc "Increase font size" - "C-=" 'text-scale-increase - - :desc "Decrease font size" - "C--" 'text-scale-decrease - - :desc "Jump to dired" - "M-f" 'dired-jump -) - -;;;------ ranger configuration ------;;; - -(map! :map ranger-mode-map - :desc "Mark current file" - "m" 'ranger-mark - - :desc "Toggle mark on current file" - "x" 'ranger-toggle-mark -) - -;;;-- hledger-mode configuration ;;;-- - -;;; Basic configuration -(require 'hledger-mode) - -;; To open files with .journal extension in hledger-mode -(add-to-list 'auto-mode-alist '("\\.journal\\'" . hledger-mode)) - -;; The default journal location is too opinionated. -(setq hledger-jfile (concat user-home-directory "/Org/Family.s/Notes/hledger.journal")) - -;;; Auto-completion for account names -;; For company-mode users: -(add-to-list 'company-backends 'hledger-company) - -(evil-define-key* 'normal hledger-view-mode-map "q" 'kill-current-buffer) -(evil-define-key* 'normal hledger-view-mode-map "[" 'hledger-prev-report) -(evil-define-key* 'normal hledger-view-mode-map "]" 'hledger-next-report) - -(map! :leader - :prefix ("l" . "hledger") - :desc "Exec hledger command" - "c" 'hledger-run-command - - :desc "Generate hledger balancesheet" - "b" 'hledger-balancesheet* - - :desc "Generate hledger daily report" - "d" 'hledger-daily-report*) - -(map! :localleader - :map hledger-mode-map - - :desc "Reschedule transaction at point" - "d s" 'hledger-reschedule - - :desc "Edit amount at point" - "t a" 'hledger-edit-amount) - -(require 'focus) - -(map! :leader - :prefix ("F" . "Focus mode") - :desc "Toggle focus mode" - "t" 'focus-mode - - :desc "Pin focused section" - "p" 'focus-pin - - :desc "Unpin focused section" - "u" 'focus-unpin) - -(add-to-list 'focus-mode-to-thing '(org-mode . org-element)) -(add-to-list 'focus-mode-to-thing '(python-mode . paragraph)) -(add-to-list 'focus-mode-to-thing '(lisp-mode . paragraph)) - -;(add-hook 'org-mode-hook #'focus-mode) - -;;;------ helpful configuration ------;;; - -(evil-set-initial-state 'helpful-mode 'normal) -(evil-define-key 'normal helpful-mode-map - "j" 'evil-next-visual-line - "k" 'evil-previous-visual-line - "q" 'helpful-kill-buffers) - -;;;------ helpful configuration ------;;; -(add-load-path! "~/.nix-profile/share/emacs/site-lisp/elpa/mu4e-1.12.2") -(require 'mu4e) -(require 'mu4e-contrib) -(require 'mu4e-actions) - -(after! mu4e - (setq mu4e-modeline-support nil) - (setq mu4e-sent-folder (lambda (msg) (concat "/" (nth 1 (split-string (mu4e-message-field msg :maildir) "/" )) "/Sent"))) - (setq mu4e-drafts-folder (lambda (msg) (concat "/" user-mail-address "/Drafts"))) - (setq mu4e-trash-folder (lambda (msg) (concat "/" (nth 1 (split-string (mu4e-message-field msg :maildir) "/" )) "/Trash"))) - (setq mu4e-refile-folder (lambda (msg) (concat "/" (nth 1 (split-string (mu4e-message-field msg :maildir) "/" )) "/Folders/" (completing-read "Refile msg to: " (directory-files (concat "~/.mail/" (nth 1 (split-string (mu4e-message-field msg :maildir) "/" )) "/Folders")))))) - - (setq mu4e-index-lazy-check t) - (setq mu4e-index-cleanup t) - (setq mu4e-update-interval 120) - (mu4e-alert-enable-notifications) - - (define-key mu4e-main-mode-map (kbd "") #'doom/leader) - (define-key mu4e-headers-mode-map (kbd "") #'doom/leader) - (define-key mu4e-view-mode-map (kbd "") #'doom/leader) - - (define-key mu4e-main-mode-map (kbd "g g") #'evil-goto-first-line) - (define-key mu4e-main-mode-map (kbd "G") #'evil-goto-line) - (define-key mu4e-main-mode-map (kbd "h") #'evil-backward-char) - (define-key mu4e-main-mode-map (kbd "l") #'evil-forward-char) - (define-key mu4e-main-mode-map (kbd "w") #'evil-forward-word-begin) - - (unbind-key "g" mu4e-headers-mode-map) - (define-key mu4e-headers-mode-map (kbd "g g") #'evil-goto-first-line) - (define-key mu4e-headers-mode-map (kbd "G") #'evil-goto-line) - (define-key mu4e-headers-mode-map (kbd "h") #'evil-backward-char) - (define-key mu4e-headers-mode-map (kbd "l") #'evil-forward-char) - (define-key mu4e-headers-mode-map (kbd "w") #'evil-forward-word-begin) - - (unbind-key "g" mu4e-view-mode-map) - (define-key mu4e-view-mode-map (kbd "g g") #'evil-goto-first-line) - (define-key mu4e-view-mode-map (kbd "G") #'evil-goto-line) - (define-key mu4e-view-mode-map (kbd "h") #'evil-backward-char) - (define-key mu4e-view-mode-map (kbd "l") #'evil-forward-char) - (define-key mu4e-view-mode-map (kbd "w") #'evil-forward-word-begin) - - (map! :map 'mu4e-main-mode-map :desc "Jump to maildir" :ge "J" #'mu4e-search-maildir) - (map! :map 'mu4e-main-mode-map :desc "Next line" :ge "j" #'evil-next-visual-line) - (map! :map 'mu4e-main-mode-map :desc "Prev line" :ge "k" #'evil-previous-visual-line) - - (map! :map 'mu4e-headers-mode-map :desc "Jump to maildir" :ge "J" #'mu4e-search-maildir) - (map! :map 'mu4e-headers-mode-map :desc "Next line" :ge "j" #'evil-next-visual-line) - (map! :map 'mu4e-headers-mode-map :desc "Prev line" :ge "k" #'evil-previous-visual-line) - (map! :map 'mu4e-headers-mode-map :desc "Next char" :ge "l" #'evil-forward-char) - (map! :map 'mu4e-headers-mode-map :desc "Update mail and index" :ge "U" #'mu4e-update-mail-and-index) - (map! :map 'mu4e-headers-mode-map :desc "Compose reply" :ge "r" #'mu4e-compose-reply) - (map! :map 'mu4e-headers-mode-map :desc "Archive message" :ge "e" #'mu4e-headers-mark-for-refile) - - (map! :map 'mu4e-view-mode-map :desc "Jump to maildir" :ge "J" #'mu4e-search-maildir) - (map! :map 'mu4e-view-mode-map :desc "Next line" :ge "j" #'evil-next-visual-line) - (map! :map 'mu4e-view-mode-map :desc "Prev line" :ge "k" #'evil-previous-visual-line) - (map! :map 'mu4e-view-mode-map :desc "Update mail and index" :ge "U" #'mu4e-update-mail-and-index) - (map! :map 'mu4e-view-mode-map :desc "Compose reply" :ge "r" #'mu4e-compose-reply) - (map! :map 'mu4e-view-mode-map :desc "Archive message" :ge "e" #'mu4e-view-mark-for-refile) - - (add-to-list 'mu4e-header-info-custom - '(:maildir-folder-no-account . - ( :name "Maildir folder without account" ;; long name, as seen in the message-view - :shortname "Folder" ;; short name, as seen in the headers view - :help "Name of the subfolder without the maildir" ;; tooltip - :function (lambda (msg) (substring (mu4e-message-field msg :maildir) (+ 2 (length (nth 1 (split-string (mu4e-message-field msg :maildir) "/" ))))))))) - (add-to-list 'mu4e-bookmarks - '( :name "Unified inbox" - :query "maildir://.*/INBOX/" - :key ?i)) - (setq mu4e-headers-fields - '((:account-stripe . 1) - (:account . 25) - (:human-date . 12) - (:flags . 6) - (:from-or-to . 20) - (:maildir-folder-no-account . 30) - (:subject))) - - (add-hook 'mu4e-compose-mode-hook #'(lambda () (auto-save-mode -1))) - (setq mu4e-sent-messages-behavior 'delete) - - (setq sendmail-program "~/.nix-profile/bin/msmtp") - (setq send-mail-function 'smtpmail-send-it) - (setq message-sendmail-f-is-evil t) - (setq message-sendmail-extra-arguments '("--read-envelope-from")) - (setq message-send-mail-function 'message-send-mail-with-sendmail) - (if (file-exists-p "~/.emacs.d/mu4e-private.el") (load! "~/.emacs.d/mu4e-private.el")) - - ;; https://emacs.stackexchange.com/questions/3061/how-to-stop-mu4e-from-inserting-line-breaks - (defun no-auto-fill () - "Turn off auto-fill-mode." - (auto-fill-mode -1)) - - (defun no-org-msg-mode () - "Disable org-msg-mode since it doesn't respect multiline emails" - (org-msg-mode 0)) - - (add-hook 'mu4e-compose-mode-hook #'no-auto-fill) - (add-hook 'mu4e-compose-pre-hook #'no-org-msg-mode) - - (mu4e--start) ;; start mu4e silently - -) - -;;;-- Load emacs direnv;;;-- -(require 'direnv) -(direnv-mode) - -;;;-- projectile wrapper commands ;;;-- -(defun projectile-goto-project () - (interactive) - (projectile-switch-project t) - ;;(neotree-dir (projectile-project-root)) -) - -(map! :leader - :desc "Open project" - "p p" #'projectile-goto-project) -(map! :leader - :desc "Projectile commander" - "p @" #'projectile-commander) -(map! :leader - :desc "Projectile grep" - "/" #'projectile-grep) -(after! projectile (put 'projectile-grep 'disabled nil)) - -;;;-- projectile wrapper commands ;;;-- -(require 'sudo-edit) -(setq sudo-edit-local-method "doas") - -(map! :leader - :desc "Open current file as root" - "f U" #'sudo-edit-current-file) -(map! :leader - :desc "Find a file and open as root" - "f u" #'sudo-edit-find-file) - -;;;-- LSP stuff ;;;-- -(require 'lsp-mode) -(require 'nix-mode) -(require 'gdscript-mode) - -(add-hook 'nix-mode-hook 'lsp-deferred) -(add-hook 'gdscript-mode-hook 'lsp-deferred) - -(setq gdscript-godot-executable "godot4") - -(setq lsp-java-workspace-dir (concat user-home-directory "/.local/share/doom/java-workspace")) - -(setq lsp-treemacs-deps-position-params - '((side . right) - (slot . 1) - (window-width . 35))) - -(setq lsp-treemacs-symbols-position-params -'((side . right) - (slot . 2) - (window-width . 35))) - -(map! :leader :desc "Open treemacs symbol outliner" "o s" #'lsp-treemacs-symbols - :desc "Hide neotree" "o S" #'treemacs-quit) - -(setq +format-on-save-enabled-modes '(not emacs-lisp-mode sql-mode tex-mode latex-mode org-msg-edit-mode nix-mode)) - -(defun lsp-booster--advice-json-parse (old-fn &rest args) - "Try to parse bytecode instead of json." - (or - (when (equal (following-char) ?#) - (let ((bytecode (read (current-buffer)))) - (when (byte-code-function-p bytecode) - (funcall bytecode)))) - (apply old-fn args))) -(advice-add (if (progn (require 'json) - (fboundp 'json-parse-buffer)) - 'json-parse-buffer - 'json-read) - :around - #'lsp-booster--advice-json-parse) - -(defun lsp-booster--advice-final-command (old-fn cmd &optional test?) - "Prepend emacs-lsp-booster command to lsp CMD." - (let ((orig-result (funcall old-fn cmd test?))) - (if (and (not test?) ;; for check lsp-server-present? - (not (file-remote-p default-directory)) ;; see lsp-resolve-final-command, it would add extra shell wrapper - lsp-use-plists - (not (functionp 'json-rpc-connection)) ;; native json-rpc - (executable-find "emacs-lsp-booster")) - (progn - (when-let ((command-from-exec-path (executable-find (car orig-result)))) ;; resolve command from exec-path (in case not found in $PATH) - (setcar orig-result command-from-exec-path)) - (message "Using emacs-lsp-booster for %s!" orig-result) - (cons "emacs-lsp-booster" orig-result)) - orig-result))) -(advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command) - -(map! :leader :desc "Find definition using lsp" "L d" #'lsp-find-definition) - -;; devdocs are cool -(require 'devdocs) - -(map! :leader :desc "Peruse devdocs" "L p" #'devdocs-peruse) - -(add-to-list 'tramp-remote-path 'tramp-own-remote-path) -(after! vterm - (add-to-list 'vterm-tramp-shells '("ssh" "zsh")) ;; I use zsh on all my servers -) - -;; I source my rss from my freshrss instance -;; I login with a private elisp file: ~/.emacs.d/freshrss-elfeed.el -;; freshrss-elfeed.el looks like this: -;;(elfeed-protocol-enable) -;;(setq elfeed-use-curl t) -;;(setq elfeed-set-timeout 36000) -;;(setq elfeed-log-level 'debug) -;;(setq freshrss-hostname "https://freshrss.example.com") -;;(setq elfeed-feeds (list -;; (list "fever+https://user@freshrss.example.com" -;; :api-url "https://user@freshrss.example.com/api/fever.php" -;; :password "mYsUpErCoMpLiCaTeDp@s$w0rD")))) -;;(setq main-elfeed-feed "https://user@freshrss.example.com/api/fever.php") - -(if (file-exists-p "~/.emacs.d/freshrss-elfeed.el") (load! "~/.emacs.d/freshrss-elfeed.el")) -(setq elfeed-search-filter "@6-months-ago +unread") -(setq browse-url-chromium-program "mpv") -(setq browse-url-chrome-program "mpv") -(setq browse-url-handlers '(("youtube.com" . browse-url-chrome) - ("youtu.be" . browse-url-chrome) - ("odcyn.com" . browse-url-chrome) - ("odysee.com" . browse-url-chrome) - ("tilvids.com" . browse-url-chrome))) -(map! :leader :desc "Open elfeed" "O n" #'elfeed) -(map! :map 'elfeed-search-mode-map :desc "Open url" :n "g o" #'elfeed-search-browse-url) - -(defun elfeed-full-update () - (interactive) - (elfeed-search-update--force) - (cl-loop for entry in elfeed-search-entries - do (elfeed-untag-1 entry 'unread)) - (elfeed-protocol-fever-reinit freshrss-hostname) - (elfeed-update)) - -(add-hook 'elfeed-search-mode-hook 'elfeed-full-update) -(add-hook 'elfeed-search-update-hook (lambda () (goto-char (point-min)))) diff --git a/user/app/doom-emacs/doom.nix b/user/app/doom-emacs/doom.nix deleted file mode 100644 index dde3ddf..0000000 --- a/user/app/doom-emacs/doom.nix +++ /dev/null @@ -1,148 +0,0 @@ -{ config, lib, pkgs, pkgs-emacs, pkgs-stable, inputs, userSettings, systemSettings, ... }: -let - themePolarity = lib.removeSuffix "\n" (builtins.readFile (./. + "../../../../themes"+("/"+userSettings.theme)+"/polarity.txt")); - dashboardLogo = ./. + "/nix-" + themePolarity + ".webp"; -in -{ - imports = [ - inputs.nix-doom-emacs.hmModule - ../git/git.nix - ../../shell/sh.nix - ../../shell/cli-collection.nix - ]; - - programs.doom-emacs = { - enable = true; - emacsPackage = pkgs-emacs.emacs29-pgtk; - doomPrivateDir = ./.; - # This block from https://github.com/znewman01/dotfiles/blob/be9f3a24c517a4ff345f213bf1cf7633713c9278/emacs/default.nix#L12-L34 - # Only init/packages so we only rebuild when those change. - doomPackageDir = let - filteredPath = builtins.path { - path = ./.; - name = "doom-private-dir-filtered"; - filter = path: type: - builtins.elem (baseNameOf path) [ "init.el" "packages.el" ]; - }; - in pkgs-emacs.linkFarm "doom-packages-dir" [ - { - name = "init.el"; - path = "${filteredPath}/init.el"; - } - { - name = "packages.el"; - path = "${filteredPath}/packages.el"; - } - { - name = "config.el"; - path = pkgs-emacs.emptyFile; - } - ]; - # End block - }; - - home.file.".emacs.d/themes/doom-stylix-theme.el".source = config.lib.stylix.colors { - template = builtins.readFile ./themes/doom-stylix-theme.el.mustache; - extension = ".el"; - }; - - home.packages = (with pkgs-emacs; [ - emacs-lsp-booster - file - wmctrl - jshon - aria - hledger - hunspell hunspellDicts.en_US-large - (pkgs-emacs.mu.override { emacs = emacs29-pgtk; }) - (pkgs.callPackage ./pkgs/org-analyzer.nix {}) - emacsPackages.mu4e - isync - msmtp - (python3.withPackages (p: with p; [ - pandas - requests - epc lxml - pysocks - pymupdf - markdown - ])) - ]) ++ (with pkgs-stable; [ - nodejs - nodePackages.mermaid-cli - ]) ++ (with pkgs; [ - openssl - stunnel - ]); - - services.mbsync = { - enable = true; - package = pkgs-stable.isync; - frequency = "*:0/5"; - }; - - home.file.".emacs.d/org-yaap" = { - source = "${inputs.org-yaap}"; - recursive = true; - }; - - home.file.".emacs.d/org-side-tree" = { - source = "${inputs.org-side-tree}"; - recursive = true; - }; - - home.file.".emacs.d/org-timeblock" = { - source = "${inputs.org-timeblock}"; - recursive = true; - }; - - home.file.".emacs.d/org-nursery" = { - source = "${inputs.org-nursery}"; - }; - - home.file.".emacs.d/org-krita" = { - source = "${inputs.org-krita}"; - }; - - home.file.".emacs.d/org-xournalpp" = { - source = "${inputs.org-xournalpp}"; - }; - - home.file.".emacs.d/org-sliced-images" = { - source = "${inputs.org-sliced-images}"; - }; - - home.file.".emacs.d/magit-file-icons" = { - source = "${inputs.magit-file-icons}"; - }; - - home.file.".emacs.d/dashboard-logo.webp".source = dashboardLogo; - home.file.".emacs.d/scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh" = { - source = ./scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh; - executable = true; - }; - - home.file.".emacs.d/phscroll" = { - source = "${inputs.phscroll}"; - }; - - home.file.".emacs.d/mini-frame" = { - source = "${inputs.mini-frame}"; - }; - - home.file.".emacs.d/system-vars.el".text = '' - ;;; ~/.emacs.d/config.el -*- lexical-binding: t; -*- - - ;; Import relevant variables from flake into emacs - - (setq user-full-name "''+userSettings.name+''") ; name - (setq user-username "''+userSettings.username+''") ; username - (setq user-mail-address "''+userSettings.email+''") ; email - (setq user-home-directory "/home/''+userSettings.username+''") ; absolute path to home directory as string - (setq user-default-roam-dir "''+userSettings.defaultRoamDir+''") ; absolute path to home directory as string - (setq system-nix-profile "''+systemSettings.profile+''") ; what profile am I using? - (setq system-wm-type "''+userSettings.wmType+''") ; wayland or x11? - (setq doom-font (font-spec :family "''+userSettings.font+''" :size 20)) ; import font - (setq dotfiles-dir "''+userSettings.dotfilesDir+''") ; import location of dotfiles directory - ''; -} diff --git a/user/app/doom-emacs/doom.org b/user/app/doom-emacs/doom.org deleted file mode 100644 index 3f9087f..0000000 --- a/user/app/doom-emacs/doom.org +++ /dev/null @@ -1,2330 +0,0 @@ -#+TITLE: Doom Emacs Literate Config -#+AUTHOR: Emmet -# FIXME doom emacs config -* Table of Contents :TOC:QUOTE: -#+BEGIN_QUOTE -- [[#what-is-doom-emacs][What is Doom Emacs?]] -- [[#configuration-for-doom-emacs][Configuration for Doom Emacs]] -- [[#my-configel][My config.el]] - - [[#preamble--user-configuration][Preamble + User Configuration]] - - [[#registers][Registers]] - - [[#org-mode-configuration][Org Mode Configuration]] - - [[#org-roam-configuration][Org Roam Configuration]] - - [[#org-agenda-configuration][Org Agenda Configuration]] - - [[#magit-configuration][Magit Configuration]] - - [[#ibuffer-configuration][Ibuffer Configuration]] - - [[#dired-configuration][Dired Configuration]] - - [[#ranger-configuration][Ranger Configuration]] - - [[#hledger-mode-configuration][hledger-mode Configuration]] - - [[#no-tab-bar-configuration][NO Tab Bar Configuration]] - - [[#focus-mode-configuration][Focus Mode Configuration]] - - [[#helpful-mode-configuration][Helpful Mode Configuration]] - - [[#mu4e-configuration][mu4e Configuration]] - - [[#direnv][Direnv]] - - [[#projectile][Projectile]] - - [[#sudo-edit][sudo-edit]] - - [[#lsp][LSP]] - - [[#devdocs][DevDocs]] - - [[#terminal][Terminal]] - - [[#elfeed][Elfeed]] -- [[#my-initel][My init.el]] -- [[#my-packagesel][My packages.el]] -- [[#nix-integration][Nix Integration]] -#+END_QUOTE - -* What is Doom Emacs? -[[https://github.com/doomemacs/doomemacs][Doom Emacs]] is a distribution of the [[https://www.gnu.org/software/emacs/][Emacs Text Editor]] designed for [[https://www.vim.org/][Vim]] users. I like to use Emacs due to its extensibility and extra features it is capable of (besides text editing). Some of these extra features include: -- [[https://orgmode.org/][Org Mode]] (Hierarchical text-based document format) -- [[https://www.orgroam.com/][Org Roam]] (A second brain / personal wiki) -- [[https://orgmode.org/][Org Agenda]] (Calendar and todo list) -- [[https://magit.vc/][Magit]] (Git Client) - -I have found Emacs to be incredibly efficient, and transferring my workflow to fit inside of Emacs has allowed me to get much more work done. I primarily use Emacs for writing, note-taking, task/project management and organizing information. - -* Configuration for Doom Emacs -Doom Emacs is configured via 3 main files, written in Elisp, a dialect of the Lisp programming language designed for Emacs. These 3 main files are: -- [[./config.el][config.el]] - Stores your main configuration and allows to set user variables. -- [[./init.el][init.el]] - Allows quick downloads of groups of Emacs packages. These groups of Emacs packages are curated by the Doom Emacs developers. -- [[./packages.el][packages.el]] - Allows you to download additional packages from Melpa (Emacs package manager). - -By storing your configuration in these 3 files, it allows for quick reproducible builds of Doom Emacs. - -You can also load separate files inside of [[./config.el][config.el]] via the =load!= function, like so: - -#+BEGIN_SRC emacs-lisp -(load! "~/.doom.d/private.el") -#+END_SRC - -This can be used to load private config file with non-public information, or can be used to create modular configuration. - -Doom Emacs is traditionally installed by cloning the repository ([[https://github.com/doomemacs/doomemacs][https://github.com/doomemacs/doomemacs]]) and running =./bin/doom install=. I instead install Doom Emacs via Nix Doom Emacs ([[https://github.com/nix-community/nix-doom-emacs][https://github.com/nix-community/nix-doom-emacs]]), which packages Doom Emacs as a Nix derivation. The advantage to this is that I get more reproducibility and the ability to rollback updates (if anything breaks), but the downside is that any time Emacs packages are changed/updated, the entire derivation must be rebuilt from scratch (this is often time-consuming). I load this as a Nix derivation in my flake using the [[./doom.nix][doom.nix]] module. - -* My config.el -** Preamble + User Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- - -;;;------ User configuration ------;;; -(setq use-package-always-defer t) - -;; Import relevant system variables from flake (see doom.nix) -;; includes variables like user-full-name, user-username, user-home-directory, user-email-address, doom-font, -;; and a few other custom variables I use later -(load! "~/.emacs.d/system-vars.el") -;; custom variables include: -;; dotfiles-dir, absolute path to home directory -;; user-default-roam-dir, name of default org-roam directory for the machine (relative to ~/Org) -;; system-nix-profile, profile selected from my dotfiles ("personal" "work" "wsl" etc...) -;; system-wm-type, wayland or x11? only should be considered if system-nix-profile is "personal" or "work" - -;; I prefer visual lines -(setq display-line-numbers-type 'visual - line-move-visual t) -(use-package-hook! evil - :pre-init - (setq evil-respect-visual-line-mode t) ;; sane j and k behavior - t) - -;; I also like evil mode visual movement -(map! :map evil-normal-state-map - :desc "Move to next visual line" - "j" 'evil-next-visual-line - :desc "Move to previous visual line" - "k" 'evil-previous-visual-line) - -;; Theme -(setq custom-theme-directory "~/.emacs.d/themes") -(setq doom-theme 'doom-stylix) -;; +unicode-init-fonts-h often errors out -(remove-hook 'doom-init-ui-hook '+unicode-init-fonts-h) - -;; Transparent background -(if (string= system-nix-profile "wsl") - ;; Can't be that tranparent under wsl because no blur - (funcall (lambda () - (set-frame-parameter nil 'alpha-background 98) - (add-to-list 'default-frame-alist '(alpha-background . 98)) - )) - ;; On Linux I can enable blur, however - (funcall (lambda () - (set-frame-parameter nil 'alpha-background 85) - (add-to-list 'default-frame-alist '(alpha-background . 85)) - )) -) - -(add-to-list 'default-frame-alist '(inhibit-double-buffering . t)) - -;; Icons in completion buffers -(add-hook 'marginalia-mode-hook #'all-the-icons-completion-marginalia-setup) -(all-the-icons-completion-mode) - -;; Grammar tasing should be voluntary -(setq writegood-mode nil) - -;; Beacon shows where the cursor is, even when fast scrolling -(setq beacon-mode t) - -(setq company-idle-delay 0.05) - -;; Quicker window management keybindings -(bind-key* "C-j" #'evil-window-down) -(bind-key* "C-k" #'evil-window-up) -(bind-key* "C-h" #'evil-window-left) -(bind-key* "C-l" #'evil-window-right) -(bind-key* "C-q" #'evil-window-delete) -(bind-key* "M-q" #'kill-current-buffer) -(bind-key* "M-w" #'+workspace/close-window-or-workspace) -(bind-key* "M-n" #'next-buffer) -(bind-key* "M-p" #'previous-buffer) -(bind-key* "M-z" #'+vterm/toggle) -(bind-key* "M-e" #'+eshell/toggle) -(bind-key* (kbd "M-") #'+vterm/here) -(bind-key* (kbd "M-E") #'+eshell/here) - -;; Buffer management -(bind-key* "" #'next-buffer) -(bind-key* "" #'previous-buffer) - -;; Disables custom.el -(setq custom-file null-device) - -;; emacs-dashboard setup -(require 'all-the-icons) -(require 'dashboard) -(setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*")) - doom-fallback-buffer-name "*dashboard*") -(setq image-scaling-factor 1) - -;; emacs-dashboard variables -(setq dashboard-banner-logo-title "Welcome to Nix Doom Emacs") -(setq dashboard-startup-banner "~/.emacs.d/dashboard-logo.webp") -(setq dashboard-icon-type 'all-the-icons) ;; use `all-the-icons' package -(setq dashboard-set-heading-icons t) -(setq dashboard-set-file-icons t) -(setq dashboard-set-navigator t) -(setq dashboard-items '()) -(setq dashboard-center-content t) -(setq dashboard-footer-messages '("Here to do customizing, or actual work?" - "M-x insert-inspiring-message" - "My software never has bugs. It just develops random features." - "Dad, what are clouds made of? Linux servers, mostly." - "There is no place like ~" - "~ sweet ~" - "sudo chown -R us ./allyourbase" - "I’ll tell you a DNS joke but it could take 24 hours for everyone to get it." - "I'd tell you a UDP joke, but you might not get it." - "I'll tell you a TCP joke. Do you want to hear it?")) - -;; Remove basic evil input and cursors from dashboard -(defun disable-cursor() - (setq-local evil-normal-state-cursor '(bar . 0)) - (hl-line-mode -1) -) -(add-hook 'dashboard-mode-hook 'disable-cursor) -(evil-define-key 'normal dashboard-mode-map - "j" 'evil-normal-state - "k" 'evil-normal-state - "h" 'evil-normal-state - "l" 'evil-normal-state) -(setq dashboard-navigator-buttons - `(;; line1 - ( (,"Roam" "" "" (lambda (&rest _)) 'org-formula) - (,(all-the-icons-octicon "globe" :height 1.0 :v-adjust 0.0) - "Notes overview" "" (lambda (&rest _) (org-roam-default-overview)) 'org-formula) - (,(all-the-icons-fileicon "org" :height 1.0 :v-adjust 0.0) - "Switch roam db" "" (lambda (&rest _) (org-roam-switch-db)) 'org-formula) - ) - ;; line 2 - ( (,"Git" "" "" (lambda (&rest _)) 'diredfl-exec-priv) - (,(all-the-icons-octicon "mark-github" :height 1.0 :v-adjust 0.0) - "GitHub" "" (lambda (&rest _) (browse-url "https://github.com/librephoenix")) 'diredfl-exec-priv) - (,(all-the-icons-faicon "gitlab" :height 1.0 :v-adjust 0.0) - "GitLab" "" (lambda (&rest _) (browse-url "https://gitlab.com/librephoenix")) 'diredfl-exec-priv) - (,(all-the-icons-faicon "coffee" :height 1.0 :v-adjust 0.0) - "Gitea" "" (lambda (&rest _) (browse-url my-gitea-domain)) 'diredfl-exec-priv) - (,(all-the-icons-octicon "triangle-up" :height 1.2 :v-adjust -0.1) - "Codeberg" "" (lambda (&rest _) (browse-url "https://codeberg.org/librephoenix")) 'diredfl-exec-priv) - ) - ;; line 3 - ( (,"Agenda" "" "" (lambda (&rest _)) 'dired-warning) - (,(all-the-icons-octicon "checklist" :height 1.0 :v-adjust 0.0) - "Agenda todos" "" (lambda (&rest _) (org-agenda-list)) 'dired-warning) - (,(all-the-icons-octicon "calendar" :height 1.0 :v-adjust 0.0) - "Agenda calendar" "" (lambda (&rest _) (cfw:open-org-calendar)) 'dired-warning) - ) - ;; line 4 - ( (,"Config" "" "" (lambda (&rest _)) 'dired-mark) - (,(all-the-icons-faicon "cogs" :height 1.0 :v-adjust 0.0) - "System config" "" (lambda (&rest _) (projectile-switch-project-by-name "~/.dotfiles" t)) 'dired-mark) - (,(all-the-icons-material "help" :height 1.0 :v-adjust -0.2) - "Doom documentation" "" (lambda (&rest _) (doom/help)) 'dired-mark) - ))) - -(setq dashboard-footer-icon - (all-the-icons-faicon "list-alt" - :height 1.0 - :v-adjust -0.15 - :face 'font-lock-keyword-face)) -(dashboard-setup-startup-hook) - -(map! :leader :desc "Open dashboard" "b b" #'dashboard-refresh-buffer) - -(setq scroll-conservatively 101) - -;; Smooth scrolling -;; requires good-scroll.el -;;(good-scroll-mode 1) -;;(setq good-scroll-duration 0.4 -;; good-scroll-step 270 -;; good-scroll-render-rate 0.03) -;; -;;(global-set-key (kbd "") #'good-scroll-up-full-screen) -;;(global-set-key (kbd "") #'good-scroll-down-full-screen) - -(setq scroll-margin 30) -(setq hscroll-margin 10) - -;; Requires for faster loading -(require 'org-agenda) -(require 'dired) - -;; Garbage collection to speed things up -(add-hook 'after-init-hook - #'(lambda () - (setq gc-cons-threshold (* 100 1024 1024)))) -(add-hook 'focus-out-hook 'garbage-collect) -(run-with-idle-timer 5 t 'garbage-collect) - -;; Enable autorevert globally so that buffers update when files change on disk. -;; Very useful when used with file syncing (i.e. syncthing) -(setq global-auto-revert-mode nil) -(setq auto-revert-use-notify t) - -;; Neotree fun -(defun neotree-snipe-dir () - (interactive) - (if (projectile-project-root) - (neotree-dir (projectile-project-root)) - (neotree-dir (file-name-directory (file-truename (buffer-name)))) - ) -) - -(map! :leader :desc "Open neotree here" "o n" #'neotree-snipe-dir - :desc "Hide neotree" "o N" #'neotree-hide) - -;; For camelCase -(global-subword-mode 1) - -;; ripgrep as grep -(setq grep-command "rg -nS --no-heading " - grep-use-null-device nil) - -;; Mini-frames ;; cool but kinda suboptimal atm -;(add-load-path! "~/.emacs.d/mini-frame") -;(require 'mini-frame) -;(setq mini-frame-ignore-commands '(evil-ex-search-forward helpful-variable helpful-callable)) -;(setq mini-frame-show-parameters -; '((left . 216) -; (top . 240) -; (width . 0.78) -; (height . 20) -; (alpha-background . 90)) -;) -;(setq mini-frame-detach-on-hide nil) -;(setq mini-frame-resize t) -;(setq resize-mini-frames t) -;(setq mini-frame-standalone nil) -;(mini-frame-mode 1) - -#+END_SRC -** Registers -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ Registers ------;;; - -(map! :leader - :desc "Jump to register" - "r" 'jump-to-register) - -(if (string= system-nix-profile "personal") (set-register ?f (cons 'file (concat user-home-directory "/Org/Family.s/Notes/hledger.org")))) -(set-register ?h (cons 'file user-home-directory)) -(set-register ?r (cons 'file (concat dotfiles-dir "/README.org"))) - -#+END_SRC -** Org Mode Configuration -*** Standard Org Mode Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ Org mode configuration ------;;; - -;; Set default org directory -(setq org-directory "~/Org") -(setq org-attach-directory "~/Org/.attach") -(setq org-attach-id-dir "~/Org/.attach") -(setq org-id-locations-file "~/Org/.orgids") -(setq org-cycle-include-plain-lists 'integrate) - -(remove-hook 'after-save-hook #'+literate|recompile-maybe) -(set-company-backend! 'org-mode nil) - -;; Automatically show images but manually control their size -(setq org-startup-with-inline-images t - org-image-actual-width nil) - -(require 'evil-org) -(require 'evil-org-agenda) -(add-hook 'org-mode-hook 'evil-org-mode -100) - -;; Top-level headings should be bigger! -(custom-set-faces! - `(outline-1 :height 1.3 :foreground ,(nth 1 (nth 14 doom-themes--colors))) - `(outline-2 :height 1.25 :foreground ,(nth 1 (nth 15 doom-themes--colors))) - `(outline-3 :height 1.2 :foreground ,(nth 1 (nth 19 doom-themes--colors))) - `(outline-4 :height 1.1 :foreground ,(nth 1 (nth 23 doom-themes--colors))) - `(outline-5 :height 1.1 :foreground ,(nth 1 (nth 24 doom-themes--colors))) - `(outline-6 :height 1.1 :foreground ,(nth 1 (nth 16 doom-themes--colors))) - `(outline-7 :height 1.05 :foreground ,(nth 1 (nth 18 doom-themes--colors))) - `(outline-8 :height 1.05 :foreground ,(nth 1 (nth 11 doom-themes--colors))) - '(variable-pitch :family "Intel One Mono") - `(org-agenda-date :inherit 'unspecified :foreground ,(nth 1 (nth 19 doom-themes--colors)) :weight bold :height 1.1) - `(org-agenda-date-today :inherit 'unspecified :foreground ,(nth 1 (nth 15 doom-themes--colors)) :weight bold :height 1.1) - `(org-agenda-date-weekend :inherit 'unspecified :foreground ,(nth 1 (nth 24 doom-themes--colors)) :weight bold :height 1.1) - `(org-agenda-date-weekend-today :inherit 'unspecified :foreground ,(nth 1 (nth 15 doom-themes--colors)) :weight bold :height 1.1) -) - -(after! org (org-eldoc-load)) - -(with-eval-after-load 'org (global-org-modern-mode)) - -;; Add frame borders and window dividers -(modify-all-frames-parameters - '((right-divider-width . 5) - (internal-border-width . 5))) -(dolist (face '(window-divider - window-divider-first-pixel - window-divider-last-pixel)) - (face-spec-reset-face face) - (set-face-foreground face (face-attribute 'default :background))) -(set-face-background 'fringe (face-attribute 'default :background)) - -(setq - ;; Edit settings - org-auto-align-tags nil - org-tags-column 0 - org-catch-invisible-edits 'show-and-error - org-special-ctrl-a/e t - org-insert-heading-respect-content t - - ;; Org styling, hide markup etc. - org-hide-emphasis-markers t - org-pretty-entities t - org-ellipsis "…") - -(setq-default line-spacing 0) - -; Automatic table of contents is nice -(if (require 'toc-org nil t) - (progn - (add-hook 'org-mode-hook 'toc-org-mode) - (add-hook 'markdown-mode-hook 'toc-org-mode)) - (warn "toc-org not found")) - -;;---- this block from http://fgiasson.com/blog/index.php/2016/06/21/optimal-emacs-settings-for-org-mode-for-literate-programming/ ----;; -;; Tangle Org files when we save them -(defun tangle-on-save-org-mode-file() - (when (string= (message "%s" major-mode) "org-mode") - (org-babel-tangle))) - -(add-hook 'after-save-hook 'tangle-on-save-org-mode-file) -;; ---- end block ---- ;; - -;; Better org table editing -;; This breaks multiline visual block edits -;;(setq-default evil-insert-state-exit-hook '(org-update-parent-todo-statistics -;; t)) -;;(setq org-table-automatic-realign nil) - -;; Better for org source blocks -(setq electric-indent-mode nil) -(setq org-src-window-setup 'current-window) -(set-popup-rule! "^\\*Org Src" - :side 'top' - :size 0.9) - -;; Horizontal scrolling tables -(add-load-path! "~/.emacs.d/phscroll") -(setq org-startup-truncated nil) -(with-eval-after-load "org" - (require 'org-phscroll)) -(setq phscroll-calculate-in-pixels t) - -;; Org side tree outline -(add-load-path! "~/.emacs.d/org-side-tree") -(require 'org-side-tree) -(setq org-side-tree-persistent nil) -(setq org-side-tree-fontify t) -(setq org-side-tree-enable-folding t) -(defun org-side-tree-create-or-toggle () - (interactive) - (if (or (org-side-tree-has-tree-p) (eq major-mode 'org-side-tree-mode)) - (org-side-tree-toggle) - (org-side-tree))) -(map! :leader - "O t" #'org-side-tree-create-or-toggle) -(map! :map org-side-tree-mode-map - "SPC" nil) - -#+END_SRC - -*** Org Download and Image Capture -#+BEGIN_SRC emacs-lisp :tangle config.el -(require 'org-download) - -;; Drag-and-drop to `dired` -(add-hook 'dired-mode-hook 'org-download-enable) - -;; system-wm-type, wayland or x11? only should be considered if system-nix-profile is "personal" or "work" -(if (string= system-wm-type "wayland") - (setq org-download-screenshot-method "grim -g \"$(slurp)\" %s") - (setq org-download-screenshot-method "flameshot gui -p %s") -) - -(after! org-download - (setq org-download-method 'directory)) - -(after! org - (setq-default org-download-image-dir "img/" - org-download-heading-lvl nil)) - -(add-to-list 'display-buffer-alist '("^*Async Shell Command*" . (display-buffer-no-window))) - -(defun org-download-clipboard-basename () - (interactive) - (setq org-download-path-last-dir org-download-image-dir) - (setq org-download-image-dir (completing-read "directory: " (-filter #'f-directory-p (directory-files-recursively "." "" t)) nil t)) - (org-download-clipboard (completing-read "basename: " '() nil nil)) - (setq org-download-image-dir org-download-path-last-dir) -) - -(map! :leader - :desc "Insert a screenshot" - "i s" 'org-download-screenshot - :desc "Insert image from clipboard" - "i p" 'org-download-clipboard - "i P" 'org-download-clipboard-basename) - -#+END_SRC -*** External Program File Management -#+BEGIN_SRC emacs-lisp :tangle config.el -(defun org-new-file-from-template() - "Copy a template from ~/Templates into a time stamped unique-named file in the -same directory as the org-buffer and insert a link to this file." - (interactive) - (setq template-file (completing-read "Template file:" (directory-files "~/Templates"))) - (setq filename - (concat - (make-temp-name - (concat (file-name-directory (buffer-file-name)) - "files/" - (file-name-nondirectory (buffer-file-name)) - "_" - (format-time-string "%Y%m%d_%H%M%S_")) ) (file-name-extension template-file t))) - (copy-file (concat user-home-directory "/Templates/" template-file) filename) - (setq prettyname (read-from-minibuffer "Pretty name:")) - (insert (concat "[[./files/" (file-name-nondirectory filename) "][" prettyname "]]")) - (org-display-inline-images)) - -(map! :leader - :desc "Create a new file from a template and insert a link at point" - "i t" 'my-org-new-file-from-template) - -(if (not (string= system-nix-profile "wsl")) - (when (require 'openwith nil 'noerror) - (setq openwith-associations - (list - (list (openwith-make-extension-regexp - '("mpg" "mpeg" "mp3" "mp4" - "avi" "wmv" "wav" "mov" "flv" - "ogm" "ogg" "mkv")) - "mpv" - '(file)) - (list (openwith-make-extension-regexp - '("doc" "xls" "ppt" "odt" "ods" "odg" "odp")) - "libreoffice" - '(file)) - '("\\.lyx" "lyx" (file)) - '("\\.chm" "kchmviewer" (file)) - (list (openwith-make-extension-regexp - '("pdf" "ps" "ps.gz" "dvi")) - "atril" - '(file)) - (list (openwith-make-extension-regexp - '("kdenlive")) - "kdenlive-accel" - '(file)) - (list (openwith-make-extension-regexp - '("kra")) - "krita" - '(file)) - (list (openwith-make-extension-regexp - '("blend" "blend1")) - "blender" - '(file)) - (list (openwith-make-extension-regexp - '("helio")) - "helio" - '(file)) - (list (openwith-make-extension-regexp - '("svg")) - "inkscape" - '(file)) - (list (openwith-make-extension-regexp - '("flp")) - "flstudio" - '(file)) - (list (openwith-make-extension-regexp - '("mid")) - "rosegarden" - '(file)) - )) - (openwith-mode 1))) - -(add-load-path! "~/.emacs.d/org-krita") -(require 'org-krita) -(add-hook 'org-mode-hook 'org-krita-mode) -(setq org-krita-extract-filename "preview.png") -(setq org-krita-scale 1) - -(add-load-path! "~/.emacs.d/org-xournalpp") -(require 'org-xournalpp) -(add-hook 'org-mode-hook 'org-xournalpp-mode) -(setq org-xournalpp-template-getter - '(closure - (t) - nil - (file-truename "~/Templates/template.xopp") ; use my own template - ) -) - -;; override width to static 250 for now -;; so I don't have massive images in org mode (scrolling not fun) -(defun org-xournalpp--create-image (link refresh) - "Extract svg/png from given LINK and return image. - -Regenerate the cached inline image, if REFRESH is true. - -If the path from LINK does not exist, nil is returned." - (let ((width 250) - (xopp-path (f-expand (org-element-property :path link)))) - (when (f-exists? xopp-path) - (if width - (create-image (org-xournalpp--get-image xopp-path refresh) - org-xournalpp-image-type - nil - :width width) - (create-image (org-xournalpp--get-image xopp-path refresh) - org-xournalpp-image-type - nil))))) - - -#+END_SRC -*** Copy Links/Files into Clipboard -#+BEGIN_SRC emacs-lisp :tangle config.el -(defun org-copy-link-to-clipboard-at-point () - "Copy current link at point into clipboard (useful for images and links)" - ;; Remember to press C-g to kill this foreground process if it hangs! - (interactive) - (if (eq major-mode #'org-mode) - (link-hint-copy-link-at-point) - ) - (if (eq major-mode #'ranger-mode) - (ranger-copy-absolute-file-paths) - ) - (if (eq major-mode #'image-mode) - (image-mode-copy-file-name-as-kill) - ) - (shell-command "~/.emacs.d/scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh " nil nil) -) - -(if (string= system-nix-profile "wsl") - (map! :leader - :desc "Copy link at point" - "y y" 'link-hint-copy-link-at-point) - (map! :leader - :desc "Copy link/file at point into system clipbord (C-g to escape if copying a file)" - "y y" 'org-copy-link-to-clipboard-at-point)) - -#+END_SRC -**** Copy Link/File to Clipboard Helper Script -Shamelessly stolen from [[https://unix.stackexchange.com/questions/30093/copy-image-from-command-line-to-clipboard][here]] and modified for my use. -#+BEGIN_SRC shell :tangle ./scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh :tangle-mode (identity #o755) -#!/bin/sh -if [ $(echo $XDG_SESSION_TYPE) == "wayland" ]; then - FILENAME="$(wl-paste)" - FILTEREDFILENAME=$(echo "$FILENAME" | sed "s+file:+./+") - echo "$FILTEREDFILENAME" - if [[ -f "$FILTEREDFILENAME" ]]; then - wl-copy < "$FILTEREDFILENAME" - fi -elif [ $(echo $XDG_SESSION_TYPE) == "x11" ]; then - FILENAME="$(xclip -o)" - FILTEREDFILENAME=$(echo "$FILENAME" | sed "s+file:+./+") - if [[ -f "$FILTEREDFILENAME" ]]; then - TYPE=$(file -b --mime-type "$FILTEREDFILENAME") - xclip -selection clipboard -t "$TYPE" -i "$FILTEREDFILENAME" - exit - fi -else - exit -fi -exit -#+END_SRC -*** NO Org Sliced Images -#+begin_src emacs-lisp -;; this is kinda buggy -(add-load-path! "~/.emacs.d/org-sliced-images") -(require 'org-sliced-images) -(defalias 'org-remove-inline-images #'org-sliced-images-remove-inline-images) -(defalias 'org-toggle-inline-images #'org-sliced-images-toggle-inline-images) -(defalias 'org-display-inline-images #'org-sliced-images-display-inline-images) -#+end_src -*** Org Online Images -#+BEGIN_SRC emacs-lisp :tangle config.el -;; Online images inside of org mode is pretty cool -;; This snippit is from Tobias on Stack Exchange -;; https://emacs.stackexchange.com/questions/42281/org-mode-is-it-possible-to-display-online-images -(require 'org-yt) - -(defun org-image-link (protocol link _description) - "Interpret LINK as base64-encoded image data." - (cl-assert (string-match "\\`img" protocol) nil - "Expected protocol type starting with img") - (let ((buf (url-retrieve-synchronously (concat (substring protocol 3) ":" link)))) - (cl-assert buf nil - "Download of image \"%s\" failed." link) - (with-current-buffer buf - (goto-char (point-min)) - (re-search-forward "\r?\n\r?\n") - (buffer-substring-no-properties (point) (point-max))))) - -(org-link-set-parameters - "imghttp" - :image-data-fun #'org-image-link) - -(org-link-set-parameters - "imghttps" - :image-data-fun #'org-image-link) -#+END_SRC -*** Org Mermaid Diagrams -#+BEGIN_SRC emacs-lisp :tangle config.el -;; Mermaid diagrams -(setq ob-mermaid-cli-path "~/.nix-profile/bin/mmdc") -#+END_SRC -*** Org Simple Printing -#+BEGIN_SRC emacs-lisp :tangle config.el -;; Print org mode -(defun org-simple-print-buffer () - "Open an htmlized form of current buffer and open in a web browser to print" - (interactive) - (htmlize-buffer) - (browse-url-of-buffer (concat (buffer-name) ".html")) - (sleep-for 1) - (kill-buffer (concat (buffer-name) ".html"))) - -;; Doesn't work yet, bc htmlize-region takes arguments BEG and END -;(defun org-simple-print-region() -; "Open an htmlized form of current region and open in a web browser to print" -; (interactive) -; (htmlize-region ) -; (browse-url-of-buffer (concat (buffer-name) ".html")) -; (sleep-for 1) -; (kill-buffer (concat (buffer-name) ".html"))) - -(map! :leader - :prefix ("P" . "Print") - :desc "Simple print buffer in web browser" - "p" 'org-simple-print-buffer) - -(map! :leader - :prefix ("P" . "Print") - :desc "Simple print buffer in web browser" - "b" 'org-simple-print-buffer) - -;(map! :leader -; :prefix ("P" . "Print") -; :desc "Simple print region in web browser" -; "r" 'org-simple-print-region) - -#+END_SRC -*** Org Inline Macros -#+BEGIN_SRC emacs-lisp :tangle config.el -;; Display macros inline in buffers -(add-to-list 'font-lock-extra-managed-props 'display) - -(font-lock-add-keywords - 'org-mode - '(("\\({{{[a-zA-Z#%)(_-+0-9]+}}}\\)" 0 - `(face nil display - ,(format "%s" - (let* ((input-str (match-string 0)) - (el (with-temp-buffer - (insert input-str) - (goto-char (point-min)) - (org-element-context))) - (text (org-macro-expand el org-macro-templates))) - (if text - text - input-str))))))) - -#+END_SRC -*** Org Transclusion -#+BEGIN_SRC emacs-lisp :tangle config.el -;; Org transclusion -(require 'org-transclusion) -(after! org - (map! :map global-map "" #'org-transclusion-add :leader :prefix "n" :desc "Org Transclusion Mode" "t" #'org-transclusion-mode) - (map! :leader :prefix "n" "l" #'org-transclusion-live-sync-start) - (setq org-transclusion-exclude-elements '(property-drawer keyword)) - (add-hook 'org-mode-hook #'org-transclusion-mode) -) - -#+END_SRC -*** Org Jekyll -#+begin_src emacs-lisp :tangle config.el -(defun org-jekyll-new-post () - (interactive) - (setq new-blog-post-title (read-from-minibuffer "Post name: ")) - (setq new-blog-post-date (format-time-string "%Y-%m-%d" (date-to-time (org-read-date)))) - (setq new-blog-post-slug (downcase (replace-regexp-in-string "[^[:alpha:][:digit:]_-]" "" (string-replace " " "-" new-blog-post-title)))) - (setq new-blog-post-file (concat (projectile-project-root) "org/_posts/" new-blog-post-date "-" new-blog-post-slug ".org")) - (let ((org-capture-templates - `(("p" "New Jekyll blog post" plain (file new-blog-post-file) - ,(concat "#+title: " new-blog-post-title "\n#+options: toc:nil num:nil\n#+begin_export html\n---\nlayout: post\ntitle: " new-blog-post-title "\nexcerpt: %?\ntags: \npermalink: " new-blog-post-date "-" new-blog-post-slug "\n---\n#+end_export\n\n#+attr_html: :alt " new-blog-post-title " :align center\n[[../assets/" new-blog-post-date "-" new-blog-post-slug ".png]]"))) - )) (org-capture)) -) - -(defun org-jekyll-rename-post () - (interactive) - (setq new-blog-post-title (read-from-minibuffer "Post name: ")) - (setq new-blog-post-date (format-time-string "%Y-%m-%d" (date-to-time (org-read-date)))) - (setq new-blog-post-slug (downcase (replace-regexp-in-string "[^[:alpha:][:digit:]_-]" "" (string-replace " " "-" new-blog-post-title)))) - (org-roam-set-keyword "title" new-blog-post-title) - (replace-regexp "permalink: .*\n" (concat "permalink: " new-blog-post-date "-" new-blog-post-slug "\n") nil (point-min) (point-max)) - (replace-regexp "title: .*\n" (concat "title: " new-blog-post-title "\n") nil (point-min) (point-max)) - (setq prev-blog-post-filename-base (file-name-base (buffer-file-name))) - (doom/move-this-file (concat new-blog-post-date "-" new-blog-post-slug ".org")) - (shell-command (concat "sed -i s/" prev-blog-post-filename-base "/" (file-name-base (buffer-file-name)) "/g *.org") nil) - (replace-regexp prev-blog-post-filename-base (file-name-base (buffer-file-name)) nil (point-min) (point-max)) - (save-buffer) -) - -(map! :leader - :prefix ("N") - - :desc "New blog post" - "p" #'org-jekyll-new-post - - :desc "Rename or redate blog post and update links accordingly" - "e" #'org-jekyll-rename-post -) - -#+end_src -*** Crdt -#+begin_src emacs-lisp :tangle config.el -(require 'crdt) -(setq crdt-default-tls t) -(setq crdt-use-stunnel t) -(setq crdt-default-name "Emmet") -(if (file-exists-p "~/.emacs.d/crdt-private.el") (load! "~/.emacs.d/crdt-private.el")) -(defun crdt-connect-default () - (interactive) - (crdt-connect crdt-default-server-address crdt-default-name) -) -(map! :leader - :desc "crdt" - :prefix ("C") - - :desc "Connect to a crdt server" - "c" #'crdt-connect-default - - :desc "Connect to default crdt server" - "C" #'crdt-connect-default - - :desc "Disconnect from a crdt server" - "d" #'crdt-disconnect - - :desc "Add buffer to a session" - "a" #'crdt-share-buffer - - :desc "Stop sharing buffer when running a server" - "s" #'crdt-stop-share-buffer - - :desc "Run M-x on the (remote) crdt session" - "x" #'crdt-M-x - - :desc "List crdt buffers in a session" - "l" #'crdt-list-buffers - - :desc "List crdt users in a session" - "u" #'crdt-list-users -) - -#+end_src -*** Org Analyzer -#+begin_src emacs-lisp :tangle config.el -(require 'org-analyzer) -(setq org-analyzer-wrapper-command "org-analyzer") -(setq org-analyzer-jar-file-name "~/.nix-profile/bin/org-analyzer.jar") -(setq org-analyzer-java-program "~/.nix-profile/bin/org-analyzer") ;; Is not actually java, buta wrapper shell script - -(defun org-analyzer-start-process (org-dir) - "Start the org analyzer process . -Argument ORG-DIR is where the org-files are located." - (org-analyzer-cleanup-process-state) - (unless (file-exists-p org-dir) - (warn "org-analyzer was started with org-directory set to - \"%s\"\nbut this directory does not exist. -Please set the variable `org-directory' to the location where you keep your org files." - org-directory)) - (let* ((name (format " *org-analyzer [org-dir:%s]*" org-dir)) - (proc-buffer (generate-new-buffer name)) - (proc nil)) - (setq org-analyzer-process-buffer proc-buffer) - (with-current-buffer proc-buffer - (setq default-directory (if (file-exists-p org-dir) - org-dir default-directory) - proc (condition-case err - (let ((process-connection-type nil) - (process-environment process-environment)) - (start-process name - (current-buffer) - org-analyzer-wrapper-command - "--port" - (format "%d" org-analyzer-http-port) - "--started-from-emacs" - (if (file-exists-p org-dir) org-dir ""))) - (error - (concat "Can't start org-analyzer (%s: %s)" - (car err) (cadr err))))) - (set-process-query-on-exit-flag proc nil) - (set-process-filter proc #'org-analyzer-process-filter)) - proc-buffer)) - -#+end_src -** Org Roam Configuration -*** Standard Org Roam Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ Org roam configuration ------;;; -(require 'org-roam) -(require 'org-roam-dailies) - -(setq org-roam-directory (concat "~/Org/" user-default-roam-dir "/Notes") - org-roam-db-location (concat "~/Org/" user-default-roam-dir "/Notes/org-roam.db")) - -(setq org-roam-node-display-template - "${title:65}📝${tags:*}") - -(org-roam-db-autosync-mode) - -(setq mode-line-misc-info '((which-function-mode - (which-func-mode - ("" which-func-format " "))) - ("" so-long-mode-line-info) - (global-mode-string - ("" global-mode-string)) - " " - org-roam-db-choice) -) - -(setq org-roam-list-files-commands '(rg)) - -#+END_SRC -*** Multi Org Roam Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -(setq full-org-roam-db-list nil) - -(setq full-org-roam-db-list (directory-files "~/Org" t "\\.[p,s]$")) -(dolist (item full-org-roam-db-list) - (setq full-org-roam-db-list - (append (directory-files item t "\\.[p,s]$") full-org-roam-db-list))) - -(setq org-roam-db-choice user-default-roam-dir) -(setq full-org-roam-db-list-pretty (list)) -(dolist (item full-org-roam-db-list) - (setq full-org-roam-db-list-pretty - (append (list - (replace-regexp-in-string (concat "\\/home\\/" user-username "\\/Org\\/") "" item)) full-org-roam-db-list-pretty))) - -(defun org-roam-open-dashboard () - "Open ${org-roam-directory}/dashboard.org (I use this naming convention to create dashboards for each of my org roam maps)" - (interactive) - (if (org-roam-node-from-title-or-alias "Overview") - (org-roam-node-open (org-roam-node-from-title-or-alias "Overview")) - (dired org-roam-directory)) -) - -(defun org-roam-open-inbox () - "Open ${org-roam-directory}/dashboard.org (I use this naming convention to create dashboards for each of my org roam maps)" - (interactive) - (if (org-roam-node-from-title-or-alias "Inbox") - (org-roam-node-open (org-roam-node-from-title-or-alias "Inbox")) - (message "No inbox found, capture something with M-x org-roam-capture-inbox")) -) - -(defun org-roam-capture-inbox () - (interactive) - (org-roam-capture- :node (org-roam-node-from-title-or-alias "Inbox") - :templates '(("i" "inbox" plain "* %?" - :if-new (file+head "%<%Y%m%d%H%M%S>-inbox.org" "#+title: Inbox\n"))))) - -(defun org-roam-switch-db (&optional arg silent) - "Switch to a different org-roam database, arg" - (interactive) - (when (not arg) - (setq full-org-roam-db-list nil) - - (setq full-org-roam-db-list (directory-files "~/Org" t "\\.[p,s]$")) - (dolist (item full-org-roam-db-list) - (setq full-org-roam-db-list - (append (directory-files item t "\\.[p,s]$") full-org-roam-db-list))) - - (setq full-org-roam-db-list-pretty (list)) - (dolist (item full-org-roam-db-list) - (setq full-org-roam-db-list-pretty - (append (list - (replace-regexp-in-string (concat "\\/home\\/" user-username "\\/Org\\/") "" item)) full-org-roam-db-list-pretty))) - - (setq org-roam-db-choice (completing-read "Select org roam database: " - full-org-roam-db-list-pretty nil t))) - (when arg - (setq org-roam-db-choice arg)) - - (setq org-roam-directory (file-truename (concat "~/Org/" org-roam-db-choice "/Notes")) - org-roam-db-location (file-truename (concat "~/Org/" org-roam-db-choice "/Notes/org-roam.db")) - org-directory (file-truename (concat "~/Org/" org-roam-db-choice "/Notes"))) - (when (not silent) - (org-roam-open-dashboard)) - - (org-roam-db-sync) - - (message (concat "Switched to " org-roam-db-choice " org-roam database!"))) - -(defun org-roam-default-overview () - (interactive) - (org-roam-switch-db user-default-roam-dir)) - -(defun org-roam-switch-db-id-open (arg ID &optional switchpersist) - "Switch to another org-roam db and visit file with id arg" - "If switchpersist is non-nil, stay in the new org-roam db after visiting file" - (interactive) - (setq prev-org-roam-db-choice org-roam-db-choice) - (org-roam-switch-db arg 1) - (org-roam-id-open ID) - (when (not switchpersist) - (org-roam-switch-db prev-org-roam-db-choice 1))) - -#+END_SRC - -#+RESULTS: -: org-roam-switch-db-id-open - -*** Org Roam "todos" Tagging for Org Agenda -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ Org-roam-agenda configuration ------;;; -(defun text-in-buffer-p (TEXT) -(save-excursion (goto-char (point-min)) (search-forward TEXT nil t))) - -(defun apply-old-todos-tag-maybe (&optional FILE) - (interactive) - (if (stringp FILE) - (setq the-daily-node-filename FILE) - (setq the-daily-node-filename buffer-file-name)) - (if (org-roam-dailies--daily-note-p the-daily-node-filename) - (if (<= (nth 2 (org-roam-dailies-calendar--file-to-date the-daily-node-filename)) (nth 2 org-agenda-current-date)) - (if (<= (nth 1 (org-roam-dailies-calendar--file-to-date the-daily-node-filename)) (nth 1 org-agenda-current-date)) - (if (<= (nth 0 (org-roam-dailies-calendar--file-to-date the-daily-node-filename)) (nth 0 org-agenda-current-date)) - (funcall (lambda () - (with-current-buffer (get-file-buffer the-daily-node-filename) (org-roam-tag-add '("old-todos"))) - (with-current-buffer (get-file-buffer the-daily-node-filename) (org-roam-tag-remove '("todos"))) - ) - ) - ) - ) - ) - ) -) - -(defun apply-old-todos-tag-maybe-and-save (FILE) - (interactive) - (find-file-noselect FILE) - (apply-old-todos-tag-maybe FILE) - (with-current-buffer (get-file-buffer the-daily-node-filename) (save-buffer)) - (with-current-buffer (get-file-buffer the-daily-node-filename) (kill-buffer)) -) - -(defun org-current-buffer-has-todos () - "Return non-nil if current buffer has any todo entry." - - (org-element-map ; (2) - (org-element-parse-buffer 'headline) ; (1) - 'headline - (lambda (h) - (eq (org-element-property :todo-type h) - 'todo)) - nil 'first-match)) ; (3) - -(defun org-has-recent-timestamps (OLD-DAYS) - "Return non-nil only if current buffer has entries with timestamps - more recent than OLD-DAYS days" - (interactive) - (if (org-element-map (org-element-parse-buffer) 'timestamp - (lambda (h) - (org-element-property :raw-value h))) - (org-element-map ; (2) - (org-element-parse-buffer) ; (1) - 'timestamp - (lambda (h) - (time-less-p (time-subtract (current-time) (* 60 60 24 OLD-DAYS)) (date-to-time (org-element-property :raw-value h)))) - nil 'first-match) nil)) - -(setq org-timestamps-days-for-old 21) - -; This has a bug where it won't sync a new agenda file -; if I'm editing an org roam node file while set to another -; org roam db -(defun add-todos-tag-on-save-org-mode-file() - (interactive) - (when (string= (message "%s" major-mode) "org-mode") - (if (org-roam-node-p (org-roam-node-at-point)) - (funcall (lambda() - (if (or (org-current-buffer-has-todos) (org-has-recent-timestamps org-timestamps-days-for-old)) - (org-roam-tag-add '("todos")) - (org-roam-tag-remove '("todos")) - ) - (apply-old-todos-tag-maybe) - ) - ) - ) - ) -) - -(add-hook 'before-save-hook 'add-todos-tag-on-save-org-mode-file) - -#+END_SRC -*** Setup Org Agenda from Org Roam -#+BEGIN_SRC emacs-lisp :tangle config.el -(defun org-roam-filter-by-tag (tag-name) - (lambda (node) - (member tag-name (org-roam-node-tags node)))) - -(defun org-roam-list-notes-by-tag (tag-name) - (mapcar #'org-roam-node-file - (seq-filter - (org-roam-filter-by-tag tag-name) - (org-roam-node-list)))) - -(defun org-roam-dailies-apply-old-todos-tags-to-all () -; (dolist (daily-node org-roam-dailies-files) -; (apply-old-todos-tag-maybe-and-save daily-node) -; ) - (setq num 0) - (while (< num (list-length (org-roam-list-notes-by-tag "todos"))) - (apply-old-todos-tag-maybe-and-save (nth num (org-roam-list-notes-by-tag "todos"))) - (setq num (1+ num)) - ) -) - -;; Refreshing org roam agenda -(defun org-roam-refresh-agenda-list () - (interactive) - (setq prev-org-roam-db-choice org-roam-db-choice) - (setq org-agenda-files '()) - (setq org-id-files '()) - (setq org-roam-directory (file-truename "~/Org") - org-roam-db-location (file-truename "~/Org/org-roam.db") - org-directory (file-truename "~/Org/")) - (org-roam-db-sync) - (setq org-agenda-files (org-roam-list-notes-by-tag "todos")) - (setq org-id-files (org-roam-list-files)) - (setq org-agenda-files (-uniq org-agenda-files)) - (org-roam-switch-db prev-org-roam-db-choice 1) -) - -;; Build agenda only when org agenda first opened for session -(setq org-roam-agenda-initialized nil) -(defun org-roam-refresh-agenda-list-init () - (if (not org-roam-agenda-initialized) - (funcall - (lambda () - (org-roam-refresh-agenda-list) - (setq org-roam-agenda-initialized t) - ) - ) - ) -) -(add-hook 'org-agenda-mode-hook 'org-roam-refresh-agenda-list-init) - -(map! :leader - :prefix ("o a") - - :desc "Refresh org agenda from roam dbs" - "r" 'org-roam-refresh-agenda-list) - -#+END_SRC -*** Org Roam Keybindings -#+BEGIN_SRC emacs-lisp :tangle config.el -(map! :leader - :prefix ("N" . "org-roam notes") - - :desc "Capture new roam node" - "c" 'org-roam-capture - - :desc "Open org roam inbox" - "I o" 'org-roam-open-inbox - - :desc "Capture stuff in inbox" - "I c" 'org-roam-capture-inbox - - :desc "Insert roam node link at point" - "i" 'org-roam-node-insert - - :desc "Find roam node" - "." 'org-roam-node-find - - :desc "Switch org-roam database" - "s" 'org-roam-switch-db - - :desc "Update current org-roam database" - "u" 'org-roam-db-sync - - :desc "Re-zoom on current node in org-roam-ui" - "z" 'org-roam-ui-node-zoom - - :desc "Visualize org-roam database with org-roam-ui" - "O" 'org-roam-default-overview - - :desc "Visualize org-roam database with org-roam-ui" - "o" 'org-roam-open-dashboard) - -#+END_SRC -*** Org Roam Capture Templates -#+BEGIN_SRC emacs-lisp :tangle config.el -(after! org-roam - (setq org-roam-capture-templates - '(("d" "default" plain "%?" :target - (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n") - :unnarrowed t)))) - -#+END_SRC -*** Org Roam Olivetti Mode -#+BEGIN_SRC emacs-lisp :tangle config.el -(setq olivetti-style 'fancy - olivetti-margin-width 100) -(setq-default olivetti-body-width 100) -(defun org-roam-olivetti-mode () - (interactive) - (if (org-roam-file-p) - (olivetti-mode)) - (if (org-roam-file-p) - (doom-disable-line-numbers-h))) - -(add-hook 'org-mode-hook 'org-roam-olivetti-mode) - -#+END_SRC -*** Org Roam Dynamic Blocks -#+BEGIN_SRC emacs-lisp :tangle config.el -(add-load-path! "~/.emacs.d/org-nursery/lisp") -(require 'org-roam-dblocks) -(add-hook 'org-mode-hook 'org-roam-dblocks-autoupdate-mode) -#+END_SRC -*** Org Roam Export Setup -#+BEGIN_SRC emacs-lisp :tangle config.el -(setq org-id-extra-files 'org-agenda-text-search-extra-files) - -#+END_SRC -*** Org Roam UI Setup -I want this to be able to automatically open ORUI in EAF Browser in a split to the right. This kinda works now? -On Wayland, EAF doesn't work. -#+BEGIN_SRC emacs-lisp :tangle config.el -;(add-to-list 'display-buffer-alist '("^\\ORUI" display-buffer-in-side-window -; '(side . right) -; (window-width . 50) -;)) -;(add-to-list 'display-buffer-alist '("^\\localhost:35901" display-buffer-in-side-window -; '(side . right) -; (window-width . 50) -;)) - -;;(setq org-roam-ui-browser-function 'eaf-open-browser) ; xorg -(setq org-roam-ui-browser-function 'browse-url) ; wayland - -(defun open-org-roam-ui () - (interactive) - (+evil/window-vsplit-and-follow) - (org-roam-ui-open) - (evil-window-left 1)) - -(defun kill-org-roam-ui () - (interactive) -;; (delete-window (get-buffer-window "ORUI" t)) ; xorg -;; (kill-buffer "ORUI") ; xorg - (kill-buffer "*httpd*") -) - -; xorg -;;(map! :leader -;; :prefix ("N" . "org-roam notes") -;; :desc "Visualize org-roam database with org-roam-ui" -;; "v" 'open-org-roam-ui) - -; wayland -(map! :leader - :prefix ("N" . "org-roam notes") - :desc "Visualize org-roam database with org-roam-ui" - "v" 'org-roam-ui-open) - -(map! :leader - :prefix ("N" . "org-roam notes") - :desc "Kill all org roam ui buffers" - "V" 'kill-org-roam-ui) - -#+END_SRC -** Org Agenda Configuration -*** Standard Org Agenda Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ Org agenda configuration ------;;; -;; Set span for agenda to be just daily -(setq org-agenda-span 1 - org-agenda-start-day "+0d" - org-agenda-skip-timestamp-if-done t - org-agenda-skip-deadline-if-done t - org-agenda-skip-scheduled-if-done t - org-agenda-skip-scheduled-if-deadline-is-shown t - org-agenda-skip-timestamp-if-deadline-is-shown t - org-log-into-drawer t) - -;; Custom styles for dates in agenda -(custom-set-faces! - '(org-agenda-date :inherit outline-1 :height 1.15) - '(org-agenda-date-today :inherit outline-2 :height 1.15) - '(org-agenda-date-weekend :inherit outline-1 :height 1.15) - '(org-agenda-date-weekend-today :inherit outline-2 :height 1.15) - '(org-super-agenda-header :inherit custom-button :weight bold :height 1.05) - `(link :foreground unspecified :underline nil :background ,(nth 1 (nth 7 doom-themes--colors))) - '(org-link :foreground unspecified)) - -;; Toggle completed entries function -(defun org-agenda-toggle-completed () - (interactive) - (setq org-agenda-skip-timestamp-if-done (not org-agenda-skip-timestamp-if-done) - org-agenda-skip-deadline-if-done (not org-agenda-skip-timestamp-if-done) - org-agenda-skip-scheduled-if-done (not org-agenda-skip-timestamp-if-done)) - (org-agenda-redo)) - -(map! - :map evil-org-agenda-mode-map - :after org-agenda - :nvmeg "s d" #'org-agenda-toggle-completed) - -;; Ricing org agenda -(setq org-agenda-current-time-string "") -(setq org-agenda-time-grid '((daily) () "" "")) - -(setq org-agenda-prefix-format '( -(agenda . " %?-2i %t ") - (todo . " %i %-12:c") - (tags . " %i %-12:c") - (search . " %i %-12:c"))) - -(setq org-agenda-hide-tags-regexp ".*") - -(setq org-agenda-category-icon-alist - `(("Teaching.p" ,(list (all-the-icons-faicon "graduation-cap" :height 0.8)) nil nil :ascent center) - ("Family.s" ,(list (all-the-icons-faicon "home" :v-adjust 0.005)) nil nil :ascent center) - ("Producer.p" ,(list (all-the-icons-faicon "youtube-play" :height 0.9)) nil nil :ascent center) - ("Bard.p" ,(list (all-the-icons-faicon "music" :height 0.9)) nil nil :ascent center) - ("Stories.s" ,(list (all-the-icons-faicon "book" :height 0.9)) nil nil :ascent center) - ("Author.p" ,(list (all-the-icons-faicon "pencil" :height 0.9)) nil nil :ascent center) - ("Gamedev.s" ,(list (all-the-icons-faicon "gamepad" :height 0.9)) nil nil :ascent center) - ("Knowledge.p" ,(list (all-the-icons-faicon "database" :height 0.8)) nil nil :ascent center) - ("Personal.p" ,(list (all-the-icons-material "person" :height 0.9)) nil nil :ascent center) -)) - -#+END_SRC - -*** Org Agenda Convenience Functions -#+BEGIN_SRC emacs-lisp :tangle config.el -(defalias 'org-timestamp-down 'org-timestamp-down-day) -(defalias 'org-timestamp-up 'org-timestamp-up-day) - -(defun org-categorize-by-roam-db-on-save () - (interactive) - (when (string= (message "%s" major-mode) "org-mode") - (when - (string-prefix-p (concat "/home/" user-username "/Org") (expand-file-name (buffer-file-name))) - (setq categorizer-old-line (line-number-at-pos)) - (evil-goto-first-line) - (org-set-property "CATEGORY" (substring (string-trim-left (expand-file-name (buffer-file-name)) (concat "/home/" user-username "/Org/")) 0 (string-match "/" (string-trim-left (expand-file-name (buffer-file-name)) (concat "/home/" user-username "/Org/"))))) - (evil-goto-line categorizer-old-line) - ) - ) -) - -(add-hook 'after-save-hook 'org-categorize-by-roam-db-on-save) - -;; Function to be run when org-agenda is opened -(defun org-agenda-open-hook () - "Hook to be run when org-agenda is opened" - (olivetti-mode)) - -;; Adds hook to org agenda mode, making follow mode active in org agenda -(add-hook 'org-agenda-mode-hook 'org-agenda-open-hook) - -;; Easy refreshes on org agenda for syncthing file changes -;; adapted from https://www.reddit.com/r/orgmode/comments/mu6n5b/org_agenda_auto_updating/ -;; and https://lists.gnu.org/archive/html/help-gnu-emacs/2008-12/msg00435.html -(defadvice org-agenda-list (before refresh-org-agenda-on-revert activate) - (mapc (lambda (file) - (unless (verify-visited-file-modtime (get-file-buffer file)) - (with-current-buffer (get-file-buffer file) - (when (eq major-mode 'org-mode) - (revert-buffer nil 'noconfirm))))) - (org-agenda-files))) -(defadvice org-agenda-redo (before refresh-org-agenda-on-revert activate) - (mapc (lambda (file) - (unless (verify-visited-file-modtime (get-file-buffer file)) - (with-current-buffer (get-file-buffer file) - (when (eq major-mode 'org-mode) - (revert-buffer nil 'noconfirm))))) - (org-agenda-files))) -(defadvice org-agenda-redo-all (before refresh-org-agenda-on-revert activate) - (mapc (lambda (file) - (unless (verify-visited-file-modtime (get-file-buffer file)) - (with-current-buffer (get-file-buffer file) - (when (eq major-mode 'org-mode) - (revert-buffer nil 'noconfirm))))) - (org-agenda-files))) - -;; Function to list all my available org agenda files and switch to them -(defun list-and-switch-to-agenda-file () - "Lists all available agenda files and switches to desired one" - (interactive) - (setq full-agenda-file-list nil) - (setq choice (completing-read "Select agenda file:" org-agenda-files nil t)) - (find-file choice)) - -(map! :leader - :desc "Switch to specific org agenda file" - "o a s" 'list-and-switch-to-agenda-file) - -(defun org-agenda-switch-with-roam () - "Switches to org roam node file and database from org agenda view" - (interactive) - (org-agenda-switch-to) - (if (f-exists-p (concat (dir!) "/org-roam.db")) - (org-roam-switch-db (replace-regexp-in-string (concat "\\/home\\/" user-username "\\/Org\\/") "" (f-parent (dir!))) t)) - (if (f-exists-p (concat (f-parent (dir!)) "/org-roam.db")) - (org-roam-switch-db (replace-regexp-in-string (concat "\\/home\\/" user-username "\\/Org\\/") "" (f-parent (f-parent (dir!)))) t)) - (org-roam-olivetti-mode) -) - -(map! - :map evil-org-agenda-mode-map - :after org-agenda - :nvmeg "" #'org-agenda-switch-with-roam - :nvmeg "" #'org-agenda-switch-with-roam) -(map! - :map org-agenda-mode-map - :after org-agenda - :nvmeg "" #'org-agenda-switch-with-roam - :nvmeg "" #'org-agenda-switch-with-roam) - -#+END_SRC -*** Org Super Agenda Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -(require 'org-super-agenda) - -(setq org-super-agenda-groups - '(;; Each group has an implicit boolean OR operator between its selectors. - (:name " Overdue " ; Optionally specify section name - :scheduled past - :order 2 - :face 'error) - - (:name "Personal " - :and(:file-path "Personal.p" :not (:tag "event")) - :order 3) - - (:name "Family " - :and(:file-path "Family.s" :not (:tag "event")) - :order 3) - - (:name "Teaching " - :and(:file-path "Teaching.p" :not (:tag "event")) - :order 3) - - (:name "Gamedev " - :and(:file-path "Gamedev.s" :not (:tag "event")) - :order 3) - - (:name "Youtube " - :and(:file-path "Producer.p" :not (:tag "event")) - :order 3) - - (:name "Music " - :and(:file-path "Bard.p" :not (:tag "event")) - :order 3) - - (:name "Storywriting " - :and(:file-path "Stories.s" :not (:tag "event")) - :order 3) - - (:name "Writing " - :and(:file-path "Author.p" :not (:tag "event")) - :order 3) - - (:name "Learning " - :and(:file-path "Knowledge.p" :not (:tag "event")) - :order 3) - - (:name " Today " ; Optionally specify section name - :time-grid t - :date today - :scheduled today - :order 1 - :face 'warning) - -)) - -(org-super-agenda-mode t) - -(map! :desc "Next line" - :map org-super-agenda-header-map - "j" 'org-agenda-next-line) - -(map! :desc "Next line" - :map org-super-agenda-header-map - "k" 'org-agenda-previous-line) - -#+END_SRC - -*** NO Org Agenda Notifications -#+BEGIN_SRC emacs-lisp -(add-load-path! "~/.emacs.d/org-yaap") -(require 'org-yaap) -(setq org-yaap-alert-title "Org Agenda") -(setq org-yaap-overdue-alerts 20) -(setq org-yaap-alert-before 20) -(setq org-yaap-daily-alert '(7 30)) -(setq org-yaap-daemon-idle-time 30) -(org-yaap-mode 1) -#+END_SRC -*** Calfw -#+begin_src emacs-lisp :tangle config.el -(require 'calfw) -(require 'calfw-org) -(setq cfw:org-agenda-schedule-args '(:timestamp)) - -(map! :leader :desc "Open org calendar" - "O c" 'cfw:open-org-calendar) -#+end_src -*** NO Org Timeblock -#+begin_src emacs-lisp -(add-load-path! "~/.emacs.d/org-timeblock") -(require 'org-timeblock) - -(map! :leader :desc "Open org timeblock" - "O c" 'org-timeblock) - -(map! :desc "Next day" - :map org-timeblock-mode-map - :nvmeg "l" 'org-timeblock-day-later) -(map! :desc "Previous day" - :map org-timeblock-mode-map - :nvmeg "h" 'org-timeblock-day-earlier) -(map! :desc "Schedule event" - :map org-timeblock-mode-map - :nvmeg "m" 'org-timeblock-schedule) -(map! :desc "Event duration" - :map org-timeblock-mode-map - :nvmeg "d" 'org-timeblock-set-duration) - -#+end_src -** Magit Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ magit configuration ------;;; -;; Need the following two blocks to make magit work with git bare repos -(require 'magit-todos) -(setq magit-todos-keywords-list '("TODO" "FIXME" "HACK" "REVIEW" "DEPRECATED" "BUG")) -(magit-todos-mode 1) - -(add-load-path! "~/.emacs.d/magit-file-icons") -(require 'magit-file-icons) -(setq magit-file-icons-icon-for-file-func 'all-the-icons-icon-for-file) -(setq magit-file-icons-icon-for-dir-func 'all-the-icons-icon-for-dir) -(magit-file-icons-mode 1) - -#+END_SRC -** Ibuffer Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -(require 'all-the-icons-ibuffer) -(add-hook 'ibuffer-mode-hook #'all-the-icons-ibuffer-mode) -(setq all-the-icons-ibuffer-color-icon t) -(evil-set-initial-state 'ibuffer-mode 'normal) - -#+END_SRC -** Dired Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ dired configuration ------;;; - -(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) -(setq all-the-icons-dired-monochrome nil) - -(map! :desc "Increase font size" - "C-=" 'text-scale-increase - - :desc "Decrease font size" - "C--" 'text-scale-decrease - - :desc "Jump to dired" - "M-f" 'dired-jump -) - - -#+END_SRC -** Ranger Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ ranger configuration ------;;; - -(map! :map ranger-mode-map - :desc "Mark current file" - "m" 'ranger-mark - - :desc "Toggle mark on current file" - "x" 'ranger-toggle-mark -) - -#+END_SRC -** hledger-mode Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;-- hledger-mode configuration ;;;-- - -;;; Basic configuration -(require 'hledger-mode) - -;; To open files with .journal extension in hledger-mode -(add-to-list 'auto-mode-alist '("\\.journal\\'" . hledger-mode)) - -;; The default journal location is too opinionated. -(setq hledger-jfile (concat user-home-directory "/Org/Family.s/Notes/hledger.journal")) - -;;; Auto-completion for account names -;; For company-mode users: -(add-to-list 'company-backends 'hledger-company) - -(evil-define-key* 'normal hledger-view-mode-map "q" 'kill-current-buffer) -(evil-define-key* 'normal hledger-view-mode-map "[" 'hledger-prev-report) -(evil-define-key* 'normal hledger-view-mode-map "]" 'hledger-next-report) - -(map! :leader - :prefix ("l" . "hledger") - :desc "Exec hledger command" - "c" 'hledger-run-command - - :desc "Generate hledger balancesheet" - "b" 'hledger-balancesheet* - - :desc "Generate hledger daily report" - "d" 'hledger-daily-report*) - -(map! :localleader - :map hledger-mode-map - - :desc "Reschedule transaction at point" - "d s" 'hledger-reschedule - - :desc "Edit amount at point" - "t a" 'hledger-edit-amount) - -#+END_SRC -** NO Tab Bar Configuration -I don't have this active right now since it's kinda weird with pgtk... -#+BEGIN_SRC emacs-lisp -;;;-- tab-bar-mode configuration ;;;-- - -;; Kbd tab navigation -(map! - :map evil-normal-state-map - "H" #'tab-bar-switch-to-prev-tab - "L" #'tab-bar-switch-to-next-tab - "C-" #'tab-bar-switch-to-prev-tab - "C-" #'tab-bar-switch-to-next-tab) - -(evil-global-set-key 'normal (kbd "C-w") 'tab-bar-close-tab) -(evil-global-set-key 'normal (kbd "C-t") 'tab-bar-new-tab) - -(setq tab-bar-new-tab-choice "*dashboard*") - -(tab-bar-mode t) - -#+END_SRC -** Focus Mode Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -(require 'focus) - -(map! :leader - :prefix ("F" . "Focus mode") - :desc "Toggle focus mode" - "t" 'focus-mode - - :desc "Pin focused section" - "p" 'focus-pin - - :desc "Unpin focused section" - "u" 'focus-unpin) - -(add-to-list 'focus-mode-to-thing '(org-mode . org-element)) -(add-to-list 'focus-mode-to-thing '(python-mode . paragraph)) -(add-to-list 'focus-mode-to-thing '(lisp-mode . paragraph)) - -;(add-hook 'org-mode-hook #'focus-mode) - -#+END_SRC -** Helpful Mode Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ helpful configuration ------;;; - -(evil-set-initial-state 'helpful-mode 'normal) -(evil-define-key 'normal helpful-mode-map - "j" 'evil-next-visual-line - "k" 'evil-previous-visual-line - "q" 'helpful-kill-buffers) - -#+END_SRC -** mu4e Configuration -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;------ helpful configuration ------;;; -(add-load-path! "~/.nix-profile/share/emacs/site-lisp/elpa/mu4e-1.12.2") -(require 'mu4e) -(require 'mu4e-contrib) -(require 'mu4e-actions) - -(after! mu4e - (setq mu4e-modeline-support nil) - (setq mu4e-sent-folder (lambda (msg) (concat "/" (nth 1 (split-string (mu4e-message-field msg :maildir) "/" )) "/Sent"))) - (setq mu4e-drafts-folder (lambda (msg) (concat "/" user-mail-address "/Drafts"))) - (setq mu4e-trash-folder (lambda (msg) (concat "/" (nth 1 (split-string (mu4e-message-field msg :maildir) "/" )) "/Trash"))) - (setq mu4e-refile-folder (lambda (msg) (concat "/" (nth 1 (split-string (mu4e-message-field msg :maildir) "/" )) "/Folders/" (completing-read "Refile msg to: " (directory-files (concat "~/.mail/" (nth 1 (split-string (mu4e-message-field msg :maildir) "/" )) "/Folders")))))) - - (setq mu4e-index-lazy-check t) - (setq mu4e-index-cleanup t) - (setq mu4e-update-interval 120) - (mu4e-alert-enable-notifications) - - (define-key mu4e-main-mode-map (kbd "") #'doom/leader) - (define-key mu4e-headers-mode-map (kbd "") #'doom/leader) - (define-key mu4e-view-mode-map (kbd "") #'doom/leader) - - (define-key mu4e-main-mode-map (kbd "g g") #'evil-goto-first-line) - (define-key mu4e-main-mode-map (kbd "G") #'evil-goto-line) - (define-key mu4e-main-mode-map (kbd "h") #'evil-backward-char) - (define-key mu4e-main-mode-map (kbd "l") #'evil-forward-char) - (define-key mu4e-main-mode-map (kbd "w") #'evil-forward-word-begin) - - (unbind-key "g" mu4e-headers-mode-map) - (define-key mu4e-headers-mode-map (kbd "g g") #'evil-goto-first-line) - (define-key mu4e-headers-mode-map (kbd "G") #'evil-goto-line) - (define-key mu4e-headers-mode-map (kbd "h") #'evil-backward-char) - (define-key mu4e-headers-mode-map (kbd "l") #'evil-forward-char) - (define-key mu4e-headers-mode-map (kbd "w") #'evil-forward-word-begin) - - (unbind-key "g" mu4e-view-mode-map) - (define-key mu4e-view-mode-map (kbd "g g") #'evil-goto-first-line) - (define-key mu4e-view-mode-map (kbd "G") #'evil-goto-line) - (define-key mu4e-view-mode-map (kbd "h") #'evil-backward-char) - (define-key mu4e-view-mode-map (kbd "l") #'evil-forward-char) - (define-key mu4e-view-mode-map (kbd "w") #'evil-forward-word-begin) - - (map! :map 'mu4e-main-mode-map :desc "Jump to maildir" :ge "J" #'mu4e-search-maildir) - (map! :map 'mu4e-main-mode-map :desc "Next line" :ge "j" #'evil-next-visual-line) - (map! :map 'mu4e-main-mode-map :desc "Prev line" :ge "k" #'evil-previous-visual-line) - - (map! :map 'mu4e-headers-mode-map :desc "Jump to maildir" :ge "J" #'mu4e-search-maildir) - (map! :map 'mu4e-headers-mode-map :desc "Next line" :ge "j" #'evil-next-visual-line) - (map! :map 'mu4e-headers-mode-map :desc "Prev line" :ge "k" #'evil-previous-visual-line) - (map! :map 'mu4e-headers-mode-map :desc "Next char" :ge "l" #'evil-forward-char) - (map! :map 'mu4e-headers-mode-map :desc "Update mail and index" :ge "U" #'mu4e-update-mail-and-index) - (map! :map 'mu4e-headers-mode-map :desc "Compose reply" :ge "r" #'mu4e-compose-reply) - (map! :map 'mu4e-headers-mode-map :desc "Archive message" :ge "e" #'mu4e-headers-mark-for-refile) - - (map! :map 'mu4e-view-mode-map :desc "Jump to maildir" :ge "J" #'mu4e-search-maildir) - (map! :map 'mu4e-view-mode-map :desc "Next line" :ge "j" #'evil-next-visual-line) - (map! :map 'mu4e-view-mode-map :desc "Prev line" :ge "k" #'evil-previous-visual-line) - (map! :map 'mu4e-view-mode-map :desc "Update mail and index" :ge "U" #'mu4e-update-mail-and-index) - (map! :map 'mu4e-view-mode-map :desc "Compose reply" :ge "r" #'mu4e-compose-reply) - (map! :map 'mu4e-view-mode-map :desc "Archive message" :ge "e" #'mu4e-view-mark-for-refile) - - (add-to-list 'mu4e-header-info-custom - '(:maildir-folder-no-account . - ( :name "Maildir folder without account" ;; long name, as seen in the message-view - :shortname "Folder" ;; short name, as seen in the headers view - :help "Name of the subfolder without the maildir" ;; tooltip - :function (lambda (msg) (substring (mu4e-message-field msg :maildir) (+ 2 (length (nth 1 (split-string (mu4e-message-field msg :maildir) "/" ))))))))) - (add-to-list 'mu4e-bookmarks - '( :name "Unified inbox" - :query "maildir://.*/INBOX/" - :key ?i)) - (setq mu4e-headers-fields - '((:account-stripe . 1) - (:account . 25) - (:human-date . 12) - (:flags . 6) - (:from-or-to . 20) - (:maildir-folder-no-account . 30) - (:subject))) - - (add-hook 'mu4e-compose-mode-hook #'(lambda () (auto-save-mode -1))) - (setq mu4e-sent-messages-behavior 'delete) - - (setq sendmail-program "~/.nix-profile/bin/msmtp") - (setq send-mail-function 'smtpmail-send-it) - (setq message-sendmail-f-is-evil t) - (setq message-sendmail-extra-arguments '("--read-envelope-from")) - (setq message-send-mail-function 'message-send-mail-with-sendmail) - (if (file-exists-p "~/.emacs.d/mu4e-private.el") (load! "~/.emacs.d/mu4e-private.el")) - - ;; https://emacs.stackexchange.com/questions/3061/how-to-stop-mu4e-from-inserting-line-breaks - (defun no-auto-fill () - "Turn off auto-fill-mode." - (auto-fill-mode -1)) - - (defun no-org-msg-mode () - "Disable org-msg-mode since it doesn't respect multiline emails" - (org-msg-mode 0)) - - (add-hook 'mu4e-compose-mode-hook #'no-auto-fill) - (add-hook 'mu4e-compose-pre-hook #'no-org-msg-mode) - - (mu4e--start) ;; start mu4e silently - -) - -#+END_SRC -** Direnv -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;-- Load emacs direnv;;;-- -(require 'direnv) -(direnv-mode) -#+END_SRC -** Projectile -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;-- projectile wrapper commands ;;;-- -(defun projectile-goto-project () - (interactive) - (projectile-switch-project t) - ;;(neotree-dir (projectile-project-root)) -) - -(map! :leader - :desc "Open project" - "p p" #'projectile-goto-project) -(map! :leader - :desc "Projectile commander" - "p @" #'projectile-commander) -(map! :leader - :desc "Projectile grep" - "/" #'projectile-grep) -(after! projectile (put 'projectile-grep 'disabled nil)) - -#+END_SRC -** sudo-edit -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;-- projectile wrapper commands ;;;-- -(require 'sudo-edit) -(setq sudo-edit-local-method "doas") - -(map! :leader - :desc "Open current file as root" - "f U" #'sudo-edit-current-file) -(map! :leader - :desc "Find a file and open as root" - "f u" #'sudo-edit-find-file) - -#+END_SRC -** LSP -#+BEGIN_SRC emacs-lisp :tangle config.el -;;;-- LSP stuff ;;;-- -(require 'lsp-mode) -(require 'nix-mode) -(require 'gdscript-mode) - -(add-hook 'nix-mode-hook 'lsp-deferred) -(add-hook 'gdscript-mode-hook 'lsp-deferred) - -(setq gdscript-godot-executable "godot4") - -(setq lsp-java-workspace-dir (concat user-home-directory "/.local/share/doom/java-workspace")) - -(setq lsp-treemacs-deps-position-params - '((side . right) - (slot . 1) - (window-width . 35))) - -(setq lsp-treemacs-symbols-position-params -'((side . right) - (slot . 2) - (window-width . 35))) - -(map! :leader :desc "Open treemacs symbol outliner" "o s" #'lsp-treemacs-symbols - :desc "Hide neotree" "o S" #'treemacs-quit) - -(setq +format-on-save-enabled-modes '(not emacs-lisp-mode sql-mode tex-mode latex-mode org-msg-edit-mode nix-mode)) - -(defun lsp-booster--advice-json-parse (old-fn &rest args) - "Try to parse bytecode instead of json." - (or - (when (equal (following-char) ?#) - (let ((bytecode (read (current-buffer)))) - (when (byte-code-function-p bytecode) - (funcall bytecode)))) - (apply old-fn args))) -(advice-add (if (progn (require 'json) - (fboundp 'json-parse-buffer)) - 'json-parse-buffer - 'json-read) - :around - #'lsp-booster--advice-json-parse) - -(defun lsp-booster--advice-final-command (old-fn cmd &optional test?) - "Prepend emacs-lsp-booster command to lsp CMD." - (let ((orig-result (funcall old-fn cmd test?))) - (if (and (not test?) ;; for check lsp-server-present? - (not (file-remote-p default-directory)) ;; see lsp-resolve-final-command, it would add extra shell wrapper - lsp-use-plists - (not (functionp 'json-rpc-connection)) ;; native json-rpc - (executable-find "emacs-lsp-booster")) - (progn - (when-let ((command-from-exec-path (executable-find (car orig-result)))) ;; resolve command from exec-path (in case not found in $PATH) - (setcar orig-result command-from-exec-path)) - (message "Using emacs-lsp-booster for %s!" orig-result) - (cons "emacs-lsp-booster" orig-result)) - orig-result))) -(advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command) - -(map! :leader :desc "Find definition using lsp" "L d" #'lsp-find-definition) - -#+END_SRC -** DevDocs -#+BEGIN_SRC emacs-lisp :tangle config.el -;; devdocs are cool -(require 'devdocs) - -(map! :leader :desc "Peruse devdocs" "L p" #'devdocs-peruse) -#+END_SRC - -** Terminal -#+BEGIN_SRC emacs-lisp :tangle config.el -(add-to-list 'tramp-remote-path 'tramp-own-remote-path) -(after! vterm - (add-to-list 'vterm-tramp-shells '("ssh" "zsh")) ;; I use zsh on all my servers -) -#+END_SRC -** Elfeed -#+BEGIN_SRC emacs-lisp :tangle config.el -;; I source my rss from my freshrss instance -;; I login with a private elisp file: ~/.emacs.d/freshrss-elfeed.el -;; freshrss-elfeed.el looks like this: -;;(elfeed-protocol-enable) -;;(setq elfeed-use-curl t) -;;(setq elfeed-set-timeout 36000) -;;(setq elfeed-log-level 'debug) -;;(setq freshrss-hostname "https://freshrss.example.com") -;;(setq elfeed-feeds (list -;; (list "fever+https://user@freshrss.example.com" -;; :api-url "https://user@freshrss.example.com/api/fever.php" -;; :password "mYsUpErCoMpLiCaTeDp@s$w0rD")))) -;;(setq main-elfeed-feed "https://user@freshrss.example.com/api/fever.php") - -(if (file-exists-p "~/.emacs.d/freshrss-elfeed.el") (load! "~/.emacs.d/freshrss-elfeed.el")) -(setq elfeed-search-filter "@6-months-ago +unread") -(setq browse-url-chromium-program "mpv") -(setq browse-url-chrome-program "mpv") -(setq browse-url-handlers '(("youtube.com" . browse-url-chrome) - ("youtu.be" . browse-url-chrome) - ("odcyn.com" . browse-url-chrome) - ("odysee.com" . browse-url-chrome) - ("tilvids.com" . browse-url-chrome))) -(map! :leader :desc "Open elfeed" "O n" #'elfeed) -(map! :map 'elfeed-search-mode-map :desc "Open url" :n "g o" #'elfeed-search-browse-url) - -(defun elfeed-full-update () - (interactive) - (elfeed-search-update--force) - (cl-loop for entry in elfeed-search-entries - do (elfeed-untag-1 entry 'unread)) - (elfeed-protocol-fever-reinit freshrss-hostname) - (elfeed-update)) - -(add-hook 'elfeed-search-mode-hook 'elfeed-full-update) -(add-hook 'elfeed-search-update-hook (lambda () (goto-char (point-min)))) - -#+END_SRC - -* My init.el -This section is the [[./init.el][init.el]] section, which controls which Doom modules are loaded. - -=SPC h d h= (vim) or =C-h d h= (non-vim) can be used to access Doom's documentation (including a "Module Index"). - -=K= (vim) or =C-c c k= (non-vim) can be used to view a module's documentation (this can help you discover module flags as well). - -=gd= (vim) or =C-c c d= (non-vim) will let you browse a module's directory (source code). - -#+BEGIN_SRC emacs-lisp :tangle init.el -(doom! :input - ;;chinese - ;;japanese - ;;layout ; auie,ctsrnm is the superior home row - - :completion - company ; the ultimate code completion backend - ;;helm ; the *other* search engine for love and life - ;;ido ; the other *other* search engine... - ;;ivy ; a search engine for love and life - vertico ; the search engine of the future - - :ui - ;;deft ; notational velocity for Emacs - doom ; what makes DOOM look the way it does - ;;doom-dashboard ; a nifty splash screen for Emacs - doom-quit ; DOOM quit-message prompts when you quit Emacs - (emoji +unicode) ; 🙂 - hl-todo ; highlight todo/fixme/note/deprecated/hack/review - ;;hydra - ;;indent-guides ; highlighted indent columns - ;;ligatures ; ligatures and symbols to make your code pretty again - ;;minimap ; show a map of the code on the side - modeline ; snazzy, Atom-inspired modeline, plus API - nav-flash ; blink cursor line after big motions - neotree ; a project drawer, like NERDTree for vim - ophints ; highlight the region an operation acts on - (popup +defaults) ; tame sudden yet inevitable temporary windows - ;;tabs ; a tab bar for Emacs - treemacs ; a project drawer, like neotree but cooler - unicode ; extended unicode support for various languages - vc-gutter ; vcs diff in the fringe - ;;vi-tilde-fringe ; fringe tildes to mark beyond EOB - window-select ; visually switch windows - workspaces ; tab emulation, persistence & separate workspaces - ;;zen ; distraction-free coding or writing - - :editor - (evil +everywhere); come to the dark side, we have cookies - file-templates ; auto-snippets for empty files - fold ; (nigh) universal code folding - (format +onsave) ; automated prettiness - ;;god ; run Emacs commands without modifier keys - ;;lispy ; vim for lisp, for people who don't like vim - multiple-cursors ; editing in many places at once - ;;objed ; text object editing for the innocent - ;;parinfer ; turn lisp into python, sort of - ;;rotate-text ; cycle region at point between text candidates - snippets ; my elves. They type so I don't have to - word-wrap ; soft wrapping with language-aware indent - - :emacs - (dired +ranger) ; making dired pretty [functional] - electric ; smarter, keyword-based electric-indent - ibuffer ; interactive buffer management - undo ; persistent, smarter undo for your inevitable mistakes - vc ; version-control and Emacs, sitting in a tree - - :term - eshell ; the elisp shell that works everywhere - ;;shell ; simple shell REPL for Emacs - ;;term ; basic terminal emulator for Emacs - vterm ; the best terminal emulation in Emacs - - :checkers - syntax ; tasing you for every semicolon you forget - (spell +flyspell) ; tasing you for misspelling mispelling - ;;grammar ; tasing grammar mistake every you make - - :tools - ;;ansible - ;;biblio ; Writes a PhD for you (citation needed) - ;;debugger ; stepping through code, to help you add bugs - ;;direnv - docker - ;;editorconfig ; let someone else argue about tabs vs spaces - ;;ein ; tame Jupyter notebooks with emacs - (eval +overlay) ; run code, run (also, repls) - ;;gist ; interacting with github gists - lookup ; navigate your code and its documentation - (lsp) ; M-x vscode - magit ; a git porcelain for Emacs - ;;make ; run make tasks from Emacs - ;;pass ; password manager for nerds - ;;pdf ; pdf enhancements - ;;prodigy ; managing external services & code builders - rgb ; creating color strings - ;;taskrunner ; taskrunner for all your projects - ;;terraform ; infrastructure as code - ;;tmux ; an API for interacting with tmux - ;;upload ; map local to remote projects via ssh/ftp - - :os - ;;(:if IS-MAC macos) ; improve compatibility with macOS - tty ; improve the terminal Emacs experience - - :lang - ;;agda ; types of types of types of types... - ;;beancount ; mind the GAAP - ;;cc ; C > C++ == 1 - ;;clojure ; java with a lisp - common-lisp ; if you've seen one lisp, you've seen them all - ;;coq ; proofs-as-programs - ;;crystal ; ruby at the speed of c - ;;csharp ; unity, .NET, and mono shenanigans - data ; config/data formats - ;;(dart +flutter) ; paint ui and not much else - ;;dhall - ;;elixir ; erlang done right - ;;elm ; care for a cup of TEA? - emacs-lisp ; drown in parentheses - ;;erlang ; an elegant language for a more civilized age - ;;ess ; emacs speaks statistics - ;;factor - ;;faust ; dsp, but you get to keep your soul - ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER) - ;;fsharp ; ML stands for Microsoft's Language - ;;fstar ; (dependent) types and (monadic) effects and Z3 - (gdscript +lsp) ; the language you waited for - ;;(go +lsp) ; the hipster dialect - (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 - (java +lsp) ; the poster child for carpal tunnel syndrome - javascript ; all(hope(abandon(ye(who(enter(here)))))) - ;;julia ; a better, faster MATLAB - (kotlin +lsp) ; a better, slicker Java(Script) - latex ; writing papers in Emacs has never been so fun - ;;lean ; for folks with too much to prove - ;;ledger ; be audit you can be - lua ; one-based indices? one-based indices - markdown ; writing docs for people to ignore - ;;nim ; python + lisp at the speed of c - (nix +lsp) ; I hereby declare "nix geht mehr!" - ;;ocaml ; an objective camel - (org +roam2) ; organize your plain life in plain text - ;;php ; perl's insecure younger brother - ;;plantuml ; diagrams for confusing people more - ;;purescript ; javascript, but functional - python ; beautiful is better than ugly - ;;qt ; the 'cutest' gui framework ever - ;;racket ; a DSL for DSLs - ;;raku ; the artist formerly known as perl6 - ;;rest ; Emacs as a REST client - ;;rst ; ReST in peace - ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} - ;;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() - ;;scala ; java, but good - ;;(scheme +guile) ; a fully conniving family of lisps - sh ; she sells {ba,z,fi}sh shells on the C xor - ;;sml - ;;solidity ; do you need a blockchain? No. - ;;swift ; who asked for emoji variables? - ;;terra ; Earth and Moon in alignment for performance. - web ; the tubes - yaml ; JSON, but readable - ;;zig ; C, but simpler - - :email - (mu4e +org) - ;;notmuch - ;;(wanderlust +gmail) - - :app - calendar - ;;emms - ;;everywhere ; *leave* Emacs!? You must be joking - ;;irc ; how neckbeards socialize - rss ; emacs as an RSS reader - ;;twitter ; twitter client https://twitter.com/vnought - - :config - ;;literate - (default +bindings +smartparens)) - -#+END_SRC - -* My packages.el -The [[./packages.el][packages.el]] file allows extra packages to be configured outside of the typical Doom modules from [[./init.el][init.el]]. - -Packages are declared via =(package! some-package)= where =some-package= is from MELPA, ELPA, or emacsmirror. - -There are other ways to install packages outside of Emacs package archives, including directly from git. Installing a package directly from git requires a =:recipe=. Here is [[https://github.com/raxod502/straight.el#the-recipe-format][a full documentation of the recipe format]]. - -Doom's built-in packages can also be modified here: -- =(package! builtin-package :disable t)= to disable -- =(package! builtin-package-2 :recipe (:repo "myfork/package"))= to override the recipe - - Side-note: the full recipe for built-in packages does not need specification, as the override will inherit the unspecified properties directly from Doom - -Any git package can be configured for a particular commit or branch: -- =(package! builtin-package :recipe (:branch "develop")= for a particular branch -- =(package! builtin-package :pin "1a2b3c4d5e")= for a particular commit -- =(unpin! pinned-package another-pinned-package)= to get bleeding edge instead of Doom's stability - -#+BEGIN_SRC emacs-lisp :tangle packages.el -(package! org-analyzer :pin "0908eea") -(package! embark :pin "0908eea") -(package! dashboard) -(package! direnv) -(package! org :pin "5bdfc02c6fa1b9ad4f075ac1ad1e4086ead310db") -(package! org-modern) -(package! org-super-agenda) -(package! emacsql :pin "c1a4407") -(package! org-roam-ui) -(package! org-transclusion) -(package! org-download) -(package! org-yt) -(package! toc-org) -(package! lister) -(package! all-the-icons-ibuffer) -(package! all-the-icons-dired) -(package! all-the-icons-completion) -(package! ox-reveal) -(package! magit-todos) -(package! hledger-mode) -(package! rainbow-mode) -(package! crdt) -(package! ess) -(package! openwith) -(package! ob-mermaid) -(package! focus) -(package! olivetti) -(package! async) -(package! centered-cursor-mode) -(package! elfeed) -(package! elfeed-protocol) -(package! docker-tramp :disable t) -(package! org-ql) -(package! persist) -(package! sudo-edit) -(package! solaire-mode :disable t) -(package! el-patch) -(package! devdocs) -#+END_SRC -* Nix Integration -In order to have Nix load my Doom Emacs configuration [[./doom.nix][doom.nix]], which I source in the =imports= block of my [[../../../profiles/work/home.nix][home.nix]]. -#+BEGIN_SRC nix :tangle doom.nix -{ config, lib, pkgs, pkgs-emacs, pkgs-stable, inputs, userSettings, systemSettings, ... }: -let - themePolarity = lib.removeSuffix "\n" (builtins.readFile (./. + "../../../../themes"+("/"+userSettings.theme)+"/polarity.txt")); - dashboardLogo = ./. + "/nix-" + themePolarity + ".webp"; -in -{ - imports = [ - inputs.nix-doom-emacs.hmModule - ../git/git.nix - ../../shell/sh.nix - ../../shell/cli-collection.nix - ]; - - programs.doom-emacs = { - enable = true; - emacsPackage = pkgs-emacs.emacs29-pgtk; - doomPrivateDir = ./.; - # This block from https://github.com/znewman01/dotfiles/blob/be9f3a24c517a4ff345f213bf1cf7633713c9278/emacs/default.nix#L12-L34 - # Only init/packages so we only rebuild when those change. - doomPackageDir = let - filteredPath = builtins.path { - path = ./.; - name = "doom-private-dir-filtered"; - filter = path: type: - builtins.elem (baseNameOf path) [ "init.el" "packages.el" ]; - }; - in pkgs-emacs.linkFarm "doom-packages-dir" [ - { - name = "init.el"; - path = "${filteredPath}/init.el"; - } - { - name = "packages.el"; - path = "${filteredPath}/packages.el"; - } - { - name = "config.el"; - path = pkgs-emacs.emptyFile; - } - ]; - # End block - }; - - home.file.".emacs.d/themes/doom-stylix-theme.el".source = config.lib.stylix.colors { - template = builtins.readFile ./themes/doom-stylix-theme.el.mustache; - extension = ".el"; - }; - - home.packages = (with pkgs-emacs; [ - emacs-lsp-booster - nil - nixfmt - kotlin-language-server - file - wmctrl - jshon - aria - hledger - hunspell hunspellDicts.en_US-large - (pkgs-emacs.mu.override { emacs = emacs29-pgtk; }) - (pkgs.callPackage ./pkgs/org-analyzer.nix {}) - emacsPackages.mu4e - isync - msmtp - (python3.withPackages (p: with p; [ - pandas - requests - epc lxml - pysocks - pymupdf - markdown - ])) - ]) ++ (with pkgs-stable; [ - nodejs - nodePackages.mermaid-cli - ]) ++ (with pkgs; [ - openssl - stunnel - ]); - - services.mbsync = { - enable = true; - package = pkgs-stable.isync; - frequency = "*:0/5"; - }; - - home.file.".emacs.d/org-yaap" = { - source = "${inputs.org-yaap}"; - recursive = true; - }; - - home.file.".emacs.d/org-side-tree" = { - source = "${inputs.org-side-tree}"; - recursive = true; - }; - - home.file.".emacs.d/org-timeblock" = { - source = "${inputs.org-timeblock}"; - recursive = true; - }; - - home.file.".emacs.d/org-nursery" = { - source = "${inputs.org-nursery}"; - }; - - home.file.".emacs.d/org-krita" = { - source = "${inputs.org-krita}"; - }; - - home.file.".emacs.d/org-xournalpp" = { - source = "${inputs.org-xournalpp}"; - }; - - home.file.".emacs.d/org-sliced-images" = { - source = "${inputs.org-sliced-images}"; - }; - - home.file.".emacs.d/magit-file-icons" = { - source = "${inputs.magit-file-icons}"; - }; - - home.file.".emacs.d/dashboard-logo.webp".source = dashboardLogo; - home.file.".emacs.d/scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh" = { - source = ./scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh; - executable = true; - }; - - home.file.".emacs.d/phscroll" = { - source = "${inputs.phscroll}"; - }; - - home.file.".emacs.d/mini-frame" = { - source = "${inputs.mini-frame}"; - }; - - home.file.".emacs.d/system-vars.el".text = '' - ;;; ~/.emacs.d/config.el -*- lexical-binding: t; -*- - - ;; Import relevant variables from flake into emacs - - (setq user-full-name "''+userSettings.name+''") ; name - (setq user-username "''+userSettings.username+''") ; username - (setq user-mail-address "''+userSettings.email+''") ; email - (setq user-home-directory "/home/''+userSettings.username+''") ; absolute path to home directory as string - (setq user-default-roam-dir "''+userSettings.defaultRoamDir+''") ; absolute path to home directory as string - (setq system-nix-profile "''+systemSettings.profile+''") ; what profile am I using? - (setq system-wm-type "''+userSettings.wmType+''") ; wayland or x11? - (setq doom-font (font-spec :family "''+userSettings.font+''" :size 20)) ; import font - (setq dotfiles-dir "''+userSettings.dotfilesDir+''") ; import location of dotfiles directory - ''; -} -#+END_SRC diff --git a/user/app/doom-emacs/init.el b/user/app/doom-emacs/init.el deleted file mode 100644 index fc4c77f..0000000 --- a/user/app/doom-emacs/init.el +++ /dev/null @@ -1,175 +0,0 @@ -(doom! :input - ;;chinese - ;;japanese - ;;layout ; auie,ctsrnm is the superior home row - - :completion - company ; the ultimate code completion backend - ;;helm ; the *other* search engine for love and life - ;;ido ; the other *other* search engine... - ;;ivy ; a search engine for love and life - vertico ; the search engine of the future - - :ui - ;;deft ; notational velocity for Emacs - doom ; what makes DOOM look the way it does - ;;doom-dashboard ; a nifty splash screen for Emacs - doom-quit ; DOOM quit-message prompts when you quit Emacs - (emoji +unicode) ; 🙂 - hl-todo ; highlight todo/fixme/note/deprecated/hack/review - ;;hydra - ;;indent-guides ; highlighted indent columns - ;;ligatures ; ligatures and symbols to make your code pretty again - ;;minimap ; show a map of the code on the side - modeline ; snazzy, Atom-inspired modeline, plus API - nav-flash ; blink cursor line after big motions - neotree ; a project drawer, like NERDTree for vim - ophints ; highlight the region an operation acts on - (popup +defaults) ; tame sudden yet inevitable temporary windows - ;;tabs ; a tab bar for Emacs - treemacs ; a project drawer, like neotree but cooler - unicode ; extended unicode support for various languages - vc-gutter ; vcs diff in the fringe - ;;vi-tilde-fringe ; fringe tildes to mark beyond EOB - window-select ; visually switch windows - workspaces ; tab emulation, persistence & separate workspaces - ;;zen ; distraction-free coding or writing - - :editor - (evil +everywhere); come to the dark side, we have cookies - file-templates ; auto-snippets for empty files - fold ; (nigh) universal code folding - (format +onsave) ; automated prettiness - ;;god ; run Emacs commands without modifier keys - ;;lispy ; vim for lisp, for people who don't like vim - multiple-cursors ; editing in many places at once - ;;objed ; text object editing for the innocent - ;;parinfer ; turn lisp into python, sort of - ;;rotate-text ; cycle region at point between text candidates - snippets ; my elves. They type so I don't have to - word-wrap ; soft wrapping with language-aware indent - - :emacs - (dired +ranger) ; making dired pretty [functional] - electric ; smarter, keyword-based electric-indent - ibuffer ; interactive buffer management - undo ; persistent, smarter undo for your inevitable mistakes - vc ; version-control and Emacs, sitting in a tree - - :term - eshell ; the elisp shell that works everywhere - ;;shell ; simple shell REPL for Emacs - ;;term ; basic terminal emulator for Emacs - vterm ; the best terminal emulation in Emacs - - :checkers - syntax ; tasing you for every semicolon you forget - (spell +flyspell) ; tasing you for misspelling mispelling - ;;grammar ; tasing grammar mistake every you make - - :tools - ;;ansible - ;;biblio ; Writes a PhD for you (citation needed) - ;;debugger ; stepping through code, to help you add bugs - ;;direnv - docker - ;;editorconfig ; let someone else argue about tabs vs spaces - ;;ein ; tame Jupyter notebooks with emacs - (eval +overlay) ; run code, run (also, repls) - ;;gist ; interacting with github gists - lookup ; navigate your code and its documentation - (lsp) ; M-x vscode - magit ; a git porcelain for Emacs - ;;make ; run make tasks from Emacs - ;;pass ; password manager for nerds - ;;pdf ; pdf enhancements - ;;prodigy ; managing external services & code builders - rgb ; creating color strings - ;;taskrunner ; taskrunner for all your projects - ;;terraform ; infrastructure as code - ;;tmux ; an API for interacting with tmux - ;;upload ; map local to remote projects via ssh/ftp - - :os - ;;(:if IS-MAC macos) ; improve compatibility with macOS - tty ; improve the terminal Emacs experience - - :lang - ;;agda ; types of types of types of types... - ;;beancount ; mind the GAAP - ;;cc ; C > C++ == 1 - ;;clojure ; java with a lisp - common-lisp ; if you've seen one lisp, you've seen them all - ;;coq ; proofs-as-programs - ;;crystal ; ruby at the speed of c - ;;csharp ; unity, .NET, and mono shenanigans - data ; config/data formats - ;;(dart +flutter) ; paint ui and not much else - ;;dhall - ;;elixir ; erlang done right - ;;elm ; care for a cup of TEA? - emacs-lisp ; drown in parentheses - ;;erlang ; an elegant language for a more civilized age - ;;ess ; emacs speaks statistics - ;;factor - ;;faust ; dsp, but you get to keep your soul - ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER) - ;;fsharp ; ML stands for Microsoft's Language - ;;fstar ; (dependent) types and (monadic) effects and Z3 - (gdscript +lsp) ; the language you waited for - ;;(go +lsp) ; the hipster dialect - (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 - (java +lsp) ; the poster child for carpal tunnel syndrome - javascript ; all(hope(abandon(ye(who(enter(here)))))) - ;;julia ; a better, faster MATLAB - (kotlin +lsp) ; a better, slicker Java(Script) - latex ; writing papers in Emacs has never been so fun - ;;lean ; for folks with too much to prove - ;;ledger ; be audit you can be - lua ; one-based indices? one-based indices - markdown ; writing docs for people to ignore - ;;nim ; python + lisp at the speed of c - (nix +lsp) ; I hereby declare "nix geht mehr!" - ;;ocaml ; an objective camel - (org +roam2) ; organize your plain life in plain text - ;;php ; perl's insecure younger brother - ;;plantuml ; diagrams for confusing people more - ;;purescript ; javascript, but functional - python ; beautiful is better than ugly - ;;qt ; the 'cutest' gui framework ever - ;;racket ; a DSL for DSLs - ;;raku ; the artist formerly known as perl6 - ;;rest ; Emacs as a REST client - ;;rst ; ReST in peace - ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} - ;;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() - ;;scala ; java, but good - ;;(scheme +guile) ; a fully conniving family of lisps - sh ; she sells {ba,z,fi}sh shells on the C xor - ;;sml - ;;solidity ; do you need a blockchain? No. - ;;swift ; who asked for emoji variables? - ;;terra ; Earth and Moon in alignment for performance. - web ; the tubes - yaml ; JSON, but readable - ;;zig ; C, but simpler - - :email - (mu4e +org) - ;;notmuch - ;;(wanderlust +gmail) - - :app - calendar - ;;emms - ;;everywhere ; *leave* Emacs!? You must be joking - ;;irc ; how neckbeards socialize - rss ; emacs as an RSS reader - ;;twitter ; twitter client https://twitter.com/vnought - - :config - ;;literate - (default +bindings +smartparens)) diff --git a/user/app/doom-emacs/nix-dark.png b/user/app/doom-emacs/nix-dark.png deleted file mode 100644 index f887f3fe2e244e5179f4a6cb087e18c4147f7f5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57446 zcmeAS@N?(olHy`uVBq!ia0y~yVC-RFV2tNrV_;y2o&5VW0|Ns~v6E*A2L}g74M$1` z1A_vCr;B4q#hf>D(+i~2>;Bi@F5lSgH$mZs%Y=mKE7B&u+Lm&1TJFv}H>aJyCi?u` z^qsR~j80CCQS(zXuAE+f>-3(T;xl*0q~#^eueH2gH2F=$rY=|0Re@`g7$Y2*T#jG+ z&zdt-?vmW{kOp8x*yiaCK=AYhHcPdkQY){l$~j0_eG3m6)76QzY1 zPB18>$km=MD{1w%^_;|VdXt2sz=}m08lICF7#3)p+Pm-b_geo47JULN6Tg}UicC#0 z(&TJXP!-}-oa^_Q!JuOQZw-f6mVL?*(~gR|Iu^>fGcp*?^x@v;DZnDY;wb1E=qBLO zcl>dZj+ijxg7VP5TMrrySQZ%Z1&kSao34T98B(kBF+LVXFu)d@V$KVA0NX4 z1rDX|MH+!3s!M`arsU_pPqC5fKX6N8%ey9(lg~bVD%!Pa)1*~v*Q)A>ai1%c@tUO4 zv`9m#OX-0{-SyuFIey)NB6IhvKl*5)#c@dXd&eS;4h0Sg28O=J4T%x~BCSF!jVCwt zoY>T}V*N}XHJ-x;9Y>Qksdy%tNQttuvoDsf`QWH9*YEq9C#4aNuTGyjm9hJ-U+#?! zje5GesveV$SoAqFGDx&V7Whm|jr3f8S)lu9%Dm^Q`|s=X@bG+SbWkugG@QufY{4~a z_j{SIz^AnZb=LxzBhKsN&b1)r!7LxGqSL#30*GDgL zwR&02-RIpQ$l|Et>11?XadYm3)X2O2-|9D>$!3uJ*ypxba9ZmB@6G&n2h!8h*6Dt& z`P`EK``g=f^*`F{Z(O`{=M5`^$YBGK!v+&lB^?7rzFb$3-lWs4bGmDhhJxp$H5y$; zR#sNu^#6a-|Ns5l?R;g1g6yN`k0f|XGzCVOFf}~wRG*h|b64r>G@0XqJck($8#n}t z2(UE9JenZbw)>ynX(Np;rY403ozovqX|K1b{PpE!XY}^GpNt7-JC4==yeMEwG~UeFw*Tj|+5L(fpB`Gj-*Z{2`)HSwiAGme zMn;Cg|F`%5_ zr5#ByIKgzlXWseS4(*B(t#-iIM_VR{9eW5iKkATN)vGvd|PRI zVr%Hh8n-LEN?%WzIC0{E4<9y6@mi|(sq`G%O+%K&1{n$*hj!KfuX|s7-u8NAP*9Q* z2a`tEEOG88g?Ag&-hB;V_uOmE?I@t&Icdx7w?}?{ey+awVulpMvCp-P(-^b0raD<$ zSzYMr>dKNi-svRB{njwWA!F7y%`PM9PM0({H@77rTA?eZ&C9>NE%#dbyvk)|udl7O zmS{6v`FzUT-CL);UbO420E=URjQL^>D`_4!<-dRb@~mk*c_!+RK+mBCtJbVp^W^va z|NoSGdwWA!92HhYOiCRjK#TXZ zryZTGCW}aLTl4 zVRoO-7^|MQ`~7CyrAwExuI{?P`Jgs7xOR>2ZrLUUjoD}0KH1n`ynTB%Py6BQM5E1V z1}w_|O&A+ekN3%5)!+N&QrWcB!bvL6lf_qUU9gC&@!Q0=YAg+F%vUbbP&jRrAkj8; z>eR?{b1W~*ce+$C7%)0yl=@Ys3b=57#i!ZdN(DEcf=dnelZ$pT3$lZJJ+`g2&r(K8ANfeMcAkkIS-` zpV9p>La5WlK!D>+Pj7Fb&3W_dBskhtVPMcaN&)EI$#t@_PA+iqoMf_D$J*A;PVVLF*V;=eCT(B3^k~tC2ad-VI=9a=n0=OS@6l~C zk7hf281^3ze)awLZ%`I_`7(2xz}ofgg3bn?yg?a6{?7w;X=^JhDa|gY%vt-CGk6P@ zpInz_op~}X_Qn5o;yhoMAAfAf&%?vw=H`}Uke({?wO6wL_}Q*S3B0_#MWv;smcEyD zjE?^?J<*=9;&-U4^Ism1Nh+FMPRo`pJJ#0T{?n=OV1Z2d#`N=YuO}+I-^$9$x|S@_ z_9`~;bfN6l>rUe57x<_J7bPVn6=h_2^c;WeYCAJhTcT;A{VRq8mu}sP`uS@0`m!lg zrp(ana@z88^DpV(e9aX)ZU$fKgV*wixN6M zqI}F|pY2_w!8V~@oB6>x$-YW2O3%#9l(iCnx$p7s?Q=FN?46Llj@xO{l9Mk>7M)Bf`t&(Na zPT034JZX1h*iceZ60-ltqi*XnX~rwpZaxvVbk6Br3@3CYb~Zhn87BJqe4&hb#5C3O zbFIs*<@(omGVD;`Fzb7K;nSz0i?6@_Vqmz+e&Dm@=?m}W9R((-oSbt1{d^f28Ig*4 z^P|2tGc$B8lCrk8KI?D$H6%1RIGEivuwW5o6%y zKIXLZeU^;!XQ^8kEX|cVX1E5r+`4tkW&7>7ik_3)1XxZU z$zxFX&sfm#^F04TjjmJ)Hy^dh!iyI#cCwI(3l--%Uby!6_xIcF{(iaKyLRo`+Z%Qk z{Y>RAd9LKnAfw1}s7b-2q^ztgt)L*_%=E9R2^?;AE3&e(wEjQjuitU_Y0*uONiJKa z-s$Eo$&U0e*!0(b+CeYghRGUT%g)WSwbnds#P6Dy%5b1ZfrD?>vefn0Pp2_GDBrQ{ zlPtsa$eNCuIotaC`}=?W{deQW4T;@dwafNw-MV$!aryc^Z!Ro!-W@S*>q^<0uj?*O zb@^?3HBNr^*)*8>e1oCJD)zC*56)IR<`Y;N$<B2(-Jy(~m*}Qr4udmnR?K8GU`DWd5%8q@JUfjLY zQ(Rf1YWozszKMmtiadvBXmlO2`~7C~Lm$I<$1AKh48{)&ZnQn#kz+Ko<=3xYRx_ga z7KEmsyLm#4AzXx&qv=6_i0`>`=ls5Z{kl}-sjw4_G< zR_wKuW&awo^7Hd=ZBF;^y#CtsV2pc%=;5bDhOe)$PdCrKb>+~eHLCYn`=YiSESt4# z=ecv|c=NVPw~Ovm12s32r>#iw2 zetv3Y@9x}mnWVBVR>1Rpcz9&b1f655OYh!u(sd3IXEil+&c7|7@~~ z<_y2(Z&@6dWM^kvuD%-8l_;@_ca2!otlZ4ZOiv9FDM@*Ge;*&8H7*Q$u08)8IluDR z%t_&Km8tVjrWC!noMC)?)0y3S&3`@E{>wu}XyO0w|Nq@z`SRsU7LiJ^c*CFxmpe>* zuH3#Yy{GQ)ueE2aZhyX;9Qw)dawxmjRn^u-8U-@$dH472O?-T;S8v8n4@{f6 za^=dD^78UGkB)XV%`aGz`3*ch&s-^s~Z7?|@Wf)Q%elIz3m93UwbXnD>0@*Vos>H|cn1hqqnc zrnNu3#`*N$2#K5j;`38e>Xc-T7hcRTDgE~5W+B6b1t+E#PgTiO6YI8QaL~}zJ*us( zoh@LxC`v)snc*EzgE7zHqe&ZAe*F0H#)}s#G9}mc?E3Yq>U8${yThox3?zJ*7}#Csos;N4ezr+rL1<{` z$+ot(tgb~C4L_|!7*50=n__3p!N735aMO|{EgmXDkInP%`J6p>PS5*VRAy%8)q~CK zYyIthK6&=))hoBFqDys!&ZgIPz1w-{bIqFV+rPhw&fjZ#=l*^9Rwe)MdSN^VBWiUv z={(-McW>u$x#~07X0s(5){8H?xUO_z>cZLI>sXa<|K8%nSkRu$vpH(*i82zoeY`Nj*O&KI*>3GCvzlv;8!>G99(<^9&eT*(8%s+|V;h?@b}yQoL|jeR z#qYnjsr-H1`Gd{u@@GYI?roI_vRl`9&vtd%=AVE6&Ab2a+xF>xb1V#{`;X_Z`PC@N z(4Z*sGl7laO{WV}#I(?B>*M3QA6qQiZnTLvYG>YqrCe^?7rh-MZUVB24Yp~ul4%`ie#G2?mRtR z-@oPXLzXp-dE0ExM`z4(^Y-#OGHceXQi-;StznGo-Y#!>yd!ebk`x`W*%Gp{Qy+c& zG3k+~il>>pO~r+8z4`MBxxZiG9?eA}I1?N2%o%h^PBzo<&-+IrqwY80N@9w(#_4fDQ zx2gN{4|Gkw&&tS?9B7~XH@^4vDh zEoysD*3%0nzQQbuwO_A>Po8ON+_h_dzl!JOl_96xCM^jH3}jrobm>%$uB280hV!9k z+yke~T(siDjT<-KeE9HT(d8V?uB?o_ylplgj|iu>^UK#wQs7v1f%)#^$B+N+|9Lk5 zT-~3K$2S`r8;6JeJ;3wskU-BLBi+-RlFQ1%R<2pIq}DE8wMn64->+!?(@$^$CZ7r=;o0i^uX3en9cXO)5F(Dqd=8G97 zG8`;NQj99sR|GviH`jXY`hCAvt>3w`Qrk69q)EX;k#!g2gFdCb@7}#z4a$B~FE96Z zKlJd!)jcwE4#r9}O{`C2IACRKs~f#GZ0W*<3%eF+#AGMl(Pr2u)U@%yHo^A8iSy^p z}iD8Exez@}U^Yi_G-saa^ zPu!T&eXA?hTcRmYVn%AD+Ogxum#&T8zDt&`Jv6#<_4%lvdcExlDXULk*spimXn{so z^xCjzKR!PG+oaH8@O+lmt2a|qj53cJ@NB*P)+sqT*|uv@d4wdx&v;|z2YlK6DH3X? zR#sM}Z*Q5}g|Fu6dwgnp{{6h#KOc`v-@bLrZ2h-QtGO3Oce9GPGCB&h{QLLMd;kBx z?|+}0V=4Tsa-X_Bd-?=XX9KQg1BM%uPO2P9GAumaC%aX}^U=*qIh%POot|ksH8=Vf zSAlEbfuxNE!NI|sYinzbXEIb=Tz*qch;#Yvx6`z>v@~|#eHWPis8xdDxB*Y1#Icsg z6`-Q<(f8l)qhu#8(ufZZp8WIUary1`-|rN&XUsCoR#&|BcD>n6rn?LaT$CnmwEy?9 zKmC6F|GzUgZrsQr;k{8zq%A>&&oOeEtgx`~%V*EhvRz$WH5nALvR*qeewZr8vp00I zCEJp1+pd*;es=c2j~^963}QvyBCH=P<_NnA#%|A>8xk8EJ4rHOVokK2&1;4($_mMKaM+6;#ZHDh^t`t z(Ih!pS=s%yzsp1zA~ZhP1>2l2UKzqwZZ&u1*VostPf*DWi$7gHe`QYQd5x|lQBhGJ z6DiqH{>xcggVwHH`(~bP^_%EzIhp#px@#SuSDk-itF~C*<7(OBx36CP`m}cYJ+3cb zz8q2Ud=>q**?5O~TY`vOjMZE>cX#)nUteFJek;dp^S1L>yx6siBPDJ&z3Ez{AmVya z#q-hp+HW^K)TRZ#xtrtsvgB4*qC|km)QpUb71zZ-Gd{6rSa;XnQ9y0hGS=O9<<_rR zqcUsOtQTvew{Mb_mHoPQ?b`kXiMH4KtyxoIHEhm%o9EqmQT6?9`TGCw|NqPHcwV_U zKBO^;!|kCU6GOFy4BO_LJ$W}aEMz-g=(G3XR>sp;MR?x6esy5!GN)T ztQ;6Q?YhgXwF(^PX3dgHy}PS4to!JrCMMlyr&%@{PD|BnQcx<}9lLVHiUq4zua2C5 zetU1CMD(^VH*2EBZ`B2Mx+MKN(kYyNuloJomlG#Wxsm4DAuj4}@z z@T^_2V#3|L?d^*+qNEx0r$n?Zo2|QAqw7hDRj}FYUQKQ7)thg>jk_v3HUG6z_=4z3 zDnBRt+x>jh%x@=QQ~b=Q<@wL()pZ4I-Nyua4yo`kTuU+PY&-nW#ogWA)-|vt%pfdl z+3p)X+PONQk;X+D!j1w-;o;Xq)EMI4WNtGyHa0HnT6CnXjqO_2)@jKSZA?$>8RqGp z6>}6gl45jI#j|Vn*|c*xX4fBE_=!6$u)c03zDeismoHyF+|J+s_o@2)8Y62{Q_)tX z`59|Uc@ApCG%-BzP!aO*_U=CWwrqERh-=97D^A?HwjA87d#^sPir=Mkx*<{GRH4k( z+qb19*L)8T0CvPJ8?B+A7Nl-U^-rC>>Aj&)BfrH zoeA3>IlBfnJpcJ)dVF2wuf5;zN$)Ou8+C=FMBJ_|LBvdK-t&tA8Yev0CneIMw)TuG>taJSRPQ`0(Mo^82;lUu{f2?)0(Z&#hJRa}L&mV%}K!^d?&Y zj*htX(^sxuz50Mbj@?zJ=xgU$RY7} zQ5Tc50hjz{ozp+oMsFADxBHc`_H0@*lcTu7XAOI zTi?wkP-MZ6%Q=TPMx04An|<-stE_^ZF`+DucQ($+wqt%!Rqk)bl_+Z4tI9P=<=|B9 z@N@NlJ|5q`@7Jr<9yW6OXKrUU*`d#KP@~3)A;Ek3q)OqB}`?~MD&-ck%i=7jx5i4EuI`NP|&!dLP zsgk_yhrNP>Cof*J=FG%G+dESYzb;_DzL!NgeAe1s@sZO6WsY;UC4P8)eZBvgGiOv1 zd07rr&f9)sQx8|ugcB?WBx`k)=PzPpDEC$PK1zcvQWpf<6D|(mVbK|?4 zpdQ~D`F|hS>&wf_S-NZ#A0-|U=y`N#lHc-;+TrWY$XS)FxR_!zv5MO{J2hjrh~Bi{ zTMfS4zV_=9XOlwYG*`d*cCsgy+!Xs;wC-WSjbod1Lc+sO>rG#6b-QRC|K^M*D_(@D zcsAYMo*)17?)$pye~*gCy9BMg^3_Ie*+C&gmc=_}Ffvpd&2-Vy($biJKD=|0#w2Zq zb(@5mCi-e@Ie)eBaMspMmoHyF`0w984Tc#DPNYwrq{906TDK6%>Fs6PbIM%)V_XMJ#lS;ujuMC+XQ$HYsegbx^CUNlObAD+aCFEZVk~&U8=#Q z=s9Wq`t|YckAKK!Ze!qIo{_RykHJBZ#c@~3%S$KA@7I=VT-HAoQMT2?kY(`?4#tMk zs;a1sx8FYa{L@Cnb>dC2s7sq>Fy?47=10-tf>+|iI9~dN> z0_U)#MwYQMF@i>|^roMFdcc6kF;Ha7J55_{MTwo?7UyYiz90nZ!1mk!`!P*{LupN; zN%ZTsY3mrEYXJg9bX7c)(l*ch{hip;+xpscg|TnnW1p2FT9t2a zZG8~+(%972_N|7lF6;dB?l<0k<6?2-S~NS??m~+5-M}T{JZ$-U|9-nIZuj%axbWeU-z1?xmxG+jH5|{+1c51c@9U&Ut`#DZBYpG-A)&!Z>!_~zG@C$?$`S3 z*Docv1-pM3vMjDBWMWvV!R0B?5)>XDp11vWrp$52`%JN^OF=&Qa1^bT?)GLvc$>N)m60b@sGpLW?hOBpVc~X%D#R3ib0d^ z|9^gdzIgNI&Br#a&Sr2n=n~dHvo_0pp@vuF+OS1?_RLwgVnx9u70dmHZe?+~t?SXO zHJpF><(8Ji4`=S%w{M5eX^k_HUTGTVX0&lL6!0A8*nIPhxvA;Y89vK)@4C4zR9iXx zby4KBshypj7yIpgy;xm-zt-Hs$SCPcca-vjpLPvQOT-vBW(WuKJj<*5dv{)LN^IZD zpL@40l;dV&5b1mDQ&Rw@Nn^M5juWfE5fT6T#6FQTDtRV^7|EGh_0}mM>qvu+-YkpR96n zeffmrsV;#cbISu0B-mIS8+1-@NIflf{@dHz*JF1S9JDtzbzL5`GQ?`G7=weDYhb;v zoQuu0=!y`-$;SK)3?Tw6B}qw6^JdKG@b&ZK3kwb1s=(2dW_0A4?%JAdlJR+8Os%6{ zD~WLZwEy$r@IPtuJQaom8L|7?3|Nx+KymcH-M(WS)Q zRB+ubC32eBW@FXl6c3x={`>MX zXUvc&vXJ3xQt((ib>p-PY`d<`pQLi~@87@EK|@TJZ{MEnvHY@|>vyTc0z3@ccI~?L z@kVlg?zX74TdaPpVqRBfc_rqFR7z1vVXVka7mwYswPGS|iJ$wOPMr%(U(~gT!BJpA zRGNzCx$`?rb5-8Gj(RH8^gDH7_S*aNclig3geIzee{=Klqwl|!H%90ff~w73C7CxK zf4pKb_goRf4&`Z^r>)^>uvT|AHa0%EZr!?Qas4`xxv-8X4 zeEV7R+GCPSfCy`o!ZYn<+_GyoWY&uvTCil-@-K@NJ%hp)M({C4bWPn9aWG)JzNZjJ z6T>2nCKb<)^Uqh`*`6PN_vB>te70uClkdMTUmv%(s`B}{xqe&EUy0&uc>UXTr9G>o zM{j?BymjHDBR{^rzMjmGpwqL3t#StIVmSsMyZP(Cw2H^w04*ANY%xKF^Hx+_l4JbS zSdA6O7m4y-6}oiJPy994F8MGo8x>C`nd6PmD^DDW{BZ5swPUZZukUwPnt0*KlO;9= z1_rOcR<&zsY1MEvDP*5Lbz$knLsza`x$*zc`Tuuz6g~Bt^SpBLv!vcn2Hb4UmrcH( z(q3<3J=f2;@9_e=D~xMzf(nVZm_VlJo)|W*SpUw)}6`Q9(}!O>cr$kl>iafeFYB>wcfjT z@5F%v4odOIw+qSGR+W4PjjM3~wCi(vm?+xA#*iRi|L0@rY_r^~g_%;9qr|GpLl$x$ zFXCCHeKu(Q@^7`LBRlK#i&&3{pRjX|ijL0Sy=#}7^28HIjvQ&RF)$GLQnlAPZ1q-N zM}eHROKxVx1a_%-7JPnoR{D6qy!^{oue#PMzFzch`u;ypx8>g6R;nh%`R?uZ`*Ms8 z2W#X*_Ekn`@6|qi`n31H&vW1Bh-s@TV=)5{rV-c)2jb-$EN=+zN*{2NF#0Y&5nEb?yXEQ(tKc{=dLudvp+vSFaQ60|9|TVkt*4`U%IpIZONSc8?-K@TdezN^5&Zl z&dfA!bWu8Z@Rr4X)!;e7bJ!P49xnt<2W?J0Ehg_M&@roPm2a!=wVU$~o| znLorIeXO|S>+Ab2M5~pp*-=%5YiWC1Ti&T+h6ArSKYJ~(EOQlcRTSX(QupbkI%tsJ zGeWxYT^hrNJwG0G%bNJ!HsEpI6ZhV2{q<GoUDLY&3T zi4s9u<%*8#hy}MNZuoXG%zI%OYuM@=fg-HaQagF2%}h4xWOuqPK5^toOU>6;R}Z{+ z@q#1e71w+78}suwMT$>SQCt|1@u$E3&tvdNUd6n4?v34S3=iUJJ{~>x?c2AqS<4J% zjyI-8UiPp1H2H7X>Z^RkvD30Y*UYJWoG8sHDRcbh^ZE7rHZEFpsP(bM1(Vw82^p-1 z1h|<+|9*E870mUnoTM_btBcFs+uPe$Md+ZKn%Wcxg$ZAN|7G47p|kHw(m^K&-Y=^g z-<_VWAHSpIWzdQD-_;os6!yD+KX8SqVdb7ZcRs#Y+@DvlGe(T(@Psor8bZRutNUau zFSR|kU@y+TY(K@uXYoRD2A|j0*X!TiU7kPrWQtNqc*r`DTS*`FrPs*)df#%*DReCl z&*6m6&(4-w^xb~+(Zb5sc5Te=vfQk)vNE4(Pb;+-OI+A}@rs$Iv$L}^D1p9t_pa}F z(#EX;OO8LVIG1;OTkhRuzO!Ey$hdnA{(I(g z?EI4xW?1w+o>%uPGrqRA*0L?JL+Z&juC{IS4jypuH@iON-YEqRrZZ`qUw(Lan0J%T zEH2vv}jaefzd1#8xmi ze66tgX8&`t{Y|&aChM-HtX$+Mz!DT49bNU~!^5=ISF;-1ubirgU|Gz_aAVuHZI@zq zmu(FeX%1j|wncj}l*`;q~|LUvto+w2AZP&0}F$(^?m(CUbmee(me%Tvb(7zEGVjhEAWY zcV%B+x9!}yb6hgVBN;Nzd~aND#(%maV^QXHE=ag8;tTBt2x!Q1!q8QuG6QT^) zx!Bth6Sm)ed3Lt>^~D-qt%nnjy#IdMJnxPK9}CmuR=F?d#9pv5s8022)r;Fxv3T`r zZ6U7KYfajx*cr|=GPB#<-kzVIBEfdKN^Xm=w}|V(9JASRRWFyG)j7TCgFuud|KSxk zIv(%H{QmB)skB+nimT_CikDuLdZ*F++wr$-5W7T^0)wMK%H3V1@4C9U`e&tqmIuwA zH}9P|i{eymyMT@rwp(`X+ND?j^=f!9Gc&U%!;9133w4=$u4Zk0b8qi%P_pbylvwos z#{$pUY+Z{EJpUYO`~S~p-I)v(-uwI$Oe-Z=npdt`RaEyn`u?p1v)R6{raRuA7}h<} zEqjAR(NUu-6>V0AiX2Rq1rHpwn-r!c7^BQe9Q`OU3iiR@v&%Pr0cnkp?^|k$(NXyvv%8Ntp2xEsVPz7QQ2h z!(gV*k49#8v(l21iiC5gDm0iLWLK7$JhV6`XIZplsuM(Wf?X^Z_g`ze|Puxn@Jl3 zvfg<9eG{@J^V=;6(Z0tC+i%}YpI=+neKpJUu(J?D{A%SCTStLqvt~&>pJ!Wri=)Zm z%8b@~y$h09cJWSQ&b{oCJB_zV!K1czZ~NmNlR~sw{d|27zP-Kuaic>*z_irB_}LTv zKc3i>eA z4h;L`7JRyTHtg-H)wO+#G>&c3xqkoteS0gbS@UMidZgkxEADG^b%7M)flY;vkA0H= z|Ks@YvuValkLi6Wjl3E4I{W{$on{f9o}9%WA00h#=8O*)Lk0uK+DAXvXk`Z)NHHGx zbjJAn6?vPAg3V{sk~O+!%@=&|p&z0-f z&6PbT`2#koyg2U~D8h2sAWWd;W@l&TgA*q@1p1Gwhy6Vu zHz#Xa>RS7sC;iJz&CJ49T)m^>`K%=uVo12+cUAfWvtM$TpxvrbL7z|jPmrh`DcFj*siF1#bwshI@ z<<1KOG#mq`C~-J#+Oy|Q+SaJtSJj{2>Rp}J{q4`0G~>tLe={d1CwDq11mtXf>Bg{O z--kooy#Drozohj&_IP_^!TPgIC-PELe(njJeKu`p>FaABPMq+NdDiqGyXbDuRy7G- zi@xaZZ*M;bO@5XKh_tTS%)VATYi)%1>9^0#SRNnzHutr}m6@4p!d!|RP0uRj*x1?C zQzNGp$V``P>#VeyS0r=X^Q-O8H`&w9?qy?e2%NHV%^DugRwrRwTiY6~saj&%hq)Q9 zwY9ZklfR=A~5w(aDSf9Yo0%nS|7GEb##HdObUBO&M-$kOmJ)c$a2 zf-Yy9ID^j8rAzzb|2z`!pE_+?)Yhbly0PnStnJQO*Ux@XpojhT_Iuyg|6M8eBGpB% z&_ZTfV`JmVn>TM-G%0lHoSt+w>u8MLbZ$q1kk_+LwMTpXzk6wpxRU^jwr9|XUteD@ zoH=u5QfF#Kfy{O}+p3boeX`b3l5Gb=PCG>(nVnm6LhSOzMRm){cHae6XK&uV?LD#S z45LHA)N{F4HSS&fl&2wc+}FKdE_c<66$P1>(>HI`*Du>>py4C7>itEwFwL$*efaPpLr09eIc=fp)S5KkOm;s8hPK2VXJ?ylxBYZNImgq}(@8WDa zP*zg1rW!QGd+O9Fov32t@HdMhVgt3>ykBK=9Xu3p@x0Sl#+*=|j9FeqeLDRc9pO*>a@j+BkOl)3pIf7c?7!v@blohDYMMpJQycA&zycVFP1?`M1v#QzcbAnfe}QOiR6ZdAWc8CmVexhm9(1cP4LDkO&oVwY*pJ z`RwsmuV0@oka0KCPD%aiwBr2M&3lt-SFEV*n3i3A`e;#3@y6%d=IA`FdUc<<;QPZ;f%QXe8vwk&l?puP8sw_GAwgbq_ z_m%hOleQJwUk{qJHTvPfyKI@lHu6_0z*y?T{p?m4OaOG{-$#2bYbVbag5 z?qq+6<28(a5i#vo#Hx(U^>6pC+gv7p>-o)fJAc`);#PiqEaA|@4{zSy-tOGB$b+M4 z$*EJPGss^zG;sX0KQ)8-fz0un)m2q(NgE@IYHH@_PB6L6C3Af3`n}(7wblOq zwsv`D)jiRrXZv=Azj+jwvA*-0C4&Ob;ewYXRo^Zx^}f7G=ko@(H9R)=**_=JjcW8$iQ>>%7dhN{UuL#+_z{eGl0HoXbmemgdE^G&ZSxvQFI>6~8u zZ?9Wm$-j!Nk6IHYe*SvB{=JXd^~nqd>CrGPUi=iA7Wcb<%htRvwbL%WbIbGC-#`1kwjFIN z+Pmy;tUycU#S=B5x&V2sUYa=I=yfsSKyUPlD zE~h;!yC(h?T-wTZ?&*#5%^b&^ZpWXHuibx}X-BbV@Y~|QcA?=@vI;f2m{=SifVv9* z-)ug=?#uV@%YD=)heSqNKKfeKo}Hb&H%qNgYWC^&sS91LcQ4DFm6w~Fduw<3dk=qq z|3}Zx&MsxRFu(n977N4W$Nl#2Zf;0)mURuBagBFsZcN0hh=rxjnXb;!D>P3Vy}7Y* zapmi4YyUn!Ki|K5(G3m;TmFK&%B2~shaZ15*|u%lHm;@#Cn7{W)E2W`)cSk4;avZ& zCHeo0_&?m-wl!PgRifPeVl7HdsE`!w%2m~%Ucp9j2B7Y4U0DUlBfB#T*Osy_0_1Ig^%6hy}eI= zIdOtRzW;dm+Z~{-Oizk-=2U-wcQ<4EZA;SwYrEXGIeZVgxNBL+mZXJ#JZr+Ve;as7 z@Z-xDle(|3LZ5=>m38#>*RNQ;`ZmK%7tyy5rsrP_s85n;TNA&(uDH6odj0+P{_%S% zHY(2byC1ccnK_|ACLOdy@cp*j+k0mIPP9|bS{i=yN{2ebfto!nDxOQ0EnD{NKqK?l z{r|qMS6-xH#(3at>g|tOL0g(G-o0yk;qF~q28OK+4ry{M3<)fbEABUK)soOS^Oez= zfgw3kY;%N;#bE=99YI zeSO>F_Eb!?sQdF{>a1C_s(22c$x1MtAGRgTWDB#Z=cHwa+xheN)&4H~@$BsEl_gbI z)vm-b7|irhdkt!F_zAGg%Ds8@X`b}_v!?(b-?{&*21~!wYy0>%6i`*&Qd* zcJ{ySY}bXN!nQnz8P0$1QsC%P;7~gM8MJ3pc_IgYar2@Hl^zD_VqMQZ8Z4Z*`Jc57 z|M}0?fBpV#KF7K|Z_~<^FYmm&yIcOS0nb&?{)_V$A|)S`?SB33{e62Q6O)p!KR!NQ z{dBW=p-lR}qxy9lm#$j1D&%a(CH>v2QdQT5>uEPDa2$F4br-*!&5f$Jx3+R>TJI*AY%y2zwrk7vvqx^vlTF(iRXA(e#xqgRK9`?zYPMl$&^cXxH&n%w z>HO#JviF=#3mDGqTy*H+1`)2-CkX}|8zX$U+7H_>EMZXKWmx@kl}47Dy1H=qx){ZE zaeHswzjNo#gQA^Uf-H_(7(di3o|&nvbGoSC=95Que0=?0>QM&#$@?7?^?M7c#ZhK{@z|kaQRg!V|<>lq;=UNso(^%WHRYQVb z*oeWw+nf9A-1jxdx7Ysu#x-l1XAYmsv{V+?K$p#Yhe5+VM+^V#Tb6K3ia&CisOO}V zOg)c98eNMPXlTu`t^W3D{@C-Pr)}ODAhPtT&&rys zX(`@e0m+hn%QtV@xN+mAwQF;qU0E6Yvf4LHPT*M9)}q~IZ?lSa-~ASI?WkA0^wn3V z#qI|#%$#Lg^(Eum{{Ec*f9Lm|&*xQhF>r{u?tgcC!ED#H zCA@9htfKy|^pzH6QB2z!rGM~nDyts1&H4MFT_wjrtIo_%pE{+brKL4%f+g1>)1_x; zoLa&m+;96W;`!6l)ARd#dp~Z^ySs|LVV~%YQe%b!>+*MB-rV26UpKt?V9xPfcXS^8 z3u18KYd>755%m4_;mOszzOC4LGw02=+}mqF#?McRywUCLFKZKaEa?&kuNSXW4Hh*=@f0rs7ejx)~oY@7bQ7o+WDP({mZEMjxJhc{yRM_O>OtCU3tCz{oDa9 zD_dCI?!S1E@#x3L$CtO~-QA_f(GD8-OY%ZI%Zf7ltcqSy>@TR#<#q-dI4+ZaM8mBuoDXhs@b!PEF3pUtVfWu7Z zKd*d!ef{zC^K5U6_a9eJi45D4do}b^sO|dydO|FY@9*p^e!R?gwvVc+D$g0wo3(wMsM$zx3|;kN@D7&xRk=O zx4Zk+t5;dC_tpM>_KSaw=!;xs=B;JCIf$w8z=!?+fA61f zQ~oYSW1>e)<%78r3=A!cF0ODDU^$v%q&j=ntQw83q*u>poM+fkSIe>WUxSM0>O~qG zSFT)n;l_;_CqDma{;_P8EMNOy`Trl~`NKj(r>^8yUfI3;rEXlq(zT@<1**OauZr9p z`_@UPONpbYp{KXE6|}{@-o(~cmZd>M>Pc+o>e$W!Mw-?aHvGd_2kr&XGy#8qF2{J3e7-}36Jsw$!9 z=jY2y%F4=K`Sx3jMO^g2+;<8*hZihfoa~&Qp5A%{V>CX7Nu=^3_T0V4Ii#uwaRGg z)~%K`cJbO>izFP%?!O6Qum4)h|LD|(b!OLZ-?sj7(Ov%TzQV_DP0xQieZFnxup#A)`ujVzzQ-B4T)Ae6 z5t`iI`H2h%V#V4NI0_ygyY3td%*9)qbsh-MMv(E@r&=^Yiob^)Wkz&WdO~t!+4a!9##0Ixa2`v@h?4;q0>( zzL#4TX;_^9Y;pc`i;AZP1B2%zCf7iww!}p`r=2uJg#6~&NLm#>I+9{Ea|xru{B9OU ztGVxX7Cdyi-7a5Ov3u99UrE{7+3H=3cEl-gEoGXc;<;z#%9Vd_rq7rC{`+s|WOe_0 z`SUfWEzA78egEIL&vc`=T}h3)e`l)X)=Q1=ayD}B4M>T4d<0YqasU1MH<&@7`Og~u zO>01F#Y{}h&1YL#TYGzXd)HvVO_Of_1g%itU+GRIFnJUTl1;?0|$^7eH# zI&%G+84Ttg|IDR2+0(i$ans#A_pI#f?2Bg@Uu&)ZEXKgzVEyN>%<-GYjvZqh(yV7ed86~Bl;YxINPg;odN#?zJ@nXfFd*AncmpQ#jr)$w??Tst#i*2uz3BNkvBEYh(^!2se z`tRlS*Bu2|X1^EiKAQA#-MV!*Ky&y;U_eCPVwhRwm~_ zk?nbRt=OJzTKkFX{AY9hm>mM|U%ir&m6hGA>N#oB*RnZO&_dte9h8{_f7! zef#!hGITgUJo0`TtFr-@c)YVS^Y--f^EU0;wX4^nFZd=?_06s+VNE%|FV1?hN$0e! zt*!aL5AF6m^X%*G&V8;qxF*tPl1gB7w0EVA+~#XemvN#Vnn%l_u_ z76k{`ioKbi&kfL+Vo~>};>DMjm&27Oo|v+YDdu!mm)o{!hO4F?ESyvQ_t)38(q=gc zk<(05D|hoVSnR%=SNm*cdRc^ySk&$(tG<0c?anQb`s_hs*5(P@c)7b4C2Wlpz2=_f+c0Im+@6J`L zPOUpOD{Qy4?t#14{bvg<-KOuaBDC`R{rdgZLY*!Q3np-fPVZ5aVC8TP?6sSJJ|sH& z^{Q2?X2ol`pU?W0zxiy?)!81CR9?J$x3BWi5zcxAfr!qmF#R*U3f>F*mSxU)Y{A7a zfn79aZH6)j6VKrQv)R23?B0R#uXf&bwUP6W+gD>*`0C0^=}9VQ#hm7^j0tmdD>=D* zeqGh(>#tKenieFi+jWn-UAoM+t8!kr-(0J! z<$r#B44fg{Z7TfYTGEw75e2{Hm#^HsnQ343nNA);$)iW|YD%zRVFJpPB;PJ8E)qnqfme&pq3QGFD zdjGH0XQxh`s(LfYqiR|;)6)E{i^REo&ugd(aJ1a3d_MQ{$`CEK;*H&=or)5yY@UhA6?{NX|7mR=Ue8D@ERGAcix zHUF;B<&+wfpc*;tX#D?Q*Pq+}{c?F_g24^0;zJuR9C)S5(Ug~!wdnhso58t8Gcy{F z?p(NO;o1bZKoJ$sroO(uHg0jfFW%j$n`ufOd$X$dET zf#;+N^XAQau)gl=>UReZ9^9b7;mfdLiG{%V&*q>${kN}QdqJ!GcHMo)_V&An>inZM zx1O8$UY>29pLcU__4f=7ktPq7rVA#%pn2#`>(;FkJG{ZV>&vF47uQ|cJMrw)_- zJcU#ydw%TJ-}mGHo7&8rnCq3_s=wc~jA{S9uY323)=8?TH|c2KdmORhvWnj=wbDBa ze47_&PB8QRt>|!RiRY{Z8bS(u0Xy=7t^HzdPBZtsmgFg-nx)vj+9l}D^qb#j?yj>> z>#HfTU9#iMgyc?sg9{lJ#qW21pZD4B`Q5e5%*=irS>okW7fT;kOI#v$s=KSJr26~2 zvo|)So)%jhwwl!=XYUFZ#c3OsoH=){ue`jxKYHyo2c{bFtutrNTz2c$tu6EaeOb;w zecH5Z40q-g#)XB2X>>jM&&$VG)!yDN=_s&@F`;7O7UN+e5QX+@Bedp_WOOm-|e~lGKYcT^{4#%$7jr&$5;F1qWim5t5zNS z`}_NIX&$!bMH($pr*CLnV%QOTV)@dgGf$sB&0ASnsn~qbA#-cg-Gj~SvyF_5zU)|B zy|F6rRy9O@N@|kWV!P912{q0JC$kSPK<~(6;Y>1qeYP-fJ z`rgB$otHGbxXjJXmrL@r#Tebnu66cWaQt+in{{cR$kOcV>%PiZm*uDla0FP*^}BrQ zR@Ao_i~F~2)bU>M>1oA1SEI>aQX=<-?hxF2{BNm-lGe0~vXwudP6r)6@@|>V>9`%; zTe%y24|zxy$b^T+$IstZ|Nq~f<8sw+7-uar-BDb+IP2*HZrQCduH3Z+1smRPy&kvw z*43*|d0CkLW?T3s*VXOIe12}O>iu8Wwtou`3llr0eY3G_l2or-cu>%!+m|jSefwFX z*X!oIS?9FJq$7bMOHZCSaUnb;M56rNoy=R?a-)AObZ#$u^89)F%4*d$(+oa*SMdyT zb#+afq_UUiunR|%f~afap@#;mFJ_d8b-Ts~1}5IxmOJ}rcKq+C!{_E&-+ul2wRhkr z$-222Iy$E}g@%T*PEu)=sAvhkaY#-KbWl%~y-F_Hr`+mCsyh zH~)O;t1Bz-{rp)OC*o>lZEgMbX8QcQ^XAQ4=kC&I#+Q|wWP1LCpF_&Ry8h|9&nx9B z=Cx~wuj~19y#9}SxQfun16o@T`U{)+25BfR@_Q;M(s?&r^+_bk%bD%I=O zEX-=PZjr|JW9p}kQc_cw);`saznQ)Hri$kzw){Ig7`15Mtx>-k+2u60N9agacuuS6 zdzUhEk=Sat?h{O@Wxs3oUAVZ|eLX8vBg37i%QRYi4|(uj$+^Gp?vESE{h?{8siDDv z{HhFV^7pPdx`6NW6ctaK!beALetv%bc6(dfpNSqRhVqBzUYIa>^5kzn9`|3b|JWUW zCpJ2IcH{d!SFf)=*Ek_{=8Cmz*REN)a^;?ikB??7(%8&%*n{Wrgh?uy+}zx!i;9Xa zJ?5Nq^`7?}lMl%yB_&g~ZQUwbQeOUDlBcaf#j{97NHJC~{MNqO-&v8wf&+pMioYg-gJo^EL3(As}r-lq1K$?bdh>_UQqf-*KnoKg^r z>zRFhlB?9m6HI%uAlkx<;#-$@7X;ktvGe+)SXwaUTN)(tH1r%t4(d=jSBJN z66Hk#ER0SIC;a$!JHLGY|9`)O1$1NU!rLyc+UO}E-M?wlB%!;F%CvM{SuHIsQ$HS(XEZa@;<{hzsxE#s$23rY^|N0om129 z@_zgBWy@T<+Nw26mo9Z%eRbO6%4KDb){AzpdHad(z#jR;|*yywJH_ z=e+IrJLwW_7ZbOZnVq?~)=c?<>3?-~_4a?Ds`SvtWlnL(EHyM>9jNBzKnke6e*6 zbXa_GgRHEqs?GV`Ztm`X?dJQlYrohiz}N1}z#!Lu{O-MbalU~ftL@CI_KV$FneTPx z|I!K@x%}|(@b^cKwA_DM)TqF*>wMj}&9{w=jeRrhR#eC8l*_JpCUvEb`;Tp0jDZZF zu(PxCW6*%Mf4h?+KSKrMfxVA}>%2BbN~JI_y#CrWdV8L!&4&Zbye7W)pS|#7J>q?- z8nhWVV(qnt>#t+iO08SDa;4$EACJ1LSFc+2=?arrLgv8*Vy9l6f82Wd7`LwB-3_}o(J#AlKe%hwr&mme!-dl>GbK-!*!p%h|AY` zwmU$?RZ>FYg|v)J%!~K$`Q4NzUbXmnO0w-W3g@B4D?+BLShe$yLs zPJLuKSCzQ&gS+P>k^T4W)3-*gO+Pp1FFK+#L4{z_&ty8Cm?!R~a`g71GvGm`+f3N3gI-tI4=cTza zcQTgiaWoaYytH(+-*V$OA1f4uIxm=-nyOY-Rz{vEpSWVhim5TTlfEuWx_L)|qshq9 zG843fZ7nx9cis-~)few^&TiSrm=L*b-Nuc9+fz?ZJG5udp4+ef94YR~V-bi1?`8Q= zTU+a_?l&i5#+*4kOb2>H<)$S_v@td8a54$?DO|~Bx{!(CMTr$t*!H@^fB*h%6jt}^ z`SthT&WOj_3?6=*B~!mGvXJS!+1kq5e){Po<%t}Qla?&pxpODidbjTEkZjgcK90QF5!H4naee>CG=lOPDzQ$jk|Z> z*8G0EeYZ=XNWp)mzNfQ_#eU1hNjgkYQI+6f`~Ca(@w|I`B)cqk&1{#e%IJ<;|GYpq z%WzGp?-Av`3eT#Fy&ChLJBql@m_NV#-}n0e<@pve`_dx8YPhxk9E*qZ=FgAMzL};e!^f`KC3NwTtM!2!JFivz z*e(2V&asCD7Ay>xWb0+vZO-#Yti9$?UjF^bp+koZ-ZAt)KONB{GOa4^$HxormoHzw z+|A8Rtj2D>NTX`&8A-Cf)s-_wF2)y=%BgxbExf__=fE&o6h} zQu5PQ*lqPOwZt|0T3OlIrR;n%8%#`1uU<0oUCQLCGj)l%scGrr{rl_F5)u@4guP{A z04=24UGXuAf8XrGp30JG6aAGRrMfQu@9*!=-`m$$#o!S0_M^C%nA7!jvE1`)DlfhI zT4md@NBp!a!;d8avF~mqTYoJG55KwhQ!_I&bMoK6e>X4EV0);SvwN3Nj?giyLrEK7Y|FWsv}WD9b=O{&%v`aqKWeuJ ztNV7H(_RV!A7XZwoxOGWvhaqRIh_TcdO4c}eqHRZD|!0n=4Nr1z$p`6$?LQIi))Q~ zkhHrdH76(Mhr0dGlkJlyPqvGgEnB-|`*!n!cXxK)eEITaUF5W*Pi>l?y2!0O=@clk zbo=)51J6IR&hc9=!^3uR&z?PZ4jnoqGiw>=p1&W06px>DvT@(8z_CE1%gEgPIcPfc z|D8K?q~9e5iyTUObkC|W_2#X%wze(L=hyG6xxOy8I%8JaTk6=a1$$Pk@YtVyT@N(yVeC0c>PvgC3b$!Nb*YNb#`%`TX*+iB zwifK2SkS}hkdcsZ;PW}__Yt;o{qAd1@4P;6wsc45le6ac-^j_ymF=}u(L~C0hug-8 ze`l+*Z=cXyr@?jOZP|U$YT|@nNwZxY|%-VV>*7}52S zWqpX}rNgY-R6I{rzu#N_^2^K1+dh8$sIX?={x3-qvu4cTh}mCv_Zw&o{c&ZS)8n1j zJ)L#eB&!MiJT+DOuClW7WoKt+#(B?$uNlvJ{`10A?QkYg?|Q@Kmvh`s)-Y&S%VpV% z7%gOFVvLTDzdz;r>#3FVmKPNlZ{D7BGpNUeyK7P2-`#?i9$EH+Rr;Qjir(DVSl52I z(PtxzOZCS4mv5-_s5Cv^@#@W+H(Q$7`Ip_T|NnQVudlB!&tU^?-SP=MI)ZMicf_pg z3n^!@kWlP4`u;c$9ztXKMtxDLtRUX`uhFZ85tLH@9(?2C-wBStjQ-+JXzh%`ASoK zRD?K7%FE;TR(woS*tXkiOIc&V-G>Dxy}iAyck{kKIdjG*Gca%>XYb3nukkC&_e}I? zk(ZU7yX9uiz0S@~1BRB#1-BL+Ja}+fx48bf+`GF#%Z zdwVQj^*Vj~{WrwZ)6>t<(NWI#vZv>zXw46sK1qnIzkZsZpZ~n~B$pXJYUh$RW;}oX zJT*{6vcqlJ!)KbTi`G^+e!ZEsVb*=kjnieMr*nAvX!&R)7RZDz)!+&b2|1FQo_^VC zZr`QXUo{sV6=0btaEYV+aF>Rj+}Rb^UwgJCo;Y;KNzL4Ry0)g~#gNd@NG&a`tjt-< z9_#k>`do7ENG&;Cw)?MJc=+`r7cN}LdhNQF<?_g=I~LBw;CO5`-v zNh++aftO_X+!YuTKg@SH#G!0!yZ7VI=kxWmGcq&`BzSlZ8tm+kIY}i@q_Qos!epNHSBD600Zv`9W_kWsSzBInHYteo zJ!Y}A+L3bW<+}6d&Y6{zmHBPozWw|1rAyzcaWpx(Y!t~na&o7@@#Dwc)z#GQ#H|nK zY;`J0PEM|LbZnITsWWYIbz|S|xNMfpe>->XJmxN6Tf%+*bC=HPE{!gQ)0>25TXX%& zJ5y5LZIcoib}h+k>f!_U?+5xVd@szhP(g{Ct-0}feEr`u()oKF9h-jlsJ9qgx_nuB z-@mWx#s40S|8sP)q@-l!CLQ6GlXl9mXD9u8YQ@xk|s|$S1IR&fB*jN%f7zu z=(E@(u(beZ`FVNQh6hV@Ez1mAe_dF`bKU8bgC~=Ac1!=iSH-S9L50)AS6Jrw+HGZ5 zHa-0Q+c|uF9Pd6*p{=T_YAPuyDb{e5+v(9yC5=NKfg-9BJiDr@s+Q%L%@*Nd17*<9 zeX`c4J}m0l@jl7&*}9a;Y}44CUVN>Z^>|0LVDOH7-oLZgJl}uogvp&PI-Wt-((Qjo zKK=3Wv9aC!^^8IuQrT)e(^6k=%e|d;3$(TFX3jZPjwXk>hk~XUgqg0GD%ASx|3|ey zZr8gHP5#n!aKYy{H#aj+*N^90vry`-R{$GBjGrH0wuzKw$UWPc-%|`1MQHVe=w5mB zwraBFdCe}RGik=NCr>_n(d6t$n|RLE`u{4_dwhI-uYUjf_2;^notO6J-{05H&=Bc! zIzngXhbJc|H}kbCKluLJQGjLH%9SfEY;Es$Y{@Rw{PA>#+~bL5N{!F|Kd`-?8oBT4 zPlLEC5_aj=7YVL4brR5juE)U?7#0>*^y0$8U)STR*RnIbQgD=fm950n_c$vmI@OHhl|geGl!?Vyu7{i{USzKH!eEIU_;?JKyZ#w^6+1txYr?j;6DbL{v73r>Dx2}64r{?`Q!2bEs zXD+K4)pORw>i&GHU%xZCqT)u`+gqlbizdcqZOaFS(kQQ!>B$=hyyLXU?A0HJIs>S)o>E;~P3H zm4mJM;Og-8eLG_GECo0iJSUZ8XJ;>sTmO8*d#1blD{2G6no=gP#bq+cT2J*k;msJz z_N?;Xwe*)SUp_lu`>wdx+1Yts#Ku#m$yZwrZpwN4?(Xid{`P-MO8xxKtxehDyC_0t z<)X@!GI#%NPCx&xw5)8`wF_mXnjwq~XE*7r)!@oDk(#+{msPH_bMwk&%Z~l|aF`#o zD0usd!`i}y>&2A0@961rG)eHVDZBT{NE%4>>a`^vvN^8}USxJLZ@YEw^>wjRj~+ex zQpD9z#IBWw|CXdxpR9N8Uh7a z7#BU9!la_sl~qwuvE$|4^80f$GBYJFzy5kw#ZxHj_uf@=+H$tvUcPMk^4Ns|9(*iJ zDS3H$ahaK!dR}LopUrc*yEtX$O1s|FOo59Vb*f(*M^0P$?c29k$K~s59&NoI$Iaki z%D}V!sm*HDo~~K5r2fvctuE^7?v{?2cJ*j6+p?~PJ4cQmc(bHS#q-FUH*YT7+?;-V zecawx{s|Jfs-R;s3SPc^Db;<{DLpN1lcl9))ZV!KiVp|bb=4+o?q0ECg^9WO^(j3p zdZv*I57jsh=`wELu)!d8YgGOmo64dq4+~n-($iVjU)P?fqN&~Gv_Z%F>GS8twzjsm zs;a6p{cXQq+1At3lhfP&erRzwi6w=S-V6 zjj`Z&pY-XS4BKzNwX6R2=Ea#aJr6!sa5NuGsQGfy{q@!;UBSy!8kW6m$q@gzL9VZ` zC1gtWCY}4c`gKk-ISMFnFio5~b?UbR%={*xr4+YbmV6TMwTRgowoB`ffdtR3W5?V; zE#{?1lTP+;*Y-I&yK24D+c`bDB}y`Uzx!mZuU)=;S@=VRP3I-OEQvP5C(oZh7ZDdv z|M!61e#KLZJ|&K(5Rq0<7RT_Ys98&|W<@RuUE!=Pyfrw!N9Wk_<8MEI{+yh@=cC*C z8#iX;S5#O$Dch|q*YDnt@kux-v@22KR?@}|V%@41R#va7emrbHZDee``qr&mUKcA1 zE_t-rGn;!q++Eas@W7k9ySIxm9LO=dt%;z z_o}@*Yt}~G>;3ujXWQ%R>wm8ad%d-aao2%iH(=mAw|<_o4MSM^i#kQ4tS={Q1tMe;9v!zs9t6v(UuW zMH;7`JbCix;$rvRRn^tY^<#ECm^X7KCs&g|+X{P!mW*|Wbq@)!G|rkeD@jaD%qciH z_~6QwD+98#SNn<_{je?f_9{iO7mN($XTl>m3m6#~=6Bp#xq9{KX{nad4<4ug`MSP- z@2}JG|B6x)5+3|2-}ia0@#Dvj8L}04=RI!@TRqjf>dTAXrlzJ%j~+b|at-9T%I5O% z_uqMqjg6ekFKe z-l&j$Qkg<8Z1ZLXc95 z)y@ih$tzdQ$)Mmd=?FU$V_`{2$d{irH3kwT*;}K`^!4?d6*_KvB(DvO+tDnUsk39V zM0|0@j8$%n7k;hUyKKo4mHjJMYJNU5)A+L8e1B$!Z=v_x!c~L}TMs9$Shue2(4j*$ zvzA#d*?98es$&z2pP!2b^(SxVn7IauR2}b=?G+Uj6}z%rT2$)D`fT0r>6Q-3KBkc^ z_Lp7c{A+Xm6njo;cx*BEV#XBEnM%U0fea0;SLfs}Z3!&?|M&ZHS-YAYi}c^ zW{>Os&MOU8>!bzU3?xAHa{M3AddQEf!`D}-dU~~#P5i(2eeL>}KcCO9_gH+I zZEdu+Wnc0|(-q=xqZX*~eNDH>TycKt{Q2`ELqlEn|NHe?nPEZe)qD;az3JMAUzW6$ zzq>Ot(L_p@K|Wi2^XARM)AeGdX3m~1Tx%ykb>_^O#UCCVRBKE0=vvf}8W}KK?&E83 zv!ID40+S5&N>_@VNpY3pVOx7PZF6r=PX(g`|LPaZHz~c03k_YGo1cGPLtlUWbBl8u z?nSPj9U(WN!R3IDiPxHQ=Z}1ReB3>0ubz;gTlBKaFHO##J-f4NZ(R4AcO5!n+)G&+ zTsc#=20Wi}gzE?B92wA(e)rwGckkW!%-Lfz$HBKztqk(Q?E=4bgnq{{F#Ks!sHm>4 z-fNzBCjzvC!Tn)DL`?Rht4RmUld^Q>_LsjhdMM)R=?0C_us>Z4;S2j&)$}}qnVxm+C>vz#Z4XQlMb!Vwr$9l z3S!krPzZb+lz-!+sYJCPXzcU*-SYUo2NMjON`yBi>C85Wn6@@QGt&@M_$^woV#TDM zsYN$RN|wuAInT&x>>AkNp(0cT8mqImw%%)OY}|S3#WGVV-qV|O)|yRT@mKi8)E>EW zAGscSPGT`OHr{4_zoz)Zp;qpBKYvy(31w0AVzIgNZnpz_U^t^_(tUnr2Mr0HU!Zyu zH2ad0p8h<-==A2tQmni3EgFyfuI>pq(bK~tb}jDW!?wG5-}iq$XI(6=7h~Zq(4yiw z>C*M<<^})${Ji<{Wu~DBSD>!0uIkO3HzQB*vkIF>4kVlf$Az8J>IN{4bmMGTxE9$;>dnqs435g8+H)SnJc96lb4(CM7HD zdW*$RL_;e}^DBco-;zQXF)^`2lP6DR+#C0vA>uw;fQ93O?7*#hom;k;hzVWps*Dg| z`LDfxPf=xJV&a_VmFGd{#l_E@F+<=_oqbAbs^sfeue!EI>9*RxuP91f+^KwZ3vYuz zTh8a^>qDz*YVNFC=ec#>6T$rU zl^R?tuVz`cB?@hwz5C<0+xh&V71<4~KTW4_Z)xWq(9M}KM6uUR;6S>_diteX*itD@#jpS~QF8&97< zzn+yLX(Q*Z&feomiCb*We_p(JF|&N#kB4_Yd?;WLite435;;xC^`r1#JF}`hjV`6# zF?zqhd@<4IV7jDLa5l-cz4^BE)sD@ZH}ARpvLsmKDSN{j7nS#GS$BjjcljN8f#>jq zizy$rDhqY?)V%bL4`Oiezr00LhHtW@q-5srZ*NyG&75`MY;U*algY6kOP5BRU$Xxx zgL(G4l9-AH7N%8x4To~RR_#p#&1x_An=AG9_3O`TpZqv2$r~IQxiUX5Z{5Y$Uzdec zo|wJE_`?&e`RBKPxL5t2H+tjRg^@j%st=bYZ?!4S5W7+8b zF~=n6!%fvA+ZjK228+4|284x8+ns+OG>sP#;kf>jwO+xr)S2q@Yc?&|v}w~k6;H3+ zG!NCZebX0)B~N4y3lwn`asBw?4~i$DDi-11=l z`|aAs4av(zB2_-lEMQo0cXPVGYiVhz-MjS>s~1~O?NAo=WWH`8=Da89->b(A3^#Jj zuDi?Ens90xoV^$LX!qT`pJ!$oKUa{F-1Opr*~Y>E^_PkqO$s-2wr%Vd*T1zcet+Mj zi<1~z6*yWKt(Y=XVAZWqozt64T$*h(I?h$Ad za}?-Wq;YBPuM6u1t}-mx8lm&dU9NITZ)&8L*yH&Z9yP6Wl3AItjA_SSeoj7{E!7hj zEneUA+LiJIhw>-6esdKx?kS%@pb(FUuK(cuJK+{ zCdj|iL5f4#cKX$byi4-yW`Zwi)40AqetyO4wcC%eIz|KvuX~!)-U4cJ=*925BhJ;z zwDJpsd7*WI(e%_vNjbT9^XJd!KYQ-nDF%n|@bGkTaq)c5Lo1&q7-*c_r1Ov|Tlur# z1}pC`=jK|U=HlkwDk&)`<8oFrD>pf^y}wp|BI{v;o@HCMgj~LLYgY2ch)W*|*Qj4{ zV%F}}JFc`tNcH6^Mu+b=lKZD_+q!k?#Eo|16+b_vD1>g|ZMbs!F2jzyhH~%i9|RmhLW^8bIF=aaXKVZYcq|H8rw8@a~km4dyj@lP@i zJ(|D1UBJPTVUdPZaZ%Bx?Ck7PfwOt8U#Avaitst5JfB_kw;i{kbX{TL#%;THS?P*! zJ!Mqc|HpODZ*l!d!RqxEGJNx%|4f}NGtEJg;l-v+n~cid-;2#Qo9!#r`z(xe!irDZ z>_jty8CQDAFl_JVJ;@R%;y6jgRmAn_v0iCm(0Km}jV{NCMD~5Dxtwpxs$ZO%s=W_% z*W%oX9x5GdZNEGqb@^_MuE^-^d4GM} z+}zX{uBaAhT(7m0KmU18%au46p;x`Fx76n7FgCQ;ii?P(*nK`@e75@Ao0B>k8U_wq zf|koMmt>&jQm>auXyB2xu zh*|ex|KHpDV?R{b#C3>Wi4mOkwM2R1i49k?c>DVLtkl)i)}7q+hco_|+BNZyEqOUj zC(3r$F5AEV{?nqJpgI1xcXn>xvTD_;ut1Rq7J9$)|2@mMQi!V2NnE1H;q+u~`MsG% zJ7XA2-&p)R^ql(_kN&OgVJprCc}#fz{P}coF)^|C_x9cv>Hg(>WMQj@;D(Lj&3iAT z%P_o1(q}$waBSN)v*5bAI=|T1*vnp@`NEj)>|Dv0ci?~9WY%B*rSta~KKlIg(1v4n z=NJMQ1Mjy!ys*%Dt&LBdbq(*fFt1N&!0tgb#-YvuV)8{uufHEaP_=<>vOsEl_v4xlInBwY^!r? zYHSKVKl62+mU>p$-)5ul>Z{9+&J$mFF~cWpb?LRIMXiZbOFuq70J>Rc%k8%lZL7ac zG2n4tT&U-k#~{xwTJuh2)tQ~Ue4Og)>c0K?v#0m5#l@#ZjtT+{KP-~CX3oj`sqr9r z(*=hq5j{MIC9JKi&fMOffBx^C=XTqT&CShcCrU8g&s1OZrhd-?p{ZcJ-!%3#1ujR?B&aw3_(N-v6;TKj-$wWOvi!g)FBx9Von$8=7gpsxxZU zi8&z?8b6x&1&S!j@M$Y6D;NL&IsboUW=%~EA4AQCuG0OJ3fQLK%`;C=O+C4E>Cy>v z=f=7OiY#8|FiVU7eIC1Bg`wi2J39&wXKjsouBNV@y8gQN{qp;@S4Bldr>b~P(%9&= z`fAqc)2DBGPuJ6Jaazd1a7I1B!!L4Lud}l=-}1{ZvvYH|7RW3=dc0%0*1`3R4<1Wd zWE@;uD!1_Q!{d)E`qr*kabj|+Ws=d%3eQO=3M_owl?0{iJcTR*Ur4qYPMbP)=DYp> z|9yFTd%L*J&nJ_2uUfUrD`S>gziS(?RBpySe|OPl)o`d;Vn|GQ0mQR&C) zS`iEkZ7hx}D&KCsUbQ7^?fS)wmAfBXge|{(k>Nn+q7|!Gtk5`f{``3dC%3>UuD(*M zTcb8RJfD;*X=H4CmYq-L#>V91eL<5?mZYVm9Le7rK+$N{q<`FPi7(!~ z$yo;~VCbPn|^N2 z%-*Sg_1Z;`Bti>)`v^p`h{wfJ56W${B)Yn~cwAjw zkNW!hmdYH@Oo>$cs3E=O!ZoA$6AUJ&{=8Nw(Z=XGNkLux_>`G5Gi#pBOy`lW{SsL3 z?%uw3`SRnhzyDUQ+aEtE**tRn^~-F{jVsrzF-b{JpZ)pMr>v-`s8bqUNdYMnqGm_D zmI}yD_>pHQ!`BX4iLowjuhoN(6-;;U-i_-&E>FGp4*k82H*3UwT+@AvrnOguy_pyH!_D@7k6vTXbS}m*xIA(8%1obm>xFh6x3XBK;-? zy$vf?uRgtc<;s(fE8{?GKTFq!y=G?+bS;^n;>p>xKv!E^`|P=MW()7HmUcS2Z}tSk z#}3{1pBA;&+Rgv_=H}*DW@hHTfB*g+c<~}5BPmHq$>sI5$9qo*hyGeBvq<#}Z@=BI z7iNnuu2`D+Yn#~y4(Ywu#FaZjRQkSJup0$(H8C_PIE05^fAIA5^mNz2FU$vKMH#JM zRr>hQAt%s=#ecHaWnX5Web&^|(<8HW+D1>Q*UYYg3Nn1{Ztm{+Rx*7Zr=K!83ap6T zT^4$Blh49^r#vJcFX3bO02<8Q`}5gsb8#^-C58Y_26G`Bmp>J$pFe+IbNcC{IeyDu zeE;p*wP>B~uNRAN-MMpz%X3o0vX{}1y+e)}_({ERouuM1iG{_nA#C;1^7r@lW*m{Y zx0lC!{>qa|7nf;#sb79M)4KTCnbv*#?0(Z=?{-}r_GqwQLN@1w^lszp|r;tk)>zOo!bQ($CKw^soBtF z5M>&+TWN0DZrj+^R}W3ojo$I)%a@u-D*0QVACZ5z{Owe(-4l;CSno=n47z$+UVeY! z(^FGHr~6&Z+a7#-Tdwxnl`B^!Nwht);FD1B*Uw9i1uX=iA%scP(P* zENswcGiR_+@tjq@GbVFk07t|$RR)Emu0tK%i(PaQwkk{2AKUREc)O^o=cj4G;!|6W z{h!CP>43BA#m}6rP6yAOJLj#eth{Zqy8o{B_V&F^3Kfc3MMZ0WF8LV9$B_B+=g*z> z|DMvgc9jH1$_Y?fB=N zmF;vn@cz5^-Me?M-T(Wpy!K(i4Q9>{!RvNe+MNG{= z$3<_^*JH~ajSs1DKm1s+2Xw+GU%PXO)!deY2^XeMnBfVswbh@tH61E}L;*W8mx+ z0*nuuqW<2lNcMOp6VB;)@@<(lJ3BiwGcz-zqrjgDHfxz2*I&%=iT`;je3rMDS5f4& zy{=-~Uv<|W)mc&}R?)ydYrjUNg!%Cm8)tppbL;soIV1mC+aFt%ji)GZ7+6|beg~}* z-gNuzH>WG*8`IXzGGIu^DJcoLeE06#T@@dbz8`F6@7Co#vuA5t_AL(J$lY@$ui@$4?x~ah2c8&7m-z$ zx8#lh%fqlqa_2vvdcA&s9Vn<2y~H?YnrAEWJgBT&uzUCJhgZYn_r`^WUJVZm+t#YU z@#ylB#1)Grf-bT*PiFlVH*?mkS#MvyoH=9OylFCg>?aL+-W_C@U(-HgvGjK9)#AH! zPA|Bak(a3@Dk>^!UG_%9vha}$hfuIrQsi_s&q*RYY}ZRCH*T4J)$ab+dDj~X=`iiEMN2C-~-7~f7{ab%da?4n;U=mtycU%!5dJ$wFKSTb$5h(@oQGb4jI zSE~ubcKi7$T+jRur?D|OOj4Qjyt4OV#*)ZsODpUq9?Y5VAj|NAU&bQf*0pP42Mu@{ z|HQv~V$*VUUH?)OzEU~fUv^5|DMb$}&OJMiYcKo^+BgbgNi59Upu*!$S?+niK&sC?T7zO zR`;Lx`DaZY!;9#XGv2qD3bQdZoPPT0|17W6RWHFbq%<+vf$1^#aE?hFnU8td@_+9nlfvcZp z&YXGk-o1O3?S~aB_r`77x9?t1Ow62q{ZB`II2h#BHyiRWcP(P@y_{emai;#0dVSE> z&-4G^VPzawqof9iOeI)+%_R1srvEz>+b%%egEIK(=SWfYV6`I z!cP4St1o3)8|KZ#V8G)XB(impchKTT@wWl2yu{^$UcDDIL z&`EYoU5g4tMMc-#%vn}yC3|#}PNvDRw;#9|F3z5{!0?V>*CGL((?V&RXKHC`E;Kea zHvReY=dPwErsS}&X_4!%Pe1(WxAGe83AJH?A{{PD4=-K}TzxlB{7sql1(UU!dU|>f zE&TeApL%>XxbQ(5%hcwnH}}<6KfbrO`Z?%&l9r6f4i}Y%qt3aGj*aW~?TgDdo2`B6 z(xojY_4xl~HdwLDNR70zx8J{E)vByDD^{Gax3XI0d1+;-iLZ2g#lzNPt5&UInwFY> zyF%ybk9h7YX}xmOLs3{Hhx;RyLpjD8-oJVMW4SFK^3OL z+JTb;Yv)XrDYv{Is!(-T$mQ%wCY6&`6E4gxQ4!k7$6#P!5WrUc&X}S6$L*+(oynVZ zxOGkkWoBlE#Kp;Nul-$SDAeiT=EipTv(4J;uP-aMayY+z(f4-Cl8YBFKAbpl;)O$p znjU@sz4FzoSATx}`X$7mFzr+H3gx;BYqOzmtSvP{_akXMwjR2 z`WGcuv9+~(|2=G%Uw3bBb@|j;cg${y?6`Q~aQW#|r?{e`qgS)Bv&$A27cWdOnDL@! zrWV76tJkhQGch#{&E6Wt_EYbIjMtVjLH>_U8H{#(i(Oj;`P!epd-v|5ar!x*n{Ug+ zUA8_HP%+m}T^zXW$o*@|4y+79J`xhw-ZF(TEjjh;??0~DXVoNm*fuR#(9r9m#KrK$ zfM@aj7luj?R%v~UE3}#mTFJli=FP~9dE1%KfBw=ZYn_!Esb(T|b}eh42eU$5hDP2$ zhm%DbMXR=M-D+oR`*+pZv~Gth>*g9PkL1~!nwq+6&z?PNmMvSBX7l}F+;xKwuiev} zT>}@aT)A@F>ebmbIXOBOCMHMJZ%kjv%J6rxzunHID^_R-pSO>EGgC+Hjxb~C51qKu z&`ByAZsxoL&7jpMCLZKuh+~N84|v?`=5^vqb*Z%Zq0f5~Hs4eU6iHnhmVN5X8J*TA zSvIHJcCm2$3Kw8WOiXyJM=s0b|t?VQauk;-@7ydwGObglTt--Z|RlllCf zJ-7e=Q*QFfl%@>+4wpqui4wK$?(Wa7@B6kjcjnBQ&r;0ff0;0;SAEgZ73=<||NoQz z_qX@=-=8#h?%MVvrM_zz8ERu=W8clQt=_g^PWRF++$?+kyBRf{U@9)repnE(tK#FM z4=*n-S9cBk!sNhz=WohHqaEqtYR3yF%$w(D#B=!Rvu9=#RZgyOW(jsIcqlnnZ~Ezb zw{KhLZN3R=u0MJHeD>+nr@J+}ls=@H?a=hvYwa@sv2|5Vd;gnjZi@}yuUtNFRa3_P z9+$G`m#L|bBBYO#L!V{aFW)mEpa?6)a!XtYe5F>6-QzfaTm?-5e&{>pLY z21{G-^bTnj*T5N%9wp_SpJywoHd#|$ly%Cfa>c&hUfx?dW*76eH!E=Dq^72ByqIC~ zIEqQ`-;Npn37WpldwtX%?ck9x+0qt$mz}qKyB-z5&aewKaKC2JqD2g@Hy++PTGZIScO6?s zaEto=hoRxgvX7U5uIAxmYt|^XjAWFY9l`QlD>1~(+&mj}`Qpjbr&l|x-U@b%SULGi z(tj=UygL$-5)uVx&YU@MFk!-ql`Bu?<>szc;b;nQcVpDq-`O7(Fj<9jqYWRZgOvaN z-d<6Gt42bJvld;xbjhc(vU2H*Ia%r7-R}PnX}ZPU`tSdj%l`SfnVBaWG7c}lx`>IP zL{wDtrghny3=^qdsnQKcye54TxMDicaR?G|EwR^Ywy{gx113P}{ z2nD@L64pL!>nS1D?Rxv-#l&0t>+5s<{QTquCkL$*S=wy9i@CAkcG_m&8*j@L1vnfu zL>5U)No6g1sWSh}&H(Y_-OB@y><+sVDc5~aonO{!i>lP@& zC4YF?`$v;I(!E^1_dK?UT75MuG52*iH^Z-X`MMpe7A{;k;qi{>#4Y8YV()NPIPQ5` zC*Quy-tzqCuG3FH&9$$uJCL?{r=pbLR3X0y)x6*Da6PqHw`}Lm$m@6R%$YfR_U={{ zPovNp@sEcxR6Qp>d-hC?ot-^aqi5UJty_2O*kK{9n{}srqsYsZe??!tUzDt9U3O;L z*?))a|2SLwUS{jynrYgYC{blwoc}Itg38Wm9LKdf)Lt%qe}Dge*7u(4-hJLEcITu| ztGn~V`3uh{@8fnAaoth%_0`$M?)~>#R@_gr?Mlv5;(KR#NJC5OlBubwB)^Qsg@u=2 zmaLoo$qxmPnDzrA+VrBR?? zV&Vk{*5?t^T0edI^y#=<^%^Dyo(*QY&VnqCU2(VGF5PqW`-8aSNk_k5cz!S;pzZ4Q zX_vB1q%Pn8|M&iTAAf)I2m4m1JPlvr>+fxwedi*mSMs)u{r}(l|NlB!$b37vOf$>5 z&|i@4^rq6?Wp6LNzqxt&r33>Jr!67gUK!#XJ3dTFjg*p+k(n`XUf-E>=d_v>4Bozd z`xMlGG4U1N@zNo;jp@gYnR};HD$a9j+9J9nb;jAW!=OX`0>Z1k=la?NhbxLChgD`Lv9;P(Fd z`pnYOQq5PzjoISbr4{<@J7#LdnTQ-Xp17sL&HVi5PZO2h*ClXP&F*{0dt|SR#M7rw zpYEDAZQ2>oIXs0j$92W3c1=8R^~=hYD`(C&&p&tm{Q1)d6DD~0`S%9<2?&LYf7raM$aPF8mA-;@4zMW2rKO0Vd=1X@!X)qQkQ;s3wi zuPH_RrO) z_E$LLPw$kwGqY=QPnSW%B8_K1pU=PFs`@!}?WZE=!-o&gn;u{H^Uc=m>uQA$7o2<7 z8{WcqKlkx>U)?QNn=~bl2<9K}>33ZlyMi-kkH@vkaoAl3k&T-_uNW;-D)9uSAehm z;jOLNi}m;a`7}YJtIorr`l9a|+3zfgOO`Ipl$MtM3c5e~Qr1>C7on4{-fW9GQvByA zhjPW|XJ=>2^}Bauiu)877qc=LR0M_YxtpMLCVPi$^wLxZcX#)<%=|VDKEbQ68nLOX ztJm)Taa5lTblisUj)D;Ps}Byj{IwLiaKf>xh1ZI&YCcbV+pHHKKkI%C$`1Ot&Odin zpa|=lu+?8rP1Q~=E-to~n+ot{^_luRo_3nA{SrT7QX|Ipz zo_KVbrk3l3NwxAqoPCe8tgNiQ`XDWmD!T=2&&!8tSE-t?N^5x6K zCWRAUzIs0gxidCi!FMxV`c0Tj(1hyq8gO@X0r3i zWL(SIT6j1kxY1_9hmE)2e&*)p77h*$o^<^+>)yEa+FDv#3m5Om4VTDYsQxNSAoBr} zUK*QnR(AGk(1Bdvj!EbLNceg+$Gvi%{_D4ITS2F8Tz3f+>F(;9HEY%^u89Ht=}L~f zKh9{FXk~4^7Icrxv&ws^+izDkDTvJVa~BmAJ7k7VmdA@UGWaM0((+3PL9?AIg zBb(7rOmBMj!z(L;#q;j%c{yY5+}<5`^Cm9KeDU_JthR=Rhkd~Vhv2fZvPQvdKH>Gb zdY3d*JexLdG(5h({_pGlUAuO*v9q&-#<&toTfdduym|9k`n<|ziuU&QvR`)vgtJAw zFKuAAeW13dv$GSlj{KYB6dkj}8NnRorimMLqOV`Owk$h0SJzCc*L8wZ;+Dci2_k_a zttU^OoH%jf#0i&QPN}t%zk2IdRL;f-qsOW*RJ(OPJYG0g|K0fq7Jaqvc0RuaYGW7% zid?^Ru9S!2)S58upPT3ZJrflg`t-+U``?@Qf=2xu;}2wWGuG%VSs%ZDpMjZ~S;3PN z6Awz8=dnC{_UusI{&)t4)@7Ny_Uwt-oO*g%$0CjE3Q*N)c1FHqq~kR z*tbt2Q6o4wxGy}e^6BE><$iZ1B&JEj-2!@$7AL}cFV+09$FY}vAWUR9R6iF^M}(SIFXJgc$| zRJCm)0;k;evFKXFaC(!Q=Om`TfB*VLPE%!wh)%$ znwU}JXbN$c<7`^M!_UvZ|H~zBbAT3TAm z&6|;)i!W-Zs;X`|nsjn`=B%*mx1wI!9`@F2eK=Tq+5+FD`xnh%Yqv$pQ4 zwVQ7))EUuy@IlY@*H?9PbX?ln+LR6-J}lRM*w9&^B_bkXhOYoiZ(nQ6@n&?Q#sMa9LwGRFl$^WUyfCH&WJ z_czX76mZT}MJRAh*y|hmbsxJwFAO-rdhycJ*&d2_wzf>1IWuxc{(Za4$^Ew1Ce5E8 zFT9qa==Y%;9e=pDE|%tWn)jS}x_>5&MpS67VB{HwY*-S6|Ep(aPG_*j=z8Z7H{3UH6$-DZ=qF8 zSxHIB1JL=A{jvLMZW@}HJn2mR&$sH_Tc(Cq2Zae@T&*5mi;i@4b%FLD@XXN&bCP() zVrwGjD4>*nZq7@a@^^Ep3kohMpWeiu$N#^CvB7s*>fEzw!s+ShKQCSkjCON#+p%WN z8jnB`EjO{Q!w)(5`1tz%JYcu4_UEjt=h>FZ9G@t2 z{O%=@j}JP(#&GZ8=i(3Ra8Y^$+LAdrIXQVV!vki9-@ACTgijy3n>A_Gs#U8lnVOqN zYiVoeYcHPbbs%@g;lqc`+1S|9+S}WeKY#vwikaUgV9M;-v->}}nr&*;+*RJSh~cn7 zM!JVYuiNLt{Pr=W4-c`<*68Yd;cFnl!?t>DnD+m(`E{S4bnEZS5O%%jBGBR#DB>^R z@`Jzr$Kl@9;p=xb9ZZmT_r{vj&&OxO;>C*_&z(DWbIqDHi@tm*5&K)Xw63Q@aqsi< z^XE&*%k%g2_Od4L6zsNK;?BSz!{^?6{dMo3yZ8UzZC$xiv)^s8Arr&d&o-r>pZOl2 zoxjiWQGtcc#^kjoC1UQD3>n^DUYkJO?DLy+I)5K9JEgPQ@0!cf)0OkWt*oux^y)?$#6Pd ziQ9LrV_Kr4Ktf5$mRI@zzvbWMIebCjZOaOdCIzQ02mcmzpYP>t3a~aa6MOUa?cBN_ z58DrK(%HP?t)`>E_J6UQ1^X{wxpL*ji4z_t9u~ADRL;Ea+@x^e&>^R%-}imD1>G>b zNJFJ2CS7~ena6iHtMJ)Pfr@!Z+7J3+0B z)dIS)`)*2Tx)xpsxBB0{ef#U$wQE6}Z^n29hMcn4CHSEyFHod)-n@C)bLY-Iw>o@1 z+p*)vRUHLZoSv?K-o)J8y3{I`jX~gJk=ccf*SbvvGG^^lP1zE)_S=Jl&Cz{wwpMb* z4bvTyy!_+Y83b4o*B*bkH%?!kuYIqGYv&1(re8DGvvw^KU~y!L(G%wnREp-zV{rL> zMxD`=VL^6Q)~W2gymePIOtxo=ze>64@_dC3o6T=o|0~?>hcDgSoc>!sW`_au?B0n% zQY%vzM_QlK*3#PY_U+qcZEbCCeUI}}mGev7%=u~_R_wjE^WedQv%^-K8WGy@7}$O7ipaOxM_jlwaZu9*tr$vbNODraN|bA#`5>~k~+lHd_rDda7n!K z{BvjCc55aEdE>8ItxI;jaaRy{kZU%ZVYN2P44n){hwoQ{{Y}%;(q3Kltdf>>THVzb z^rme0=NA_jA2!_lENxO8SMuYf=}d_mBfjh|dus&R%0A=lGbg1k-t#G;=^vF`lqQ0v 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 A@Bjb+ diff --git a/user/app/doom-emacs/nix-dark.webp b/user/app/doom-emacs/nix-dark.webp deleted file mode 100644 index b225ed745ebea395a8b95fbac279cdc62a1cb8ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26946 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ℑ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 diff --git a/user/app/doom-emacs/nix-light.webp b/user/app/doom-emacs/nix-light.webp deleted file mode 100644 index 92c3aad59c542394dddb54b9cf1c0674f5d931de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22286 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 M=12V%UODUx0DSagIRF3v diff --git a/user/app/doom-emacs/packages.el b/user/app/doom-emacs/packages.el deleted file mode 100644 index 4d367bf..0000000 --- a/user/app/doom-emacs/packages.el +++ /dev/null @@ -1,38 +0,0 @@ -(package! org-analyzer :pin "0908eea") -(package! embark :pin "0908eea") -(package! dashboard) -(package! direnv) -(package! org :pin "5bdfc02c6fa1b9ad4f075ac1ad1e4086ead310db") -(package! org-modern) -(package! org-super-agenda) -(package! emacsql :pin "c1a4407") -(package! org-roam-ui) -(package! org-transclusion) -(package! org-download) -(package! org-yt) -(package! toc-org) -(package! lister) -(package! all-the-icons-ibuffer) -(package! all-the-icons-dired) -(package! all-the-icons-completion) -(package! ox-reveal) -(package! magit-todos) -(package! hledger-mode) -(package! rainbow-mode) -(package! crdt) -(package! ess) -(package! openwith) -(package! ob-mermaid) -(package! focus) -(package! olivetti) -(package! async) -(package! centered-cursor-mode) -(package! elfeed) -(package! elfeed-protocol) -(package! docker-tramp :disable t) -(package! org-ql) -(package! persist) -(package! sudo-edit) -(package! solaire-mode :disable t) -(package! el-patch) -(package! devdocs) diff --git a/user/app/doom-emacs/pkgs/org-analyzer.nix b/user/app/doom-emacs/pkgs/org-analyzer.nix deleted file mode 100644 index d3c3974..0000000 --- a/user/app/doom-emacs/pkgs/org-analyzer.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ stdenv, fetchFromGitHub, pkgs, ... }: -let name = "clj-org-analyzer"; - version = "1.0.2"; -in stdenv.mkDerivation -{ - inherit name version; - - src = builtins.fetchurl { - url = "https://github.com/rksm/clj-org-analyzer/releases/download/1.0.2/org-analyzer-1.0.2.jar"; - sha256 = "sha256:1j5c688yg6f5y6n86rf6vkwd1csn1y4dc716d5bczmyr2sgi9c67"; - }; - - dontUnpack = true; - - installPhase = '' - mkdir $out $out/bin; - cp $src $out/bin/org-analyzer.jar; - echo "#!/bin/sh - ${pkgs.jdk}/bin/java -jar $out/bin/org-analyzer.jar $@" > $out/bin/org-analyzer - chmod +x $out/bin/org-analyzer.jar - chmod +x $out/bin/org-analyzer - ''; - -} diff --git a/user/app/doom-emacs/scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh b/user/app/doom-emacs/scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh deleted file mode 100755 index 59c147b..0000000 --- a/user/app/doom-emacs/scripts/copy-link-or-file/copy-link-or-file-to-clipboard.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -if [ $(echo $XDG_SESSION_TYPE) == "wayland" ]; then - FILENAME="$(wl-paste)" - FILTEREDFILENAME=$(echo "$FILENAME" | sed "s+file:+./+") - echo "$FILTEREDFILENAME" - if [[ -f "$FILTEREDFILENAME" ]]; then - wl-copy < "$FILTEREDFILENAME" - fi -elif [ $(echo $XDG_SESSION_TYPE) == "x11" ]; then - FILENAME="$(xclip -o)" - FILTEREDFILENAME=$(echo "$FILENAME" | sed "s+file:+./+") - if [[ -f "$FILTEREDFILENAME" ]]; then - TYPE=$(file -b --mime-type "$FILTEREDFILENAME") - xclip -selection clipboard -t "$TYPE" -i "$FILTEREDFILENAME" - exit - fi -else - exit -fi -exit diff --git a/user/app/doom-emacs/themes/doom-stylix-theme.el.mustache b/user/app/doom-emacs/themes/doom-stylix-theme.el.mustache deleted file mode 100644 index e83b979..0000000 --- a/user/app/doom-emacs/themes/doom-stylix-theme.el.mustache +++ /dev/null @@ -1,177 +0,0 @@ -;;; doom-stylix-theme.el --- stylix template created from doom-one -*- lexical-binding: t; no-byte-compile: t; -*- -;; -;; Author: Emmet K -;; Maintainer: Emmet K -;; Source: https://github.com/doomemacs/themes -;; -;;; Commentary: -;; -;; Stylix template for Doom Emacs. -;; -;;; Code: - -(require 'doom-themes) - -;; -;;; Variables - -(defgroup doom-stylix-theme nil - "Options for the `doom-one' theme." - :group 'doom-themes) - -(defcustom doom-stylix-brighter-modeline nil - "If non-nil, more vivid colors will be used to style the mode-line." - :group 'doom-stylix-theme - :type 'boolean) - -(defcustom doom-stylix-brighter-comments nil - "If non-nil, comments will be highlighted in more vivid colors." - :group 'doom-stylix-theme - :type 'boolean) - -(defcustom doom-stylix-padded-modeline doom-themes-padded-modeline - "If non-nil, adds a 4px padding to the mode-line. -Can be an integer to determine the exact padding." - :group 'doom-stylix-theme - :type '(choice integer boolean)) - - -;; -;;; Theme definition - -(def-doom-theme doom-stylix - "A theme generated from current stylix theme." - - ;; name default 256 16 - ((bg '("#{{base00-hex}}" "black" "black" )) - (fg '("#{{base05-hex}}" "#bfbfbf" "brightwhite" )) - - ;; These are off-color variants of bg/fg, used primarily for `solaire-mode', - ;; but can also be useful as a basis for subtle highlights (e.g. for hl-line - ;; or region), especially when paired with the `doom-darken', `doom-lighten', - ;; and `doom-blend' helper functions. - (bg-alt '("#{{base01-hex}}" "black" "black" )) - (fg-alt '("#{{base07-hex}}" "#2d2d2d" "white" )) - - ;; These should represent a spectrum from bg to fg, where base0 is a starker - ;; bg and base8 is a starker fg. For example, if bg is light grey and fg is - ;; dark grey, base0 should be white and base8 should be black. - (base0 '("#{{base00-hex}}" "black" "black" )) - (base1 '("#{{base01-hex}}" "#1e1e1e" "brightblack" )) - (base2 '("#{{base01-hex}}" "#2e2e2e" "brightblack" )) - (base3 '("#{{base02-hex}}" "#262626" "brightblack" )) - (base4 '("#{{base03-hex}}" "#3f3f3f" "brightblack" )) - (base5 '("#{{base04-hex}}" "#525252" "brightblack" )) - (base6 '("#{{base05-hex}}" "#6b6b6b" "brightblack" )) - (base7 '("#{{base06-hex}}" "#979797" "brightblack" )) - (base8 '("#{{base07-hex}}" "#dfdfdf" "white" )) - - (grey base4) - (red '("#{{base08-hex}}" "#ff6655" "red" )) - (orange '("#{{base09-hex}}" "#dd8844" "brightred" )) - (green '("#{{base0B-hex}}" "#99bb66" "green" )) - (teal '("#{{base0C-hex}}" "#44b9b1" "brightgreen" )) - (yellow '("#{{base0A-hex}}" "#ECBE7B" "yellow" )) - (blue '("#{{base0E-hex}}" "#51afef" "brightblue" )) - (dark-blue '("#{{base0E-hex}}" "#2257A0" "blue" )) - (magenta '("#{{base0F-hex}}" "#c678dd" "brightmagenta")) - (violet '("#{{base0F-hex}}" "#a9a1e1" "magenta" )) - (cyan '("#{{base0D-hex}}" "#46D9FF" "brightcyan" )) - (dark-cyan '("#{{base0C-hex}}" "#5699AF" "cyan" )) - - ;; These are the "universal syntax classes" that doom-themes establishes. - ;; These *must* be included in every doom themes, or your theme will throw an - ;; error, as they are used in the base theme defined in doom-themes-base. - (highlight blue) - (vertical-bar (doom-darken base1 0.1)) - (selection dark-blue) - (builtin magenta) - (comments (if doom-stylix-brighter-comments dark-cyan base5)) - (doc-comments (doom-lighten (if doom-stylix-brighter-comments dark-cyan base5) 0.25)) - (constants violet) - (functions magenta) - (keywords blue) - (methods cyan) - (operators blue) - (type yellow) - (strings green) - (variables (doom-lighten magenta 0.4)) - (numbers orange) - (region `(,(doom-lighten (car bg-alt) 0.15) ,@(doom-lighten (cdr base1) 0.35))) - (error red) - (warning yellow) - (success green) - (vc-modified orange) - (vc-added green) - (vc-deleted red) - - ;; These are extra color variables used only in this theme; i.e. they aren't - ;; mandatory for derived themes. - (modeline-fg fg) - (modeline-fg-alt base5) - (modeline-bg (if doom-stylix-brighter-modeline - (doom-darken blue 0.45) - (doom-darken bg-alt 0.1))) - (modeline-bg-alt (if doom-stylix-brighter-modeline - (doom-darken blue 0.475) - `(,(doom-darken (car bg-alt) 0.15) ,@(cdr bg)))) - (modeline-bg-inactive `(,(car bg-alt) ,@(cdr base1))) - (modeline-bg-inactive-alt `(,(doom-darken (car bg-alt) 0.1) ,@(cdr bg))) - - (-modeline-pad - (when doom-stylix-padded-modeline - (if (integerp doom-stylix-padded-modeline) doom-stylix-padded-modeline 4)))) - - - ;;;; Base theme face overrides - (((line-number &override) :foreground base4) - ((line-number-current-line &override) :foreground fg) - ((font-lock-comment-face &override) - :background (if doom-stylix-brighter-comments (doom-lighten bg 0.05))) - (mode-line - :background modeline-bg :foreground modeline-fg - :box (if -modeline-pad `(:line-width ,-modeline-pad :color ,modeline-bg))) - (mode-line-inactive - :background modeline-bg-inactive :foreground modeline-fg-alt - :box (if -modeline-pad `(:line-width ,-modeline-pad :color ,modeline-bg-inactive))) - (mode-line-emphasis :foreground (if doom-stylix-brighter-modeline base8 highlight)) - - ;;;; css-mode / scss-mode - (css-proprietary-property :foreground orange) - (css-property :foreground green) - (css-selector :foreground blue) - ;;;; doom-modeline - (doom-modeline-bar :background (if doom-stylix-brighter-modeline modeline-bg highlight)) - (doom-modeline-buffer-file :inherit 'mode-line-buffer-id :weight 'bold) - (doom-modeline-buffer-path :inherit 'mode-line-emphasis :weight 'bold) - (doom-modeline-buffer-project-root :foreground green :weight 'bold) - ;;;; elscreen - (elscreen-tab-other-screen-face :background "#{{base01-hex}}" :foreground "#{{base06-hex}}") - ;;;; ivy - (ivy-current-match :background dark-blue :distant-foreground base0 :weight 'normal) - ;;;; LaTeX-mode - (font-latex-math-face :foreground green) - ;;;; markdown-mode - (markdown-markup-face :foreground base5) - (markdown-header-face :inherit 'bold :foreground red) - ((markdown-code-face &override) :background (doom-lighten base3 0.05)) - ;;;; org-mode - (org-block :background (doom-darken bg 0.05 ) :extend t) - (org-code :background (doom-darken bg 0.05 ) :extend t) - ;;;; rjsx-mode - (rjsx-tag :foreground red) - (rjsx-attr :foreground orange) - ;;;; solaire-mode - (solaire-mode-line-face - :inherit 'mode-line - :background modeline-bg-alt - :box (if -modeline-pad `(:line-width ,-modeline-pad :color ,modeline-bg-alt))) - (solaire-mode-line-inactive-face - :inherit 'mode-line-inactive - :background modeline-bg-inactive-alt - :box (if -modeline-pad `(:line-width ,-modeline-pad :color ,modeline-bg-inactive-alt)))) - - ;;;; Base theme variable overrides- - ()) - -;;; doom-stylix-theme.el ends here diff --git a/user/app/emacsng/default.nix b/user/app/emacsng/default.nix deleted file mode 100644 index e2c4c61..0000000 --- a/user/app/emacsng/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ config, lib, pkgs, inputs, ... }: - -{ - home.packages = [ - inputs.emacsng.packages.${pkgs.system}.emacsngWRPgtk - pkgs.source-code-pro - ]; -} diff --git a/user/pkgs/rogauracore.nix b/user/pkgs/rogauracore.nix deleted file mode 100644 index d141753..0000000 --- a/user/pkgs/rogauracore.nix +++ /dev/null @@ -1,17 +0,0 @@ -# THIS DOES NOT WORK YET! -{ stdenv, pkgs, ... }: - -let name = "rogauracore"; - owner = "wroberts"; - version = "1.6"; -in - stdenv.mkDerivation { - inherit name owner version; - src = fetchTarball { - url = "https://github.com/"+owner+"/"+name+"/releases/download/"+version+"/rogauracore-"+version+".tar.gz"; - sha256 = "0vpypcq71yv0v8vbgpkn8xy77j22g55aw6i83s30mpbpjjna2lm9"; - }; - buildInputs = [ pkgs.udev - pkgs.libusb - ]; -} diff --git a/user/wm/hyprland/hyprland.nix b/user/wm/hyprland/hyprland.nix index 9198dad..b4b05b3 100644 --- a/user/wm/hyprland/hyprland.nix +++ b/user/wm/hyprland/hyprland.nix @@ -1,4 +1,4 @@ -{ inputs, config, lib, pkgs, userSettings, systemSettings, pkgs-nwg-dock-hyprland, ... }: let +{ inputs, config, lib, pkgs, userSettings, systemSettings, ... }: let pkgs-hyprland = inputs.hyprland.inputs.nixpkgs.legacyPackages.${pkgs.stdenv.hostPlatform.system}; in { @@ -109,7 +109,6 @@ in bind=SUPERSHIFT,T,exec,screenshot-ocr bind=CTRLALT,Delete,exec,hyprctl kill bind=SUPERSHIFT,K,exec,hyprctl kill - bind=SUPER,W,exec,nwg-dock-wrapper bind=,code:172,exec,lollypop -t bind=,code:208,exec,lollypop -t @@ -420,24 +419,23 @@ in rustPlatform = oldAttrs.rustPlatform // { buildRustPackage = args: oldAttrs.rustPlatform.buildRustPackage (args // { pname = "hyprnome"; - version = "unstable-2024-05-06"; + version = "0.3.1"; src = fetchFromGitHub { owner = "donovanglover"; repo = "hyprnome"; - rev = "f185e6dbd7cfcb3ecc11471fab7d2be374bd5b28"; - hash = "sha256-tmko/bnGdYOMTIGljJ6T8d76NPLkHAfae6P6G2Aa2Qo="; + rev = "a4597387e777fde8f8a79090cce418843e5b85d1"; + hash = "sha256-GZn7qS1J6QSanWdy17sMBbwJ77iMij2jKRgPdrjt6tM="; }; cargoDeps = oldAttrs.cargoDeps.overrideAttrs (oldAttrs: rec { name = "${pname}-vendor.tar.gz"; inherit src; - outputHash = "sha256-cQwAGNKTfJTnXDI3IMJQ2583NEIZE7GScW7TsgnKrKs="; + outputHash = "sha256-oxIZTp5ZJRUjXLpMw2nOnPHYHhHN03HWFRhBZ82Ac10="; }); - cargoHash = "sha256-cQwAGNKTfJTnXDI3IMJQ2583NEIZE7GScW7TsgnKrKs="; + cargoHash = "sha256-oxIZTp5ZJRUjXLpMw2nOnPHYHhHN03HWFRhBZ82Ac10="; }); }; }) ) - gnome.zenity wlr-randr wtype ydotool @@ -472,15 +470,6 @@ in tesseract $imgname $txtname; wl-copy -n < $txtfname '') - (pkgs.writeScriptBin "nwg-dock-wrapper" '' - #!/bin/sh - if pgrep -x ".nwg-dock-hyprl" > /dev/null - then - nwg-dock-hyprland - else - nwg-dock-hyprland -f -x -i 64 -nolauncher -a start -ml 8 -mr 8 -mb 8 - fi - '') (pkgs.writeScriptBin "sct" '' #!/bin/sh killall wlsunset &> /dev/null; @@ -509,74 +498,12 @@ in if pgrep -x nixos-rebuild > /dev/null || pgrep -x home-manager > /dev/null || pgrep -x kdenlive > /dev/null || pgrep -x FL64.exe > /dev/null || pgrep -x blender > /dev/null || pgrep -x flatpak > /dev/null; then echo "Shouldn't suspend"; sleep 10; else echo "Should suspend"; systemctl suspend; fi '') - ]) - ++ - (with pkgs-hyprland; [ ]) - ++ (with pkgs-nwg-dock-hyprland; [ - (nwg-dock-hyprland.overrideAttrs (oldAttrs: { - patches = ./patches/noactiveclients.patch; - })) - ]); + ]); home.file.".local/share/pixmaps/hyprland-logo-stylix.svg".source = config.lib.stylix.colors { template = builtins.readFile ../../pkgs/hyprland-logo-stylix.svg.mustache; extension = "svg"; }; - home.file.".config/nwg-dock-hyprland/style.css".text = '' - window { - background: rgba(''+config.lib.stylix.colors.base00-rgb-r+'',''+config.lib.stylix.colors.base00-rgb-g+'',''+config.lib.stylix.colors.base00-rgb-b+'',0.0); - border-radius: 20px; - padding: 4px; - margin-left: 4px; - margin-right: 4px; - border-style: none; - } - - #box { - /* Define attributes of the box surrounding icons here */ - padding: 10px; - background: rgba(''+config.lib.stylix.colors.base00-rgb-r+'',''+config.lib.stylix.colors.base00-rgb-g+'',''+config.lib.stylix.colors.base00-rgb-b+'',0.55); - border-radius: 20px; - padding: 4px; - margin-left: 4px; - margin-right: 4px; - border-style: none; - } - button { - border-radius: 10px; - padding: 4px; - margin-left: 4px; - margin-right: 4px; - background: rgba(''+config.lib.stylix.colors.base03-rgb-r+'',''+config.lib.stylix.colors.base03-rgb-g+'',''+config.lib.stylix.colors.base03-rgb-b+'',0.55); - color: #''+config.lib.stylix.colors.base07+''; - font-size: 12px - } - - button:hover { - background: rgba(''+config.lib.stylix.colors.base04-rgb-r+'',''+config.lib.stylix.colors.base04-rgb-g+'',''+config.lib.stylix.colors.base04-rgb-b+'',0.55); - } - - ''; - home.file.".config/nwg-dock-pinned".text = '' - nwggrid - Alacritty - neovide - qutebrowser - brave-browser - writer - impress - calc - draw - krita - xournalpp - obs - kdenlive - flstudio - blender - openscad - Cura - virt-manager - ''; home.file.".config/hypr/hypridle.conf".text = '' general { lock_cmd = pgrep hyprlock || hyprlock