diff --git a/.forgejo/workflows/update-inputs.yml b/.forgejo/workflows/update-inputs.yml new file mode 100644 index 00000000..c63d914a --- /dev/null +++ b/.forgejo/workflows/update-inputs.yml @@ -0,0 +1,90 @@ +name: update-inputs + +on: + schedule: + - cron: "0 6 * * 2,5" # Tue & Fri + workflow_dispatch: + +jobs: + update-flake-lock: + runs-on: nixos + + env: + BASE_BRANCH: main + BRANCH_PREFIX: flake-lock-update + FJ_URL: https://code.oliverdavies.uk + GIT_AUTHOR_EMAIL: flake-bot@local + GIT_AUTHOR_NAME: flake-bot + GIT_COMMITTER_EMAIL: ${{ env.GIT_AUTHOR_EMAIL }} + GIT_COMMITTER_NAME: ${{ env.GIT_AUTHOR_NAME }} + + steps: + - uses: actions/checkout@v3 + with: { fetch-depth: 0 } + + - name: Update inputs & commit + id: bump + run: | + set -o errexit + set -o nounset + set -o pipefail + + BRANCH="${BRANCH_PREFIX}-${GITHUB_RUN_ID}" + git switch -c "$BRANCH" + + BEFORE=$(git rev-parse HEAD) + + # Nix updates inputs and commits if needed + nix flake update --commit-lock-file + + AFTER=$(git rev-parse HEAD) + if [ "$BEFORE" = "$AFTER" ]; then + echo "changed=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # ── Grab commit info ──────────────────────────────────────────────── + # Full message + COMMIT_RAW=$(git log -1 --pretty=%B) + + # First line is the short summary; we keep lines AFTER the first blank + COMMIT_BODY=$(printf '%s\n' "$COMMIT_RAW" \ + | sed '1,/^$/d' \ + | sed 's/^• */* /') # nicer Markdown bullet + + # Title becomes first line of the PR + COMMIT_TITLE=$(printf '%s\n' "$COMMIT_RAW" | head -n1) + + # JSON-escape the body so \n etc. are valid JSON + BODY_JSON=$(printf '%s' "$COMMIT_BODY" | jq -Rs .) + + echo "changed=true" >> "$GITHUB_OUTPUT" + echo "branch=$BRANCH" >> "$GITHUB_OUTPUT" + echo "title=$COMMIT_TITLE" >> "$GITHUB_OUTPUT" + echo "body_json=$BODY_JSON" >> "$GITHUB_OUTPUT" + + git push -u origin "$BRANCH" + + - name: Open pull-request + if: steps.bump.outputs.changed == 'true' + env: + TOKEN: ${{ secrets.FLAKE_UPDATE_PAT }} + BRANCH: ${{ steps.bump.outputs.branch }} + TITLE: ${{ steps.bump.outputs.title }} + BODY_JSON: ${{ steps.bump.outputs.body_json }} + run: | + set -o errexit + set -o nounset + + OWNER="${GITHUB_REPOSITORY%%/*}" + REPO="${GITHUB_REPOSITORY#*/}" + + curl -fSs -X POST "$FJ_URL/api/v1/repos/$OWNER/$REPO/pulls" \ + -H "Authorization: token $TOKEN" \ + --json '{ + "base": "'"$BASE_BRANCH"'", + "body": '"$BODY_JSON"', + "draft": false, + "head": "'"$BRANCH"'", + "title": "'"$TITLE"'" + }' diff --git a/flake.lock b/flake.lock index 68beed58..fd6f07ec 100644 --- a/flake.lock +++ b/flake.lock @@ -10,11 +10,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1762618334, - "narHash": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=", + "lastModified": 1754433428, + "narHash": "sha256-NA/FT2hVhKDftbHSwVnoRTFhes62+7dxZbxj5Gxvghs=", "owner": "ryantm", "repo": "agenix", - "rev": "fcdea223397448d35d9b31f798479227e80183f6", + "rev": "9edb1787864c4f59ae5074ad498b6272b3ec308d", "type": "github" }, "original": { @@ -26,11 +26,11 @@ "bop-scripts": { "flake": false, "locked": { - "lastModified": 1762468291, - "narHash": "sha256-kvhro91rmPgSX8LYLTsesLJlOlKp1YJsIg9e+Cb9u6o=", + "lastModified": 1760234399, + "narHash": "sha256-SpQ4TMOsYCr9EoCdUZ1GeX5cOoPHfxEYyRakYznc91w=", "owner": "breadonpenguins", "repo": "scripts", - "rev": "c1c94c3f4b89076dc8f788fae12f639dda663ddb", + "rev": "1396a09a206dbd6f9a08ffa7a5603e6d55ae5f00", "type": "github" }, "original": { @@ -39,6 +39,22 @@ "type": "github" } }, + "conf-vim": { + "flake": false, + "locked": { + "lastModified": 1507549264, + "narHash": "sha256-AjiTJsoim0BAnyfqk1IQzNsa6jhFM2+A66E7q9sJqz0=", + "owner": "tjdevries", + "repo": "conf.vim", + "rev": "a716df0fd5d7ba558c07dac2e07f05d5eba11afb", + "type": "github" + }, + "original": { + "owner": "tjdevries", + "repo": "conf.vim", + "type": "github" + } + }, "darwin": { "inputs": { "nixpkgs": [ @@ -82,24 +98,6 @@ "type": "github" } }, - "devshell_2": { - "inputs": { - "nixpkgs": "nixpkgs_2" - }, - "locked": { - "lastModified": 1741473158, - "narHash": "sha256-kWNaq6wQUbUMlPgw8Y+9/9wP0F8SHkjy24/mN3UAppg=", - "owner": "numtide", - "repo": "devshell", - "rev": "7c9e793ebe66bcba8292989a68c0419b737a22a0", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "devshell", - "type": "github" - } - }, "disko": { "inputs": { "nixpkgs": [ @@ -107,11 +105,11 @@ ] }, "locked": { - "lastModified": 1762276996, - "narHash": "sha256-TtcPgPmp2f0FAnc+DMEw4ardEgv1SGNR3/WFGH0N19M=", + "lastModified": 1758287904, + "narHash": "sha256-IGmaEf3Do8o5Cwp1kXBN1wQmZwQN3NLfq5t4nHtVtcU=", "owner": "nix-community", "repo": "disko", - "rev": "af087d076d3860760b3323f6b583f4d828c1ac17", + "rev": "67ff9807dd148e704baadbd4fd783b54282ca627", "type": "github" }, "original": { @@ -120,16 +118,32 @@ "type": "github" } }, + "edit-alternate-vim": { + "flake": false, + "locked": { + "lastModified": 1635180789, + "narHash": "sha256-mEKnqYAhgrdxPRoKf4S4yYecdFIHGg8bDxpqPuC1+S4=", + "owner": "tjdevries", + "repo": "edit_alternate.vim", + "rev": "ef3019115d9bb7ffd691d2859eda213dd99e0b0a", + "type": "github" + }, + "original": { + "owner": "tjdevries", + "repo": "edit_alternate.vim", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1762440070, - "narHash": "sha256-xxdepIcb39UJ94+YydGP221rjnpkDZUlykKuF54PsqI=", + "lastModified": 1759362264, + "narHash": "sha256-wfG0S7pltlYyZTM+qqlhJ7GMw2fTF4mLKCIVhLii/4M=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "26d05891e14c88eb4a5d5bee659c0db5afb609d8", + "rev": "758cf7296bee11f1706a574c77d072b8a7baa881", "type": "github" }, "original": { @@ -195,13 +209,13 @@ "narHash": "sha256-DpZgkdZELTZ/F/O+Xgj81E+01S5Zp2JCMa8zruEZe9o=", "ref": "refs/heads/main", "rev": "19591ad8e1f3c261e84b487307c8534dd67a3707", - "revCount": 37, + "revCount": 1, "type": "git", - "url": "https://git.oliverdavies.uk/opdavies/git-repo-updater" + "url": "https://code.oliverdavies.uk/opdavies/git-repo-updater" }, "original": { "type": "git", - "url": "https://git.oliverdavies.uk/opdavies/git-repo-updater" + "url": "https://code.oliverdavies.uk/opdavies/git-repo-updater" } }, "home-manager": { @@ -232,11 +246,11 @@ ] }, "locked": { - "lastModified": 1762721397, - "narHash": "sha256-E428EuouA4nFTNlLuqlL4lVR78X+EbBIqDqsBFnB79w=", + "lastModified": 1760312644, + "narHash": "sha256-U9SkK45314urw9P7MmjhEgiQwwD/BTj+T3HTuz1JU1Q=", "owner": "nix-community", "repo": "home-manager", - "rev": "b8645b18b0f5374127bbade6de7381ef0b3d5720", + "rev": "e121f3773fa596ecaba5b22e518936a632d72a90", "type": "github" }, "original": { @@ -248,11 +262,11 @@ }, "import-tree": { "locked": { - "lastModified": 1762327901, - "narHash": "sha256-AJ96FNj50DU0bTyIzAPkPOjCZTHqjURVjok8qoXvmqM=", + "lastModified": 1752730890, + "narHash": "sha256-GES8fapSLGz36MMPRVNkSUWXUTtqvGQNXHjRmRLfJUY=", "owner": "vic", "repo": "import-tree", - "rev": "90fa129798be99cde036b78658e89475710966a1", + "rev": "6ebb8cb87987b20264c09296166543fd3761d274", "type": "github" }, "original": { @@ -296,11 +310,11 @@ ] }, "locked": { - "lastModified": 1762660502, - "narHash": "sha256-C9F1C31ys0V7mnp4EcDy7L1cLZw/sCTEXqqTtGnvu08=", + "lastModified": 1760241904, + "narHash": "sha256-OD7QnaGEVNdukYEbJbUNWPsvnDrpbZOZxVIk6Pt9Jhw=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "15c5451c63f4c612874a43846bfe3fa828b03eee", + "rev": "c9f5ea45f25652ec2f771f9426ccacb21cbbaeaa", "type": "github" }, "original": { @@ -311,11 +325,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1762463231, - "narHash": "sha256-hv1mG5j5PTbnWbtHHomzTus77pIxsc4x8VrMjc7+/YE=", + "lastModified": 1760106635, + "narHash": "sha256-2GoxVaKWTHBxRoeUYSjv0AfSOx4qw5CWSFz2b+VolKU=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "52113c4f5cfd1e823001310e56d9c8d0699a6226", + "rev": "9ed85f8afebf2b7478f25db0a98d0e782c0ed903", "type": "github" }, "original": { @@ -327,11 +341,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1762596750, - "narHash": "sha256-rXXuz51Bq7DHBlfIjN7jO8Bu3du5TV+3DSADBX7/9YQ=", + "lastModified": 1760284886, + "narHash": "sha256-TK9Kr0BYBQ/1P5kAsnNQhmWWKgmZXwUQr4ZMjCzWf2c=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b6a8526db03f735b89dd5ff348f53f752e7ddc8e", + "rev": "cf3f5c4def3c7b5f1fc012b3d839575dbe552d43", "type": "github" }, "original": { @@ -343,11 +357,11 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1761765539, - "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", + "lastModified": 1754788789, + "narHash": "sha256-x2rJ+Ovzq0sCMpgfgGaaqgBSwY+LST+WbZ6TytnT9Rk=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", + "rev": "a73b9c743612e4244d865a2fdee11865283c04e6", "type": "github" }, "original": { @@ -372,22 +386,6 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1722073938, - "narHash": "sha256-OpX0StkL8vpXyWOGUD6G+MA26wAXK6SpT94kLJXo6B4=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "e36e9f57337d0ff0cf77aceb58af4c805472bfae", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nixvim": { "inputs": { "flake-parts": [ @@ -400,11 +398,11 @@ "systems": "systems_3" }, "locked": { - "lastModified": 1762691346, - "narHash": "sha256-dyYnqvYrgViB22inBqNern/XSWtOiweP8NTfJQJeTis=", + "lastModified": 1760353389, + "narHash": "sha256-/NLkyQww0DEkGqC6drAUK5MEFhhygibv8tyNGpWzR3E=", "owner": "nix-community", "repo": "nixvim", - "rev": "faf1fb4b7cd069ce44469e45c3259b7bcf106f81", + "rev": "69d72bb82d7ba1904df47cf092ce1d4c88448001", "type": "github" }, "original": { @@ -421,11 +419,11 @@ ] }, "locked": { - "lastModified": 1762724684, - "narHash": "sha256-B24ywaTUd9BYkK3qHfl0MubCLnO4Bk8cRSQmIvfofco=", + "lastModified": 1760420678, + "narHash": "sha256-zPQiSr9oQTifvRgZqRelp4xrkZN85/dgmZ4/bEUYG58=", "owner": "nix-community", "repo": "NUR", - "rev": "efc27c839b15d0ff15d58fb09035a93dea7f85f5", + "rev": "7e2b85da72150967bc4994a39d8902065db4640d", "type": "github" }, "original": { @@ -444,11 +442,11 @@ ] }, "locked": { - "lastModified": 1761730856, - "narHash": "sha256-t1i5p/vSWwueZSC0Z2BImxx3BjoUDNKyC2mk24krcMY=", + "lastModified": 1758662783, + "narHash": "sha256-igrxT+/MnmcftPOHEb+XDwAMq3Xg1Xy7kVYQaHhPlAg=", "owner": "NuschtOS", "repo": "search", - "rev": "e29de6db0cb3182e9aee75a3b1fd1919d995d85b", + "rev": "7d4c0fc4ffe3bd64e5630417162e9e04e64b27a4", "type": "github" }, "original": { @@ -461,7 +459,9 @@ "inputs": { "agenix": "agenix", "bop-scripts": "bop-scripts", + "conf-vim": "conf-vim", "disko": "disko", + "edit-alternate-vim": "edit-alternate-vim", "flake-parts": "flake-parts", "git-repo-updater": "git-repo-updater", "home-manager": "home-manager_2", @@ -473,9 +473,11 @@ "nixvim": "nixvim", "nur": "nur", "rwxrob-dot": "rwxrob-dot", + "standard-vim": "standard-vim", + "vim-heritage": "vim-heritage", "vim-textobj-xmlattr": "vim-textobj-xmlattr", "voidrice": "voidrice", - "z": "z" + "zet": "zet" } }, "rwxrob-dot": { @@ -494,6 +496,22 @@ "type": "github" } }, + "standard-vim": { + "flake": false, + "locked": { + "lastModified": 1539613748, + "narHash": "sha256-9VwkvV1Dv6cE4uDkPp36DozjWJOclDR883yDMYw000E=", + "owner": "tjdevries", + "repo": "standard.vim", + "rev": "b333ef9a9cf6cf66536deda017a542843613fa75", + "type": "github" + }, + "original": { + "owner": "tjdevries", + "repo": "standard.vim", + "type": "github" + } + }, "systems": { "locked": { "lastModified": 1681028828, @@ -539,6 +557,22 @@ "type": "github" } }, + "vim-heritage": { + "flake": false, + "locked": { + "lastModified": 1716350150, + "narHash": "sha256-YzqP2+Go8bW3heFyzzcS/91LrMkwjpZ89+ptrjjBKrM=", + "owner": "jessarcher", + "repo": "vim-heritage", + "rev": "574baeb0679681a710adce5110a0d8b2ae1c2637", + "type": "github" + }, + "original": { + "owner": "jessarcher", + "repo": "vim-heritage", + "type": "github" + } + }, "vim-textobj-xmlattr": { "flake": false, "locked": { @@ -571,28 +605,20 @@ "type": "github" } }, - "z": { - "inputs": { - "devshell": "devshell_2", - "flake-parts": [ - "flake-parts" - ], - "nixpkgs": [ - "nixpkgs" - ] - }, + "zet": { + "flake": false, "locked": { - "lastModified": 1762731584, - "narHash": "sha256-qSN44lGSceoqkUeksXbEAcGPeTf9yJBGQMWafh8cZuw=", + "lastModified": 1760382896, + "narHash": "sha256-VMYs159/oGaA7bSYDRlIY6VgwevpyKeZ2Xxj96IAdMo=", "ref": "refs/heads/main", - "rev": "184accfd1fadb9580f2af8873ce0f2a70eeb8b49", - "revCount": 165, + "rev": "6763ab8a805a352bf6e8a9ee6de9e57957a87e33", + "revCount": 74, "type": "git", - "url": "https://git.oliverdavies.uk/opdavies/z" + "url": "https://code.oliverdavies.uk/opdavies/cmd-zet" }, "original": { "type": "git", - "url": "https://git.oliverdavies.uk/opdavies/z" + "url": "https://code.oliverdavies.uk/opdavies/cmd-zet" } } }, diff --git a/flake.nix b/flake.nix index 01149a04..49ca8b78 100644 --- a/flake.nix +++ b/flake.nix @@ -10,18 +10,28 @@ url = "github:breadonpenguins/scripts"; }; + conf-vim = { + flake = false; + url = "github:tjdevries/conf.vim"; + }; + disko = { inputs.nixpkgs.follows = "nixpkgs"; url = "github:nix-community/disko"; }; + edit-alternate-vim = { + flake = false; + url = "github:tjdevries/edit_alternate.vim"; + }; + flake-parts.url = "github:hercules-ci/flake-parts"; git-repo-updater = { inputs.flake-parts.follows = "flake-parts"; inputs.import-tree.follows = "import-tree"; inputs.nixpkgs.follows = "nixpkgs"; - url = "git+https://git.oliverdavies.uk/opdavies/git-repo-updater"; + url = "git+https://code.oliverdavies.uk/opdavies/git-repo-updater"; }; home-manager = { @@ -58,6 +68,16 @@ url = "github:rwxrob/dot"; }; + standard-vim = { + flake = false; + url = "github:tjdevries/standard.vim"; + }; + + vim-heritage = { + flake = false; + url = "github:jessarcher/vim-heritage"; + }; + vim-textobj-xmlattr = { flake = false; url = "github:whatyouhide/vim-textobj-xmlattr"; @@ -68,10 +88,9 @@ url = "github:lukesmithxyz/voidrice"; }; - z = { - inputs.flake-parts.follows = "flake-parts"; - inputs.nixpkgs.follows = "nixpkgs"; - url = "git+https://git.oliverdavies.uk/opdavies/z"; + zet = { + flake = false; + url = "git+https://code.oliverdavies.uk/opdavies/cmd-zet"; }; }; diff --git a/home-manager/opdavies/t480.nix b/home-manager/opdavies/t480.nix index 5cbc5b67..b4826a3c 100644 --- a/home-manager/opdavies/t480.nix +++ b/home-manager/opdavies/t480.nix @@ -8,7 +8,7 @@ in { "wiki-push" = - "rsync -avzP ${documents}/notes nixedo.oliverdavies.uk:${documents} --delete --delete-after"; + "rsync -avzP ${documents}/wiki nixedo.oliverdavies.uk:${documents} --delete --delete-after"; }; }; diff --git a/hosts/nixedo/configuration.nix b/hosts/nixedo/configuration.nix index f59020f5..88d3920c 100644 --- a/hosts/nixedo/configuration.nix +++ b/hosts/nixedo/configuration.nix @@ -2,12 +2,7 @@ # your system. Help is available in the configuration.nix(5) man page # and in the NixOS manual (accessible by running ‘nixos-help’). -{ - inputs, - lib, - pkgs, - ... -}: +{ inputs, pkgs, ... }: { imports = [ @@ -24,7 +19,12 @@ ../../users/opdavies.nix ]; - services.logind.settings.Login.HandleLidSwitchExternalPower = "ignore"; + # TODO: why didn't it work when adding this to jitsi.nix? + nixpkgs.config.permittedInsecurePackages = [ + "jitsi-meet-1.0.8043" + ]; + + services.logind.lidSwitchExternalPower = "ignore"; boot.loader = { efi.canTouchEfiVariables = true; diff --git a/hosts/nixedo/homelab.nix b/hosts/nixedo/homelab.nix index 3c00336d..5e747cc9 100644 --- a/hosts/nixedo/homelab.nix +++ b/hosts/nixedo/homelab.nix @@ -9,7 +9,8 @@ services = { audiobookshelf.enable = true; home-assistant.enable = true; - freshrss.enable = true; + homepage-dashboard.enable = true; + jitsi.enable = true; paperless.enable = true; peertube.enable = true; tubearchivist.enable = true; diff --git a/hosts/nixedo/modules/acme.nix b/hosts/nixedo/modules/acme.nix index 64a226f1..33979e9c 100644 --- a/hosts/nixedo/modules/acme.nix +++ b/hosts/nixedo/modules/acme.nix @@ -26,8 +26,6 @@ "code" "eric" "florida-drupalcamp-tailwind-css" - "freshrss" - "git" "home" "jellyfin" "luke" diff --git a/hosts/nixedo/modules/audiobookshelf.nix b/hosts/nixedo/modules/audiobookshelf.nix index 9ccf8511..8e30bdd4 100644 --- a/hosts/nixedo/modules/audiobookshelf.nix +++ b/hosts/nixedo/modules/audiobookshelf.nix @@ -15,6 +15,26 @@ in default = "audiobookshelf.${homelab.domain}"; type = types.str; }; + + homepage.name = mkOption { + default = "Audiobookshelf"; + type = types.str; + }; + + homepage.description = mkOption { + default = "Self-hosted audiobook and podcast server"; + type = types.str; + }; + + homepage.icon = mkOption { + default = "audiobookshelf"; + type = types.str; + }; + + homepage.category = mkOption { + default = "Media"; + type = types.str; + }; }; config = mkIf cfg.enable { diff --git a/hosts/nixedo/modules/containers/pi-hole.nix b/hosts/nixedo/modules/containers/pi-hole.nix index f7ef64f4..7d523e89 100644 --- a/hosts/nixedo/modules/containers/pi-hole.nix +++ b/hosts/nixedo/modules/containers/pi-hole.nix @@ -2,7 +2,7 @@ let service = "pihole"; - port = config.homelab.ports.services.${service}; + port = config.homelab.ports.${service}; in { virtualisation.oci-containers.containers.${service} = { diff --git a/hosts/nixedo/modules/containers/tubearchivist.nix b/hosts/nixedo/modules/containers/tubearchivist.nix index 57ba7107..76212f0d 100644 --- a/hosts/nixedo/modules/containers/tubearchivist.nix +++ b/hosts/nixedo/modules/containers/tubearchivist.nix @@ -13,7 +13,7 @@ let service = "tubearchivist"; homelab = config.homelab; - port = homelab.ports.services.${service}; + port = homelab.ports.${service}; in { options.homelab.services.${service} = { @@ -23,6 +23,26 @@ in default = "${service}.${homelab.domain}"; type = types.str; }; + + homepage.name = mkOption { + default = "Tube Archivist"; + type = types.str; + }; + + homepage.description = mkOption { + default = "Your self hosted YouTube media server"; + type = types.str; + }; + + homepage.icon = mkOption { + default = "tube-archivist"; + type = types.str; + }; + + homepage.category = mkOption { + default = "Media"; + type = types.str; + }; }; config = mkIf cfg.enable { @@ -33,7 +53,6 @@ in virtualisation.oci-containers.containers."archivist-es" = { image = "bbilly1/tubearchivist-es"; - pull = "newer"; environment = { "ES_JAVA_OPTS" = "-Xms1g -Xmx1g"; @@ -136,7 +155,6 @@ in virtualisation.oci-containers.containers."tubearchivist" = { image = "bbilly1/tubearchivist"; - pull = "newer"; environment = { "ES_URL" = "http://archivist-es:9200"; diff --git a/hosts/nixedo/modules/default.nix b/hosts/nixedo/modules/default.nix index 21e7fc5c..20a9d6cf 100644 --- a/hosts/nixedo/modules/default.nix +++ b/hosts/nixedo/modules/default.nix @@ -23,10 +23,10 @@ with lib; ./cloudflared.nix ./containers ./forgejo.nix - ./freshrss.nix ./home-assistant.nix ./immich.nix ./jellyfin.nix + ./jitsi.nix ./nginx ./paperless.nix ./peertube.nix diff --git a/hosts/nixedo/modules/forgejo.nix b/hosts/nixedo/modules/forgejo.nix index 7a8b4f18..91a228d6 100644 --- a/hosts/nixedo/modules/forgejo.nix +++ b/hosts/nixedo/modules/forgejo.nix @@ -7,7 +7,7 @@ settings = { server = { - DOMAIN = "git.oliverdavies.uk"; + DOMAIN = "code.oliverdavies.uk"; LANDING_PAGE = "explore"; ROOT_URL = "https://${config.services.forgejo.settings.server.DOMAIN}"; SSH_DOMAIN = "ssh.oliverdavies.uk"; diff --git a/hosts/nixedo/modules/freshrss.nix b/hosts/nixedo/modules/freshrss.nix deleted file mode 100644 index 65d68794..00000000 --- a/hosts/nixedo/modules/freshrss.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ - config, - lib, - ... -}: - -let - inherit (lib) - mkEnableOption - mkIf - mkOption - types - ; - - cfg = homelab.services.${service}; - homelab = config.homelab; - service = "freshrss"; -in -{ - options.homelab.services.${service} = { - enable = mkEnableOption "Enable ${service}"; - - url = mkOption { - default = "freshrss.${homelab.domain}"; - type = types.str; - }; - }; - - config = mkIf cfg.enable { - services = { - ${service} = { - enable = true; - - baseUrl = "https://${cfg.url}"; - passwordFile = config.age.secrets.freshrss-password-file.path; - virtualHost = cfg.url; - }; - - nginx.virtualHosts.${cfg.url} = { - useACMEHost = homelab.domain; - forceSSL = true; - }; - }; - }; -} diff --git a/hosts/nixedo/modules/home-assistant.nix b/hosts/nixedo/modules/home-assistant.nix index 88b35b35..2995ade3 100644 --- a/hosts/nixedo/modules/home-assistant.nix +++ b/hosts/nixedo/modules/home-assistant.nix @@ -15,6 +15,26 @@ in default = "home.${homelab.domain}"; type = types.str; }; + + homepage.name = mkOption { + default = "Home Assisant"; + type = types.str; + }; + + homepage.description = mkOption { + default = "Open source home automation that puts local control and privacy first."; + type = types.str; + }; + + homepage.icon = mkOption { + default = "home-assistant"; + type = types.str; + }; + + homepage.category = mkOption { + default = "Services"; + type = types.str; + }; }; config = mkIf cfg.enable { diff --git a/hosts/nixedo/modules/jellyfin.nix b/hosts/nixedo/modules/jellyfin.nix index 8dc57fb0..430fac28 100644 --- a/hosts/nixedo/modules/jellyfin.nix +++ b/hosts/nixedo/modules/jellyfin.nix @@ -2,6 +2,7 @@ services.jellyfin = { enable = true; + configDir = "/mnt/media/jellyfin"; group = "media"; openFirewall = true; }; diff --git a/hosts/nixedo/modules/jitsi.nix b/hosts/nixedo/modules/jitsi.nix new file mode 100644 index 00000000..fbe216e3 --- /dev/null +++ b/hosts/nixedo/modules/jitsi.nix @@ -0,0 +1,41 @@ +{ config, lib, ... }: + +let + cfg = config.homelab.services.${service}; + homelab = config.homelab; + service = "jitsi"; + + inherit (lib) mkEnableOption mkOption types; +in +{ + options.homelab.services.${service} = { + enable = mkEnableOption "Enable ${service}"; + + url = mkOption { + default = "meet.${homelab.domain}"; + type = types.str; + }; + }; + + config = lib.mkIf cfg.enable { + services = { + jitsi-meet = { + enable = false; + + hostName = cfg.url; + + secureDomain.enable = true; + }; + + nginx.virtualHosts.${cfg.url} = { + enableACME = false; + forceSSL = false; + }; + + cloudflared.tunnels.${homelab.cloudflared.tunnelId}.ingress = { + # TODO: is this the correct port? + ${cfg.url} = "http://localhost:5280"; + }; + }; + }; +} diff --git a/hosts/nixedo/modules/nginx/default.nix b/hosts/nixedo/modules/nginx/default.nix index a7ec3e22..b28403e0 100644 --- a/hosts/nixedo/modules/nginx/default.nix +++ b/hosts/nixedo/modules/nginx/default.nix @@ -51,8 +51,5 @@ in users.users.${config.services.nginx.user}.extraGroups = [ "acme" ]; - imports = [ - ./oliverdavies.uk - ./ponthirtaekwondo.co.uk.nix - ]; + imports = [ ./www.oliverdavies.uk ]; } diff --git a/hosts/nixedo/modules/nginx/ponthirtaekwondo.co.uk.nix b/hosts/nixedo/modules/nginx/ponthirtaekwondo.co.uk.nix deleted file mode 100644 index f16e61b2..00000000 --- a/hosts/nixedo/modules/nginx/ponthirtaekwondo.co.uk.nix +++ /dev/null @@ -1,51 +0,0 @@ -{ config, ... }: - -let - name = "ponthirtaekwondo.co.uk"; - ports = config.homelab.ports; - port = ports.nginx.ponthir-taekwondo; -in -{ - security.acme.certs = { - "ponthirtaekwondo.co.uk" = { - domain = "ponthirtaekwondo.co.uk"; - dnsProvider = "cloudflare"; - email = "oliver@oliverdavies.uk"; - environmentFile = config.age.secrets.cloudflare.path; - webroot = null; - - extraDomainNames = [ - "www.ponthirtaekwondo.co.uk" - ]; - }; - }; - - services = { - nginx.virtualHosts = { - "www.${name}" = { - root = "/var/www/vhosts/${name}"; - - listen = [ - { - inherit port; - - addr = "localhost"; - } - ]; - - locations."/".tryFiles = "$uri $uri.html $uri/index.html =404"; - - extraConfig = '' - port_in_redirect off; - - # Remove trailing slashes. - rewrite ^/(.*)/$ /$1 permanent; - ''; - }; - }; - - cloudflared.tunnels."e1514105-327f-4984-974e-e2fbaca76466".ingress = { - "www.ponthirtaekwondo.co.uk" = "http://localhost:${toString port}"; - }; - }; -} diff --git a/hosts/nixedo/modules/nginx/sites.nix b/hosts/nixedo/modules/nginx/sites.nix index 78325fb2..3d682ec7 100644 --- a/hosts/nixedo/modules/nginx/sites.nix +++ b/hosts/nixedo/modules/nginx/sites.nix @@ -5,7 +5,7 @@ let name: overrides: let root = "/var/www/vhosts/${name}" + (overrides.rootSuffix or ""); - port = ports.nginx.${name}; + port = ports."nginx-${name}"; url = "${name}.oliverdavies.uk"; in { inherit port root url; } // overrides; diff --git a/hosts/nixedo/modules/nginx/oliverdavies.uk/default.nix b/hosts/nixedo/modules/nginx/www.oliverdavies.uk/default.nix similarity index 96% rename from hosts/nixedo/modules/nginx/oliverdavies.uk/default.nix rename to hosts/nixedo/modules/nginx/www.oliverdavies.uk/default.nix index 467b60ac..cfae1427 100644 --- a/hosts/nixedo/modules/nginx/oliverdavies.uk/default.nix +++ b/hosts/nixedo/modules/nginx/www.oliverdavies.uk/default.nix @@ -2,7 +2,7 @@ let ports = config.homelab.ports; - port = ports.nginx.website-sculpin; + port = ports.nginx-website-sculpin; redirects = builtins.concatStringsSep "\n" ( map (r: "rewrite ^${r.from}/?$ ${r.to} redirect;") (import ./redirects.nix) @@ -26,7 +26,7 @@ let "themes/custom/opdavies" ]; - port = ports.nginx.website-tome; + port = ports.nginx-website-tome; }; tomeLocations = builtins.listToAttrs ( diff --git a/hosts/nixedo/modules/nginx/oliverdavies.uk/redirects.nix b/hosts/nixedo/modules/nginx/www.oliverdavies.uk/redirects.nix similarity index 100% rename from hosts/nixedo/modules/nginx/oliverdavies.uk/redirects.nix rename to hosts/nixedo/modules/nginx/www.oliverdavies.uk/redirects.nix diff --git a/hosts/nixedo/modules/paperless.nix b/hosts/nixedo/modules/paperless.nix index 4cb73ad8..33fd9801 100644 --- a/hosts/nixedo/modules/paperless.nix +++ b/hosts/nixedo/modules/paperless.nix @@ -15,6 +15,26 @@ in default = "${service}.${homelab.domain}"; type = types.str; }; + + homepage.name = mkOption { + default = "Paperless-ngx"; + type = types.str; + }; + + homepage.description = mkOption { + default = "Document management system"; + type = types.str; + }; + + homepage.icon = mkOption { + default = "paperless"; + type = types.str; + }; + + homepage.category = mkOption { + default = "Services"; + type = types.str; + }; }; config = mkIf cfg.enable { diff --git a/hosts/nixedo/modules/peertube.nix b/hosts/nixedo/modules/peertube.nix index 25c90a01..a35e3f01 100644 --- a/hosts/nixedo/modules/peertube.nix +++ b/hosts/nixedo/modules/peertube.nix @@ -25,6 +25,26 @@ in default = "videos.${homelab.domain}"; type = types.str; }; + + homepage.name = mkOption { + default = "Peertube"; + type = types.str; + }; + + homepage.description = mkOption { + default = "A free and open-source, decentralized, ActivityPub federated video platform"; + type = types.str; + }; + + homepage.icon = mkOption { + default = "peertube"; + type = types.str; + }; + + homepage.category = mkOption { + default = "Media"; + type = types.str; + }; }; config = mkIf cfg.enable { diff --git a/hosts/nixedo/ports.nix b/hosts/nixedo/ports.nix index 7d5e3c50..e3ceba08 100644 --- a/hosts/nixedo/ports.nix +++ b/hosts/nixedo/ports.nix @@ -6,37 +6,33 @@ in { options.homelab.ports = mkOption { internal = true; - type = types.attrsOf (types.attrsOf types.port); + type = types.attrsOf types.port; }; config.homelab.ports = { - services = { - mealie = 9001; - pihole = 8082; - tubearchivist = 8099; - vaultwarden = 8022; - }; + homepage-dashboard = 8097; + mealie = 9001; + pihole = 8082; + tubearchivist = 8099; + vaultwarden = 8022; - nginx = { - website-sculpin = 8095; - website-tome = 8098; + nginx-website-sculpin = 8095; + nginx-website-tome = 8098; - books = 9002; - bootstrap-with-tailwind = 8081; - eric = 8084; - examples = 9003; - florida-drupalcamp-tailwind-css = 8083; - luke = 8094; - phpsw-sculpin-demo = 8085; - ponthir-taekwondo = 9004; - rebuilding-acquia = 8086; - rebuilding-bartik = 8087; - rebuilding-bristol-js = 8088; - rebuilding-symfony = 8089; - tailwindcss-demo = 8090; - talking-drupal-tailwindcss = 8093; - wp-tailwind = 8091; - zet = 8092; - }; + nginx-books = 9002; + nginx-bootstrap-with-tailwind = 8081; + nginx-eric = 8084; + nginx-examples = 9003; + nginx-florida-drupalcamp-tailwind-css = 8083; + nginx-luke = 8094; + nginx-phpsw-sculpin-demo = 8085; + nginx-rebuilding-acquia = 8086; + nginx-rebuilding-bartik = 8087; + nginx-rebuilding-bristol-js = 8088; + nginx-rebuilding-symfony = 8089; + nginx-tailwindcss-demo = 8090; + nginx-talking-drupal-tailwindcss = 8093; + nginx-wp-tailwind = 8091; + nginx-zet = 8092; }; } diff --git a/hosts/nixedo/secrets.nix b/hosts/nixedo/secrets.nix index 853a4958..6c55583f 100644 --- a/hosts/nixedo/secrets.nix +++ b/hosts/nixedo/secrets.nix @@ -2,6 +2,5 @@ age.secrets = { cloudflare.file = ../../secrets/cloudflare.age; cloudflared.file = ../../secrets/cloudflared-credentials.age; - freshrss-password-file.file = ../../secrets/freshrss-password-file.age; }; } diff --git a/hosts/nixedo/services/default.nix b/hosts/nixedo/services/default.nix index 4bf7c492..b5a19f88 100644 --- a/hosts/nixedo/services/default.nix +++ b/hosts/nixedo/services/default.nix @@ -7,6 +7,8 @@ { imports = [ + ./homepage + ./mastodon.nix ./mealie.nix ./samba.nix ./uptime-kuma.nix diff --git a/hosts/nixedo/services/homepage/default.nix b/hosts/nixedo/services/homepage/default.nix new file mode 100644 index 00000000..df0b543b --- /dev/null +++ b/hosts/nixedo/services/homepage/default.nix @@ -0,0 +1,63 @@ +{ config, lib, ... }: + +with lib; + +let + cfg = homelab.services.${service}; + homelab = config.homelab; + service = "homepage-dashboard"; +in +{ + options.homelab.services.${service} = { + enable = mkEnableOption "Enable ${service}"; + + url = mkOption { + default = "${config.networking.hostName}.${homelab.domain}"; + type = types.str; + }; + }; + + config = mkIf cfg.enable { + services = { + ${service} = { + enable = true; + listenPort = homelab.ports.${service}; + openFirewall = true; + + customCSS = '' + #information-widgets { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + div#footer { + display: none; + } + + .services-group { + margin-bottom: 3rem; + } + ''; + + services = (import ./services.nix { inherit config lib; }); + + settings = { + headerStyle = "clean"; + hideVersion = "true"; + layout = (import ./layout.nix); + statusStyle = "dot"; + }; + }; + + glances.enable = true; + + nginx.virtualHosts.${cfg.url} = { + forceSSL = true; + useACMEHost = homelab.domain; + + locations."/".proxyPass = + "http://localhost:${toString config.services.homepage-dashboard.listenPort}"; + }; + }; + }; +} diff --git a/hosts/nixedo/services/homepage/glances.nix b/hosts/nixedo/services/homepage/glances.nix new file mode 100644 index 00000000..ebcd3622 --- /dev/null +++ b/hosts/nixedo/services/homepage/glances.nix @@ -0,0 +1,57 @@ +{ config }: + +{ + Glances = + let + port = toString config.services.glances.port; + in + [ + { + Info = { + widget = { + type = "glances"; + url = "http://localhost:${port}"; + metric = "info"; + chart = false; + version = 4; + }; + }; + } + + { + "CPU Temp" = { + widget = { + type = "glances"; + url = "http://localhost:${port}"; + metric = "sensor:Package id 0"; + chart = false; + version = 4; + }; + }; + } + + { + Processes = { + widget = { + type = "glances"; + url = "http://localhost:${port}"; + metric = "process"; + chart = false; + version = 4; + }; + }; + } + + { + Network = { + widget = { + type = "glances"; + url = "http://localhost:${port}"; + metric = "network:enp0s20f0u1"; + chart = false; + version = 4; + }; + }; + } + ]; +} diff --git a/hosts/nixedo/services/homepage/layout.nix b/hosts/nixedo/services/homepage/layout.nix new file mode 100644 index 00000000..b0b05b94 --- /dev/null +++ b/hosts/nixedo/services/homepage/layout.nix @@ -0,0 +1,23 @@ +[ + { + Glances = { + columns = 4; + header = false; + style = "row"; + }; + } + + { + Media = { + header = true; + style = "column"; + }; + } + + { + Services = { + header = true; + style = "column"; + }; + } +] diff --git a/hosts/nixedo/services/homepage/services.nix b/hosts/nixedo/services/homepage/services.nix new file mode 100644 index 00000000..52c8cec8 --- /dev/null +++ b/hosts/nixedo/services/homepage/services.nix @@ -0,0 +1,32 @@ +{ config, lib }: + +with lib; + +let + homelab = config.homelab.services; + + homepageCategories = [ + "Media" + "Services" + ]; + + homepageServices = + category: + (attrsets.filterAttrs ( + name: value: value ? homepage && value.homepage.category == category + ) homelab); + + services = lists.forEach homepageCategories (cat: { + "${cat}" = + lib.lists.forEach (lib.attrsets.mapAttrsToList (name: value: name) (homepageServices "${cat}")) + (x: { + "${homelab.${x}.homepage.name}" = { + icon = homelab.${x}.homepage.icon; + description = homelab.${x}.homepage.description; + href = "https://${homelab.${x}.url}"; + siteMonitor = "https://${homelab.${x}.url}"; + }; + }); + }); +in +services ++ [ (import ./glances.nix { inherit config; }) ] diff --git a/hosts/nixedo/services/mastodon.nix b/hosts/nixedo/services/mastodon.nix new file mode 100644 index 00000000..d020a223 --- /dev/null +++ b/hosts/nixedo/services/mastodon.nix @@ -0,0 +1,84 @@ +{ config, lib, ... }: + +with lib; + +let + cfg = config.homelab.services.${service}; + domain = "oliverdavies.uk"; + service = "mastodon"; +in +{ + options.homelab.services.${service} = { + url = mkOption { + default = "social.${domain}"; + internal = true; + type = types.str; + }; + }; + + config = { + services = { + ${service} = { + enable = false; + + configureNginx = false; + localDomain = domain; + streamingProcesses = 3; + + extraConfig = { + SINGLE_USER_MODE = "true"; + WEB_DOMAIN = cfg.url; + }; + + smtp = { + fromAddress = "social@${domain}"; + }; + }; + + cloudflared.tunnels.${config.homelab.cloudflared.tunnelId} = { + ingress = { + "${cfg.url}" = "http://localhost"; + }; + }; + + nginx = { + upstreams.mastodon-streaming = { + extraConfig = '' + least_conn; + ''; + + servers = builtins.listToAttrs ( + map (i: { + name = "unix:/run/mastodon-streaming/streaming-${toString i}.socket"; + value = { }; + }) (range 1 config.services.mastodon.streamingProcesses) + ); + }; + + virtualHosts."social.oliverdavies.uk" = { + root = "${config.services.mastodon.package}/public/"; + + locations = { + "/".tryFiles = "$uri @proxy"; + + "/api/v1/streaming/" = { + proxyPass = "http://mastodon-streaming"; + proxyWebsockets = true; + }; + + "/system/".alias = "/var/lib/mastodon/public-system/"; + + "@proxy" = { + proxyPass = "http://unix:/run/mastodon-web/web.socket"; + proxyWebsockets = true; + }; + }; + + extraConfig = '' + client_max_body_size 100m; + ''; + }; + }; + }; + }; +} diff --git a/hosts/nixedo/services/mealie.nix b/hosts/nixedo/services/mealie.nix index b6c36042..ceb4516f 100644 --- a/hosts/nixedo/services/mealie.nix +++ b/hosts/nixedo/services/mealie.nix @@ -10,7 +10,7 @@ in database.createLocally = true; - port = ports.services.mealie; + port = ports.mealie; settings.ALLOW_SIGNUP = "false"; }; diff --git a/hosts/nixedo/services/uptime-kuma.nix b/hosts/nixedo/services/uptime-kuma.nix index 52dd8ed5..2bdb1487 100644 --- a/hosts/nixedo/services/uptime-kuma.nix +++ b/hosts/nixedo/services/uptime-kuma.nix @@ -15,6 +15,26 @@ in default = "uptime.${homelab.domain}"; type = types.str; }; + + homepage.name = mkOption { + default = "Uptime Kuma"; + type = types.str; + }; + + homepage.description = mkOption { + default = "A fancy self-hosted monitoring tool"; + type = types.str; + }; + + homepage.icon = mkOption { + default = "uptime-kuma"; + type = types.str; + }; + + homepage.category = mkOption { + default = "Services"; + type = types.str; + }; }; config = mkIf cfg.enable { diff --git a/hosts/nixedo/services/vaultwarden.nix b/hosts/nixedo/services/vaultwarden.nix index 48a64f8e..b3f697a3 100644 --- a/hosts/nixedo/services/vaultwarden.nix +++ b/hosts/nixedo/services/vaultwarden.nix @@ -32,7 +32,7 @@ in config = { DOMAIN = "https://${cfg.url}"; ROCKET_ADDRESS = "127.0.0.1"; - ROCKET_PORT = homelab.ports.services.${service}; + ROCKET_PORT = homelab.ports.${service}; SIGNUPS_ALLOWED = false; }; }; diff --git a/hosts/t480/configuration.nix b/hosts/t480/configuration.nix index 10a47b94..6609ecc7 100644 --- a/hosts/t480/configuration.nix +++ b/hosts/t480/configuration.nix @@ -11,6 +11,7 @@ ./hardware-configuration.nix ./cron.nix ./neomutt.nix + ./newsboat ./secrets.nix ./xserver.nix @@ -94,10 +95,4 @@ xsel yt-dlp ]; - - services.logind.settings.Login = { - HandleLidSwitch = "supend-then-hibernate"; - HandleLidSwitchExternalPower = "ignore"; - HandlePowerKey = "supend-then-hibernate"; - }; } diff --git a/hosts/t480/cron.nix b/hosts/t480/cron.nix index cb3c405c..27b9e811 100644 --- a/hosts/t480/cron.nix +++ b/hosts/t480/cron.nix @@ -5,7 +5,7 @@ enable = true; systemCronJobs = [ - "*/15 * * * * opdavies ${pkgs.imapfilter}/bin/imapfilter -c ~/Repos/git.oliverdavies.uk/opdavies/email-filters/config.lua" + "*/15 * * * * opdavies ${pkgs.imapfilter}/bin/imapfilter -c ~/Repos/code.oliverdavies.uk/opdavies/email-filters/config.lua" "0 8,20 * * * opdavies ${pkgs.isync}/bin/mbsync -a" ]; }; diff --git a/hosts/t480/newsboat/default.nix b/hosts/t480/newsboat/default.nix new file mode 100644 index 00000000..e99f78e9 --- /dev/null +++ b/hosts/t480/newsboat/default.nix @@ -0,0 +1,30 @@ +{ + home-manager.users.opdavies.programs.newsboat = { + enable = true; + + extraConfig = '' + bind-key j down + bind-key k up + + bind-key j next articlelist + bind-key k prev articlelist + bind-key J next-feed articlelist + bind-key K prev-feed articlelist + + bind-key g home + bind-key G end + + bind-key d pagedown + bind-key u pageup + + bind-key a toggle-article-read + bind-key n next-unread + bind-key N prev-unread + bind-key x pb-delete + + color info white black bold + ''; + + urls = import ./urls.nix; + }; +} diff --git a/hosts/t480/newsboat/urls.nix b/hosts/t480/newsboat/urls.nix new file mode 100644 index 00000000..83f2a2df --- /dev/null +++ b/hosts/t480/newsboat/urls.nix @@ -0,0 +1,298 @@ +[ + { url = "https://www.reddit.com/r/nginx/new/.rss"; } + { url = "https://www.reddit.com/r/devops/.rss"; } + { url = "https://medium.com/feed/@bdfinst"; } + { url = "https://blog.system76.com/rss"; } + { url = "https://medium.com/feed/@codemonkeymike"; } + { url = "https://www.reddit.com/r/devops/new/.rss"; } + { url = "https://www.reddit.com/r/sysadmin/.rss"; } + { + url = "https://www.carlpullein.com/blog?format=RSS"; + title = "Carl Pullein"; + tags = [ "Productivity" ]; + } + { url = "https://feeds.feedburner.com/Faildesk"; } + { url = "https://syndication.thedailywtf.com/TheDailyWtf"; } + { url = "https://www.sherdog.com/rss/videos2.xml"; } + { + url = "https://www.reddit.com/r/MMA/.rss"; + tags = [ "MMA" ]; + } + { + url = "https://mmaweekly.com/feed/rss"; + tags = [ "MMA" ]; + } + { + url = "https://www.sherdog.com/rss/news2.xml"; + tags = [ "MMA" ]; + } + { + url = "https://www.sherdog.com/rss/articles2.xml"; + tags = [ "MMA" ]; + } + { + url = "https://www.ufc.com/rss/news"; + tags = [ "MMA" ]; + } + { url = "https://www.theregister.co.uk/headlines.atom"; } + { + url = "https://www.rbs6nations.com/en/RssLatestNews.xml"; + tags = [ "Rugby" ]; + } + { + url = "https://feeds.feedburner.com/rugbydump"; + tags = [ "Rugby" ]; + } + { + url = "https://www.telegraph.co.uk/sport/rugbyunion/rss"; + tags = [ "Rugby" ]; + } + { url = "https://code.facebook.com/posts/rss"; } + { url = "https://nginx.com/feed/rss"; } + { + url = "https://www.lornajane.net/feed"; + tags = [ "Software" ]; + } + { + url = "https://nginx.org/index.rss"; + tags = [ "Software" ]; + } + { url = "https://www.engadget.com/rss.xml"; } + { url = "https://rss.slashdot.org/Slashdot/slashdotIt"; } + { url = "https://lwn.net/headlines/newrss"; } + { url = "https://rss.slashdot.org/Slashdot/slashdotLinux"; } + { + url = "https://blog.sebastian-daschner.com/feeds/rss"; + title = "Sebastian Daschner"; + } + { url = "https://www.reddit.com/r/linux/.rss"; } + { url = "https://githubengineering.com/atom.xml"; } + { url = "https://rss.slashdot.org/Slashdot/slashdotDevelopers"; } + { url = "https://www.alistapart.com/rss.xml"; } + { url = "https://www.christitus.com/index.xml"; } + { url = "https://www.freeagentcentral.com/feed.rss"; } + { url = "https://akrabat.com/feed Software"; } + { url = "https://jasonmccreary.me/feed.atom"; } + { url = "https://martinfowler.com/bliki/bliki.atom"; } + { url = "https://lornajane.net/feed"; } + { url = "https://christoph-rumpel.com/feed.xml"; } + { url = "https://gdstechnology.blog.gov.uk/feed/atom"; } + { url = "https://weierophinney.net/matthew/feeds/index.rss2"; } + { url = "https://stitcher.io/rss"; } + { url = "https://www.reddit.com/r/css.rss"; } + { url = "https://www.reddit.com/r/PHP/.rss"; } + { url = "https://whateverthing.com/atom.xml"; } + { url = "https://mnapoli.fr/atom.xml"; } + { url = "https://www.epicweb.dev/rss.xml?ck_subscriber_id=2498091571"; } + { url = "https://dev.to/feed"; } + { url = "https://localheinz.com/feed.xml"; } + { url = "https://www.ben-morris.com/feed"; } + { url = "https://www.jbrains.ca/rss"; } + { url = "https://blog.thecodewhisperer.com/rss"; } + { url = "https://odan.github.io/feed.xml"; } + { url = "https://feeds.feedburner.com/symfony/blog"; } + { url = "https://www.alwaysagileconsulting.com/feed"; } + { url = "https://blog.sensiolabs.com/feed"; } + { url = "https://pascalbaljetmedia.com/rss"; } + { url = "https://tighten.co/blog/feed.atom"; } + { url = "https://ryangjchandler.co.uk/feed"; } + { url = "https://jnsgr.uk/posts/index.xml"; } + { url = "https://timacdonald.me/feed.xml"; } + { url = "https://phppot.com/feed"; } + { url = "https://howtocodewell.libsyn.com/rss"; } + { url = "https://ctankersley.com/atom.xml"; } + { url = "https://blog.wyrihaximus.net/atom.xml"; } + { url = "https://dotfyle.com/this-week-in-neovim/rss.xml"; } + { url = "https://paul-m-jones.com/feed"; } + { url = "https://www.tomasvotruba.cz/rss.xml"; } + { url = "https://www.reddit.com/r/git/.rss"; } + { url = "https://www.daveismyname.com/feed"; } + { + url = "https://murze.be/feed/php"; + title = "freek.dev"; + tags = [ + "PHP" + "Laravel" + "Software" + ]; + } + { url = "https://nikic.github.io/rss.xml"; } + { + url = "https://drupal.org/planet/rss.xml"; + tags = [ "Drupal" ]; + } + { url = "https://www.bram.us/feed"; } + { url = "https://feeds.feedburner.com/GiantRobotsSmashingIntoOtherGiantRobots"; } + { url = "https://murze.be/feed/originals"; } + { url = "https://www.patkua.com/feed"; } + { url = "https://www.benjystanton.co.uk/feed.xml"; } + { + url = "https://drupal.org/security/rss.xml"; + tags = [ "Drupal" ]; + } + { + url = "https://uk.indeed.com/rss?q=symfony&l=np18"; + tags = [ "Jobs" ]; + } + { + url = "https://uk.indeed.com/rss?q=php&l=np18"; + tags = [ "Jobs" ]; + } + { + url = "https://jobs.drupal.org/all-jobs/feed"; + tags = [ "Jobs" ]; + } + { + url = "https://www.reed.co.uk/jobs/rss/np18?source=rss&keywords=drupal&salaryfrom=50000&sortby=DisplayDate"; + tags = [ "Jobs" ]; + } + { + url = "https://www.reed.co.uk/jobs/rss/np18?source=rss&keywords=php&salaryfrom=50000&sortby=DisplayDate"; + tags = [ "Jobs" ]; + } + { + url = "https://uk.indeed.com/rss?q=drupal&l=np18"; + tags = [ "Jobs" ]; + } + { + url = "https://www.reed.co.uk/jobs/rss/np18?source=rss&keywords=symfony&salaryfrom=50000&sortby=DisplayDate"; + tags = [ "Jobs" ]; + } + { url = "https://emilywebber.co.uk/feed"; } + { url = "https://introvertdear.com/feed"; } + { url = "https://designli.co/blog/feed"; } + { url = "https://www.oliverdavies.uk/rss/daily.xml"; } + { + url = "https://www.drupal.org/project/issues/rss/override_node_options"; + tags = [ "Drupal" ]; + } + { + url = "https://www.drupal.org/project/issues/rss/tailwindcss"; + tags = [ "Drupal" ]; + } + { + url = "https://nixos.org/blog/announcements-rss.xml"; + tags = [ "Linux" ]; + } + { + url = "https://laracasts.com/feed"; + tags = [ + "PHP" + "Laravel" + ]; + } + { + url = "https://feeds.feedburner.com/knpuniversity"; + title = "SymfonyCasts"; + tags = [ + "PHP" + "Symfony" + ]; + } + { + url = "https://nickjanetakis.com/atom.xml"; + title = "Nick Janetakis"; + } + { + url = "https://www.learnlinux.tv/feed"; + tags = [ "Linux" ]; + } + { + url = "https://tailwindcss.com/feeds/feed.xml"; + tags = [ + "Software" + "CSS" + ]; + } + { + url = "https://monospacementor.com/feed"; + tags = [ + "Linux" + "Software" + ]; + } + { + url = "https://frontendmasters.com/blog/feed"; + tags = [ "Software" ]; + title = "Frontend Masters Boost"; + } + { + url = "https://www.youtube.com/feeds/videos.xml?channel_id=UC2aHRY064THg_t7JZoGSYGg"; + title = "YouTube - elysse"; + tags = [ + "Software" + "YouTube" + ]; + } + { + url = "https://www.youtube.com/feeds/videos.xml?channel_id=UCSUA5RARrNt4-Ik3qtbETLQ"; + title = "YouTube - Jason Swett"; + tags = [ + "Software" + "YouTube" + ]; + } + { + url = "https://www.youtube.com/feeds/videos.xml?channel_id=UCorzANoC3fX9VVefJHM5wtA"; + title = "~YouTube - Nick Janetakis"; + tags = [ + "Software" + "YouTube" + ]; + } + { url = "https://devenv.sh/feed_rss_created.xml"; } + { url = "https://sive.rs/en.atom"; } + { url = "https://kressle.in/feed.xml"; } + { + url = "https://github.com/sculpin/sculpin/releases.atom"; + tags = [ + "PHP" + "Sculpin" + "Open Source" + ]; + } + { url = "https://www.theminimalists.com/feed"; } + { url = "https://opensourcepledge.com/rss.xml"; } + { + url = "https://feeds.bbci.co.uk/sport/rugby-union/teams/ng-dragons/rss.xml"; + tags = [ "Rugby" ]; + title = "BBC Sport - Dragons RFC"; + } + { + url = "https://openrss.org/www.twitch.tv/thealtf4stream/videos?filter=all&sort=time"; + tags = [ "Twitch" ]; + } + { + url = "https://openrss.org/www.twitch.tv/theprimeagen/videos?filter=all&sort=time"; + tags = [ "Twitch" ]; + } + { + url = "https://openrss.org/www.twitch.tv/teej_dv/videos?filter=all&sort=time"; + tags = [ "Twitch" ]; + } + { + url = "https://openrss.org/www.twitch.tv/monospacementor/videos?filter=all&sort=time"; + tags = [ "Twitch" ]; + } + { url = "https://www.reddit.com/r/librewolf/new/.rss"; } + { + url = "https://www.youtube.com/feeds/videos.xml?channel_id=UCSJKQnpmPcdkysduL0mNktg"; + title = "YouTube - teej_daily"; + tags = [ + "Software" + "YouTube" + ]; + } + { + url = "https://feeds.bbci.co.uk/sport/rugby-union/rss.xml"; + tags = [ "Rugby" ]; + title = "BBC Sport - Rugby Union"; + } + { url = "https://tinkerbetter.tube/feeds/videos.xml?videoChannelId=2"; } + { url = "https://video.fosshq.org/feeds/videos.xml?videoChannelId=2"; } + { + url = "https://www.garfieldtech.com/blog/feed"; + tags = [ "PHP" ]; + } + { url = "https://world.hey.com/dhh/feed.atom"; } +] diff --git a/modules/dmenu-mpv.nix b/modules/dmenu-mpv.nix deleted file mode 100644 index b60d4d58..00000000 --- a/modules/dmenu-mpv.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ - flake.modules.homeManager.gui = - { pkgs, ... }: - { - home.packages = [ - (pkgs.writeShellApplication { - name = "dmenu_mpv"; - - text = '' - selected="$(find "$HOME/Videos" -type f | dmenu -i -l 15)" - - if [[ -n "$selected" ]]; then - mpv --fs --speed=1.5 "$selected" >/dev/null 2>&1 - fi - ''; - - runtimeInputs = with pkgs; [ - dmenu - mpv - ]; - }) - ]; - }; -} diff --git a/modules/dmenu-sys.nix b/modules/dmenu-sys.nix index 6f289eb4..2ccab6e7 100644 --- a/modules/dmenu-sys.nix +++ b/modules/dmenu-sys.nix @@ -17,7 +17,7 @@ installPhase = '' mkdir -p $out/bin - cp $src/shortcuts-menus/sys $out/bin/${pname} + cp $src/${pname} $out/bin chmod +x $out/bin/${pname} ''; }) diff --git a/modules/dmenu-timer.nix b/modules/dmenu-timer.nix index 460305f4..7a829d27 100644 --- a/modules/dmenu-timer.nix +++ b/modules/dmenu-timer.nix @@ -17,7 +17,7 @@ installPhase = '' mkdir -p $out/bin - cp $src/statusbar/timer $out/bin/${pname} + cp $src/${pname} $out/bin chmod +x $out/bin/${pname} ''; }) diff --git a/modules/dmenu-tmux.nix b/modules/dmenu-tmux.nix deleted file mode 100644 index deb6e66e..00000000 --- a/modules/dmenu-tmux.nix +++ /dev/null @@ -1,36 +0,0 @@ -{ inputs, ... }: - -{ - flake.modules.homeManager.gui = - { pkgs, ... }: - { - home.packages = [ - (pkgs.writeShellApplication { - name = "dmenu_tmux"; - - text = '' - selected="$(z tmux list | dmenu -l 40)" || exit 0 - - if tmux list-sessions >/dev/null 2>&1; then - if pgrep -x st >/dev/null; then - z tmux connect "$selected" - - exit 0 - fi - fi - - pkill -x st 2>/dev/null || true - sleep 0.1 - - exec st -e z tmux connect "$selected" - ''; - - runtimeInputs = with pkgs; [ - dmenu - inputs.z.packages.${pkgs.stdenv.hostPlatform.system}.default - st - ]; - }) - ]; - }; -} diff --git a/modules/git-repo-updater.nix b/modules/git-repo-updater.nix index 1b78a042..25fb059f 100644 --- a/modules/git-repo-updater.nix +++ b/modules/git-repo-updater.nix @@ -2,10 +2,10 @@ { flake.modules.nixos.base = - { pkgs, ... }: + { system, ... }: { environment.systemPackages = [ - inputs.git-repo-updater.packages.${pkgs.stdenv.hostPlatform.system}.default + inputs.git-repo-updater.packages.${system}.default ]; }; } diff --git a/modules/git/aliases.nix b/modules/git/aliases.nix index feac4013..ad52e1b7 100644 --- a/modules/git/aliases.nix +++ b/modules/git/aliases.nix @@ -1,52 +1,50 @@ { - flake.modules.homeManager.base.programs.git = { - settings.aliases = { - aa = "add --all"; - assume = "update-index --assume-unchanged"; - assumed = "!git ls-files -v | grep '^[hsmrck?]' | cut -c 3-"; - b = "branch"; - blame = "blame -w -C -C -C"; - browse = "!gh repo view --web"; - ca = "commit --amend --verbose"; - car = "commit --amend --no-edit"; - cl = "!hub clone"; - co = "checkout"; - compare = "!hub compare"; - current-branch = "rev-parse --abbrev-ref HEAD"; - dc = "diff --color --word-diff --cached"; - df = "diff --color --word-diff"; - dup = "!git checkout develop && git fetch origin && echo && git sl develop..origin/develop && echo && git pull --quiet && git checkout -"; - fixup = "commit --fixup"; - issues = "!gh issue list --web"; - mup = "!git master-to-main-wrapper checkout %BRANCH% && git fetch origin && echo && git sl %BRANCH%..origin/%BRANCH% && echo && git pull --quiet && git checkout -"; - no-ff = "merge --no-ff"; - pl = "pull"; - prune = "remote prune origin"; - ps = "push"; - pulls = "!gh pr list --web"; - rbc = "rebase --continue"; - rdup = "!git dup && git rebase develop"; - remotes = "remote -v"; - repush = "!git pull --rebase && git push"; - ri = "rebase --interactive"; - rid = "!git rebase -i $(git merge-base develop HEAD)"; - rim = "!git rebase -i $(git master-to-main-wrapper merge-base %BRANCH% HEAD)"; - rip = "!git rebase -i $(git merge-base production HEAD)"; - ris = "!git rebase -i $(git merge-base staging HEAD)"; - riu = "!git rebase -i $(git rev-parse --abbrev-ref --symbolic-full-name @{u})"; - rmup = "!git mup && git master-to-main-wrapper rebase %BRANCH%"; - sl = "log --oneline --decorate -20"; - sla = "log --oneline --decorate --graph --all -20"; - slap = "log --oneline --decorate --graph --all"; - slp = "log --oneline --decorate"; - stash = "stash --included-untracked"; - unassume = "update-index --no-assume-unchanged"; - uncommit = "reset --soft HEAD^"; - unstage = "reset"; - update = "!git fetch --all --jobs=4 --prune --progress && git rebase --autostash --stat"; - upstream = "rev-parse --abbrev-ref --symbolic-full-name @{u}"; - ureset = "!git reset --hard $(git upstream)"; - worktrees = "worktree list"; - }; + flake.modules.homeManager.base.programs.git.aliases = { + aa = "add --all"; + assume = "update-index --assume-unchanged"; + assumed = "!git ls-files -v | grep '^[hsmrck?]' | cut -c 3-"; + b = "branch"; + blame = "blame -w -C -C -C"; + browse = "!gh repo view --web"; + ca = "commit --amend --verbose"; + car = "commit --amend --no-edit"; + cl = "!hub clone"; + co = "checkout"; + compare = "!hub compare"; + current-branch = "rev-parse --abbrev-ref HEAD"; + dc = "diff --color --word-diff --cached"; + df = "diff --color --word-diff"; + dup = "!git checkout develop && git fetch origin && echo && git sl develop..origin/develop && echo && git pull --quiet && git checkout -"; + fixup = "commit --fixup"; + issues = "!gh issue list --web"; + mup = "!git master-to-main-wrapper checkout %BRANCH% && git fetch origin && echo && git sl %BRANCH%..origin/%BRANCH% && echo && git pull --quiet && git checkout -"; + no-ff = "merge --no-ff"; + pl = "pull"; + prune = "remote prune origin"; + ps = "push"; + pulls = "!gh pr list --web"; + rbc = "rebase --continue"; + rdup = "!git dup && git rebase develop"; + remotes = "remote -v"; + repush = "!git pull --rebase && git push"; + ri = "rebase --interactive"; + rid = "!git rebase -i $(git merge-base develop HEAD)"; + rim = "!git rebase -i $(git master-to-main-wrapper merge-base %BRANCH% HEAD)"; + rip = "!git rebase -i $(git merge-base production HEAD)"; + ris = "!git rebase -i $(git merge-base staging HEAD)"; + riu = "!git rebase -i $(git rev-parse --abbrev-ref --symbolic-full-name @{u})"; + rmup = "!git mup && git master-to-main-wrapper rebase %BRANCH%"; + sl = "log --oneline --decorate -20"; + sla = "log --oneline --decorate --graph --all -20"; + slap = "log --oneline --decorate --graph --all"; + slp = "log --oneline --decorate"; + stash = "stash --included-untracked"; + unassume = "update-index --no-assume-unchanged"; + uncommit = "reset --soft HEAD^"; + unstage = "reset"; + update = "!git fetch --all --jobs=4 --prune --progress && git rebase --autostash --stat"; + upstream = "rev-parse --abbrev-ref --symbolic-full-name @{u}"; + ureset = "!git reset --hard $(git upstream)"; + worktrees = "worktree list"; }; } diff --git a/modules/git/defaults.nix b/modules/git/defaults.nix index 31c59951..02b8978c 100644 --- a/modules/git/defaults.nix +++ b/modules/git/defaults.nix @@ -2,7 +2,7 @@ flake.modules.homeManager.base = { config, ... }: { - programs.git.settings = { + programs.git.extraConfig = { branch = { autosetupmerge = true; autosetuprebase = "always"; diff --git a/modules/git/user.nix b/modules/git/user.nix index 5b04c014..bc3f214f 100644 --- a/modules/git/user.nix +++ b/modules/git/user.nix @@ -2,9 +2,7 @@ { flake.modules.homeManager.base.programs.git = { - settings.user = { - email = config.flake.meta.owner.email; - name = config.flake.meta.owner.name; - }; + userName = config.flake.meta.owner.name; + userEmail = config.flake.meta.owner.email; }; } diff --git a/modules/hosts/t480/ollama.nix b/modules/hosts/t480/ollama.nix new file mode 100644 index 00000000..4ec6407a --- /dev/null +++ b/modules/hosts/t480/ollama.nix @@ -0,0 +1,3 @@ +{ + flake.modules.nixos.desktop.services.ollama.enable = false; +} diff --git a/modules/hosts/t480/open-webui.nix b/modules/hosts/t480/open-webui.nix new file mode 100644 index 00000000..ae6421f8 --- /dev/null +++ b/modules/hosts/t480/open-webui.nix @@ -0,0 +1,5 @@ +{ + nixpkgs.allowedUnfreePackages = [ "open-webui" ]; + + flake.modules.nixos.desktop.services.open-webui.enable = false; +} diff --git a/modules/kanata/config.nix b/modules/kanata/config.nix index 7fb660b8..bc73ab3e 100644 --- a/modules/kanata/config.nix +++ b/modules/kanata/config.nix @@ -5,21 +5,21 @@ ) (defvar + tap-time 150 hold-time 200 hold-time-slow 300 - tap-time 150 ) (defalias escctrl (tap-hold 100 100 esc lctl) - a (tap-hold $tap-time $hold-time-slow a lsft) + a (tap-hold $tap-time $hold-time-slow a lmet) s (tap-hold $tap-time $hold-time-slow s lalt) - d (tap-hold $tap-time $hold-time d lctl) - f (tap-hold $tap-time $hold-time f lmet) - j (tap-hold $tap-time $hold-time j rmet) - k (tap-hold $tap-time $hold-time k rctl) + d (tap-hold $tap-time $hold-time d lsft) + f (tap-hold $tap-time $hold-time f lctl) + j (tap-hold $tap-time $hold-time j rctl) + k (tap-hold $tap-time $hold-time k rsft) l (tap-hold $tap-time $hold-time-slow l ralt) - ; (tap-hold $tap-time $hold-time-slow ; rsft) + ; (tap-hold $tap-time $hold-time-slow ; rmet) ) (deflayer base diff --git a/modules/nixvim/auto-save.nix b/modules/nixvim/auto-save.nix new file mode 100644 index 00000000..732944ba --- /dev/null +++ b/modules/nixvim/auto-save.nix @@ -0,0 +1,21 @@ +{ + flake.modules.nixvim.custom.plugins.auto-save = { + enable = true; + + settings.condition = '' + function(buf) + local excluded_filetypes = {} + + local excluded_filenames = {} + + if vim.tbl_contains(excluded_filetypes, vim.fn.getbufvar(buf, "&filetype")) + or vim.tbl_contains(excluded_filenames, vim.fn.expand("%:t")) + then + return false + end + + return true + end + ''; + }; +} diff --git a/modules/nixvim/completion/snippets/nix.lua b/modules/nixvim/completion/snippets/nix.lua index 76254b27..8e454963 100644 --- a/modules/nixvim/completion/snippets/nix.lua +++ b/modules/nixvim/completion/snippets/nix.lua @@ -1,6 +1,39 @@ return { s("home_packages", fmta("home.packages = with pkgs; [ <> ];", i(0))), + s( + "homepage_options", + fmta( + [[ + homepage.name = mkOption { + default = ""; + type = types.str; + }; + + homepage.description = mkOption { + default = ""; + type = types.str; + }; + + homepage.icon = mkOption { + default = ""; + type = types.str; + }; + + homepage.category = mkOption { + default = ""; + type = types.str; + }; + ]], + { + description = i(2), + finish = i(0), + icon = i(3), + name = i(1), + } + ) + ), + s( "imports", fmta( diff --git a/modules/nixvim/filetypes.nix b/modules/nixvim/filetypes.nix index 6bdbef9a..bfdc4ca9 100644 --- a/modules/nixvim/filetypes.nix +++ b/modules/nixvim/filetypes.nix @@ -7,7 +7,6 @@ module = "php"; neon = "yaml"; pcss = "scss"; - tf = "terraform"; theme = "php"; }; diff --git a/modules/nixvim/keymaps.nix b/modules/nixvim/keymaps.nix index 458e411a..dc13def0 100644 --- a/modules/nixvim/keymaps.nix +++ b/modules/nixvim/keymaps.nix @@ -43,7 +43,7 @@ } { - action = "silent !tmux new-window start-tmux"; + action = "silent !tmux new-window tmux-sessionizer"; key = ""; options.silent = true; } diff --git a/modules/nixvim/lsp/terraform.nix b/modules/nixvim/lsp/terraform.nix deleted file mode 100644 index d2054efe..00000000 --- a/modules/nixvim/lsp/terraform.nix +++ /dev/null @@ -1,3 +0,0 @@ -{ - flake.modules.nixvim.custom.lsp.servers.terraformls.enable = true; -} diff --git a/modules/nixvim/oil.nix b/modules/nixvim/oil.nix deleted file mode 100644 index 80a83874..00000000 --- a/modules/nixvim/oil.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ - flake.modules.nixvim.custom = { - plugins.oil = { - enable = true; - - settings = { - delete_to_trash = true; - - keymaps."-" = "actions.parent"; - - skip_confirm_for_simple_edits = true; - view_options.show_hidden = true; - }; - }; - - keymaps = [ - { - action = "Oil"; - key = "-"; - } - ]; - }; -} - diff --git a/modules/nixvim/qmk.nix b/modules/nixvim/qmk.nix deleted file mode 100644 index 54997959..00000000 --- a/modules/nixvim/qmk.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ - flake.modules.nixvim.custom.plugins.qmk = { - enable = true; - - settings = { - layout = [ - "x x x x x _ _ _ _ _ _ _ _ _ x x x x x" - "x x x x x x _ _ _ _ _ _ _ x x x x x x" - "x x x x x x _ _ _ _ _ _ _ x x x x x x" - "x x x x x x _ _ _ _ _ _ _ x x x x x x" - "x x x x x x x x x _ x x x x x x x x x" - "x x x x x _ x x x _ x x x _ x x x x x" - ]; - name = "LAYOUT_glove80"; - variant = "zmk"; - }; - }; -} diff --git a/modules/nixvim/treesitter.nix b/modules/nixvim/treesitter.nix index d2e85c12..02de1492 100644 --- a/modules/nixvim/treesitter.nix +++ b/modules/nixvim/treesitter.nix @@ -11,7 +11,6 @@ comment css csv - devicetree dockerfile gitattributes gitignore @@ -42,10 +41,7 @@ yaml ]; - settings = { - highlight.enable = true; - indent.enable = true; - }; + settings.highlight.enable = true; }; treesitter-textobjects.enable = true; diff --git a/modules/scripts/add-weight.nix b/modules/scripts/add-weight.nix new file mode 100644 index 00000000..cb884e97 --- /dev/null +++ b/modules/scripts/add-weight.nix @@ -0,0 +1,34 @@ +{ withSystem, ... }: + +let + name = "add-weight"; +in +{ + perSystem = + psArgs@{ pkgs, ... }: + { + packages.${name} = pkgs.writeShellApplication { + inherit name; + + runtimeInputs = with pkgs; [ + coreutils + psArgs.config.packages.today2 + psArgs.config.packages.weight + ]; + + text = '' + echo "$(today2),$1" >> "$XDG_DOCUMENTS_DIR/wiki/2-areas/health-fitness/weight.csv" + + weight + ''; + }; + }; + + flake.modules.homeManager.base = + { pkgs, ... }: + { + home.packages = [ + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) + ]; + }; +} diff --git a/modules/scripts/build-adoc.nix b/modules/scripts/build-adoc.nix new file mode 100644 index 00000000..703adf51 --- /dev/null +++ b/modules/scripts/build-adoc.nix @@ -0,0 +1,62 @@ +{ + flake.modules.homeManager.base = + { pkgs, ... }: + { + home.packages = [ + (pkgs.writeShellApplication { + name = "build-adoc"; + + runtimeInputs = with pkgs; [ + asciidoctor-with-extensions + ]; + + excludeShellChecks = [ "SC2034" ]; + + text = '' + ls book + + echo "" + + date=$(date '+%Y-%m-%d %H:%M:%S') + + echo "The current date is $date." + + pwd=$(pwd) + parent=$(basename "$(dirname "$pwd")") + name=$(basename "$pwd") + + echo "The parent directory is $parent." + echo "The current directory is $name." + + echo "" + echo "Generating the HTML..." + asciidoctor \ + -D book \ + -a "date=$date" \ + -o index.html \ + ./book/index.adoc + + echo "" + echo "Generating the EPUB..." + asciidoctor-epub3 \ + -D book \ + -a "date=$date" \ + -o "$parent-$name.epub" \ + ./book/index.adoc + + echo "" + echo "Generating the PDF..." + asciidoctor-pdf \ + -D book \ + -a "date=$date" \ + -o "$parent-$name.pdf" \ + ./book/index.adoc + + echo "" + + ls book + ''; + }) + ]; + }; +} diff --git a/modules/scripts/build.nix b/modules/scripts/build.nix new file mode 100644 index 00000000..c04f4664 --- /dev/null +++ b/modules/scripts/build.nix @@ -0,0 +1,16 @@ +{ + flake.modules.homeManager.base = + { pkgs, ... }: + { + home.packages = [ + (pkgs.writeShellApplication { + name = "build"; + + text = '' + test -r book/index.adoc && exec build-adoc "$@" + test -x build && exec ./build "$@" + ''; + }) + ]; + }; +} diff --git a/modules/scripts/clone.nix b/modules/scripts/clone.nix index dc655e91..36d1574d 100644 --- a/modules/scripts/clone.nix +++ b/modules/scripts/clone.nix @@ -9,7 +9,7 @@ runtimeInputs = with pkgs; [ git - psArgs.config.packages.start-tmux + psArgs.config.packages.tmux-sessionizer ]; text = '' @@ -20,7 +20,7 @@ domain="''${BASH_REMATCH[2]}" if [[ "$domain" == "ssh.oliverdavies.uk" ]]; then - domain="git.oliverdavies.uk" + domain="code.oliverdavies.uk" fi user="''${BASH_REMATCH[3]}" @@ -29,13 +29,13 @@ user_path="$XDG_REPOS_DIR/$domain/$user" repo_path="$user_path/$name" - [[ -d "$repo_path" ]] && start-tmux "$repo_path" && exit 0 + [[ -d "$repo_path" ]] && tmux-sessionizer "$repo_path" && exit 0 mkdir -pv "$repo_path" git clone "$repo_url" "$repo_path" - start-tmux "$repo_path" + tmux-sessionizer "$repo_path" else exit 1 fi @@ -47,7 +47,7 @@ { pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.clone)) + (withSystem pkgs.system (psArgs: psArgs.config.packages.clone)) ]; }; } diff --git a/modules/scripts/datepath.nix b/modules/scripts/datepath.nix index 44101018..fa2b4e4d 100644 --- a/modules/scripts/datepath.nix +++ b/modules/scripts/datepath.nix @@ -20,7 +20,7 @@ in { pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) ]; }; } diff --git a/modules/scripts/hnow.nix b/modules/scripts/hnow.nix new file mode 100644 index 00000000..58650c03 --- /dev/null +++ b/modules/scripts/hnow.nix @@ -0,0 +1,35 @@ +{ lib, withSystem, ... }: + +let + name = "hnow"; +in +{ + perSystem = + psArgs@{ pkgs, ... }: + let + now = withSystem pkgs.system (psArgs: psArgs.config.packages.now); + in + { + packages.${name} = pkgs.writeShellApplication { + inherit name; + + runtimeInputs = [ + psArgs.config.packages.now + ]; + + text = '' + # Based on https://github.com/rwxrob/dot/blob/main/scripts/hnow. + + echo "== $(${lib.getExe now} "$*")" + ''; + }; + }; + + flake.modules.homeManager.base = + { pkgs, ... }: + { + home.packages = [ + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) + ]; + }; +} diff --git a/modules/scripts/now.nix b/modules/scripts/now.nix new file mode 100644 index 00000000..94ad3d31 --- /dev/null +++ b/modules/scripts/now.nix @@ -0,0 +1,32 @@ +{ withSystem, ... }: + +let + name = "now"; +in +{ + perSystem = + { pkgs, ... }: + { + packages.${name} = pkgs.writeShellApplication { + inherit name; + + runtimeInputs = with pkgs; [ coreutils ]; + + text = '' + # Based on https://github.com/rwxrob/dot/blob/main/scripts/now. + + out=$(date "+%A, %B %e, %Y, %R %Z" "-d ''${*:-now}") + + echo "''${out// / }" + ''; + }; + }; + + flake.modules.homeManager.base = + { pkgs, ... }: + { + home.packages = [ + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) + ]; + }; +} diff --git a/modules/scripts/onchange.nix b/modules/scripts/onchange.nix index 6ce168dc..78e36bf4 100644 --- a/modules/scripts/onchange.nix +++ b/modules/scripts/onchange.nix @@ -29,7 +29,7 @@ in { pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) ]; }; } diff --git a/modules/scripts/open-repo-url.nix b/modules/scripts/open-repo-url.nix index 4726a167..35e5b5f0 100644 --- a/modules/scripts/open-repo-url.nix +++ b/modules/scripts/open-repo-url.nix @@ -15,7 +15,7 @@ in text = '' repo_url=$(git remote get-url origin | sed -E 's#(git|forgejo)@([A-Za-z0-9.-]+):#https://\2/#;s#.git$##') - repo_url="''${repo_url//ssh.oliverdavies.uk/git.oliverdavies.uk}" + repo_url="''${repo_url//ssh.oliverdavies.uk/code.oliverdavies.uk}" xdg-open "$repo_url" ''; @@ -26,7 +26,7 @@ in { pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) ]; }; } diff --git a/modules/scripts/ppp.nix b/modules/scripts/ppp.nix index 90c96ae4..17cba13a 100644 --- a/modules/scripts/ppp.nix +++ b/modules/scripts/ppp.nix @@ -20,7 +20,7 @@ in { pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) ]; }; } diff --git a/modules/scripts/ptest.nix b/modules/scripts/ptest.nix index 487da87c..a0cfa6eb 100644 --- a/modules/scripts/ptest.nix +++ b/modules/scripts/ptest.nix @@ -36,7 +36,7 @@ in { pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) ]; }; } diff --git a/modules/scripts/skills.nix b/modules/scripts/skills.nix index e6a46f00..b1af10a0 100644 --- a/modules/scripts/skills.nix +++ b/modules/scripts/skills.nix @@ -20,7 +20,7 @@ in { config, pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) ]; home.sessionVariables.SKILLS_FILE = "${config.home.sessionVariables.NOTES_DIRECTORY}/2-areas/skills.csv"; diff --git a/modules/scripts/start-tmux.nix b/modules/scripts/start-tmux.nix deleted file mode 100644 index 3fb6ee8e..00000000 --- a/modules/scripts/start-tmux.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ inputs, withSystem, ... }: - -let - name = "start-tmux"; -in -{ - perSystem = - { pkgs, ... }: - { - packages.${name} = pkgs.writeShellApplication { - inherit name; - - runtimeInputs = with pkgs; [ - fzf - inputs.z.packages.${pkgs.stdenv.hostPlatform.system}.default - ]; - - text = '' - selected="$(z tmux list | fzf)" - - [[ -n $selected ]] && z tmux connect "$selected" - ''; - }; - }; - - flake.modules.homeManager.base = - { pkgs, ... }: - { - home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) - ]; - }; -} diff --git a/modules/scripts/tmux-default-startup.nix b/modules/scripts/tmux-default-startup.nix deleted file mode 100644 index c9de163d..00000000 --- a/modules/scripts/tmux-default-startup.nix +++ /dev/null @@ -1,36 +0,0 @@ -{ withSystem, ... }: - -let - name = "tmux-default-startup"; -in -{ - perSystem = - { pkgs, ... }: - { - packages.${name} = pkgs.writeShellApplication { - inherit name; - - text = '' - if [[ -x "$PWD/.tmux-sessionizer" ]]; then - "$PWD/.tmux-sessionizer" - fi - - if [[ -x "$PWD/.tmux" ]]; then - "$PWD/.tmux" - fi - - tmux new-window -d -n scratch - - "$EDITOR" - ''; - }; - }; - - flake.modules.homeManager.base = - { pkgs, ... }: - { - home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) - ]; - }; -} diff --git a/modules/scripts/tmux-sessionizer/default.nix b/modules/scripts/tmux-sessionizer/default.nix new file mode 100644 index 00000000..8f4513b5 --- /dev/null +++ b/modules/scripts/tmux-sessionizer/default.nix @@ -0,0 +1,30 @@ +{ + flake.modules.homeManager.base = + { config, pkgs, ... }: + { + home.file.".tmux-sessionizer".source = "${ + pkgs.writeShellApplication { + name = ".tmux-sessionizer"; + + runtimeInputs = with pkgs; [ + tmux + ]; + + text = '' + set +o errexit + set +o nounset + + if [[ "$PWD" == "${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/os" || "$PWD" == "${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/personal" || "$PWD" == "${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/work" ]]; then + clear + + return + fi + + tmux new-window -d -n scratch + nvim . + clear + ''; + } + }/bin/.tmux-sessionizer"; + }; +} diff --git a/modules/scripts/tmux-sessionizer/package.nix b/modules/scripts/tmux-sessionizer/package.nix index 90e66dfb..e33b99a6 100644 --- a/modules/scripts/tmux-sessionizer/package.nix +++ b/modules/scripts/tmux-sessionizer/package.nix @@ -83,7 +83,7 @@ { pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.tmux-sessionizer)) + (withSystem pkgs.system (psArgs: psArgs.config.packages.tmux-sessionizer)) ]; }; } diff --git a/modules/scripts/today.nix b/modules/scripts/today.nix index 57ff2b61..1abbee1f 100644 --- a/modules/scripts/today.nix +++ b/modules/scripts/today.nix @@ -20,7 +20,7 @@ in { pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) ]; }; } diff --git a/modules/scripts/today2.nix b/modules/scripts/today2.nix index 15cdddf4..90a76c59 100644 --- a/modules/scripts/today2.nix +++ b/modules/scripts/today2.nix @@ -1,4 +1,4 @@ -{ withSystem, ... }: +{ withSystem, ... }: let name = "today2"; @@ -20,7 +20,7 @@ in { pkgs, ... }: { home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) ]; }; } diff --git a/modules/scripts/todo.nix b/modules/scripts/todo.nix new file mode 100644 index 00000000..9eb0248c --- /dev/null +++ b/modules/scripts/todo.nix @@ -0,0 +1,34 @@ +{ withSystem, ... }: + +let + name = "todo"; +in +{ + perSystem = + { pkgs, ... }: + { + packages.${name} = pkgs.writeShellApplication { + inherit name; + + runtimeInputs = with pkgs; [ coreutils ]; + + text = '' + "$EDITOR" +3 "$TODO_FILE" + cd "$NOTES_DIRECTORY" + git add "$TODO_FILE" + git commit -m "Update TODOs" + git push + ''; + }; + }; + + flake.modules.homeManager.base = + { config, pkgs, ... }: + { + home.packages = [ + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) + ]; + + home.sessionVariables.TODO_FILE = "${config.home.sessionVariables.NOTES_DIRECTORY}/todo.adoc"; + }; +} diff --git a/modules/scripts/weight.nix b/modules/scripts/weight.nix new file mode 100644 index 00000000..4c63f47c --- /dev/null +++ b/modules/scripts/weight.nix @@ -0,0 +1,28 @@ +{ withSystem, ... }: + +let + name = "weight"; +in +{ + perSystem = + { pkgs, ... }: + { + packages.${name} = pkgs.writeShellApplication { + inherit name; + + runtimeInputs = with pkgs; [ + coreutils + ]; + + text = ''tail "$XDG_DOCUMENTS_DIR/wiki/2-areas/health-fitness/weight.csv"''; + }; + }; + + flake.modules.homeManager.base = + { pkgs, ... }: + { + home.packages = [ + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) + ]; + }; +} diff --git a/modules/scripts/zet.nix b/modules/scripts/zet.nix new file mode 100644 index 00000000..5c9a0bfc --- /dev/null +++ b/modules/scripts/zet.nix @@ -0,0 +1,38 @@ +{ inputs, withSystem, ... }: + +let + name = "zet"; +in +{ + perSystem = + { pkgs, ... }: + { + packages.${name} = pkgs.buildGoModule { + inherit name; + + runtimeInputs = with pkgs; [ + git + ]; + + src = inputs.zet; + + vendorHash = "sha256-pprnK2JKmPuR3Q+F8+vMDEdowlb3oX4BOOzW8NGOqgs="; + + postInstall = '' + mv $out/bin/cmd-${name} $out/bin/${name} + ''; + }; + }; + + flake.modules.homeManager.base = + { config, pkgs, ... }: + { + home.packages = [ + (withSystem pkgs.system (psArgs: psArgs.config.packages.${name})) + ]; + + home.sessionVariables = { + ZET_DIRECTORY = "${config.home.sessionVariables.NOTES_DIRECTORY}/${name}"; + }; + }; +} diff --git a/modules/st.nix b/modules/st.nix index 328dca7b..09d393dd 100644 --- a/modules/st.nix +++ b/modules/st.nix @@ -3,7 +3,363 @@ { pkgs, ... }: { home.packages = with pkgs; [ - st + (st.override { + conf = '' + static char *font = "MesloLGSNerdFontMono:pixelsize=16:antialias=true:autohint=true"; + + int disablebold = 1; + int disableitalic = 1; + int disableroman = 1; + + static int borderpx = 2; + + static char *shell = "/bin/sh"; + char *utmp = NULL; + char *scroll = NULL; + char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; + + char *vtiden = "\033[?6c"; + + static float cwscale = 1.0; + static float chscale = 1.0; + + wchar_t *worddelimiters = L" "; + + static unsigned int doubleclicktimeout = 300; + static unsigned int tripleclicktimeout = 600; + + int allowaltscreen = 1; + + int allowwindowops = 0; + + static double minlatency = 2; + static double maxlatency = 33; + + static unsigned int blinktimeout = 800; + + static unsigned int cursorthickness = 2; + + static int bellvolume = 0; + + char *termname = "st-256color"; + + unsigned int tabspaces = 8; + + static const char *colorname[] = { + "black", + "red3", + "green3", + "yellow3", + "blue2", + "magenta3", + "cyan3", + "gray90", + + "gray50", + "red", + "green", + "yellow", + "#5c5cff", + "magenta", + "cyan", + "white", + + [255] = 0, + + "#cccccc", + "#555555", + "gray90", + "black", + }; + + unsigned int defaultfg = 258; + unsigned int defaultbg = 259; + unsigned int defaultcs = 256; + static unsigned int defaultrcs = 257; + + static unsigned int cursorshape = 2; + + static unsigned int cols = 80; + static unsigned int rows = 24; + + static unsigned int mouseshape = XC_xterm; + static unsigned int mousefg = 7; + static unsigned int mousebg = 0; + + static unsigned int defaultattr = 11; + + static uint forcemousemod = ShiftMask; + + static MouseShortcut mshortcuts[] = { + { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, + { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, + { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, + { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, + { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, + }; + + #define MODKEY Mod1Mask + #define TERMMOD (ControlMask|ShiftMask) + + static Shortcut shortcuts[] = { + { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, + { ControlMask, XK_Print, toggleprinter, {.i = 0} }, + { ShiftMask, XK_Print, printscreen, {.i = 0} }, + { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, + { TERMMOD, XK_Prior, zoom, {.f = +1} }, + { TERMMOD, XK_Next, zoom, {.f = -1} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { TERMMOD, XK_C, clipcopy, {.i = 0} }, + { TERMMOD, XK_D, zoom, {.f = -2} }, + { TERMMOD, XK_J, zoom, {.f = -1} }, + { TERMMOD, XK_K, zoom, {.f = +1} }, + { TERMMOD, XK_U, zoom, {.f = +2} }, + { TERMMOD, XK_V, clippaste, {.i = 0} }, + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + }; + + static KeySym mappedkeys[] = { -1 }; + + static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; + + static Key key[] = { + { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, + { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, + { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, + { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, + { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, + { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, + { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, + { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, + { XK_KP_End, ControlMask, "\033[J", -1, 0}, + { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, + { XK_KP_End, ShiftMask, "\033[K", -1, 0}, + { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, + { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, + { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, + { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, + { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, + { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, + { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, + { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, + { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, + { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, + { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, + { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, + { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, + { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, + { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, + { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, + { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, + { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, + { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, + { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, + { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, + { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, + { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, + { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, + { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, + { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, + { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, + { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, + { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, + { XK_Up, ShiftMask|Mod1Mask, "\033[1;4A", 0, 0}, + { XK_Up, ControlMask, "\033[1;5A", 0, 0}, + { XK_Up, ShiftMask|ControlMask, "\033[1;6A", 0, 0}, + { XK_Up, ControlMask|Mod1Mask, "\033[1;7A", 0, 0}, + { XK_Up, ShiftMask|ControlMask|Mod1Mask, "\033[1;8A", 0, 0}, + { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, + { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, + { XK_Down, ShiftMask|Mod1Mask, "\033[1;4B", 0, 0}, + { XK_Down, ControlMask, "\033[1;5B", 0, 0}, + { XK_Down, ShiftMask|ControlMask, "\033[1;6B", 0, 0}, + { XK_Down, ControlMask|Mod1Mask, "\033[1;7B", 0, 0}, + { XK_Down, ShiftMask|ControlMask|Mod1Mask, "\033[1;8B", 0, 0}, + { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, + { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, + { XK_Left, ShiftMask|Mod1Mask, "\033[1;4D", 0, 0}, + { XK_Left, ControlMask, "\033[1;5D", 0, 0}, + { XK_Left, ShiftMask|ControlMask, "\033[1;6D", 0, 0}, + { XK_Left, ControlMask|Mod1Mask, "\033[1;7D", 0, 0}, + { XK_Left, ShiftMask|ControlMask|Mod1Mask, "\033[1;8D", 0, 0}, + { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, + { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, + { XK_Right, ShiftMask|Mod1Mask, "\033[1;4C", 0, 0}, + { XK_Right, ControlMask, "\033[1;5C", 0, 0}, + { XK_Right, ShiftMask|ControlMask, "\033[1;6C", 0, 0}, + { XK_Right, ControlMask|Mod1Mask, "\033[1;7C", 0, 0}, + { XK_Right, ShiftMask|ControlMask|Mod1Mask, "\033[1;8C", 0, 0}, + { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, + { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, + { XK_Return, Mod1Mask, "\033\r", 0, 0}, + { XK_Return, XK_ANY_MOD, "\r", 0, 0}, + { XK_Insert, ShiftMask, "\033[4l", -1, 0}, + { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, + { XK_Insert, ControlMask, "\033[L", -1, 0}, + { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, + { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, + { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, + { XK_Delete, ControlMask, "\033[M", -1, 0}, + { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, + { XK_Delete, ShiftMask, "\033[2K", -1, 0}, + { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, + { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, + { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, + { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, + { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, + { XK_Home, ShiftMask, "\033[2J", 0, -1}, + { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, + { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, + { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, + { XK_End, ControlMask, "\033[J", -1, 0}, + { XK_End, ControlMask, "\033[1;5F", +1, 0}, + { XK_End, ShiftMask, "\033[K", -1, 0}, + { XK_End, ShiftMask, "\033[1;2F", +1, 0}, + { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, + { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, + { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, + { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, + { XK_Next, ControlMask, "\033[6;5~", 0, 0}, + { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, + { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, + { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, + { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, + { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, + { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, + { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, + { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, + { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, + { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, + { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, + { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, + { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, + { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, + { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, + { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, + { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, + { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, + { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, + { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, + { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, + { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, + { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, + { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, + { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, + { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, + { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, + { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, + { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, + { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, + { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, + { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, + { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, + { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, + { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, + { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, + { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, + { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, + { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, + { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, + { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, + { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, + { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, + { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, + { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, + { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, + { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, + { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, + { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, + { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, + { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, + { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, + { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, + { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, + { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, + { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, + { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, + { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, + { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, + { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, + { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, + { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, + { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, + { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, + { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, + { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, + { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, + { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, + { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, + { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, + { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, + { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, + { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, + { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, + { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, + { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, + { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, + { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, + { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, + { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, + { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, + { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, + { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, + { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, + { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, + { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, + { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, + { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, + }; + + static uint selmasks[] = { + [SEL_RECTANGULAR] = Mod1Mask, + }; + + static char ascii_printable[] = + " !\"#$%&'()*+,-./0123456789:;<=>?" + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" + "`abcdefghijklmnopqrstuvwxyz{|}~"; + ''; + + patches = [ + (fetchpatch { + name = "disable_bold_italic_fonts"; + url = "https://st.suckless.org/patches/disable_bold_italic_fonts/st-disable-bold-italic-fonts-0.8.2.diff"; + sha256 = "PG96QMqbX3Fr0EvDmF4lm/J3gj18eyBfm1bJ3M7plvQ="; + }) + + (fetchpatch { + name = "anysize"; + url = "https://st.suckless.org/patches/anysize/st-anysize-20220718-baa9357.diff"; + sha256 = "yx9VSwmPACx3EN3CAdQkxeoJKJxQ6ziC9tpBcoWuWHc="; + }) + ]; + }) ]; }; } diff --git a/modules/sudo.nix b/modules/sudo.nix index 933b9963..7f70c7c6 100644 --- a/modules/sudo.nix +++ b/modules/sudo.nix @@ -2,6 +2,8 @@ { flake.modules.nixos.pc = { + security.sudo-rs.enable = true; + users.users.${config.flake.meta.owner.username}.extraGroups = [ "wheel" ]; }; } diff --git a/modules/sxhkd/keybindings.nix b/modules/sxhkd/keybindings.nix index f713990d..67338e12 100644 --- a/modules/sxhkd/keybindings.nix +++ b/modules/sxhkd/keybindings.nix @@ -13,8 +13,6 @@ "super + shift + i" = "${pkgs.xdotool}/bin/xdotool type $(cat ~/.local/share/snippets.txt | grep -v '^#' | grep -v '^$' | sort | dmenu -i -l 50 | cut -d' ' -f1)"; "super + shift + p" = "${lib.getExe pkgs.passmenu-otp} -i"; - "super + shift + t" = "dmenu_tmux"; - "super + shift + v" = "dmenu_mpv"; "super + x; {1, 2, 3, 4}" = "st {notes, newsboat, nmtui, bluetuith}"; "{_, shift +, super +}XF86MonBrightness{Down,Up}" = "${lib.getExe pkgs.brightnessctl} set {5%-,10%-,10%,+5%,+10%,100%} --quiet"; diff --git a/modules/tmux/extra-config.nix b/modules/tmux/extra-config.nix index 5a16ed63..78f0d208 100644 --- a/modules/tmux/extra-config.nix +++ b/modules/tmux/extra-config.nix @@ -61,10 +61,9 @@ bind k select-pane -U bind l select-pane -R - bind-key -r f run-shell "tmux new-window start-tmux" - bind-key -r g run-shell "tmux new-window open-repo-url" + bind-key -r f run-shell "tmux new-window tmux-sessionizer" - bind-key -r D new-window -c "#{pane_current_path}" "[[ -e TODO.md ]] && nvim TODO.md || nvim ~/Documents/notes/todo.txt" - bind-key -r W split-window -h -c ~/Documents/notes "nvim '+Telescope find_files'" + bind-key -r D new-window -c "#{pane_current_path}" "[[ -e TODO.md ]] && nvim TODO.md || nvim ~/Documents/wiki/todo.txt" + bind-key -r W split-window -h -c ~/Documents/wiki "nvim '+Telescope find_files'" ''; } diff --git a/modules/z.nix b/modules/z.nix deleted file mode 100644 index 010bb4dc..00000000 --- a/modules/z.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ inputs, withSystem, ... }: - -let - name = "z"; -in -{ - perSystem = - { pkgs, ... }: - { - packages.${name} = inputs.${name}.packages.${pkgs.stdenv.hostPlatform.system}.default; - }; - - flake.modules.homeManager.base = - { config, pkgs, ... }: - { - home.packages = [ - (withSystem pkgs.stdenv.hostPlatform.system (psArgs: psArgs.config.packages.${name})) - ]; - - home.sessionVariables = { - ZET_DIRECTORY = "${config.home.sessionVariables.NOTES_DIRECTORY}/zet"; - }; - }; -} diff --git a/modules/zsh/abbreviations/abbreviations.nix b/modules/zsh/abbreviations/abbreviations.nix index 5598a87e..c979afff 100644 --- a/modules/zsh/abbreviations/abbreviations.nix +++ b/modules/zsh/abbreviations/abbreviations.nix @@ -28,7 +28,7 @@ g = "git"; ga = "git add"; gan = "git add -N"; - gap = "git add -p"; + gap = "git add . -p"; gb = "git branch"; gba = "git branch --all"; gbl = "git blame"; @@ -39,16 +39,16 @@ gcm = "git commit -m"; gco = "git checkout"; gcob = "git checkout -b"; - gd = "git diff"; - gds = "git diff --staged"; + gd = "git diff ."; + gds = "git diff . --staged"; gf = "git fetch"; gfa = "git fetch --all"; gl = "git log"; - glg = "git log --grep"; - glo = "git log --oneline"; - glog = "git log --oneline --grep"; - glos = "git log --oneline -S"; - gls = "git log -S"; + glg = "git log --grep ."; + glo = "git log --oneline ."; + glog = "git log --oneline --grep ."; + glos = "git log --oneline -S ."; + gls = "git log . -S"; gm = "git merge"; gmf = "git merge --ff"; gmnf = "git merge --no-ff"; @@ -67,9 +67,9 @@ gra = "git rebase --abort"; grc = "git rebase --continue"; gri = "git rebase -i"; - gs = "git status"; - gsh = "git show"; - gst = "git stash"; + gs = "git status ."; + gsh = "git show ."; + gst = "git stash ."; gstp = "git stash pop"; gt = "git tag"; @@ -131,7 +131,6 @@ rduli = "run drush uli"; rdup = "run drush updatedb -y"; rpub = "run publish"; - rs = "run switch"; rt = "run test"; nah = "git reset --hard; git clean -fd"; @@ -169,8 +168,5 @@ sgsp = "vendor/bin/sculpin generate --server --port"; sgsw = "vendor/bin/sculpin generate --server --watch"; sgswp = "vendor/bin/sculpin generate --server --watch --port"; - - mnf = "man fzf"; - mnt = "man tmux"; }; } diff --git a/modules/zsh/aliases.nix b/modules/zsh/aliases.nix index 6d587de6..e89f1515 100644 --- a/modules/zsh/aliases.nix +++ b/modules/zsh/aliases.nix @@ -9,14 +9,11 @@ "..." = "cd ../.."; "...." = "cd ../../.."; "....." = "cd ../../../.."; - build = "z build"; chmox = "chmod +x"; run = "./run"; tag = "tag-release"; - todo = "z todo"; vss = "LC_ALL=C sort --unique ${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/nixos-config/modules/home-manager/cli/neovim/config/spell/en.utf-8.adddotfiles/nvim/spell/en.utf-8.add --output ${config.xdg.userDirs.extraConfig.XDG_REPOS_DIR}/nixos-config/modules/home-manager/cli/neovim/config/spell/en.utf-8.add"; wt = "git worktree"; - zet = "z zet"; }; }; } diff --git a/modules/zsh/init.nix b/modules/zsh/init.nix index eece5a0b..e147ffad 100644 --- a/modules/zsh/init.nix +++ b/modules/zsh/init.nix @@ -1,13 +1,8 @@ -{ lib, ... }: - { flake.modules.homeManager.base = { config, pkgs, ... }: { programs.zsh.initContent = '' - # Completions - source <(z completion zsh) - background() { for ((i=2;i<=$#;i++)); do ''${@[1]} ''${@[$i]} &> /dev/null & @@ -49,10 +44,6 @@ command ${pkgs.ttyper}/bin/ttyper --language english1000 --words 50 "''${@}" } - watchexec() { - ${lib.getExe pkgs.watchexec} --clear "$@" - } - weather() { curl "https://wttr.in/''$1" } @@ -61,19 +52,13 @@ command yt-dlp --paths ~/Videos "$@" } - bindkey -s ^f "start-tmux\n" - bindkey -s ^g "open-repo-url\n" + bindkey -s ^f "tmux-sessionizer\n" bindkey -s ^v "nvim\n" setopt auto_cd setopt auto_pushd setopt pushd_ignore_dups setopt pushdminus - - autoload -U edit-command-line - bindkey '^x^e' edit-command-line - bindkey '^xe' edit-command-line - zle -N edit-command-line ''; }; } diff --git a/notes.txt b/notes.txt index fe128232..e01d0f67 100644 --- a/notes.txt +++ b/notes.txt @@ -1,6 +1,6 @@ Running Neovim as a package: nix run .#neovim -nix run git+https://git.oliverdavies.uk/opdavies/nix-config#neovim +nix run git+https://code.oliverdavies.uk/opdavies/nix-config#neovim nixos-rebuild --flake .#nixedo --target-host 192.168.1.116 --sudo test diff --git a/overlays/default.nix b/overlays/default.nix index 89b72e68..17308ce2 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -11,7 +11,6 @@ modifications = final: prev: { dwm = import ./mods/dwm { inherit prev; }; - st = import ./mods/st { inherit prev; }; }; stable-packages = final: _prev: { diff --git a/overlays/mods/st/default.nix b/overlays/mods/st/default.nix deleted file mode 100644 index 083a99b8..00000000 --- a/overlays/mods/st/default.nix +++ /dev/null @@ -1,362 +0,0 @@ -{ prev, ... }: - -let - inherit (prev) lib; -in -prev.st.override { - conf = '' - static char *font = "MesloLGSNerdFontMono:pixelsize=16:antialias=true:autohint=true"; - - int disablebold = 1; - int disableitalic = 1; - int disableroman = 1; - - static int borderpx = 2; - - static char *shell = "/bin/sh"; - char *utmp = NULL; - char *scroll = NULL; - char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; - - char *vtiden = "\033[?6c"; - - static float cwscale = 1.0; - static float chscale = 1.0; - - wchar_t *worddelimiters = L" "; - - static unsigned int doubleclicktimeout = 300; - static unsigned int tripleclicktimeout = 600; - - int allowaltscreen = 1; - - int allowwindowops = 0; - - static double minlatency = 2; - static double maxlatency = 33; - - static unsigned int blinktimeout = 800; - - static unsigned int cursorthickness = 2; - - static int bellvolume = 0; - - char *termname = "st-256color"; - - unsigned int tabspaces = 8; - - static const char *colorname[] = { - "black", - "red3", - "green3", - "yellow3", - "blue2", - "magenta3", - "cyan3", - "gray90", - - "gray50", - "red", - "green", - "yellow", - "#5c5cff", - "magenta", - "cyan", - "white", - - [255] = 0, - - "#cccccc", - "#555555", - "gray90", - "black", - }; - - unsigned int defaultfg = 258; - unsigned int defaultbg = 259; - unsigned int defaultcs = 256; - static unsigned int defaultrcs = 257; - - static unsigned int cursorshape = 2; - - static unsigned int cols = 80; - static unsigned int rows = 24; - - static unsigned int mouseshape = XC_xterm; - static unsigned int mousefg = 7; - static unsigned int mousebg = 0; - - static unsigned int defaultattr = 11; - - static uint forcemousemod = ShiftMask; - - static MouseShortcut mshortcuts[] = { - { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, - { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, - { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, - { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, - { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, - }; - - #define MODKEY Mod1Mask - #define TERMMOD (ControlMask|ShiftMask) - - static Shortcut shortcuts[] = { - { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, - { ControlMask, XK_Print, toggleprinter, {.i = 0} }, - { ShiftMask, XK_Print, printscreen, {.i = 0} }, - { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, - { TERMMOD, XK_Prior, zoom, {.f = +1} }, - { TERMMOD, XK_Next, zoom, {.f = -1} }, - { TERMMOD, XK_Home, zoomreset, {.f = 0} }, - { TERMMOD, XK_C, clipcopy, {.i = 0} }, - { TERMMOD, XK_D, zoom, {.f = -2} }, - { TERMMOD, XK_J, zoom, {.f = -1} }, - { TERMMOD, XK_K, zoom, {.f = +1} }, - { TERMMOD, XK_U, zoom, {.f = +2} }, - { TERMMOD, XK_V, clippaste, {.i = 0} }, - { TERMMOD, XK_Y, selpaste, {.i = 0} }, - { ShiftMask, XK_Insert, selpaste, {.i = 0} }, - { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, - }; - - static KeySym mappedkeys[] = { -1 }; - - static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; - - static Key key[] = { - { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, - { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, - { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, - { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, - { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, - { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, - { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, - { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, - { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, - { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, - { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, - { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, - { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, - { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, - { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, - { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, - { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, - { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, - { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, - { XK_KP_End, ControlMask, "\033[J", -1, 0}, - { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, - { XK_KP_End, ShiftMask, "\033[K", -1, 0}, - { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, - { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, - { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, - { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, - { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, - { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, - { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, - { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, - { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, - { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, - { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, - { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, - { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, - { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, - { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, - { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, - { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, - { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, - { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, - { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, - { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, - { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, - { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, - { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, - { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, - { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, - { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, - { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, - { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, - { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, - { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, - { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, - { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, - { XK_Up, ShiftMask|Mod1Mask, "\033[1;4A", 0, 0}, - { XK_Up, ControlMask, "\033[1;5A", 0, 0}, - { XK_Up, ShiftMask|ControlMask, "\033[1;6A", 0, 0}, - { XK_Up, ControlMask|Mod1Mask, "\033[1;7A", 0, 0}, - { XK_Up, ShiftMask|ControlMask|Mod1Mask, "\033[1;8A", 0, 0}, - { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, - { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, - { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, - { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, - { XK_Down, ShiftMask|Mod1Mask, "\033[1;4B", 0, 0}, - { XK_Down, ControlMask, "\033[1;5B", 0, 0}, - { XK_Down, ShiftMask|ControlMask, "\033[1;6B", 0, 0}, - { XK_Down, ControlMask|Mod1Mask, "\033[1;7B", 0, 0}, - { XK_Down, ShiftMask|ControlMask|Mod1Mask, "\033[1;8B", 0, 0}, - { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, - { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, - { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, - { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, - { XK_Left, ShiftMask|Mod1Mask, "\033[1;4D", 0, 0}, - { XK_Left, ControlMask, "\033[1;5D", 0, 0}, - { XK_Left, ShiftMask|ControlMask, "\033[1;6D", 0, 0}, - { XK_Left, ControlMask|Mod1Mask, "\033[1;7D", 0, 0}, - { XK_Left, ShiftMask|ControlMask|Mod1Mask, "\033[1;8D", 0, 0}, - { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, - { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, - { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, - { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, - { XK_Right, ShiftMask|Mod1Mask, "\033[1;4C", 0, 0}, - { XK_Right, ControlMask, "\033[1;5C", 0, 0}, - { XK_Right, ShiftMask|ControlMask, "\033[1;6C", 0, 0}, - { XK_Right, ControlMask|Mod1Mask, "\033[1;7C", 0, 0}, - { XK_Right, ShiftMask|ControlMask|Mod1Mask, "\033[1;8C", 0, 0}, - { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, - { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, - { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, - { XK_Return, Mod1Mask, "\033\r", 0, 0}, - { XK_Return, XK_ANY_MOD, "\r", 0, 0}, - { XK_Insert, ShiftMask, "\033[4l", -1, 0}, - { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, - { XK_Insert, ControlMask, "\033[L", -1, 0}, - { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, - { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, - { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, - { XK_Delete, ControlMask, "\033[M", -1, 0}, - { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, - { XK_Delete, ShiftMask, "\033[2K", -1, 0}, - { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, - { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, - { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, - { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, - { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, - { XK_Home, ShiftMask, "\033[2J", 0, -1}, - { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, - { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, - { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, - { XK_End, ControlMask, "\033[J", -1, 0}, - { XK_End, ControlMask, "\033[1;5F", +1, 0}, - { XK_End, ShiftMask, "\033[K", -1, 0}, - { XK_End, ShiftMask, "\033[1;2F", +1, 0}, - { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, - { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, - { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, - { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, - { XK_Next, ControlMask, "\033[6;5~", 0, 0}, - { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, - { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, - { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, - { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, - { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, - { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, - { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, - { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, - { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, - { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, - { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, - { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, - { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, - { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, - { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, - { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, - { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, - { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, - { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, - { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, - { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, - { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, - { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, - { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, - { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, - { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, - { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, - { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, - { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, - { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, - { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, - { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, - { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, - { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, - { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, - { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, - { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, - { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, - { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, - { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, - { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, - { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, - { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, - { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, - { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, - { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, - { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, - { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, - { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, - { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, - { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, - { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, - { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, - { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, - { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, - { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, - { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, - { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, - { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, - { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, - { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, - { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, - { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, - { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, - { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, - { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, - { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, - { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, - { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, - { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, - { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, - { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, - { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, - { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, - { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, - { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, - { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, - { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, - { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, - { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, - { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, - { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, - { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, - { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, - { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, - { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, - { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, - { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, - }; - - static uint selmasks[] = { - [SEL_RECTANGULAR] = Mod1Mask, - }; - - static char ascii_printable[] = - " !\"#$%&'()*+,-./0123456789:;<=>?" - "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" - "`abcdefghijklmnopqrstuvwxyz{|}~"; - ''; - - patches = with prev; [ - (fetchpatch { - name = "disable_bold_italic_fonts"; - url = "https://st.suckless.org/patches/disable_bold_italic_fonts/st-disable-bold-italic-fonts-0.8.2.diff"; - sha256 = "PG96QMqbX3Fr0EvDmF4lm/J3gj18eyBfm1bJ3M7plvQ="; - }) - - (fetchpatch { - name = "anysize"; - url = "https://st.suckless.org/patches/anysize/st-anysize-20220718-baa9357.diff"; - sha256 = "yx9VSwmPACx3EN3CAdQkxeoJKJxQ6ziC9tpBcoWuWHc="; - }) - ]; -} diff --git a/packages/default.nix b/packages/default.nix index 1669f6ef..418c1638 100644 --- a/packages/default.nix +++ b/packages/default.nix @@ -28,6 +28,7 @@ in tag-release = callPackage ./tag-release.nix { }; time-until = callPackage ./time-until.nix { }; timer = callPackage ./timer.nix { }; + tmux-sessionizer = callPackage ./tmux-sessionizer { }; unmounter = callPackage ./unmounter.nix { }; update-all-git-repos = callPackage ./update-all-git-repos.nix { }; vic = callPackage ./vic.nix { inherit inputs; }; diff --git a/secrets.nix b/secrets.nix index 465ce7ee..23e41540 100644 --- a/secrets.nix +++ b/secrets.nix @@ -25,11 +25,6 @@ in ] ++ [ users.opdavies ]; - "secrets/freshrss-password-file.age".publicKeys = [ - hosts.nixedo - ] - ++ [ users.opdavies ]; - "secrets/peertube-env.age".publicKeys = [ hosts.nixedo ] diff --git a/secrets/freshrss-password-file.age b/secrets/freshrss-password-file.age deleted file mode 100644 index 16e7baba..00000000 --- a/secrets/freshrss-password-file.age +++ /dev/null @@ -1,17 +0,0 @@ -age-encryption.org/v1 --> ssh-ed25519 IsVD3g qUcQuqnQVqFEa3pMKA4MCAGvBdkU55wUc9QL+CV7bEg -xFsrPc+7aZBg4AQscuf4uI+NkjHW+iDtx9+lIFGhwvM --> ssh-rsa +vTWQw -ZsahI21WKpNepuhJFCxRLJmfJaY8ZarIlLXTyhEzPwZ8OISpHfJ4gkgk42AMFZrq -s+Pr1zYx74EZ/VhfuxkvLCTekhW5aT9fk+NsGOZwuddywTjkgoKg8JzaMTXcTJxp -uFYNfGlIUgn94SrnisJP/sNztdjluGz4fEhBo99WJb6KabHtWLllUwEkzwDeKbT4 -hFvCp3ZupjHi/8bb2faAu5CJ82C1bAuHGqhlgJvhdFgi+VMinGl9zUYkQNY12O+O -z8zo5KxtNofzhkM3+Z8Xcnz1C5VaZNHtzvIDXVwA7CTuhc0H1a5uEN8keqBhN0dR -YdU4WiINZcDBq0+A6Aou+TxBZE+IQ+hLQJVuZMch6oBznP6IigD3ugbrVoQtzDGf -mdw87IXFB/tDMMSaT567XJoN7hECoZVqVc6pZKZgGZpmsScBpJBBAqSo6TLpzbsy -/u5AhuiWBZZylaJlX6OrNAwobAbs07scJyufdEJ48ga8dVQI0OHiBphJbq92nGKt -iBHW6nzjgfb4fe93LXaSAT66ffM3j5DOTx6DUkMZnHg0OqUIikWwRLBrLs1bC2oL -1YXJICCbRdA0cW1DnTGtsjBTYwv3IKk3jvYD6XEJYpBXKJC8Uqx3pV/dxuwFrrLV -Rk9U+RmwKmJasqiYFHuYJhEdPbxWT4YPgDwcHpD3vA4 ---- kD476dnm+Q4VMK9oHU4wIz6JciDtOS7LKik6Q2JgDdA -b'Hn?w@D-7ʂF"A jxU{4d6OP5 \ No newline at end of file