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 9c12db23..a2958418 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 cd4b3bce..6fe8cad2 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 5e66bd03..00000000 --- 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 b0494ac1..00000000 --- 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 00000000..3d019063 --- /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 9ca35970..ad9ed926 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 65aea7a4..c2f896c0 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 dec50c55..32e137eb 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 d6e1a6e9..cf24b509 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 d8dde8c4..00000000 --- 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 91ba2096..00000000 --- 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 dde3ddf9..00000000 --- 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 3f9087f1..00000000 --- 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 fc4c77f0..00000000 --- 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 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 X_1^ZLNA3f^3H+t1q^X!kwYc>^AvPlL 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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 diff --git a/user/app/doom-emacs/packages.el b/user/app/doom-emacs/packages.el deleted file mode 100644 index 4d367bf1..00000000 --- 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 d3c39743..00000000 --- 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 59c147ba..00000000 --- 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 e83b9796..00000000 --- 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 e2c4c61f..00000000 --- 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 d141753e..00000000 --- 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 9198dadd..b4b05b37 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