Compare commits
583 commits
main
...
8e56077d94
Author | SHA1 | Date | |
---|---|---|---|
Bruno BELANYI | 8e56077d94 | ||
Bruno BELANYI | 30c676e20b | ||
Bruno BELANYI | ed24bebc04 | ||
Bruno BELANYI | 23c4256769 | ||
Bruno BELANYI | 4e9764920a | ||
Bruno BELANYI | 3fc0201dfa | ||
Bruno BELANYI | d5527912a3 | ||
Bruno BELANYI | 44b2034135 | ||
Bruno BELANYI | 6f7f49dc13 | ||
Bruno BELANYI | d39c0419b7 | ||
Bruno BELANYI | e4622dd6ea | ||
Bruno BELANYI | 52e0a2fd0f | ||
Bruno BELANYI | d5e50b5389 | ||
Bruno BELANYI | fdf1f1617f | ||
Bruno BELANYI | be3391285a | ||
Bruno BELANYI | 435e56d53a | ||
Bruno BELANYI | df92d1c562 | ||
Bruno BELANYI | 8d1535e261 | ||
Bruno BELANYI | 2df0940665 | ||
Bruno BELANYI | 3e0a5ef1a4 | ||
Bruno BELANYI | 52722fb408 | ||
Bruno BELANYI | 93a3a4fb6b | ||
Bruno BELANYI | 1834a7002b | ||
Bruno BELANYI | bcbc9af372 | ||
Bruno BELANYI | 1be9eb517b | ||
Bruno BELANYI | 16fc677509 | ||
Bruno BELANYI | bf7184c260 | ||
Bruno BELANYI | 4627350311 | ||
Bruno BELANYI | 9ef35f06df | ||
Bruno BELANYI | 5b7fa7c09a | ||
Bruno BELANYI | a49e66da80 | ||
Bruno BELANYI | 35d96e1e69 | ||
Bruno BELANYI | 05e7883dab | ||
Bruno BELANYI | 273618ff94 | ||
Bruno BELANYI | 25967e21f1 | ||
Bruno BELANYI | 3df2ad0f1f | ||
Bruno BELANYI | 57e5def998 | ||
Bruno BELANYI | c5d9396a7d | ||
Bruno BELANYI | 5263942970 | ||
Bruno BELANYI | cd20914370 | ||
Bruno BELANYI | 04761da664 | ||
Bruno BELANYI | 14d9837b07 | ||
Bruno BELANYI | adedb42a99 | ||
Bruno BELANYI | 38c140ee86 | ||
Bruno BELANYI | d36f01d937 | ||
Bruno BELANYI | 62f93a852a | ||
Bruno BELANYI | 080d08bb13 | ||
Bruno BELANYI | 6da1c47472 | ||
Bruno BELANYI | 9c023b78a3 | ||
Bruno BELANYI | 3d6580f52b | ||
Bruno BELANYI | f34f2fc706 | ||
Bruno BELANYI | 95df872916 | ||
Bruno BELANYI | 3e86aa5ef4 | ||
Bruno BELANYI | f2f2b2a98a | ||
Bruno BELANYI | 842489a986 | ||
Bruno BELANYI | 4cecb8b987 | ||
Bruno BELANYI | bc56292544 | ||
Bruno BELANYI | c259fe87a0 | ||
Bruno BELANYI | 508b30eadd | ||
Bruno BELANYI | 605da54f24 | ||
Bruno BELANYI | 213d698d56 | ||
Bruno BELANYI | c5fff38942 | ||
Bruno BELANYI | e3b0f9d38f | ||
Bruno BELANYI | af56bc76cf | ||
Bruno BELANYI | 7a9760b0cd | ||
Bruno BELANYI | e8ffddedef | ||
Bruno BELANYI | 44dae3a940 | ||
Bruno BELANYI | b79cee6eee | ||
Bruno BELANYI | 56156e1fe4 | ||
Bruno BELANYI | f551c4fc30 | ||
Bruno BELANYI | f854c49c29 | ||
Bruno BELANYI | ae7c2d921b | ||
Bruno BELANYI | a96fb22d4d | ||
Bruno BELANYI | bd5a15ebe7 | ||
Bruno BELANYI | d26b9f2537 | ||
Bruno BELANYI | b7b3387df7 | ||
Bruno BELANYI | be84a4a6fa | ||
Bruno BELANYI | bbc47b6683 | ||
Bruno BELANYI | 416a4ca0d6 | ||
Bruno BELANYI | 19889f4cbf | ||
Bruno BELANYI | fa836d7df9 | ||
Bruno BELANYI | 8b985cda84 | ||
Bruno BELANYI | 0478efa817 | ||
Bruno BELANYI | 87f255d265 | ||
Bruno BELANYI | b9e5273672 | ||
Bruno BELANYI | dd3bfc74fa | ||
Bruno BELANYI | 5dd9d1c6d0 | ||
Bruno BELANYI | d87fd7b9e1 | ||
Bruno BELANYI | 01d7ead121 | ||
Bruno BELANYI | e701dd06ea | ||
Bruno BELANYI | faa8ae6d1e | ||
Bruno BELANYI | 729f60c471 | ||
Bruno BELANYI | d7a9783ceb | ||
Bruno BELANYI | f54fbcf793 | ||
Bruno BELANYI | 4b92a3fda9 | ||
Bruno BELANYI | 5947ec4217 | ||
Bruno BELANYI | bb512cf838 | ||
Bruno BELANYI | 3aa859861e | ||
Bruno BELANYI | 60b87c90fc | ||
Bruno BELANYI | 5f06b43ad4 | ||
Bruno BELANYI | 58470804d6 | ||
Bruno BELANYI | 58bf5b6b1c | ||
Bruno BELANYI | 367dc1e5a5 | ||
Bruno BELANYI | d9a2c12d3f | ||
Bruno BELANYI | f73f59b06c | ||
Bruno BELANYI | cb389b71b1 | ||
Bruno BELANYI | 4382904060 | ||
Bruno BELANYI | 5ce5057d0f | ||
Bruno BELANYI | d2e410de56 | ||
Bruno BELANYI | 1819c7077d | ||
Bruno BELANYI | 44ed078606 | ||
Bruno BELANYI | 305b0b985c | ||
Bruno BELANYI | 27448ac60a | ||
Bruno BELANYI | f73edd9f8d | ||
Bruno BELANYI | e57ebf4317 | ||
Bruno BELANYI | e8adbb5b20 | ||
Bruno BELANYI | 6d1d0c9488 | ||
Bruno BELANYI | 61cd9cb1a2 | ||
Bruno BELANYI | d6acc175de | ||
Bruno BELANYI | 9dd3dceb83 | ||
Bruno BELANYI | 633a422532 | ||
Bruno BELANYI | b082057170 | ||
Bruno BELANYI | 50c927fea3 | ||
Bruno BELANYI | 42cb742976 | ||
Bruno BELANYI | 5558642d32 | ||
Bruno BELANYI | a66441d496 | ||
Bruno BELANYI | 702bfafe73 | ||
Bruno BELANYI | f4b860d915 | ||
Bruno BELANYI | b565518e2d | ||
Bruno BELANYI | 15a093ff61 | ||
Bruno BELANYI | 06e7134ae0 | ||
Bruno BELANYI | d2db3e52c2 | ||
Bruno BELANYI | 9c009b40eb | ||
Bruno BELANYI | dc8d4c2802 | ||
Bruno BELANYI | afc78bac2a | ||
Bruno BELANYI | 3a313812b8 | ||
Bruno BELANYI | 876dacab85 | ||
Bruno BELANYI | d71a99083c | ||
Bruno BELANYI | 5f3d9b3a22 | ||
Bruno BELANYI | 0becdd4b99 | ||
Bruno BELANYI | 555c474b88 | ||
Bruno BELANYI | 0bf893c8a0 | ||
Bruno BELANYI | 925b872305 | ||
Bruno BELANYI | 2b5fedadd2 | ||
Bruno BELANYI | c7c38865e9 | ||
Bruno BELANYI | 5150bad300 | ||
Bruno BELANYI | 6f643052e1 | ||
Bruno BELANYI | 119504d0b5 | ||
Bruno BELANYI | 2d7f01f035 | ||
Bruno BELANYI | 6ebfa1a8cc | ||
Bruno BELANYI | 7d31aa93db | ||
Bruno BELANYI | cef430ed39 | ||
Bruno BELANYI | 4c5b556bb8 | ||
Bruno BELANYI | 10d35f73c8 | ||
Bruno BELANYI | 4491eaea49 | ||
Bruno BELANYI | 5f47ec564c | ||
Bruno BELANYI | 6633405e42 | ||
Bruno BELANYI | 21f0199791 | ||
Bruno BELANYI | 7c1f379d82 | ||
Bruno BELANYI | e91ebb24f0 | ||
Bruno BELANYI | a602cf4143 | ||
Bruno BELANYI | e428895ba7 | ||
Bruno BELANYI | e7ff83b1bb | ||
Bruno BELANYI | 79265008d2 | ||
Bruno BELANYI | 74a5c50fbe | ||
Bruno BELANYI | 680eeffd3a | ||
Bruno BELANYI | 9b4a92895f | ||
Bruno BELANYI | 2af0fe542f | ||
Bruno BELANYI | fe455ffe9f | ||
Bruno BELANYI | f6381b14b0 | ||
Bruno BELANYI | 7dc177cf44 | ||
Bruno BELANYI | da4acebdde | ||
Bruno BELANYI | 3f7fb26b8f | ||
Bruno BELANYI | ddeeb974a4 | ||
Bruno BELANYI | ea6c3727be | ||
Bruno BELANYI | 40ec169d6e | ||
Bruno BELANYI | a94f349dde | ||
Bruno BELANYI | b83f28f2ba | ||
Bruno BELANYI | 148d6609ec | ||
Bruno BELANYI | 14e4e681aa | ||
Bruno BELANYI | 3058636c87 | ||
Bruno BELANYI | 6bec62073b | ||
Bruno BELANYI | 5241bce29b | ||
Bruno BELANYI | 4f11cf3a9a | ||
Bruno BELANYI | 927dd9e02a | ||
Bruno BELANYI | 9582f8403e | ||
Bruno BELANYI | df1bc0d0d5 | ||
Bruno BELANYI | 760e24a356 | ||
Bruno BELANYI | c280f0cae8 | ||
Bruno BELANYI | cbf6ea9ac9 | ||
Bruno BELANYI | 8edef9d528 | ||
Bruno BELANYI | 708d60bcc6 | ||
Bruno BELANYI | 5e438f9e77 | ||
Bruno BELANYI | 9e33f4ca82 | ||
Bruno BELANYI | c55708ab54 | ||
Bruno BELANYI | 6c25380d5d | ||
Bruno BELANYI | 537fa5c909 | ||
Bruno BELANYI | 8a8256e555 | ||
Bruno BELANYI | 9117df1e72 | ||
Bruno BELANYI | 296833651a | ||
Bruno BELANYI | 158d39bb6e | ||
Bruno BELANYI | b1cff1b8a3 | ||
Bruno BELANYI | e475855e18 | ||
Bruno BELANYI | ef07c9ff43 | ||
Bruno BELANYI | 111ee136c8 | ||
Bruno BELANYI | 8d8904ccef | ||
Bruno BELANYI | 97fa58c220 | ||
Bruno BELANYI | ce5a8a20b9 | ||
Bruno BELANYI | b298607ea7 | ||
Bruno BELANYI | d918bf279d | ||
Bruno BELANYI | 6f3bee895c | ||
Bruno BELANYI | 069987f47e | ||
Bruno BELANYI | 971b6e9b65 | ||
Bruno BELANYI | 8c103a2261 | ||
Bruno BELANYI | 76f33fbd57 | ||
Bruno BELANYI | 7d787a2770 | ||
Bruno BELANYI | 323e99bbb0 | ||
Bruno BELANYI | 8569a8eb55 | ||
Bruno BELANYI | 6d393fdef2 | ||
Bruno BELANYI | a85922b3b3 | ||
Bruno BELANYI | d1cd5bfa32 | ||
Bruno BELANYI | d64a867afc | ||
Bruno BELANYI | cc21d84808 | ||
Bruno BELANYI | 84cdc30037 | ||
Bruno BELANYI | 07cf0fa4da | ||
Bruno BELANYI | 24de1890fc | ||
Bruno BELANYI | 4055ef17f0 | ||
Bruno BELANYI | 7ce69233c1 | ||
Bruno BELANYI | 9f86615e77 | ||
Bruno BELANYI | e805496588 | ||
Bruno BELANYI | 3201445c08 | ||
Bruno BELANYI | 30eaefc1d1 | ||
Bruno BELANYI | 5f41bb1647 | ||
Bruno BELANYI | fec4956063 | ||
Bruno BELANYI | a62c0ad126 | ||
Bruno BELANYI | 2cc13dddb5 | ||
Bruno BELANYI | de92358bc0 | ||
Bruno BELANYI | 167db81c6c | ||
Bruno BELANYI | 738d1760c3 | ||
Bruno BELANYI | e962d4c574 | ||
Bruno BELANYI | 1c0d671fff | ||
Bruno BELANYI | 3bf3980e45 | ||
Bruno BELANYI | f6faa11ff7 | ||
Bruno BELANYI | 67090494e2 | ||
Bruno BELANYI | 0d44b3b9f2 | ||
Bruno BELANYI | 37c20529c1 | ||
Bruno BELANYI | 2449a96652 | ||
Bruno BELANYI | 8a9337710f | ||
Bruno BELANYI | 7b75ea43ad | ||
Bruno BELANYI | fb6e2afe89 | ||
Bruno BELANYI | 51067582e0 | ||
Bruno BELANYI | 78ade4c605 | ||
Bruno BELANYI | 5c2921e00d | ||
Bruno BELANYI | 62a18cd3f6 | ||
Bruno BELANYI | c6cc64e156 | ||
Bruno BELANYI | 875a3d8587 | ||
Bruno BELANYI | 409e0ef357 | ||
Bruno BELANYI | b6af754199 | ||
Bruno BELANYI | ca5e5a53cd | ||
Bruno BELANYI | ba10af0644 | ||
Bruno BELANYI | 0f2c20e51d | ||
Bruno BELANYI | ca218730ff | ||
Bruno BELANYI | ac5fd7f472 | ||
Bruno BELANYI | db37cea907 | ||
Bruno BELANYI | 1cf93825b2 | ||
Bruno BELANYI | 8a2aad9b54 | ||
Bruno BELANYI | 018394b61d | ||
Bruno BELANYI | 1e3c633c72 | ||
Bruno BELANYI | df302465c9 | ||
Bruno BELANYI | 673ead7863 | ||
Bruno BELANYI | 3d10461a6e | ||
Bruno BELANYI | 75312c747b | ||
Bruno BELANYI | 68be7743ad | ||
Bruno BELANYI | 9d362655e2 | ||
Bruno BELANYI | 604b99a7ac | ||
Bruno BELANYI | 8467fda721 | ||
Bruno BELANYI | bad9b8a06b | ||
Bruno BELANYI | 2d26b36e31 | ||
Bruno BELANYI | c93a9e5a98 | ||
Bruno BELANYI | 3fa14ebe71 | ||
Bruno BELANYI | bd1a2000fe | ||
Bruno BELANYI | 4a0c10b897 | ||
Bruno BELANYI | 9f3811ea3b | ||
Bruno BELANYI | 5c95ba1113 | ||
Bruno BELANYI | 37bb7fd625 | ||
Bruno BELANYI | 45321072fc | ||
Bruno BELANYI | ed456c999d | ||
Bruno BELANYI | ad848ef89d | ||
Bruno BELANYI | 680d0c9f37 | ||
Bruno BELANYI | 9a06108603 | ||
Bruno BELANYI | c8633abf6d | ||
Bruno BELANYI | aceb4ef901 | ||
Bruno BELANYI | 5937d43993 | ||
Bruno BELANYI | add6326fdf | ||
Bruno BELANYI | b0e4475586 | ||
Bruno BELANYI | 5c1dd6500a | ||
Bruno BELANYI | 60e977611c | ||
Bruno BELANYI | 99462199bd | ||
Bruno BELANYI | 4fe18ff4cd | ||
Bruno BELANYI | 02ffbcf970 | ||
Bruno BELANYI | 878c92b67e | ||
Bruno BELANYI | 8596ce8638 | ||
Bruno BELANYI | 808058d576 | ||
Bruno BELANYI | 8ffad5d41b | ||
Bruno BELANYI | 52706ab4c4 | ||
Bruno BELANYI | 5ae7b593e4 | ||
Bruno BELANYI | 87613a9163 | ||
Bruno BELANYI | 47d19e5b3f | ||
Bruno BELANYI | a78091c57c | ||
Bruno BELANYI | 9aba0d3ce0 | ||
Bruno BELANYI | 78064bb2a1 | ||
Bruno BELANYI | 70af0ba99a | ||
Bruno BELANYI | dc2a3610a6 | ||
Bruno BELANYI | 894b571745 | ||
Bruno BELANYI | 2049e7a2c5 | ||
Bruno BELANYI | 7032ddef37 | ||
Bruno BELANYI | 81e12969eb | ||
Bruno BELANYI | b97eff2479 | ||
Bruno BELANYI | 4f742b69f2 | ||
Bruno BELANYI | 11fbbd62eb | ||
Bruno BELANYI | d21087ddcd | ||
Bruno BELANYI | 3919a87d9e | ||
Bruno BELANYI | 3fd487bbd2 | ||
Bruno BELANYI | 5916ae631d | ||
Bruno BELANYI | 1a436fd962 | ||
Bruno BELANYI | a48303e66d | ||
Bruno BELANYI | 30fc01b5ae | ||
Bruno BELANYI | 13684ecdc4 | ||
Bruno BELANYI | fe720b2de3 | ||
Bruno BELANYI | ec6b31f4a6 | ||
Bruno BELANYI | 1335bbfe9d | ||
Bruno BELANYI | 2cc1925346 | ||
Bruno BELANYI | eb0c5d5895 | ||
Bruno BELANYI | 8c298c26f9 | ||
Bruno BELANYI | 55a04cfac3 | ||
Bruno BELANYI | 1783c2838b | ||
Bruno BELANYI | e215f7aa1d | ||
Bruno BELANYI | afb683f1cf | ||
Bruno BELANYI | c320387746 | ||
Bruno BELANYI | bbb1231ad3 | ||
Bruno BELANYI | 9f00d8a38e | ||
Bruno BELANYI | 820b52314f | ||
Bruno BELANYI | a3293277d9 | ||
Bruno BELANYI | 2ecd417a68 | ||
Bruno BELANYI | 4e8045716c | ||
Bruno BELANYI | e060476f32 | ||
Bruno BELANYI | 2458ddf59d | ||
Bruno BELANYI | 8927b3182f | ||
Bruno BELANYI | f2dfeeb35b | ||
Bruno BELANYI | 971b610cd5 | ||
Bruno BELANYI | 21f48b5f71 | ||
Bruno BELANYI | a3edf2548b | ||
Bruno BELANYI | ea7b064546 | ||
Bruno BELANYI | ff8e64d601 | ||
Bruno BELANYI | 791109c3c1 | ||
Bruno BELANYI | 6eb3942270 | ||
Bruno BELANYI | 2232062fd9 | ||
Bruno BELANYI | d6e9f9786d | ||
Bruno BELANYI | 5abe4e929e | ||
Bruno BELANYI | 57717d70ef | ||
Bruno BELANYI | 7a382368e8 | ||
Bruno BELANYI | 0f17123d09 | ||
Bruno BELANYI | c6d21493ef | ||
Bruno BELANYI | 5cebb9b54b | ||
Bruno BELANYI | 92c2748747 | ||
Bruno BELANYI | 4cae294cf5 | ||
Bruno BELANYI | 23c6093c36 | ||
Bruno BELANYI | 3fdcfb5b5f | ||
Bruno BELANYI | c9418cc4d3 | ||
Bruno BELANYI | cd02cbff45 | ||
Bruno BELANYI | daa69a54fa | ||
Bruno BELANYI | 212dd299e2 | ||
Bruno BELANYI | cff3811cad | ||
Bruno BELANYI | 8f266245ee | ||
Bruno BELANYI | b8be3d80a8 | ||
Bruno BELANYI | b04c1b09ea | ||
Bruno BELANYI | 3a471433ed | ||
Bruno BELANYI | f8325cc9c7 | ||
Bruno BELANYI | cd1173d2f6 | ||
Bruno BELANYI | e319eaf09f | ||
Bruno BELANYI | e6ba569b36 | ||
Bruno BELANYI | ee21de5b94 | ||
Bruno BELANYI | 6614b47546 | ||
Bruno BELANYI | 06c53620f8 | ||
Bruno BELANYI | d43045c6d6 | ||
Bruno BELANYI | 6113ad154d | ||
Bruno BELANYI | e8982b8bc9 | ||
Bruno BELANYI | 7684489c9a | ||
Bruno BELANYI | 1994ef2b1b | ||
Bruno BELANYI | a434016252 | ||
Bruno BELANYI | 1794eefd30 | ||
Bruno BELANYI | 29437d3e3f | ||
Bruno BELANYI | a827a34501 | ||
Bruno BELANYI | 610b0f2f4b | ||
Bruno BELANYI | 59cb038045 | ||
Bruno BELANYI | 15db81eb3b | ||
Bruno BELANYI | 24efa3edca | ||
Bruno BELANYI | 2fe4f1faad | ||
Bruno BELANYI | 4f1f687eea | ||
Bruno BELANYI | b90be0acdf | ||
Bruno BELANYI | ea4c699b81 | ||
Bruno BELANYI | 8efe75295d | ||
Bruno BELANYI | 2d9b11406a | ||
Bruno BELANYI | 003c08cb09 | ||
Bruno BELANYI | 6728b50d3a | ||
Bruno BELANYI | 2eaf3bf2c7 | ||
Bruno BELANYI | 0077ce1f94 | ||
Bruno BELANYI | 14d9fc89f1 | ||
Bruno BELANYI | f660bf94e9 | ||
Bruno BELANYI | 3b9f01e780 | ||
Bruno BELANYI | 60f1e693d1 | ||
Bruno BELANYI | ce4b0b8c90 | ||
Bruno BELANYI | d2704b17fe | ||
Bruno BELANYI | 31f8ec6e98 | ||
Bruno BELANYI | af67d04992 | ||
Bruno BELANYI | f9bcf79430 | ||
Bruno BELANYI | b0cc830467 | ||
Bruno BELANYI | 9b054d10c7 | ||
Bruno BELANYI | e81aaa8ebc | ||
Bruno BELANYI | 737b5e797b | ||
Bruno BELANYI | 6728b5b949 | ||
Bruno BELANYI | 2999ba7c0b | ||
Bruno BELANYI | 1ac9f0cc8c | ||
Bruno BELANYI | 6074958292 | ||
Bruno BELANYI | da21e7a6f2 | ||
Bruno BELANYI | 395f15f181 | ||
Bruno BELANYI | 059831b532 | ||
Bruno BELANYI | 76d165343e | ||
Bruno BELANYI | f66da6fee6 | ||
Bruno BELANYI | ca1c7962ea | ||
Bruno BELANYI | 796df5475e | ||
Bruno BELANYI | 414606b58e | ||
Bruno BELANYI | 931b67fdb2 | ||
Bruno BELANYI | 8b4966fcbe | ||
Bruno BELANYI | a508db48c9 | ||
Bruno BELANYI | 406eeea9f6 | ||
Bruno BELANYI | 9d3d86365c | ||
Bruno BELANYI | 78d77890de | ||
Bruno BELANYI | a33fbc6659 | ||
Bruno BELANYI | b134aedff0 | ||
Bruno BELANYI | d31e293cef | ||
Bruno BELANYI | 182ec2a4db | ||
Bruno BELANYI | 81647c5a02 | ||
Bruno BELANYI | 8a8f7387f4 | ||
Bruno BELANYI | f2b20c65a8 | ||
Bruno BELANYI | cc37713839 | ||
Bruno BELANYI | e80485018c | ||
Bruno BELANYI | 15abb291ef | ||
Bruno BELANYI | fb56631ef3 | ||
Bruno BELANYI | 9113290161 | ||
Bruno BELANYI | 943ea20b16 | ||
Bruno BELANYI | 129fcdd42c | ||
Bruno BELANYI | d086af7e00 | ||
Bruno BELANYI | e4d8a4d4b2 | ||
Bruno BELANYI | 1a5dd0b91c | ||
Bruno BELANYI | 02c2a23ee5 | ||
Bruno BELANYI | f6ace9d438 | ||
Bruno BELANYI | 2a0b5b7802 | ||
Bruno BELANYI | 2c596395b0 | ||
Bruno BELANYI | 986701d1c8 | ||
Bruno BELANYI | ee33ab11c6 | ||
Bruno BELANYI | 7d0a772cce | ||
Bruno BELANYI | 97ee498405 | ||
Bruno BELANYI | e5fdfd6c44 | ||
Bruno BELANYI | 76148d75b8 | ||
Bruno BELANYI | 9e6bc604f3 | ||
Bruno BELANYI | b4d3b06fbf | ||
Bruno BELANYI | 8de23feee7 | ||
Bruno BELANYI | 0fc3bf3096 | ||
Bruno BELANYI | 7d48b0edab | ||
Bruno BELANYI | d23ad8f5e1 | ||
Bruno BELANYI | f3764ce20e | ||
Bruno BELANYI | f9d849c5da | ||
Bruno BELANYI | 59e833a55b | ||
Bruno BELANYI | 03130ed9ee | ||
Bruno BELANYI | ac4cf0c1a2 | ||
Bruno BELANYI | fab93a5f2f | ||
Bruno BELANYI | f04368a71e | ||
Bruno BELANYI | 30ce91557d | ||
Bruno BELANYI | d46f66842f | ||
Bruno BELANYI | 737484dcfe | ||
Bruno BELANYI | 125935ac0f | ||
Bruno BELANYI | e786eaddde | ||
Bruno BELANYI | e211ac7d73 | ||
Bruno BELANYI | 3f50abcbe0 | ||
Bruno BELANYI | 1c2193d698 | ||
Bruno BELANYI | 12b3397a20 | ||
Bruno BELANYI | ca620a4eb6 | ||
Bruno BELANYI | 885b45d39c | ||
Bruno BELANYI | 0c943d8430 | ||
Bruno BELANYI | 79dfb3a979 | ||
Bruno BELANYI | 00a5d1b076 | ||
Bruno BELANYI | 5e193b3a42 | ||
Bruno BELANYI | bf9de874ce | ||
Bruno BELANYI | 5aaa497653 | ||
Bruno BELANYI | 3887a86650 | ||
Bruno BELANYI | f57fd32088 | ||
Bruno BELANYI | 1c147613e4 | ||
Bruno BELANYI | 15190d4b50 | ||
Bruno BELANYI | 5f7d2c74bc | ||
Bruno BELANYI | 53dd04a0b7 | ||
Bruno BELANYI | 86ab6bf17a | ||
Bruno BELANYI | 6008ac470c | ||
Bruno BELANYI | 717c628ff1 | ||
Bruno BELANYI | 749ef9f072 | ||
Bruno BELANYI | a0c63f00f9 | ||
Bruno BELANYI | d9734dd505 | ||
Bruno BELANYI | 4225bdd103 | ||
Bruno BELANYI | 3a07cffa14 | ||
Bruno BELANYI | 06f9f423e9 | ||
Bruno BELANYI | ad1d907c25 | ||
Bruno BELANYI | ef0f4bdca5 | ||
Bruno BELANYI | b4d002033a | ||
Bruno BELANYI | 8837c7c33c | ||
Bruno BELANYI | f4cc68a650 | ||
Bruno BELANYI | 79525013b0 | ||
Bruno BELANYI | 2b8d01f056 | ||
Bruno BELANYI | b115d94cd6 | ||
Bruno BELANYI | 1022601602 | ||
Bruno BELANYI | 376e60d71e | ||
Bruno BELANYI | a03db294fe | ||
Bruno BELANYI | f2b9040175 | ||
Bruno BELANYI | b1e8664e32 | ||
Bruno BELANYI | b61aca7def | ||
Bruno BELANYI | d388a379d4 | ||
Bruno BELANYI | 3402b92784 | ||
Bruno BELANYI | b55466b791 | ||
Bruno BELANYI | 036d59ec11 | ||
Bruno BELANYI | f89e1ba3e9 | ||
Bruno BELANYI | 8788deac5e | ||
Bruno BELANYI | 676cd03c9c | ||
Bruno BELANYI | e329e7a59a | ||
Bruno BELANYI | 98a8e068ea | ||
Bruno BELANYI | f5fcd2a7a6 | ||
Bruno BELANYI | 1b9b598662 | ||
Bruno BELANYI | 05e0cd4e1f | ||
Bruno BELANYI | 9973e0d32f | ||
Bruno BELANYI | 8231e8feaa | ||
Bruno BELANYI | 8dc89846b2 | ||
Bruno BELANYI | 5a32160954 | ||
Bruno BELANYI | 6612d0226a | ||
Bruno BELANYI | 75e3d9bf70 | ||
Bruno BELANYI | 9dbfb65c27 | ||
Bruno BELANYI | f8d6447ac4 | ||
Bruno BELANYI | 185781a4e2 | ||
Bruno BELANYI | cdc29efafc | ||
Bruno BELANYI | 9f6c614c9f | ||
Bruno BELANYI | 54a20058fb | ||
Bruno BELANYI | 6bad81a644 | ||
Bruno BELANYI | 971ee359ce | ||
Bruno BELANYI | c175964630 | ||
Bruno BELANYI | 046391e26e | ||
Bruno BELANYI | b32fec2c63 | ||
Bruno BELANYI | 3ec448bf03 | ||
Bruno BELANYI | c3c44bceb6 | ||
Bruno BELANYI | e1240c188e | ||
Bruno BELANYI | d5b3b95827 | ||
Bruno BELANYI | c17b5f4004 | ||
Bruno BELANYI | e06edc8f47 | ||
Bruno BELANYI | 4d04dd9b9b | ||
Bruno BELANYI | e6b810b5a1 | ||
Bruno BELANYI | 595720dcd4 | ||
Bruno BELANYI | e6fb00ce9a | ||
Bruno BELANYI | d01b7963cd | ||
Bruno BELANYI | 646768c3b7 | ||
Bruno BELANYI | b254e0f7ac | ||
Bruno BELANYI | fee045d82c | ||
Bruno BELANYI | 76b17e924a | ||
Bruno BELANYI | 9fe78a5a70 | ||
Bruno BELANYI | 90ccf42779 | ||
Bruno BELANYI | cdbe16e703 | ||
Bruno BELANYI | 1da8177ea2 | ||
Bruno BELANYI | fe9f468e06 | ||
Bruno BELANYI | 45cb955433 | ||
Bruno BELANYI | b6fb77fc34 | ||
Bruno BELANYI | f57cfda767 | ||
Bruno BELANYI | 5427f15a17 | ||
Bruno BELANYI | 6acf9f4a19 | ||
Bruno BELANYI | cd7c8e2172 | ||
Bruno BELANYI | e0b0f44a9a | ||
Bruno BELANYI | bd53470e46 | ||
Bruno BELANYI | f634f1b2ed | ||
dc052386d1 |
43
.drone.yml
43
.drone.yml
|
@ -1,24 +1,27 @@
|
||||||
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
name: check config
|
type: exec
|
||||||
|
name: NixOS config check
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: format check
|
- name: nix flake check
|
||||||
image: nixos/nix
|
commands:
|
||||||
commands:
|
- nix flake check
|
||||||
- nix-shell -p nixpkgs-fmt --run 'nixpkgs-fmt . --check'
|
|
||||||
|
|
||||||
- name: notify
|
- name: notifiy
|
||||||
image: plugins/matrix
|
commands:
|
||||||
settings:
|
- nix run .#matrix-notifier
|
||||||
homeserver:
|
environment:
|
||||||
from_secret: matrix_homeserver
|
ADDRESS:
|
||||||
roomid:
|
from_secret: matrix_homeserver
|
||||||
from_secret: matrix_roomid
|
ROOM:
|
||||||
username:
|
from_secret: matrix_roomid
|
||||||
from_secret: matrix_username
|
USER:
|
||||||
password:
|
from_secret: matrix_username
|
||||||
from_secret: matrix_password
|
PASS:
|
||||||
trigger:
|
from_secret: matrix_password
|
||||||
status:
|
when:
|
||||||
- failure
|
status:
|
||||||
- success
|
- failure
|
||||||
|
- success
|
||||||
|
...
|
||||||
|
|
1
.envrc
1
.envrc
|
@ -6,3 +6,4 @@ use_flake() {
|
||||||
|
|
||||||
ulimit -s unlimited # Bypass current bug in `nix` flakes evaluation
|
ulimit -s unlimited # Bypass current bug in `nix` flakes evaluation
|
||||||
use flake
|
use flake
|
||||||
|
eval "$shellHooks"
|
||||||
|
|
4
.git-crypt/.gitattributes
vendored
4
.git-crypt/.gitattributes
vendored
|
@ -1,4 +0,0 @@
|
||||||
# Do not edit this file. To specify the files to encrypt, create your own
|
|
||||||
# .gitattributes file in the directory where your files are.
|
|
||||||
* !filter !diff
|
|
||||||
*.gpg binary
|
|
Binary file not shown.
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/.pre-commit-config.yaml
|
|
@ -1,21 +0,0 @@
|
||||||
repos:
|
|
||||||
- repo: 'https://github.com/pre-commit/pre-commit-hooks'
|
|
||||||
rev: 'v2.3.0'
|
|
||||||
hooks:
|
|
||||||
- id: 'trailing-whitespace'
|
|
||||||
- id: 'end-of-file-fixer'
|
|
||||||
- id: 'check-yaml'
|
|
||||||
- id: 'check-added-large-files'
|
|
||||||
- repo: 'https://github.com/jumanjihouse/pre-commit-hooks'
|
|
||||||
rev: '2.1.4'
|
|
||||||
hooks:
|
|
||||||
- id: 'forbid-binary'
|
|
||||||
- repo: 'local'
|
|
||||||
hooks:
|
|
||||||
- id: 'nixpkgs-fmt'
|
|
||||||
name: 'nixpkgs-fmt'
|
|
||||||
description: 'Format nix code with nixpkgs-fmt'
|
|
||||||
entry: 'nixpkgs-fmt'
|
|
||||||
language: 'system'
|
|
||||||
files: '\.nix$'
|
|
||||||
always_run: true
|
|
|
@ -17,7 +17,8 @@ Secondly, take care of a few manual steps:
|
||||||
* Configure Gitea and Drone
|
* Configure Gitea and Drone
|
||||||
* Configure Lohr webhook and SSH key
|
* Configure Lohr webhook and SSH key
|
||||||
* Configure Jellyfin
|
* Configure Jellyfin
|
||||||
* Configure Jackett and NZBHydra2
|
* Configure Prowlarr,Jackett and NZBHydra2
|
||||||
* Configure Sonarr, Radarr, Bazarr
|
* Configure Sonarr, Radarr, Bazarr
|
||||||
* Configure Transmission's webui port
|
* Configure Transmission's webui port
|
||||||
* Configure Quassel user
|
* Configure Quassel user
|
||||||
|
* Configure Flood account
|
||||||
|
|
|
@ -58,6 +58,8 @@ get_ssh() {
|
||||||
|
|
||||||
get_doc "SysAdmin/SSH" "shared-key-public" "$HOME/.ssh/shared_rsa.pub" 644
|
get_doc "SysAdmin/SSH" "shared-key-public" "$HOME/.ssh/shared_rsa.pub" 644
|
||||||
get_doc "SysAdmin/SSH" "shared-key-private" "$HOME/.ssh/shared_rsa" 600
|
get_doc "SysAdmin/SSH" "shared-key-private" "$HOME/.ssh/shared_rsa" 600
|
||||||
|
get_doc "SysAdmin/SSH" "agenix-public" "$HOME/.ssh/id_ed25519.pub" 644
|
||||||
|
get_doc "SysAdmin/SSH" "agenix-private" "$HOME/.ssh/id_ed25519" 600
|
||||||
}
|
}
|
||||||
|
|
||||||
get_pgp() {
|
get_pgp() {
|
||||||
|
@ -78,7 +80,7 @@ get_pgp() {
|
||||||
}
|
}
|
||||||
|
|
||||||
get_creds() {
|
get_creds() {
|
||||||
BW_SESSION="$(bw login --raw)"
|
BW_SESSION="$(bw login --raw || bw unlock --raw)"
|
||||||
export BW_SESSION
|
export BW_SESSION
|
||||||
|
|
||||||
get_ssh
|
get_ssh
|
||||||
|
|
73
flake.lock
73
flake.lock
|
@ -1,12 +1,33 @@
|
||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
|
"agenix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1646105662,
|
||||||
|
"narHash": "sha256-jdXCZbGZL0SWWi29GnAOFHUh/QvvP0IyaVLv1ZTDkBI=",
|
||||||
|
"owner": "ryantm",
|
||||||
|
"repo": "agenix",
|
||||||
|
"rev": "297cd58b418249240b9f1f155d52b1b17f292884",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "ryantm",
|
||||||
|
"ref": "main",
|
||||||
|
"repo": "agenix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"futils": {
|
"futils": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1619345332,
|
"lastModified": 1644229661,
|
||||||
"narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=",
|
"narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28",
|
"rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -23,11 +44,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1619558193,
|
"lastModified": 1646559628,
|
||||||
"narHash": "sha256-DljP5/9EX0eXEPhzCUFqFEHkkcFuXJBx1PTgcv0OgyM=",
|
"narHash": "sha256-WDoqxH/IPTV8CkI15wwzvXYgXq9UPr8xd8WKziuaynw=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "18ad12d52b8cebbb57013865eec2be5125de050a",
|
"rev": "afe96e7433c513bf82375d41473c57d1f66b4e68",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -39,11 +60,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1619464443,
|
"lastModified": 1646497237,
|
||||||
"narHash": "sha256-R7WAb8EnkIJxxaF6GTHUPytjonhB4Zm0iatyWoW169A=",
|
"narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "8e4fe32876ca15e3d5eb3ecd3ca0b224417f5f17",
|
"rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -55,11 +76,11 @@
|
||||||
},
|
},
|
||||||
"nur": {
|
"nur": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1619628114,
|
"lastModified": 1646721260,
|
||||||
"narHash": "sha256-s3pQyvMfXVmbQOX224yOWQf6zi8406sShFF4u17LVQ0=",
|
"narHash": "sha256-r8ZWtEwiRxLKOtsT2yvU9Rs1oqL/RsSkPkgupXsw1bU=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "NUR",
|
"repo": "NUR",
|
||||||
"rev": "0615e756dc14986c4968fa478c0bd080d621cb2b",
|
"rev": "25adb63e9381cb0342cdbe2d2d56266f4974a2c5",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -69,12 +90,38 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"pre-commit-hooks": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": [
|
||||||
|
"futils"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1646153636,
|
||||||
|
"narHash": "sha256-AlWHMzK+xJ1mG267FdT8dCq/HvLCA6jwmx2ZUy5O8tY=",
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "pre-commit-hooks.nix",
|
||||||
|
"rev": "b6bc0b21e1617e2b07d8205e7fae7224036dfa4b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "cachix",
|
||||||
|
"ref": "master",
|
||||||
|
"repo": "pre-commit-hooks.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
|
"agenix": "agenix",
|
||||||
"futils": "futils",
|
"futils": "futils",
|
||||||
"home-manager": "home-manager",
|
"home-manager": "home-manager",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
"nur": "nur"
|
"nur": "nur",
|
||||||
|
"pre-commit-hooks": "pre-commit-hooks"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
114
flake.nix
114
flake.nix
|
@ -1,6 +1,16 @@
|
||||||
{
|
{
|
||||||
description = "NixOS configuration with flakes";
|
description = "NixOS configuration with flakes";
|
||||||
inputs = {
|
inputs = {
|
||||||
|
agenix = {
|
||||||
|
type = "github";
|
||||||
|
owner = "ryantm";
|
||||||
|
repo = "agenix";
|
||||||
|
ref = "main";
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
futils = {
|
futils = {
|
||||||
type = "github";
|
type = "github";
|
||||||
owner = "numtide";
|
owner = "numtide";
|
||||||
|
@ -31,9 +41,29 @@
|
||||||
repo = "NUR";
|
repo = "NUR";
|
||||||
ref = "master";
|
ref = "master";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pre-commit-hooks = {
|
||||||
|
type = "github";
|
||||||
|
owner = "cachix";
|
||||||
|
repo = "pre-commit-hooks.nix";
|
||||||
|
ref = "master";
|
||||||
|
inputs = {
|
||||||
|
flake-utils.follows = "futils";
|
||||||
|
nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { self, futils, home-manager, nixpkgs, nur } @ inputs:
|
outputs =
|
||||||
|
inputs @
|
||||||
|
{ self
|
||||||
|
, agenix
|
||||||
|
, futils
|
||||||
|
, home-manager
|
||||||
|
, nixpkgs
|
||||||
|
, nur
|
||||||
|
, pre-commit-hooks
|
||||||
|
}:
|
||||||
let
|
let
|
||||||
inherit (futils.lib) eachDefaultSystem;
|
inherit (futils.lib) eachDefaultSystem;
|
||||||
|
|
||||||
|
@ -51,58 +81,84 @@
|
||||||
nur.overlay
|
nur.overlay
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
home-manager.nixosModules.home-manager
|
# Include generic settings
|
||||||
{
|
./modules
|
||||||
home-manager.users.ambroisie = import ./home;
|
# Include bundles of settings
|
||||||
# Nix Flakes compatibility
|
./profiles
|
||||||
home-manager.useGlobalPkgs = true;
|
|
||||||
home-manager.useUserPackages = true;
|
|
||||||
}
|
|
||||||
];
|
];
|
||||||
|
|
||||||
buildHost = name: system: lib.nixosSystem {
|
buildHost = name: system: lib.nixosSystem {
|
||||||
inherit system;
|
inherit system;
|
||||||
modules = defaultModules ++ [
|
modules = defaultModules ++ [
|
||||||
(./. + "/${name}.nix")
|
(./. + "/machines/${name}")
|
||||||
];
|
];
|
||||||
specialArgs = {
|
specialArgs = {
|
||||||
# Use my extended lib in NixOS configuration
|
# Use my extended lib in NixOS configuration
|
||||||
inherit lib;
|
inherit lib;
|
||||||
|
# Inject inputs to use them in global registry
|
||||||
|
inherit inputs;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
eachDefaultSystem
|
eachDefaultSystem
|
||||||
(system:
|
(system:
|
||||||
let
|
let
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
in
|
in
|
||||||
rec {
|
rec {
|
||||||
apps = {
|
apps = {
|
||||||
diff-flake = futils.lib.mkApp { drv = packages.diff-flake; };
|
diff-flake = futils.lib.mkApp { drv = packages.diff-flake; };
|
||||||
|
};
|
||||||
|
|
||||||
|
checks = {
|
||||||
|
pre-commit = pre-commit-hooks.lib.${system}.run {
|
||||||
|
src = ./.;
|
||||||
|
|
||||||
|
hooks = {
|
||||||
|
nixpkgs-fmt = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
shellcheck = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
defaultApp = apps.diff-flake;
|
defaultApp = apps.diff-flake;
|
||||||
|
|
||||||
devShell = pkgs.mkShell {
|
devShell = pkgs.mkShell {
|
||||||
name = "NixOS-config";
|
name = "NixOS-config";
|
||||||
buildInputs = with pkgs; [
|
|
||||||
git-crypt
|
|
||||||
gitAndTools.pre-commit
|
|
||||||
gnupg
|
|
||||||
nixpkgs-fmt
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
packages = import ./pkgs { inherit pkgs; };
|
nativeBuildInputs = with pkgs; [
|
||||||
}) // {
|
gitAndTools.pre-commit
|
||||||
|
nixpkgs-fmt
|
||||||
|
];
|
||||||
|
|
||||||
|
inherit (self.checks.${system}.pre-commit) shellHook;
|
||||||
|
};
|
||||||
|
|
||||||
|
packages =
|
||||||
|
let
|
||||||
|
inherit (futils.lib) filterPackages flattenTree;
|
||||||
|
packages = import ./pkgs { inherit pkgs; };
|
||||||
|
flattenedPackages = flattenTree packages;
|
||||||
|
finalPackages = filterPackages system flattenedPackages;
|
||||||
|
in
|
||||||
|
finalPackages;
|
||||||
|
}) // {
|
||||||
overlay = self.overlays.pkgs;
|
overlay = self.overlays.pkgs;
|
||||||
|
|
||||||
overlays = {
|
overlays = import ./overlays // {
|
||||||
lib = final: prev: { inherit lib; };
|
lib = final: prev: { inherit lib; };
|
||||||
pkgs = final: prev: { ambroisie = import ./pkgs { pkgs = prev; }; };
|
pkgs = final: prev: {
|
||||||
|
ambroisie = prev.recurseIntoAttrs (import ./pkgs { pkgs = prev; });
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
nixosConfigurations = lib.mapAttrs buildHost {
|
nixosConfigurations = lib.mapAttrs buildHost {
|
||||||
|
aramis = "x86_64-linux";
|
||||||
porthos = "x86_64-linux";
|
porthos = "x86_64-linux";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,6 +10,8 @@ in
|
||||||
config.programs.bat = lib.mkIf cfg.enable {
|
config.programs.bat = lib.mkIf cfg.enable {
|
||||||
enable = true;
|
enable = true;
|
||||||
config = {
|
config = {
|
||||||
|
theme = "gruvbox-dark";
|
||||||
|
|
||||||
pager = with config.home.sessionVariables; "${PAGER} ${LESS}";
|
pager = with config.home.sessionVariables; "${PAGER} ${LESS}";
|
||||||
};
|
};
|
||||||
};
|
};
|
19
home/bluetooth/default.nix
Normal file
19
home/bluetooth/default.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.bluetooth;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.bluetooth = with lib; {
|
||||||
|
enable = mkEnableOption "bluetooth configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.blueman-applet = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.mpris-proxy = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
29
home/comma/default.nix
Normal file
29
home/comma/default.nix
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.comma;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.comma = with lib; {
|
||||||
|
enable = my.mkDisableOption "comma configuration";
|
||||||
|
|
||||||
|
pkgsFlake = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "pkgs";
|
||||||
|
example = "nixpkgs";
|
||||||
|
description = ''
|
||||||
|
Which flake from the registry should be used with
|
||||||
|
<command>nix shell</command>.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
ambroisie.comma
|
||||||
|
];
|
||||||
|
|
||||||
|
home.sessionVariables = {
|
||||||
|
COMMA_PKGS_FLAKE = cfg.pkgsFlake;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,20 +1,38 @@
|
||||||
{ ... }:
|
{ ... }:
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./bat.nix
|
./bat
|
||||||
./direnv.nix
|
./bluetooth
|
||||||
./documentation.nix
|
./comma
|
||||||
|
./direnv
|
||||||
|
./discord
|
||||||
|
./documentation
|
||||||
|
./feh
|
||||||
|
./firefox
|
||||||
|
./flameshot
|
||||||
|
./gammastep
|
||||||
|
./gdb
|
||||||
./git
|
./git
|
||||||
./gpg.nix
|
./gpg
|
||||||
./htop.nix
|
./gtk
|
||||||
./jq.nix
|
./htop
|
||||||
./packages.nix
|
./jq
|
||||||
./pager.nix
|
./mail
|
||||||
./secrets # Home-manager specific secrets
|
./mpv
|
||||||
./ssh.nix
|
./nix-index
|
||||||
./tmux.nix
|
./nm-applet
|
||||||
|
./packages
|
||||||
|
./pager
|
||||||
|
./power-alert
|
||||||
|
./ssh
|
||||||
|
./terminal
|
||||||
|
./tmux
|
||||||
|
./udiskie
|
||||||
./vim
|
./vim
|
||||||
./xdg.nix
|
./wm
|
||||||
|
./x
|
||||||
|
./xdg
|
||||||
|
./zathura
|
||||||
./zsh
|
./zsh
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -23,4 +41,7 @@
|
||||||
|
|
||||||
# Who am I?
|
# Who am I?
|
||||||
home.username = "ambroisie";
|
home.username = "ambroisie";
|
||||||
|
|
||||||
|
# Start services automatically
|
||||||
|
systemd.user.startServices = "sd-switch";
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,9 @@ in
|
||||||
|
|
||||||
config.programs.direnv = lib.mkIf cfg.enable {
|
config.programs.direnv = lib.mkIf cfg.enable {
|
||||||
enable = true;
|
enable = true;
|
||||||
# A better `use_nix`
|
nix-direnv = {
|
||||||
enableNixDirenvIntegration = true;
|
# A better `use_nix`
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
23
home/discord/default.nix
Normal file
23
home/discord/default.nix
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.discord;
|
||||||
|
|
||||||
|
jsonFormat = pkgs.formats.json { };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.discord = with lib; {
|
||||||
|
enable = mkEnableOption "discord configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
discord
|
||||||
|
];
|
||||||
|
|
||||||
|
xdg.configFile."discord/settings.json".source =
|
||||||
|
jsonFormat.generate "discord.json" {
|
||||||
|
# Do not keep me from using the app just to force an update
|
||||||
|
SKIP_HOST_UPDATE = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
13
home/feh/default.nix
Normal file
13
home/feh/default.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.feh;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.feh = with lib; {
|
||||||
|
enable = mkEnableOption "feh configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config.programs.feh = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
}
|
84
home/firefox/default.nix
Normal file
84
home/firefox/default.nix
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.firefox;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./tridactyl
|
||||||
|
];
|
||||||
|
|
||||||
|
options.my.home.firefox = with lib; {
|
||||||
|
enable = mkEnableOption "firefox configuration";
|
||||||
|
|
||||||
|
tridactyl = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "tridactyl configuration";
|
||||||
|
example = false;
|
||||||
|
default = config.my.home.firefox.enable;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ff2mpv = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "ff2mpv configuration";
|
||||||
|
example = false;
|
||||||
|
default = config.my.home.mpv.enable;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.programs.firefox = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
package = pkgs.firefox.override {
|
||||||
|
cfg = {
|
||||||
|
enableTridactylNative = cfg.tridactyl.enable;
|
||||||
|
};
|
||||||
|
|
||||||
|
extraNativeMessagingHosts = with pkgs; ([ ]
|
||||||
|
# Watch videos using mpv
|
||||||
|
++ lib.optional cfg.ff2mpv.enable ambroisie.ff2mpv-go
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
profiles = {
|
||||||
|
default = {
|
||||||
|
id = 0;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
"browser.bookmarks.showMobileBookmarks" = true; # Mobile bookmarks
|
||||||
|
"browser.download.useDownloadDir" = false; # Ask for download location
|
||||||
|
"browser.in-content.dark-mode" = true; # Dark mode
|
||||||
|
"browser.newtabpage.activity-stream.feeds.section.topstories" = false; # Disable top stories
|
||||||
|
"browser.newtabpage.activity-stream.feeds.sections" = false;
|
||||||
|
"browser.newtabpage.activity-stream.feeds.system.topstories" = false; # Disable top stories
|
||||||
|
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false; # Disable pocket
|
||||||
|
"extensions.pocket.enabled" = false; # Disable pocket
|
||||||
|
"media.eme.enabled" = true; # Enable DRM
|
||||||
|
"media.gmp-widevinecdm.visible" = true; # Enable DRM
|
||||||
|
"media.gmp-widevinecdm.enabled" = true; # Enable DRM
|
||||||
|
"signon.autofillForms" = false; # Disable built-in form-filling
|
||||||
|
"signon.rememberSignons" = false; # Disable built-in password manager
|
||||||
|
"ui.systemUsesDarkTheme" = true; # Dark mode
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
extensions = with pkgs.nur.repos.rycee.firefox-addons; ([
|
||||||
|
bitwarden
|
||||||
|
consent-o-matic
|
||||||
|
form-history-control
|
||||||
|
https-everywhere
|
||||||
|
reddit-comment-collapser
|
||||||
|
reddit-enhancement-suite
|
||||||
|
refined-github
|
||||||
|
sponsorblock
|
||||||
|
ublock-origin
|
||||||
|
]
|
||||||
|
++ lib.optional (cfg.tridactyl.enable) tridactyl
|
||||||
|
++ lib.optional (cfg.ff2mpv.enable) ff2mpv
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
9
home/firefox/tridactyl/default.nix
Normal file
9
home/firefox/tridactyl/default.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.firefox.tridactyl;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
xdg.configFile."tridactyl/tridactylrc".source = ./tridactylrc;
|
||||||
|
};
|
||||||
|
}
|
76
home/firefox/tridactyl/tridactylrc
Normal file
76
home/firefox/tridactyl/tridactylrc
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
" Shamelessly taken from bovine3dom's example configuration file from the docs
|
||||||
|
|
||||||
|
" Basics {{{
|
||||||
|
" Use dark color scheme
|
||||||
|
colorscheme dark
|
||||||
|
|
||||||
|
" Make tridactyl open Vim in my prefered terminal
|
||||||
|
" FIXME: make it follow my prefered terminal
|
||||||
|
set editorcmd termite --class tridactyl_editor -e 'vim %f'
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" Binds {{{
|
||||||
|
" Reddit et al. {{{
|
||||||
|
" Toggle comments on Reddit, Hacker News, Lobste.rs
|
||||||
|
bind ;c hint -c [class*="expand"],[class*="togg"],[class="comment_folder"]
|
||||||
|
|
||||||
|
" Make `gu` take me back to subreddit from comments
|
||||||
|
bindurl reddit.com gu urlparent 3
|
||||||
|
|
||||||
|
" Only hint search results on Google
|
||||||
|
bindurl www.google.com f hint -Jc #search div:not(.action-menu) > a
|
||||||
|
bindurl www.google.com F hint -Jbc #search div:not(.action-menu) > a
|
||||||
|
|
||||||
|
" Only hint search results on DuckDuckGo
|
||||||
|
bindurl ^https://duckduckgo.com f hint -Jc [class~=result__a]
|
||||||
|
bindurl ^https://duckduckgo.com F hint -Jbc [class~=result__a]
|
||||||
|
|
||||||
|
" Only hint item pages on Hacker News
|
||||||
|
bindurl news.ycombinator.com ;f hint -Jc .age > a
|
||||||
|
bindurl news.ycombinator.com ;F hint -Jtc .age > a
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" Better bindings {{{
|
||||||
|
" Handy multiwindow binds
|
||||||
|
bind gd tabdetach
|
||||||
|
bind gD composite tabduplicate; tabdetach
|
||||||
|
|
||||||
|
" Duplicate a tab without detaching window
|
||||||
|
bind <Space>d tabduplicate
|
||||||
|
|
||||||
|
" Make yy use canonical links on the few websites that support them
|
||||||
|
bind yy clipboard yankcanon
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" Search {{{
|
||||||
|
" Case insensitive only if fully lowercase
|
||||||
|
set findcase smart
|
||||||
|
|
||||||
|
" Search forward/backward
|
||||||
|
bind / fillcmdline find
|
||||||
|
bind ? fillcmdline find -?
|
||||||
|
|
||||||
|
" Go to next/previous match
|
||||||
|
bind n findnext 1
|
||||||
|
bind N findnext -1
|
||||||
|
|
||||||
|
" Because :nohls never works
|
||||||
|
bind <Space><Space> nohlsearch
|
||||||
|
|
||||||
|
" Use browser's native find when using Ctrl-F
|
||||||
|
unbind <C-f>
|
||||||
|
" }}}
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" Redirections {{{
|
||||||
|
" Always redirect Reddit to the old site
|
||||||
|
autocmd DocStart ^http(s?)://www.reddit.com js tri.excmds.urlmodify("-t", "www", "old")
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" Disabled websites {{{
|
||||||
|
blacklistadd netflix.com
|
||||||
|
blacklistadd primevideo.com
|
||||||
|
blacklistadd jellyfin.belanyi.fr
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" vim: set filetype=vim foldmethod=marker:
|
13
home/flameshot/default.nix
Normal file
13
home/flameshot/default.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.flameshot;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.flameshot = with lib; {
|
||||||
|
enable = mkEnableOption "flameshot configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config.services.flameshot = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
}
|
44
home/gammastep/default.nix
Normal file
44
home/gammastep/default.nix
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.gammastep;
|
||||||
|
|
||||||
|
mkTempOption = with lib; description: default: mkOption {
|
||||||
|
inherit description default;
|
||||||
|
type = types.int;
|
||||||
|
example = 1000;
|
||||||
|
};
|
||||||
|
|
||||||
|
mkTimeOption = with lib; description: default: mkOption {
|
||||||
|
inherit description default;
|
||||||
|
type = types.str;
|
||||||
|
example = "12:00-14:00";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.gammastep = with lib; {
|
||||||
|
enable = mkEnableOption "gammastep configuration";
|
||||||
|
|
||||||
|
temperature = {
|
||||||
|
day = mkTempOption "Colour temperature to use during the day" 6500;
|
||||||
|
night = mkTempOption "Colour temperature to use during the night" 2000;
|
||||||
|
};
|
||||||
|
|
||||||
|
times = {
|
||||||
|
dawn = mkTimeOption "Dawn time" "6:00-7:30";
|
||||||
|
dusk = mkTimeOption "Dusk time" "18:30-20:00";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.services.gammastep = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
tray = true;
|
||||||
|
|
||||||
|
dawnTime = cfg.times.dawn;
|
||||||
|
duskTime = cfg.times.dusk;
|
||||||
|
|
||||||
|
temperature = {
|
||||||
|
inherit (cfg.temperature) day night;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
42
home/gdb/default.nix
Normal file
42
home/gdb/default.nix
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.gdb;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.gdb = with lib; {
|
||||||
|
enable = my.mkDisableOption "gdb configuration";
|
||||||
|
|
||||||
|
rr = {
|
||||||
|
enable = my.mkDisableOption "rr configuration";
|
||||||
|
|
||||||
|
package = mkOption {
|
||||||
|
type = types.package;
|
||||||
|
default = pkgs.rr;
|
||||||
|
defaultText = literalExample "pkgs.rr";
|
||||||
|
description = ''
|
||||||
|
Package providing rr
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkMerge [
|
||||||
|
(lib.mkIf cfg.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
gdb
|
||||||
|
];
|
||||||
|
|
||||||
|
# FIXME: waiting for commit 64aaad6349d2b2c45063a5383f877ce9a3a0c354
|
||||||
|
xdg.configFile."gdb/gdbinit".source = ./gdbinit;
|
||||||
|
|
||||||
|
# FIXME: remove once `gdb` is updated from version 10.2
|
||||||
|
home.file.".gdbinit".source = ./gdbinit;
|
||||||
|
})
|
||||||
|
|
||||||
|
(lib.mkIf cfg.rr.enable {
|
||||||
|
home.packages = [
|
||||||
|
cfg.rr.package
|
||||||
|
];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
24
home/gdb/gdbinit
Normal file
24
home/gdb/gdbinit
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Keep a history of all commands in each directory
|
||||||
|
set history save on
|
||||||
|
|
||||||
|
# Enable those pretty-printers
|
||||||
|
enable pretty-printer
|
||||||
|
|
||||||
|
# Pretty formatting of structures
|
||||||
|
set print pretty on
|
||||||
|
# Show derived type based on VTable
|
||||||
|
set print object on
|
||||||
|
# Show static members
|
||||||
|
set print static-members on
|
||||||
|
# Show VTable
|
||||||
|
set print vtbl on
|
||||||
|
# Demangle types
|
||||||
|
set print demangle on
|
||||||
|
|
||||||
|
# Read python scrips in the load path
|
||||||
|
set auto-load python-scripts
|
||||||
|
|
||||||
|
# Allow autoloading project-local .gdbinit files
|
||||||
|
set auto-load safe-path ~/git/
|
||||||
|
# Allow autoloading from the Nix store
|
||||||
|
set auto-load safe-path /nix/store
|
|
@ -24,3 +24,7 @@ compile_commands.json
|
||||||
# Swap and backup files
|
# Swap and backup files
|
||||||
*~
|
*~
|
||||||
~.swp
|
~.swp
|
||||||
|
|
||||||
|
# Direnv files
|
||||||
|
.envrc
|
||||||
|
.direnv/
|
||||||
|
|
|
@ -1,34 +1,72 @@
|
||||||
{ config, pkgs, lib, ... }:
|
{ config, pkgs, lib, ... }:
|
||||||
let
|
let
|
||||||
cfg = config.my.home.git;
|
cfg = config.my.home.git;
|
||||||
|
|
||||||
|
inherit (lib.my) mkMailAddress;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.my.home.git = with lib.my; {
|
options.my.home.git = with lib.my; {
|
||||||
enable = mkDisableOption "git configuration";
|
enable = mkDisableOption "git configuration";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
config.home.packages = with pkgs.gitAndTools; lib.mkIf cfg.enable [
|
||||||
|
gitAndTools.git-absorb
|
||||||
|
gitAndTools.git-revise
|
||||||
|
gitAndTools.tig
|
||||||
|
];
|
||||||
|
|
||||||
config.programs.git = lib.mkIf cfg.enable {
|
config.programs.git = lib.mkIf cfg.enable {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
# Who am I?
|
# Who am I?
|
||||||
userEmail = "bruno@belanyi.fr";
|
userEmail = mkMailAddress "bruno" "belanyi.fr";
|
||||||
userName = "Bruno BELANYI";
|
userName = "Bruno BELANYI";
|
||||||
|
|
||||||
# I want the full experience
|
# I want the full experience
|
||||||
package = pkgs.gitAndTools.gitFull;
|
package = pkgs.gitAndTools.gitFull;
|
||||||
|
|
||||||
aliases = {
|
aliases = {
|
||||||
lol = "log --graph --decorate --pretty=oneline --abbrev-commit";
|
git = "!git";
|
||||||
|
lol = "log --graph --decorate --pretty=oneline --abbrev-commit --topo-order";
|
||||||
lola = "lol --all";
|
lola = "lol --all";
|
||||||
assume = "update-index --assume-unchanged";
|
assume = "update-index --assume-unchanged";
|
||||||
unassume = "update-index --no-assume-unchanged";
|
unassume = "update-index --no-assume-unchanged";
|
||||||
assumed = "!git ls-files -v | grep ^h | cut -c 3-";
|
assumed = "!git ls-files -v | grep ^h | cut -c 3-";
|
||||||
|
pick = "log -p -G";
|
||||||
push-new = "!git push -u origin "
|
push-new = "!git push -u origin "
|
||||||
+ ''"$(git branch | grep '^* ' | cut -f2- -d' ')"'';
|
+ ''"$(git branch | grep '^* ' | cut -f2- -d' ')"'';
|
||||||
};
|
};
|
||||||
|
|
||||||
lfs.enable = true;
|
lfs.enable = true;
|
||||||
|
|
||||||
|
delta = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
options = {
|
||||||
|
features = "diff-highlight decorations";
|
||||||
|
|
||||||
|
# Less jarring style for `diff-highlight` emulation
|
||||||
|
diff-highlight = {
|
||||||
|
minus-style = "red";
|
||||||
|
minus-non-emph-style = "red";
|
||||||
|
minus-emph-style = "bold red 52";
|
||||||
|
|
||||||
|
plus-style = "green";
|
||||||
|
plus-non-emph-style = "green";
|
||||||
|
plus-emph-style = "bold green 22";
|
||||||
|
|
||||||
|
whitespace-error-style = "reverse red";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Personal preference for easier reading
|
||||||
|
decorations = {
|
||||||
|
commit-style = "raw"; # Do not recolor meta information
|
||||||
|
keep-plus-minus-markers = true;
|
||||||
|
paging = "always";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
# There's more
|
# There's more
|
||||||
extraConfig = {
|
extraConfig = {
|
||||||
# Makes it a bit more readable
|
# Makes it a bit more readable
|
||||||
|
@ -62,13 +100,6 @@ in
|
||||||
whitespace = "red reverse";
|
whitespace = "red reverse";
|
||||||
};
|
};
|
||||||
|
|
||||||
"color.diff-highlight" = {
|
|
||||||
oldNormal = "red bold";
|
|
||||||
oldHighlight = "red bold 52";
|
|
||||||
newNormal = "green bold";
|
|
||||||
newHighlight = "green bold 22";
|
|
||||||
};
|
|
||||||
|
|
||||||
commit = {
|
commit = {
|
||||||
# Show my changes when writing the message
|
# Show my changes when writing the message
|
||||||
verbose = true;
|
verbose = true;
|
||||||
|
@ -89,16 +120,6 @@ in
|
||||||
defaultBranch = "main";
|
defaultBranch = "main";
|
||||||
};
|
};
|
||||||
|
|
||||||
pager =
|
|
||||||
let
|
|
||||||
diff-highlight = "${pkgs.gitAndTools.gitFull}/share/git/contrib/diff-highlight/diff-highlight";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
diff = "${diff-highlight} | less";
|
|
||||||
log = "${diff-highlight} | less";
|
|
||||||
show = "${diff-highlight} | less";
|
|
||||||
};
|
|
||||||
|
|
||||||
pull = {
|
pull = {
|
||||||
# Avoid useless merge commits
|
# Avoid useless merge commits
|
||||||
rebase = true;
|
rebase = true;
|
||||||
|
@ -114,11 +135,33 @@ in
|
||||||
autoSquash = true;
|
autoSquash = true;
|
||||||
autoStash = true;
|
autoStash = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
url = {
|
||||||
|
"git@gitea.belanyi.fr:" = {
|
||||||
|
insteadOf = "https://gitea.belanyi.fr/";
|
||||||
|
};
|
||||||
|
|
||||||
|
"git@github.com:" = {
|
||||||
|
insteadOf = "https://github.com/";
|
||||||
|
};
|
||||||
|
|
||||||
|
"git@gitlab.com:" = {
|
||||||
|
insteadOf = "https://gitlab.com/";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Multiple identities
|
# Multiple identities
|
||||||
includes = [
|
includes = [
|
||||||
{ path = ./epita.config; condition = "gitdir:~/git/EPITA/"; }
|
{
|
||||||
|
condition = "gitdir:~/git/EPITA/";
|
||||||
|
contents = {
|
||||||
|
user = {
|
||||||
|
name = "Bruno BELANYI";
|
||||||
|
email = mkMailAddress "bruno.belanyi" "epita.fr";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
ignores =
|
ignores =
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[user]
|
|
||||||
email = bruno.belanyi@epita.fr
|
|
||||||
name = Bruno BELANYI
|
|
||||||
# vim: set ft=gitconfig:
|
|
|
@ -3,8 +3,15 @@ let
|
||||||
cfg = config.my.home.gpg;
|
cfg = config.my.home.gpg;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.my.home.gpg = with lib.my; {
|
options.my.home.gpg = with lib; {
|
||||||
enable = mkDisableOption "gpg configuration";
|
enable = my.mkDisableOption "gpg configuration";
|
||||||
|
|
||||||
|
pinentry = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "tty";
|
||||||
|
example = "gtk2";
|
||||||
|
description = "Which pinentry interface to use";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
|
@ -15,7 +22,7 @@ in
|
||||||
services.gpg-agent = {
|
services.gpg-agent = {
|
||||||
enable = true;
|
enable = true;
|
||||||
enableSshSupport = true; # One agent to rule them all
|
enableSshSupport = true; # One agent to rule them all
|
||||||
pinentryFlavor = "tty";
|
pinentryFlavor = cfg.pinentry;
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
allow-loopback-pinentry
|
allow-loopback-pinentry
|
||||||
'';
|
'';
|
33
home/gtk/default.nix
Normal file
33
home/gtk/default.nix
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.gtk;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.gtk = with lib; {
|
||||||
|
enable = mkEnableOption "GTK configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config.gtk = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
font = {
|
||||||
|
package = pkgs.dejavu_fonts;
|
||||||
|
name = "DejaVu Sans";
|
||||||
|
};
|
||||||
|
|
||||||
|
gtk2 = {
|
||||||
|
# That sweet, sweet clean home that I am always aiming for...
|
||||||
|
configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc";
|
||||||
|
};
|
||||||
|
|
||||||
|
iconTheme = {
|
||||||
|
package = pkgs.gnome.gnome-themes-extra;
|
||||||
|
name = "Adwaita";
|
||||||
|
};
|
||||||
|
|
||||||
|
theme = {
|
||||||
|
package = pkgs.gnome.gnome-themes-extra;
|
||||||
|
name = "Adwaita";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
105
home/mail/accounts/default.nix
Normal file
105
home/mail/accounts/default.nix
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.mail;
|
||||||
|
|
||||||
|
inherit (lib.my) mkMailAddress;
|
||||||
|
|
||||||
|
mkConfig = { domain, address, passName, aliases ? [ ], primary ? false }: {
|
||||||
|
realName = lib.mkDefault "Bruno BELANYI";
|
||||||
|
userName = lib.mkDefault (mkMailAddress address domain);
|
||||||
|
passwordCommand =
|
||||||
|
lib.mkDefault [ "${pkgs.ambroisie.bw-pass}/bin/bw-pass" "Mail" passName ];
|
||||||
|
|
||||||
|
address = mkMailAddress address domain;
|
||||||
|
aliases = builtins.map (lib.flip mkMailAddress domain) aliases;
|
||||||
|
|
||||||
|
inherit primary;
|
||||||
|
|
||||||
|
himalaya = {
|
||||||
|
enable = cfg.himalaya.enable;
|
||||||
|
};
|
||||||
|
|
||||||
|
msmtp = {
|
||||||
|
enable = cfg.msmtp.enable;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
migaduConfig = {
|
||||||
|
imap = {
|
||||||
|
host = "imap.migadu.com";
|
||||||
|
port = 993;
|
||||||
|
tls = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
smtp = {
|
||||||
|
host = "smtp.migadu.com";
|
||||||
|
port = 465;
|
||||||
|
tls = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gmailConfig = {
|
||||||
|
flavor = "gmail.com";
|
||||||
|
folders = {
|
||||||
|
drafts = "[Gmail]/Drafts";
|
||||||
|
sent = "[Gmail]/Sent Mail";
|
||||||
|
trash = "[Gmail]/Trash";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
office365Config = {
|
||||||
|
imap = {
|
||||||
|
host = "outlook.office365.com";
|
||||||
|
port = 993;
|
||||||
|
tls = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
smtp = {
|
||||||
|
host = "outlook.office365.com";
|
||||||
|
port = 587;
|
||||||
|
tls = {
|
||||||
|
enable = true;
|
||||||
|
useStartTls = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config.accounts.email.accounts = {
|
||||||
|
personal = lib.mkMerge [
|
||||||
|
# Common configuraton
|
||||||
|
(mkConfig {
|
||||||
|
domain = "belanyi.fr";
|
||||||
|
address = "bruno";
|
||||||
|
passName = "Migadu";
|
||||||
|
aliases = [ "admin" "postmaster" ];
|
||||||
|
primary = true; # This is my primary email
|
||||||
|
})
|
||||||
|
migaduConfig
|
||||||
|
];
|
||||||
|
|
||||||
|
gmail = lib.mkMerge [
|
||||||
|
# Common configuraton
|
||||||
|
(mkConfig {
|
||||||
|
domain = "gmail.com";
|
||||||
|
address = "brunobelanyi";
|
||||||
|
passName = "GMail";
|
||||||
|
})
|
||||||
|
gmailConfig
|
||||||
|
];
|
||||||
|
|
||||||
|
epita = lib.mkMerge [
|
||||||
|
# Common configuration
|
||||||
|
(mkConfig {
|
||||||
|
domain = "epita.fr";
|
||||||
|
address = "bruno.belanyi";
|
||||||
|
passName = "EPITA";
|
||||||
|
})
|
||||||
|
office365Config
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
31
home/mail/default.nix
Normal file
31
home/mail/default.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.mail;
|
||||||
|
|
||||||
|
mkRelatedOption = desc: lib.mkEnableOption desc // { default = cfg.enable; };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./accounts
|
||||||
|
./himalaya
|
||||||
|
./msmtp
|
||||||
|
];
|
||||||
|
|
||||||
|
options.my.home.mail = with lib; {
|
||||||
|
enable = my.mkDisableOption "email configuration";
|
||||||
|
|
||||||
|
himalaya = {
|
||||||
|
enable = mkRelatedOption "himalaya configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
msmtp = {
|
||||||
|
enable = mkRelatedOption "msmtp configuration";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
accounts.email = {
|
||||||
|
maildirBasePath = "mail";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
23
home/mail/himalaya/default.nix
Normal file
23
home/mail/himalaya/default.nix
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.mail.himalaya;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config.programs.himalaya = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
notify-cmd =
|
||||||
|
let
|
||||||
|
notify-send = "${pkgs.libnotify}/bin/notify-send";
|
||||||
|
in
|
||||||
|
pkgs.writeScript "mail-notifier" ''
|
||||||
|
SENDER="$1"
|
||||||
|
SUBJECT="$2"
|
||||||
|
${notify-send} \
|
||||||
|
-c himalaya \
|
||||||
|
-- "$(printf 'Received email from %s\n\n%s' "$SENDER" "$SUBJECT")"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
9
home/mail/msmtp/default.nix
Normal file
9
home/mail/msmtp/default.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.mail.msmtp;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config.programs.msmtp = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
}
|
19
home/mpv/default.nix
Normal file
19
home/mpv/default.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.mpv;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.mpv = with lib; {
|
||||||
|
enable = mkEnableOption "mpv configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.mpv = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
scripts = [
|
||||||
|
pkgs.mpvScripts.mpris # Allow controlling using media keys
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
13
home/nix-index/default.nix
Normal file
13
home/nix-index/default.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.nix-index;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.nix-index = with lib.my; {
|
||||||
|
enable = mkDisableOption "nix-index configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config.programs.nix-index = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
}
|
13
home/nm-applet/default.nix
Normal file
13
home/nm-applet/default.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.nm-applet;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.nm-applet = with lib; {
|
||||||
|
enable = mkEnableOption "network-manager-applet configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config.services.network-manager-applet = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,20 +0,0 @@
|
||||||
{ config, lib, pkgs, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.my.home.packages;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.my.home.packages = with lib.my; {
|
|
||||||
enable = mkDisableOption "user packages";
|
|
||||||
};
|
|
||||||
|
|
||||||
config.home.packages = with pkgs; lib.mkIf cfg.enable [
|
|
||||||
# Git related
|
|
||||||
gitAndTools.git-absorb
|
|
||||||
gitAndTools.git-revise
|
|
||||||
gitAndTools.tig
|
|
||||||
# Dev work
|
|
||||||
rr
|
|
||||||
# Terminal prettiness
|
|
||||||
termite.terminfo
|
|
||||||
];
|
|
||||||
}
|
|
28
home/packages/default.nix
Normal file
28
home/packages/default.nix
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.packages;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.packages = with lib; {
|
||||||
|
enable = my.mkDisableOption "user packages";
|
||||||
|
|
||||||
|
additionalPackages = mkOption {
|
||||||
|
type = with types; listOf package;
|
||||||
|
default = [ ];
|
||||||
|
example = literalExample ''
|
||||||
|
with pkgs; [
|
||||||
|
quasselClient
|
||||||
|
]
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.home.packages = with pkgs; lib.mkIf cfg.enable ([
|
||||||
|
fd
|
||||||
|
file
|
||||||
|
mosh
|
||||||
|
ripgrep
|
||||||
|
rr
|
||||||
|
termite.terminfo
|
||||||
|
] ++ cfg.additionalPackages);
|
||||||
|
}
|
|
@ -1,18 +0,0 @@
|
||||||
{ config, lib, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.my.home.pager;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.my.home.pager = with lib.my; {
|
|
||||||
enable = mkDisableOption "pager configuration";
|
|
||||||
};
|
|
||||||
|
|
||||||
config.programs.lesspipe.enable = cfg.enable;
|
|
||||||
|
|
||||||
config.home.sessionVariables = lib.mkIf cfg.enable {
|
|
||||||
# My default pager
|
|
||||||
PAGER = "less";
|
|
||||||
# Clear the screen on start and exit
|
|
||||||
LESS = "-R -+X -c";
|
|
||||||
};
|
|
||||||
}
|
|
36
home/pager/default.nix
Normal file
36
home/pager/default.nix
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.pager;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.pager = with lib.my; {
|
||||||
|
enable = mkDisableOption "pager configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.sessionVariables = {
|
||||||
|
# My default pager
|
||||||
|
PAGER = "less";
|
||||||
|
# Clear the screen on start and exit
|
||||||
|
LESS = "-R -+X -c";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.zsh.localVariables = {
|
||||||
|
# Colored man pages
|
||||||
|
LESS_TERMCAP_mb = "$(tput bold; tput setaf 2)";
|
||||||
|
LESS_TERMCAP_md = "$(tput bold; tput setaf 6)";
|
||||||
|
LESS_TERMCAP_me = "$(tput sgr0)";
|
||||||
|
LESS_TERMCAP_so = "$(tput bold; tput setaf 3; tput setab 4)";
|
||||||
|
LESS_TERMCAP_se = "$(tput rmso; tput sgr0)";
|
||||||
|
LESS_TERMCAP_us = "$(tput bold; tput setaf 2)";
|
||||||
|
LESS_TERMCAP_ue = "$(tput rmul; tput sgr0)";
|
||||||
|
LESS_TERMCAP_mr = "$(tput rev)";
|
||||||
|
LESS_TERMCAP_mh = "$(tput dim)";
|
||||||
|
LESS_TERMCAP_ZN = "$(tput ssubm)";
|
||||||
|
LESS_TERMCAP_ZV = "$(tput rsubm)";
|
||||||
|
LESS_TERMCAP_ZO = "$(tput ssupm)";
|
||||||
|
LESS_TERMCAP_ZW = "$(tput rsupm)";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
15
home/power-alert/default.nix
Normal file
15
home/power-alert/default.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.power-alert;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.power-alert = with lib; {
|
||||||
|
enable = mkEnableOption "power-alert configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.poweralertd = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
3
home/secrets/.gitattributes
vendored
3
home/secrets/.gitattributes
vendored
|
@ -1,3 +0,0 @@
|
||||||
* filter=git-crypt diff=git-crypt
|
|
||||||
.gitattributes !filter !diff
|
|
||||||
/default.nix !filter !diff
|
|
Binary file not shown.
|
@ -1,19 +0,0 @@
|
||||||
{ lib, ... }:
|
|
||||||
|
|
||||||
with lib;
|
|
||||||
let
|
|
||||||
canaryHash = builtins.hashFile "sha256" ./canary;
|
|
||||||
expectedHash =
|
|
||||||
"9df8c065663197b5a1095122d48e140d3677d860343256abd5ab6e4fb4c696ab";
|
|
||||||
in
|
|
||||||
if canaryHash != expectedHash then
|
|
||||||
abort "Secrets are not readable. Have you run `git-crypt unlock`?"
|
|
||||||
else {
|
|
||||||
options.my.secrets = mkOption {
|
|
||||||
type = types.attrs;
|
|
||||||
};
|
|
||||||
|
|
||||||
config.my.secrets = {
|
|
||||||
# Home-manager secrets go here
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -7,7 +7,7 @@ in
|
||||||
enable = mkDisableOption "ssh configuration";
|
enable = mkDisableOption "ssh configuration";
|
||||||
};
|
};
|
||||||
|
|
||||||
config.programs.ssh = {
|
config.programs.ssh = lib.mkIf cfg.enable {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
matchBlocks = {
|
matchBlocks = {
|
||||||
|
@ -40,6 +40,12 @@ in
|
||||||
identityFile = "~/.ssh/shared_rsa";
|
identityFile = "~/.ssh/shared_rsa";
|
||||||
user = "ambroisie";
|
user = "ambroisie";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
work = {
|
||||||
|
hostname = "workspaces.dgexsol.fr";
|
||||||
|
identityFile = "~/.ssh/shared_rsa";
|
||||||
|
user = "bruno_belanyi";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
extraConfig = ''
|
extraConfig = ''
|
61
home/terminal/default.nix
Normal file
61
home/terminal/default.nix
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
mkColorOption = with lib; description: default: mkOption {
|
||||||
|
inherit description default;
|
||||||
|
example = "#abcdef";
|
||||||
|
type = types.strMatching "#[0-9a-f]{6}";
|
||||||
|
};
|
||||||
|
|
||||||
|
cfg = config.my.home.terminal;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./termite
|
||||||
|
];
|
||||||
|
|
||||||
|
options.my.home = with lib; {
|
||||||
|
terminal = {
|
||||||
|
program = mkOption {
|
||||||
|
type = with types; nullOr (enum [ "termite" ]);
|
||||||
|
default = null;
|
||||||
|
example = "termite";
|
||||||
|
description = "Which terminal to use for home session";
|
||||||
|
};
|
||||||
|
|
||||||
|
colors = {
|
||||||
|
background = mkColorOption "Background color" "#161616";
|
||||||
|
foreground = mkColorOption "Foreground color" "#ffffff";
|
||||||
|
foregroundBold = mkColorOption "Foreground bold color" "#ffffff";
|
||||||
|
cursor = mkColorOption "Cursor color" "#ffffff";
|
||||||
|
|
||||||
|
black = mkColorOption "Black" "#222222";
|
||||||
|
blackBold = mkColorOption "Black bold" "#666666";
|
||||||
|
|
||||||
|
red = mkColorOption "Red" "#e84f4f";
|
||||||
|
redBold = mkColorOption "Red bold" "#d23d3d";
|
||||||
|
|
||||||
|
green = mkColorOption "Green" "#b7ce42";
|
||||||
|
greenBold = mkColorOption "Green bold" "#bde077";
|
||||||
|
|
||||||
|
yellow = mkColorOption "Yellow" "#fea63c";
|
||||||
|
yellowBold = mkColorOption "Yellow bold" "#ffe863";
|
||||||
|
|
||||||
|
blue = mkColorOption "Blue" "#66aabb";
|
||||||
|
blueBold = mkColorOption "Blue bold" "#aaccbb";
|
||||||
|
|
||||||
|
magenta = mkColorOption "Magenta" "#b7416e";
|
||||||
|
magentaBold = mkColorOption "Magenta bold" "#e16a98";
|
||||||
|
|
||||||
|
cyan = mkColorOption "Cyan" "#6d878d";
|
||||||
|
cyanBold = mkColorOption "Cyan bold" "#42717b";
|
||||||
|
|
||||||
|
white = mkColorOption "White" "#dddddd";
|
||||||
|
whiteBold = mkColorOption "White bold" "#cccccc";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.home.sessionVariables = lib.mkIf (cfg.program != null) {
|
||||||
|
TERMINAL = cfg.program;
|
||||||
|
};
|
||||||
|
}
|
53
home/terminal/termite/default.nix
Normal file
53
home/terminal/termite/default.nix
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.terminal;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf (cfg.program == "termite") {
|
||||||
|
programs.termite = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
# Niceties
|
||||||
|
browser = "${pkgs.xdg-utils}/bin/xdg-open";
|
||||||
|
clickableUrl = true;
|
||||||
|
dynamicTitle = true;
|
||||||
|
fullscreen = false;
|
||||||
|
mouseAutohide = true;
|
||||||
|
urgentOnBell = true;
|
||||||
|
|
||||||
|
# Look and feel
|
||||||
|
allowBold = true;
|
||||||
|
audibleBell = false;
|
||||||
|
cursorBlink = "system";
|
||||||
|
font = "Monospace 9";
|
||||||
|
scrollbar = "off";
|
||||||
|
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
backgroundColor = cfg.colors.background;
|
||||||
|
cursorColor = cfg.colors.cursor;
|
||||||
|
foregroundColor = cfg.colors.foreground;
|
||||||
|
foregroundBoldColor = cfg.colors.foregroundBold;
|
||||||
|
colorsExtra = with cfg.colors; ''
|
||||||
|
# Normal colors
|
||||||
|
color0 = ${black}
|
||||||
|
color1 = ${red}
|
||||||
|
color2 = ${green}
|
||||||
|
color3 = ${yellow}
|
||||||
|
color4 = ${blue}
|
||||||
|
color5 = ${magenta}
|
||||||
|
color6 = ${cyan}
|
||||||
|
color7 = ${white}
|
||||||
|
# Bold colors
|
||||||
|
color8 = ${blackBold}
|
||||||
|
color9 = ${redBold}
|
||||||
|
color10 = ${greenBold}
|
||||||
|
color11 = ${yellowBold}
|
||||||
|
color12 = ${blueBold}
|
||||||
|
color13 = ${magentaBold}
|
||||||
|
color14 = ${cyanBold}
|
||||||
|
color15 = ${whiteBold}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
let
|
let
|
||||||
cfg = config.my.home.tmux;
|
cfg = config.my.home.tmux;
|
||||||
|
hasGUI = config.my.home.x.enable || (config.my.home.wm != null);
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.my.home.tmux = with lib.my; {
|
options.my.home.tmux = with lib.my; {
|
||||||
|
@ -13,7 +14,7 @@ in
|
||||||
keyMode = "vi"; # Home-row keys and other niceties
|
keyMode = "vi"; # Home-row keys and other niceties
|
||||||
clock24 = true; # I'm one of those heathens
|
clock24 = true; # I'm one of those heathens
|
||||||
escapeTime = 0; # Let vim do its thing instead
|
escapeTime = 0; # Let vim do its thing instead
|
||||||
historyLimit = 5000; # Bigger buffer
|
historyLimit = 50000; # Bigger buffer
|
||||||
terminal = "tmux-256color"; # I want accurate termcap info
|
terminal = "tmux-256color"; # I want accurate termcap info
|
||||||
|
|
||||||
plugins = with pkgs.tmuxPlugins; [
|
plugins = with pkgs.tmuxPlugins; [
|
||||||
|
@ -23,8 +24,16 @@ in
|
||||||
pain-control
|
pain-control
|
||||||
# Better session management
|
# Better session management
|
||||||
sessionist
|
sessionist
|
||||||
# X clipboard integration
|
(lib.optionalAttrs hasGUI {
|
||||||
yank
|
# X clipboard integration
|
||||||
|
plugin = yank;
|
||||||
|
extraConfig = ''
|
||||||
|
# Use 'clipboard' because of misbehaving apps (e.g: firefox)
|
||||||
|
set -g @yank_selection_mouse 'clipboard'
|
||||||
|
# Stay in copy mode after yanking
|
||||||
|
set -g @yank_action 'copy-pipe'
|
||||||
|
'';
|
||||||
|
})
|
||||||
{
|
{
|
||||||
# Show when prefix has been pressed
|
# Show when prefix has been pressed
|
||||||
plugin = prefix-highlight;
|
plugin = prefix-highlight;
|
||||||
|
@ -41,7 +50,13 @@ in
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
# Better vim mode
|
# Better vim mode
|
||||||
bind-key -T copy-mode-vi 'v' send -X begin-selection
|
bind-key -T copy-mode-vi 'v' send -X begin-selection
|
||||||
bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel
|
${
|
||||||
|
lib.optionalString
|
||||||
|
(!hasGUI)
|
||||||
|
"bind-key -T copy-mode-vi 'y' send -X copy-selection"
|
||||||
|
}
|
||||||
|
# Block selection in vim mode
|
||||||
|
bind-key -Tcopy-mode-vi 'C-v' send -X begin-selection \; send -X rectangle-toggle
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
}
|
}
|
13
home/udiskie/default.nix
Normal file
13
home/udiskie/default.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.udiskie;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.my.home.udiskie = with lib; {
|
||||||
|
enable = mkEnableOption "udiskie configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
config.services.udiskie = lib.mkIf cfg.enable {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,14 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
||||||
|
|
||||||
" Use shfmt as ALE fixer for bash
|
|
||||||
let b:ale_fixers=[ 'shfmt' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_fixers'
|
|
||||||
|
|
||||||
" Indent with 4 spaces, simplify script, indent switch cases, use Bash variant
|
|
||||||
let b:ale_sh_shfmt_options='-i 4 -s -ci -ln bash'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_sh_shfmt_options'
|
|
||||||
|
|
||||||
" Use bash dialect explicitly, require explicit empty string test
|
|
||||||
let b:ale_sh_shellcheck_options='-s bash -o avoid-nullary-conditions'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_sh_shellcheck_options'
|
|
|
@ -7,7 +7,3 @@ let b:undo_ftplugin.='|setlocal shiftwidth<'
|
||||||
|
|
||||||
" Have automatic padding of transactions so that decimal is on 52nd column
|
" Have automatic padding of transactions so that decimal is on 52nd column
|
||||||
let g:beancount_separator_col=52
|
let g:beancount_separator_col=52
|
||||||
|
|
||||||
" Automatic padding for transactions
|
|
||||||
nnoremap <buffer> <leader>= :AlignCommodity<CR>
|
|
||||||
vnoremap <buffer> <leader>= :AlignCommodity<CR>
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
||||||
|
|
||||||
" More warnings and the usual version in flags for Clang
|
|
||||||
let b:ale_c_clang_options='-Wall -Wextra -pedantic -std=c99'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_c_clang_options'
|
|
||||||
|
|
||||||
" More warnings and the usual version in flags for GCC
|
|
||||||
let b:ale_c_gcc_options='-Wall -Wextra -pedantic -std=c99'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_c_gcc_options'
|
|
||||||
|
|
||||||
" Use compile_commands.json to look for additional flags
|
|
||||||
let b:ale_c_parse_compile_commands=1
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_c_parse_compile_commands'
|
|
|
@ -1,14 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
||||||
|
|
||||||
" More warnings and the usual version in flags for Clang
|
|
||||||
let b:ale_cpp_clang_options='-Wall -Wextra -pedantic -std=c++17'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_cpp_clang_options'
|
|
||||||
|
|
||||||
" More warnings and the usual version in flags for GCC
|
|
||||||
let b:ale_cpp_gcc_options='-Wall -Wextra -pedantic -std=c++17'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_cpp_gcc_options'
|
|
||||||
|
|
||||||
" Use compile_commands.json to look for additional flags
|
|
||||||
let b:ale_c_parse_compile_commands=1
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_c_parse_compile_commands'
|
|
|
@ -1,6 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
||||||
|
|
||||||
" Use my desired ALE fixer for D
|
|
||||||
let b:ale_fixers=[ 'dfmt' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_fixers'
|
|
|
@ -1,2 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
|
@ -5,26 +5,6 @@ call ftplugined#check_undo_ft()
|
||||||
setlocal shiftwidth=2
|
setlocal shiftwidth=2
|
||||||
let b:undo_ftplugin.='|setlocal shiftwidth<'
|
let b:undo_ftplugin.='|setlocal shiftwidth<'
|
||||||
|
|
||||||
" Use my desired ALE fixers for Haskell
|
|
||||||
let b:ale_fixers=[ 'brittany' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_fixers'
|
|
||||||
|
|
||||||
" Use stack-managed `hlint`
|
|
||||||
let b:ale_haskell_hlint_executable='stack'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_haskell_hlint_executable'
|
|
||||||
|
|
||||||
" Use stack-managed `brittany`
|
|
||||||
let b:ale_haskell_brittany_executable='stack'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_haskell_brittany_executable'
|
|
||||||
|
|
||||||
" Use dynamic libraries because of Arch linux, with default ALE options
|
|
||||||
let b:ale_haskell_ghc_options='--dynamic -fno-code -v0'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_haskell_ghc_options'
|
|
||||||
|
|
||||||
" Automatically format files when saving them
|
|
||||||
let b:ale_fix_on_save=1
|
|
||||||
let b:undo_ftplugin='|unlet! b:ale_lint_on_save'
|
|
||||||
|
|
||||||
" Change max length of a line to 100 for this buffer to match official guidelines
|
" Change max length of a line to 100 for this buffer to match official guidelines
|
||||||
setlocal colorcolumn=100
|
setlocal colorcolumn=100
|
||||||
let b:undo_ftplugin.='|setlocal colorcolumn<'
|
let b:undo_ftplugin.='|setlocal colorcolumn<'
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
||||||
|
|
||||||
" Use my desired ALE fixer for JSON
|
|
||||||
let b:ale_fixers=[ 'jq' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_fixers'
|
|
|
@ -1,10 +1,6 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
||||||
call ftplugined#check_undo_ft()
|
call ftplugined#check_undo_ft()
|
||||||
|
|
||||||
" Let ALE know that I want Markdown linters
|
|
||||||
let b:ale_linter_aliases=[ 'markdown' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_linter_aliases'
|
|
||||||
|
|
||||||
" Use a small indentation value on Pandoc files
|
" Use a small indentation value on Pandoc files
|
||||||
setlocal shiftwidth=2
|
setlocal shiftwidth=2
|
||||||
let b:undo_ftplugin.='|setlocal shiftwidth<'
|
let b:undo_ftplugin.='|setlocal shiftwidth<'
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
||||||
|
|
||||||
" Use my desired ALE fixers for python
|
|
||||||
let b:ale_fixers=[ 'black', 'isort' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_fixers'
|
|
||||||
" Use my desired ALE linters for python
|
|
||||||
let b:ale_linters=[ 'flake8', 'mypy', 'pylint', 'pyls' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_linters'
|
|
||||||
|
|
||||||
" Use pyls inside the python environment if needed
|
|
||||||
let b:ale_python_pyls_auto_pipenv=1
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_python_pyls_auto_pipenv'
|
|
||||||
|
|
||||||
" Disable pycodestyle checks from pyls because I'm already using flake8
|
|
||||||
let b:ale_python_pyls_config={
|
|
||||||
\ 'pyls': {
|
|
||||||
\ 'plugins': {
|
|
||||||
\ 'pycodestyle': {
|
|
||||||
\ 'enabled': v:false
|
|
||||||
\ },
|
|
||||||
\ },
|
|
||||||
\ },
|
|
||||||
\ }
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_python_pyls_config'
|
|
||||||
|
|
||||||
" Don't use mypy to check for syntax errors
|
|
||||||
let b:ale_python_mypy_ignore_invalid_syntax=1
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_python_mypy_ignore_invalid_syntax'
|
|
||||||
" Use mypy inside the python environment if needed
|
|
||||||
let b:ale_python_mypy_auto_pipenv=1
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_python_mypy_auto_pipenv'
|
|
||||||
|
|
||||||
" Automatically format files when saving them
|
|
||||||
let b:ale_fix_on_save=1
|
|
||||||
let b:undo_ftplugin='|unlet! b:ale_lint_on_save'
|
|
||||||
|
|
||||||
" Change max length of a line to 88 for this buffer to match black's settings
|
|
||||||
setlocal colorcolumn=88
|
|
||||||
let b:undo_ftplugin.='|setlocal colorcolumn<'
|
|
|
@ -1,8 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
||||||
|
|
||||||
" Use h/l to go to the previous/next non-empty quickfix or location list
|
|
||||||
nnoremap <silent> <buffer> h :call quickfixed#older()<CR>
|
|
||||||
let b:undo_ftplugin.='|nunmap <buffer> h'
|
|
||||||
nnoremap <silent> <buffer> l :call quickfixed#newer()<CR>
|
|
||||||
let b:undo_ftplugin.='|nunmap <buffer> l'
|
|
|
@ -1,31 +1,6 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
||||||
call ftplugined#check_undo_ft()
|
call ftplugined#check_undo_ft()
|
||||||
|
|
||||||
" Check tests too
|
|
||||||
let b:ale_rust_cargo_check_tests=1
|
|
||||||
let b:undo_ftplugin='|unlet! b:ale_rust_cargo_check_tests'
|
|
||||||
|
|
||||||
" Check examples too
|
|
||||||
let b:ale_rust_cargo_check_examples=1
|
|
||||||
let b:undo_ftplugin='|unlet! b:ale_rust_cargo_check_examples'
|
|
||||||
|
|
||||||
" Use clippy if it's available instead of just cargo check
|
|
||||||
let b:ale_rust_cargo_use_clippy=executable('cargo-clippy')
|
|
||||||
let b:undo_ftplugin='|unlet! b:ale_rust_cargo_use_clippy'
|
|
||||||
|
|
||||||
" Use rust-analyzer instead of RLS as a linter
|
|
||||||
let b:ale_linters=[ 'cargo', 'analyzer' ]
|
|
||||||
let b:undo_ftplugin='|unlet! b:ale_linters'
|
|
||||||
|
|
||||||
|
|
||||||
" Use rustfmt as ALE fixer for rust
|
|
||||||
let b:ale_fixers=[ 'rustfmt' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_fixers'
|
|
||||||
|
|
||||||
" Automatically format files when saving them
|
|
||||||
let b:ale_fix_on_save=1
|
|
||||||
let b:undo_ftplugin='|unlet! b:ale_lint_on_save'
|
|
||||||
|
|
||||||
" Change max length of a line to 99 for this buffer to match official guidelines
|
" Change max length of a line to 99 for this buffer to match official guidelines
|
||||||
setlocal colorcolumn=99
|
setlocal colorcolumn=99
|
||||||
let b:undo_ftplugin.='|setlocal colorcolumn<'
|
let b:undo_ftplugin.='|setlocal colorcolumn<'
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
||||||
|
|
||||||
" Use shfmt as ALE fixer for sh
|
|
||||||
let b:ale_fixers=[ 'shfmt' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_fixers'
|
|
||||||
|
|
||||||
" Indent with 4 spaces, simplify the code, indent switch cases, use POSIX
|
|
||||||
let b:ale_sh_shfmt_options='-i 4 -s -ci -ln posix'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_sh_shfmt_options'
|
|
||||||
|
|
||||||
" Require explicit empty string test
|
|
||||||
let b:ale_sh_shellcheck_options='-o avoid-nullary-conditions'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_sh_shellcheck_options'
|
|
|
@ -1,14 +0,0 @@
|
||||||
" Create the `b:undo_ftplugin` variable if it doesn't exist
|
|
||||||
call ftplugined#check_undo_ft()
|
|
||||||
|
|
||||||
" Use shfmt as ALE fixer for zsh
|
|
||||||
let b:ale_fixers=[ 'shfmt' ]
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_fixers'
|
|
||||||
|
|
||||||
" Indent with 4 spaces, simplify script, indent switch cases, use Bash variant
|
|
||||||
let b:ale_sh_shfmt_options='-i 4 -s -ci -ln bash'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_sh_shfmt_options'
|
|
||||||
|
|
||||||
" Use bash dialect explicitly, require explicit empty string test
|
|
||||||
let b:ale_sh_shellcheck_options='-s bash -o avoid-nullary-conditions'
|
|
||||||
let b:undo_ftplugin.='|unlet! b:ale_sh_shellcheck_options'
|
|
|
@ -1,2 +0,0 @@
|
||||||
" Use ALE LSP-powered symbol information
|
|
||||||
nnoremap <Leader>K :ALEHover<CR>
|
|
12
home/vim/after/plugin/mappings/commentary.vim
Normal file
12
home/vim/after/plugin/mappings/commentary.vim
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
lua << EOF
|
||||||
|
local wk = require("which-key")
|
||||||
|
|
||||||
|
local keys = {
|
||||||
|
name = "Comment/uncomment",
|
||||||
|
c = "Current line",
|
||||||
|
u = "Uncomment the current and adjacent commented lines",
|
||||||
|
["gc"] = "Uncomment the current and adjacent commented lines",
|
||||||
|
}
|
||||||
|
|
||||||
|
wk.register(keys, { prefix = "gc" })
|
||||||
|
EOF
|
|
@ -1,10 +0,0 @@
|
||||||
" Visual bindings for merging diffs as in normal mode
|
|
||||||
xnoremap dp :diffput<cr>
|
|
||||||
xnoremap do :diffget<cr>
|
|
||||||
|
|
||||||
" Open status window
|
|
||||||
nnoremap <Leader>gs :Gstatus<CR>
|
|
||||||
" Open diff view of current buffer: the up/left window is the current index
|
|
||||||
nnoremap <Leader>gd :Gdiffsplit!<CR>
|
|
||||||
" Open current file log in new tab, populate its location list with history
|
|
||||||
nnoremap <Leader>gl :sp<CR><C-w>T:Gllog --follow -- %:p<CR>
|
|
|
@ -1,38 +0,0 @@
|
||||||
" Only git-tracked files, Vim needs to be in a Git repository
|
|
||||||
nnoremap <Leader>fg :GFiles<CR>
|
|
||||||
|
|
||||||
" All files
|
|
||||||
nnoremap <Leader>ff :Files<CR>
|
|
||||||
|
|
||||||
" Currently open buffers
|
|
||||||
nnoremap <Leader>fb :Buffers<CR>
|
|
||||||
|
|
||||||
" Buffer history
|
|
||||||
nnoremap <Leader>fh :History<CR>
|
|
||||||
|
|
||||||
" Tags in buffer
|
|
||||||
nnoremap <Leader>ft :BTags<CR>
|
|
||||||
|
|
||||||
" Tags in all project files
|
|
||||||
nnoremap <Leader>fT :Tags<CR>
|
|
||||||
|
|
||||||
" Snippets for the current fileytpe (using Ultisnips)
|
|
||||||
nnoremap <Leader>fs :Snippets<CR>
|
|
||||||
|
|
||||||
" All available commands
|
|
||||||
nnoremap <Leader>f: :Commands<CR>
|
|
||||||
|
|
||||||
" All commits (using fugitive)
|
|
||||||
nnoremap <Leader>fc :Commits<CR>
|
|
||||||
|
|
||||||
" All commits for the current buffer (using fugitive)
|
|
||||||
nnoremap <Leader>fC :BCommits<CR>
|
|
||||||
|
|
||||||
" Select normal mode mapping by searching for its name
|
|
||||||
nmap <Leader><Tab> <Plug>(fzf-maps-n)
|
|
||||||
|
|
||||||
" Select visual mode mapping by searching for its name
|
|
||||||
xmap <Leader><Tab> <Plug>(fzf-maps-x)
|
|
||||||
|
|
||||||
" Select operator pending mode mapping by searching for its name
|
|
||||||
omap <Leader><Tab> <Plug>(fzf-maps-o)
|
|
|
@ -1,8 +1,9 @@
|
||||||
" Yank until the end of line with Y, to be more consistent with D and C
|
lua << EOF
|
||||||
nnoremap Y y$
|
local wk = require("which-key")
|
||||||
|
|
||||||
" Run make silently, then skip the 'Press ENTER to continue'
|
local keys = {
|
||||||
noremap <Leader>m :silent! :make! \| :redraw!<CR>
|
["<leader>"] = { "<cmd>nohls<CR>", "Clear search highlight" },
|
||||||
|
}
|
||||||
|
|
||||||
" Remove search-highlighting
|
wk.register(keys, { prefix = "<leader>" })
|
||||||
noremap <Leader><Leader> :nohls<CR>
|
EOF
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
" Next and previous in quick-fix list
|
|
||||||
nmap <Leader>fn <Plug>(qf_qf_next)
|
|
||||||
nmap <Leader>fp <Plug>(qf_qf_previous)
|
|
||||||
|
|
||||||
" Next and previous in location list
|
|
||||||
nmap <Leader>ln <Plug>(qf_loc_next)
|
|
||||||
nmap <Leader>lp <Plug>(qf_loc_previous)
|
|
||||||
|
|
||||||
" Toggle quick-fix and location lists
|
|
||||||
nmap <Leader>tf <Plug>(qf_qf_toggle)
|
|
||||||
nmap <Leader>tl <Plug>(qf_loc_toggle)
|
|
20
home/vim/after/plugin/mappings/telescope.vim
Normal file
20
home/vim/after/plugin/mappings/telescope.vim
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
lua << EOF
|
||||||
|
local wk = require("which-key")
|
||||||
|
local telescope = require("telescope")
|
||||||
|
local telescope_builtin = require("telescope.builtin")
|
||||||
|
|
||||||
|
local keys = {
|
||||||
|
f = {
|
||||||
|
name = "Fuzzy finder",
|
||||||
|
b = { telescope_builtin.buffers, "Open buffers" },
|
||||||
|
f = { telescope_builtin.git_files, "Git tracked files" },
|
||||||
|
F = { telescope_builtin.find_files, "Files" },
|
||||||
|
g = { telescope_builtin.live_grep, "Grep string" },
|
||||||
|
G = { telescope_builtin.grep_string, "Grep string under cursor" },
|
||||||
|
n = { telescope.extensions.notify.notify, "Notification history" },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
wk.register(keys, { prefix = "<leader>" })
|
||||||
|
EOF
|
||||||
|
|
32
home/vim/after/plugin/mappings/tree-sitter-textobjects.vim
Normal file
32
home/vim/after/plugin/mappings/tree-sitter-textobjects.vim
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
lua << EOF
|
||||||
|
local wk = require("which-key")
|
||||||
|
|
||||||
|
local motions = {
|
||||||
|
["]m"] = "Next method start",
|
||||||
|
["]M"] = "Next method end",
|
||||||
|
["]S"] = "Next statement start",
|
||||||
|
["]]"] = "Next class start",
|
||||||
|
["]["] = "Next class end",
|
||||||
|
["[m"] = "Previous method start",
|
||||||
|
["[M"] = "Previous method end",
|
||||||
|
["[S"] = "Previous statement start",
|
||||||
|
["[["] = "Previous class start",
|
||||||
|
["[]"] = "Previous class end",
|
||||||
|
}
|
||||||
|
|
||||||
|
local objects = {
|
||||||
|
["aa"] = "a parameter",
|
||||||
|
["ia"] = "inner parameter",
|
||||||
|
["ab"] = "a block",
|
||||||
|
["ib"] = "inner block",
|
||||||
|
["ac"] = "a class",
|
||||||
|
["ic"] = "inner class",
|
||||||
|
["af"] = "a function",
|
||||||
|
["if"] = "inner function",
|
||||||
|
["ak"] = "a comment",
|
||||||
|
["aS"] = "a statement",
|
||||||
|
}
|
||||||
|
|
||||||
|
wk.register(motions, { mode = "n" })
|
||||||
|
wk.register(objects, { mode = "o" })
|
||||||
|
EOF
|
|
@ -1,7 +1,125 @@
|
||||||
" Better fr layout mappings for vim-unimpaired and other '[' and ']' commands
|
lua << EOF
|
||||||
nmap ( [
|
local wk = require("which-key")
|
||||||
nmap ) ]
|
|
||||||
omap ( [
|
local keys = {
|
||||||
omap ) ]
|
-- Edition and navigation mappins
|
||||||
xmap ( [
|
["["] = {
|
||||||
xmap ) ]
|
name = "Previous",
|
||||||
|
["<space>"] = "Insert blank line above",
|
||||||
|
["<C-L>"] = "Previous location list file",
|
||||||
|
["<C-Q>"] = "Previous quickfix list file",
|
||||||
|
["<C-T>"] = "Previous tag in preview window",
|
||||||
|
a = "Previous argument",
|
||||||
|
A = "First argument",
|
||||||
|
b = "Previous buffer",
|
||||||
|
B = "First buffer",
|
||||||
|
e = "Exchange previous line",
|
||||||
|
f = "Previous file in directory",
|
||||||
|
l = "Previous location list entry",
|
||||||
|
L = "First Location list entry",
|
||||||
|
n = "Previous conflict marker/diff hunk",
|
||||||
|
p = "Paste line above",
|
||||||
|
P = "Paste line above",
|
||||||
|
q = "Previous quickfix list entry",
|
||||||
|
Q = "First quickfix list entry",
|
||||||
|
t = "Previous matching tag",
|
||||||
|
T = "First matching tag",
|
||||||
|
z = "Previous fold",
|
||||||
|
-- Encoding
|
||||||
|
C = "C string encode",
|
||||||
|
u = "URL encode",
|
||||||
|
x = "XML encode",
|
||||||
|
y = "C string encode",
|
||||||
|
-- Custom
|
||||||
|
d = { vim.diagnostic.goto_prev, "Previous diagnostic" }
|
||||||
|
},
|
||||||
|
["]"] = {
|
||||||
|
name = "Next",
|
||||||
|
["<space>"] = "Insert blank line below",
|
||||||
|
["<C-L>"] = "Next location list file",
|
||||||
|
["<C-Q>"] = "Next quickfix list file",
|
||||||
|
["<C-T>"] = "Next tag in preview window",
|
||||||
|
a = "Next argument",
|
||||||
|
A = "Last argument",
|
||||||
|
b = "Next buffer",
|
||||||
|
B = "Last buffer",
|
||||||
|
e = "Exchange next line",
|
||||||
|
f = "Next file in directory",
|
||||||
|
l = "Next location list entry",
|
||||||
|
L = "Last Location list entry",
|
||||||
|
n = "Next conflict marker/diff hunk",
|
||||||
|
p = "Paste line below",
|
||||||
|
P = "Paste line below",
|
||||||
|
q = "Next quickfix list entry",
|
||||||
|
Q = "Last quickfix list entry",
|
||||||
|
t = "Next matching tag",
|
||||||
|
T = "Last matching tag",
|
||||||
|
z = "Next fold",
|
||||||
|
-- Decoding
|
||||||
|
C = "C string decode",
|
||||||
|
u = "URL decode",
|
||||||
|
x = "XML decode",
|
||||||
|
y = "C string decode",
|
||||||
|
-- Custom
|
||||||
|
d = { vim.diagnostic.goto_next, "Next diagnostic" }
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Option mappings
|
||||||
|
["[o"] = {
|
||||||
|
name = "Enable option",
|
||||||
|
b = "Light background",
|
||||||
|
c = "Cursor line",
|
||||||
|
d = "Diff",
|
||||||
|
e = { "<cmd>lwindow<CR>", "Location list" },
|
||||||
|
f = { "<cmd>cwindow<CR>", "Quickfix list" },
|
||||||
|
h = "Search high-lighting",
|
||||||
|
i = "Case insensitive search",
|
||||||
|
l = "List mode",
|
||||||
|
n = "Line numbers",
|
||||||
|
r = "Relative line numbers",
|
||||||
|
u = "Cursor column",
|
||||||
|
v = "Virtual editing",
|
||||||
|
w = "Text wrapping",
|
||||||
|
x = "Cursor line and column",
|
||||||
|
z = "Spell checking",
|
||||||
|
},
|
||||||
|
["]o"] = {
|
||||||
|
name = "Option off",
|
||||||
|
b = "Light background",
|
||||||
|
c = "Cursor line",
|
||||||
|
d = "Diff",
|
||||||
|
e = { "<cmd>lclose<CR>", "Location list" },
|
||||||
|
f = { "<cmd>cclose<CR>", "Quickfix list" },
|
||||||
|
h = "Search high-lighting",
|
||||||
|
i = "Case insensitive search",
|
||||||
|
l = "List mode",
|
||||||
|
n = "Line numbers",
|
||||||
|
r = "Relative line numbers",
|
||||||
|
u = "Cursor column",
|
||||||
|
v = "Virtual editing",
|
||||||
|
w = "Text wrapping",
|
||||||
|
x = "Cursor line and column",
|
||||||
|
z = "Spell checking",
|
||||||
|
},
|
||||||
|
["yo"] = {
|
||||||
|
name = "Option toggle",
|
||||||
|
b = "Light background",
|
||||||
|
c = "Cursor line",
|
||||||
|
d = "Diff",
|
||||||
|
e = { "<Plug>(qf_loc_toggle)", "Location list" },
|
||||||
|
f = { "<Plug>(qf_qf_toggle)", "Quickfix list" },
|
||||||
|
h = "Search high-lighting",
|
||||||
|
i = "Case insensitive search",
|
||||||
|
l = "List mode",
|
||||||
|
n = "Line numbers",
|
||||||
|
r = "Relative line numbers",
|
||||||
|
u = "Cursor column",
|
||||||
|
v = "Virtual editing",
|
||||||
|
w = "Text wrapping",
|
||||||
|
x = "Cursor line and column",
|
||||||
|
z = "Spell checking",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
wk.register(keys)
|
||||||
|
EOF
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
" Taken from the Vimways article
|
|
||||||
|
|
||||||
function! s:isLocation()
|
|
||||||
" Get dictionary of properties of the current window
|
|
||||||
let wininfo = filter(getwininfo(), {i,v -> v.winnr == winnr()})[0]
|
|
||||||
return wininfo.loclist
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:length()
|
|
||||||
" Get the size of the current quickfix/location list
|
|
||||||
return len(s:isLocation() ? getloclist(0) : getqflist())
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:getProperty(key, ...)
|
|
||||||
" getqflist() and getloclist() expect a dictionary argument
|
|
||||||
" If a 2nd argument has been passed in, use it as the value, else 0
|
|
||||||
let l:what = {a:key : a:0 ? a:1 : 0}
|
|
||||||
let l:listdict = s:isLocation() ? getloclist(0, l:what) : getqflist(l:what)
|
|
||||||
return get(l:listdict, a:key)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:isFirst()
|
|
||||||
return s:getProperty('nr') <= 1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:isLast()
|
|
||||||
return s:getProperty('nr') == s:getProperty('nr', '$')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:history(goNewer)
|
|
||||||
" Build the command: one of colder/cnewer/lolder/lnewer
|
|
||||||
let l:cmd = (s:isLocation() ? 'l' : 'c') . (a:goNewer ? 'newer' : 'older')
|
|
||||||
|
|
||||||
" Apply the cmd repeatedly until we hit a non-empty list, or first/last list
|
|
||||||
" is reached
|
|
||||||
while 1
|
|
||||||
if (a:goNewer && s:isLast()) || (!a:goNewer && s:isFirst()) | break | endif
|
|
||||||
" Run the command. Use :silent to suppress message-history output.
|
|
||||||
" Note that the :try wrapper is no longer necessary
|
|
||||||
silent execute l:cmd
|
|
||||||
if s:length() | break | endif
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
" Echo a description of the new quickfix / location list.
|
|
||||||
" And make it look like a rainbow.
|
|
||||||
let l:nr = s:getProperty('nr')
|
|
||||||
let l:last = s:getProperty('nr', '$')
|
|
||||||
echohl MoreMsg | echon '('
|
|
||||||
echohl Identifier | echon l:nr
|
|
||||||
if l:last > 1
|
|
||||||
echohl LineNr | echon ' of '
|
|
||||||
echohl Identifier | echon l:last
|
|
||||||
endif
|
|
||||||
echohl MoreMsg | echon ') '
|
|
||||||
echohl MoreMsg | echon '['
|
|
||||||
echohl Identifier | echon s:length()
|
|
||||||
echohl MoreMsg | echon '] '
|
|
||||||
echohl Normal | echon s:getProperty('title')
|
|
||||||
echohl None
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! quickfixed#older()
|
|
||||||
call s:history(0)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! quickfixed#newer()
|
|
||||||
call s:history(1)
|
|
||||||
endfunction
|
|
|
@ -13,6 +13,7 @@ let
|
||||||
"after"
|
"after"
|
||||||
"autoload"
|
"autoload"
|
||||||
"ftdetect"
|
"ftdetect"
|
||||||
|
"lua"
|
||||||
"plugin"
|
"plugin"
|
||||||
];
|
];
|
||||||
in
|
in
|
||||||
|
@ -30,11 +31,9 @@ in
|
||||||
|
|
||||||
plugins = with pkgs.vimPlugins; [
|
plugins = with pkgs.vimPlugins; [
|
||||||
# Theming
|
# Theming
|
||||||
lightline-vim # Fancy status bar
|
vim-gruvbox8 # Nice dark theme
|
||||||
{
|
lualine-nvim # A lua-based status line
|
||||||
plugin = onedark-vim; # Nice dark theme
|
lualine-lsp-progress # Show progress for LSP servers
|
||||||
optional = true; # Needs to be `packadd`-ed manually...
|
|
||||||
}
|
|
||||||
|
|
||||||
# tpope essentials
|
# tpope essentials
|
||||||
vim-commentary # Easy comments
|
vim-commentary # Easy comments
|
||||||
|
@ -57,20 +56,53 @@ in
|
||||||
vim-toml
|
vim-toml
|
||||||
|
|
||||||
# General enhancements
|
# General enhancements
|
||||||
fastfold # Better folding
|
|
||||||
vim-qf # Better quick-fix list
|
vim-qf # Better quick-fix list
|
||||||
|
|
||||||
# Other wrappers
|
# Other wrappers
|
||||||
fzfWrapper # The vim plugin inside the 'fzf' package
|
|
||||||
fzf-vim # Fuzzy commands
|
|
||||||
git-messenger-vim # A simple blame window
|
git-messenger-vim # A simple blame window
|
||||||
|
|
||||||
# LSP and linting
|
# LSP and linting
|
||||||
ale # Asynchronous Linting Engine
|
lsp_lines-nvim # Show diagnostics *over* regions
|
||||||
lightline-ale # Status bar integration
|
null-ls-nvim # LSP integration for linters and formatters
|
||||||
|
(nvim-treesitter.withPlugins (_: pkgs.tree-sitter.allGrammars)) # Better highlighting
|
||||||
|
nvim-treesitter-textobjects # More textobjects
|
||||||
|
nvim-ts-context-commentstring # Comment string in nested language blocks
|
||||||
|
plenary-nvim # 'null-ls', 'telescope' dependency
|
||||||
|
|
||||||
|
# Completion
|
||||||
|
nvim-cmp # Completion engine
|
||||||
|
cmp-buffer # Words from open buffers
|
||||||
|
cmp-nvim-lsp # LSP suggestions
|
||||||
|
cmp-nvim-lua # NeoVim lua API
|
||||||
|
cmp-path # Path name suggestions
|
||||||
|
cmp-under-comparator # Sort items that start with '_' lower
|
||||||
|
friendly-snippets # LSP snippets collection
|
||||||
|
luasnip # Snippet manager compatible with LSP
|
||||||
|
|
||||||
|
# UX improvements
|
||||||
|
dressing-nvim # Integrate native UI hooks with Telescope etc...
|
||||||
|
gitsigns-nvim # Fast git UI integration
|
||||||
|
nvim-notify # Better notification API
|
||||||
|
telescope-fzf-native-nvim # Use 'fzf' fuzzy matching algorithm
|
||||||
|
telescope-lsp-handlers-nvim # Use 'telescope' for various LSP actions
|
||||||
|
telescope-nvim # Fuzzy finder interface
|
||||||
|
which-key-nvim # Show available mappings
|
||||||
];
|
];
|
||||||
|
|
||||||
extraConfig = builtins.readFile ./init.vim;
|
extraConfig = builtins.readFile ./init.vim;
|
||||||
|
|
||||||
|
# Linters, formatters, etc...
|
||||||
|
extraPackages = with pkgs; [
|
||||||
|
# C/C++
|
||||||
|
clang-tools
|
||||||
|
|
||||||
|
# Nix
|
||||||
|
nixpkgs-fmt
|
||||||
|
|
||||||
|
# Shell
|
||||||
|
shellcheck
|
||||||
|
shfmt
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
config.xdg.configFile = lib.mkIf cfg.enable configFiles;
|
config.xdg.configFile = lib.mkIf cfg.enable configFiles;
|
||||||
|
|
|
@ -13,6 +13,13 @@ set wildmenu
|
||||||
" Enable syntax high-lighting and file-type specific plugins
|
" Enable syntax high-lighting and file-type specific plugins
|
||||||
syntax on
|
syntax on
|
||||||
filetype plugin indent on
|
filetype plugin indent on
|
||||||
|
|
||||||
|
" Map leader to space (needs the noremap trick to avoid moving the cursor)
|
||||||
|
nnoremap <Space> <Nop>
|
||||||
|
let mapleader=" "
|
||||||
|
|
||||||
|
" Map localleader to '!' (if I want to filter text, I use visual mode)
|
||||||
|
let maplocalleader="!"
|
||||||
" }}}
|
" }}}
|
||||||
|
|
||||||
" Indentation configuration {{{
|
" Indentation configuration {{{
|
||||||
|
@ -65,13 +72,18 @@ set lazyredraw
|
||||||
" Timeout quickly on shortcuts, I can't wait two seconds to delete in visual
|
" Timeout quickly on shortcuts, I can't wait two seconds to delete in visual
|
||||||
set timeoutlen=500
|
set timeoutlen=500
|
||||||
|
|
||||||
|
" Timeout quickly for CursorHold events (and also swap file)
|
||||||
|
set updatetime=250
|
||||||
|
|
||||||
" Set dark mode by default
|
" Set dark mode by default
|
||||||
set background=dark
|
set background=dark
|
||||||
|
|
||||||
" Load it manually because of autoload functions...
|
" Include plug-in integration
|
||||||
packadd! onedark-vim
|
let g:gruvbox_plugin_hi_groups=1
|
||||||
" Use onedark
|
" Include filetype integration
|
||||||
colorscheme onedark
|
let g:gruvbox_filetype_hi_groups=1
|
||||||
|
" Use my preferred colorscheme
|
||||||
|
colorscheme gruvbox8
|
||||||
" }}}
|
" }}}
|
||||||
|
|
||||||
" Search parameters {{{
|
" Search parameters {{{
|
||||||
|
|
83
home/vim/lua/ambroisie/lsp.lua
Normal file
83
home/vim/lua/ambroisie/lsp.lua
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
-- shared LSP configuration callback
|
||||||
|
-- @param client native client configuration
|
||||||
|
-- @param bufnr int? buffer number of the attched client
|
||||||
|
M.on_attach = function(client, bufnr)
|
||||||
|
-- Diagnostics
|
||||||
|
vim.diagnostic.config({
|
||||||
|
-- Disable virtual test next to affected regions
|
||||||
|
virtual_text = false,
|
||||||
|
-- Show diagnostics signs
|
||||||
|
signs = true,
|
||||||
|
-- Underline offending regions
|
||||||
|
underline = true,
|
||||||
|
-- Do not bother me in the middle of insertion
|
||||||
|
update_in_insert = false,
|
||||||
|
-- Show highest severity first
|
||||||
|
severity_sort = true,
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.cmd([[
|
||||||
|
augroup DiagnosticsHover
|
||||||
|
autocmd! * <buffer>
|
||||||
|
" Show diagnostics on "hover"
|
||||||
|
autocmd CursorHold,CursorHoldI <buffer> lua vim.diagnostic.open_float(nil, {focus=false, scope="cursor"})
|
||||||
|
augroup END
|
||||||
|
]])
|
||||||
|
|
||||||
|
-- Format on save
|
||||||
|
if client.resolved_capabilities.document_formatting then
|
||||||
|
vim.cmd([[
|
||||||
|
augroup LspFormatting
|
||||||
|
autocmd! * <buffer>
|
||||||
|
autocmd BufWritePre <buffer> lua vim.lsp.buf.formatting_sync()
|
||||||
|
augroup END
|
||||||
|
]])
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Mappings
|
||||||
|
local wk = require("which-key")
|
||||||
|
|
||||||
|
local function list_workspace_folders()
|
||||||
|
local utils = require("ambroisie.utils")
|
||||||
|
utils.dump(vim.lsp.buf.list_workspace_folders())
|
||||||
|
end
|
||||||
|
|
||||||
|
local function show_line_diagnostics()
|
||||||
|
vim.diagnostic.open_float(nil, { scope="line" })
|
||||||
|
end
|
||||||
|
|
||||||
|
local function show_buffer_diagnostics()
|
||||||
|
vim.diagnostic.open_float(nil, { scope="buffer" })
|
||||||
|
end
|
||||||
|
|
||||||
|
local keys = {
|
||||||
|
K = { vim.lsp.buf.hover, "Show symbol information" },
|
||||||
|
["gd"] = { vim.lsp.buf.definition, "Go to definition" },
|
||||||
|
["gD"] = { vim.lsp.buf.declaration, "Go to declaration" },
|
||||||
|
["gi"] = { vim.lsp.buf.implementation, "Go to implementation" },
|
||||||
|
["gr"] = { vim.lsp.buf.references, "List all references" },
|
||||||
|
|
||||||
|
["<leader>c"] = {
|
||||||
|
name = "Code",
|
||||||
|
a = { vim.lsp.buf.code_action, "Code actions" },
|
||||||
|
d = { show_line_diagnostics, "Show line diagnostics" },
|
||||||
|
D = { show_buffer_diagnostics, "Show buffer diagnostics" },
|
||||||
|
r = { vim.lsp.buf.rename, "Rename symbol" },
|
||||||
|
s = { vim.lsp.buf.signature_help, "Show signature" },
|
||||||
|
t = { vim.lsp.buf.type_definition, "Go to type definition" },
|
||||||
|
w = {
|
||||||
|
name = "Workspace",
|
||||||
|
a = { vim.lsp.buf.add_workspace_folder, "Add folder to workspace" },
|
||||||
|
l = { list_workspace_folders, "List folders in workspace" },
|
||||||
|
r = { vim.lsp.buf.remove_workspace_folder, "Remove folder from workspace" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
wk.register(keys, { buffer = bufnr })
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
return M
|
37
home/vim/lua/ambroisie/utils.lua
Normal file
37
home/vim/lua/ambroisie/utils.lua
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
-- pretty print lua object
|
||||||
|
-- @param obj any object to pretty print
|
||||||
|
M.dump = function(obj)
|
||||||
|
print(vim.inspect(obj))
|
||||||
|
end
|
||||||
|
|
||||||
|
--- checks if a given command is executable
|
||||||
|
---@param cmd string? command to check
|
||||||
|
---@return boolean executable
|
||||||
|
M.is_executable = function(cmd)
|
||||||
|
return cmd and vim.fn.executable(cmd) == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
--- return a function that checks if a given command is executable
|
||||||
|
---@param cmd string? command to check
|
||||||
|
---@return fun(cmd: string): boolean executable
|
||||||
|
M.is_executable_condition = function(cmd)
|
||||||
|
return function() return M.is_executable(cmd) end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- list all active LSP clients for current buffer
|
||||||
|
-- @param bufnr int? buffer number
|
||||||
|
-- @return table all active LSP client names
|
||||||
|
M.list_lsp_clients = function(bufnr)
|
||||||
|
local clients = vim.lsp.buf_get_clients(bufnr)
|
||||||
|
local names = {}
|
||||||
|
|
||||||
|
for _, client in ipairs(clients) do
|
||||||
|
table.insert(names, client.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
return names
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
|
@ -1,6 +0,0 @@
|
||||||
" Map leader to space (needs the noremap trick to avoid moving the cursor)
|
|
||||||
nnoremap <Space> <Nop>
|
|
||||||
let mapleader=" "
|
|
||||||
|
|
||||||
" Map localleader to '!' (if I want to filter text, I use visual mode)
|
|
||||||
let maplocalleader="!"
|
|
|
@ -1,24 +0,0 @@
|
||||||
" Always display the sign column to avoid moving the buffer all the time
|
|
||||||
let g:ale_sign_column_always=1
|
|
||||||
|
|
||||||
" Change the way ALE display messages
|
|
||||||
let g:ale_echo_msg_info_str='I'
|
|
||||||
let g:ale_echo_msg_warning_str='W'
|
|
||||||
let g:ale_echo_msg_error_str='E'
|
|
||||||
|
|
||||||
" The message displayed in the command line area
|
|
||||||
let g:ale_echo_msg_format='[%linter%][%severity%]%(code):% %s'
|
|
||||||
|
|
||||||
" The message displayed in the location list
|
|
||||||
let g:ale_loclist_msg_format='[%linter%]%(code):% %s'
|
|
||||||
|
|
||||||
" Don't lint every time I change the buffer
|
|
||||||
let g:ale_lint_on_text_changed=0
|
|
||||||
" Don't lint on leaving insert mode
|
|
||||||
let g:ale_lint_on_insert_leave=0
|
|
||||||
" Don't lint on entering a buffer
|
|
||||||
let g:ale_lint_on_enter=0
|
|
||||||
" Do lint on save
|
|
||||||
let g:ale_lint_on_save=1
|
|
||||||
" Lint on changing the filetype
|
|
||||||
let g:ale_lint_on_filetype_changed=1
|
|
61
home/vim/plugin/settings/completion.vim
Normal file
61
home/vim/plugin/settings/completion.vim
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
" Show completion menu in all cases, and don't select anything
|
||||||
|
set completeopt=menu,menuone,noselect
|
||||||
|
|
||||||
|
lua << EOF
|
||||||
|
local cmp = require("cmp")
|
||||||
|
local cmp_under_comparator = require("cmp-under-comparator")
|
||||||
|
local luasnip = require("luasnip")
|
||||||
|
|
||||||
|
cmp.setup({
|
||||||
|
snippet = {
|
||||||
|
expand = function(args)
|
||||||
|
luasnip.lsp_expand(args.body)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
mapping = {
|
||||||
|
["<Tab>"] = function(fallback)
|
||||||
|
if luasnip.expand_or_jumpable() then
|
||||||
|
luasnip.expand_or_jump()
|
||||||
|
else
|
||||||
|
fallback()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
["<S-Tab>"] = function(fallback)
|
||||||
|
if luasnip.jumpable(-1) then
|
||||||
|
luasnip.jump(-1)
|
||||||
|
else
|
||||||
|
fallback()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
["<C-n>"] = cmp.mapping(cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), { "i", "c" }),
|
||||||
|
["<C-p>"] = cmp.mapping(cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), { "i", "c" }),
|
||||||
|
["<C-d>"] = cmp.mapping.scroll_docs(-5),
|
||||||
|
["<C-f>"] = cmp.mapping.scroll_docs(5),
|
||||||
|
["<C-y>"] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Insert, select = false }),
|
||||||
|
["<C-e>"] = cmp.mapping.abort(),
|
||||||
|
},
|
||||||
|
view = {
|
||||||
|
entries = "native",
|
||||||
|
},
|
||||||
|
sources = {
|
||||||
|
{ name = "path", priority_weight = 110 },
|
||||||
|
{ name = "nvim_lsp", priority_weight = 100 },
|
||||||
|
{ name = "nvim_lua", priority_weight = 90 },
|
||||||
|
{ name = "luasnip", priority_weight = 80 },
|
||||||
|
{ name = "buffer", max_item_count = 5, priority_weight = 50 },
|
||||||
|
},
|
||||||
|
sorting = {
|
||||||
|
priority_weight = 100,
|
||||||
|
comparators = {
|
||||||
|
cmp.config.compare.offset,
|
||||||
|
cmp.config.compare.exact,
|
||||||
|
cmp.config.compare.score,
|
||||||
|
cmp_under_comparator.under,
|
||||||
|
cmp.config.compare.kind,
|
||||||
|
cmp.config.compare.sort_text,
|
||||||
|
cmp.config.compare.length,
|
||||||
|
cmp.config.compare.order,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
EOF
|
8
home/vim/plugin/settings/dressing.vim
Normal file
8
home/vim/plugin/settings/dressing.vim
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
lua << EOF
|
||||||
|
local dressing = require("dressing")
|
||||||
|
|
||||||
|
dressing.setup({
|
||||||
|
-- Use a relative prompt size
|
||||||
|
prefer_width = 0.4,
|
||||||
|
})
|
||||||
|
EOF
|
|
@ -1,8 +0,0 @@
|
||||||
" Use a floating window when availble
|
|
||||||
if has('nvim-0.4.0') || has("patch-8.2.0191")
|
|
||||||
let g:fzf_layout = { 'window': {
|
|
||||||
\ 'width': 0.9,
|
|
||||||
\ 'height': 0.7,
|
|
||||||
\ 'highlight': 'Comment',
|
|
||||||
\ 'rounded': v:false } }
|
|
||||||
endif
|
|
66
home/vim/plugin/settings/git.vim
Normal file
66
home/vim/plugin/settings/git.vim
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
lua << EOF
|
||||||
|
local gitsigns = require('gitsigns')
|
||||||
|
|
||||||
|
gitsigns.setup({
|
||||||
|
-- I dislike the full-green sign column when this happens
|
||||||
|
attach_to_untracked = false,
|
||||||
|
|
||||||
|
current_line_blame_opts = {
|
||||||
|
-- Show the blame quickly
|
||||||
|
delay = 100,
|
||||||
|
},
|
||||||
|
|
||||||
|
on_attach = function(bufnr)
|
||||||
|
local wk = require("which-key")
|
||||||
|
|
||||||
|
local keys = {
|
||||||
|
-- Navigation
|
||||||
|
["[c"] = { "&diff ? '[c' : '<cmd>Gitsigns prev_hunk<CR>'", "Previous hunk/diff", expr = true },
|
||||||
|
["]c"] = { "&diff ? ']c' : '<cmd>Gitsigns next_hunk<CR>'", "Next hunk/diff", expr = true },
|
||||||
|
|
||||||
|
|
||||||
|
-- Commands
|
||||||
|
["<leader>g"] = {
|
||||||
|
name = "Git",
|
||||||
|
-- Actions
|
||||||
|
b = { gitsigns.toggle_current_line_blame, "Toggle blame virtual text" },
|
||||||
|
d = { gitsigns.diffthis, "Diff buffer" },
|
||||||
|
D = { function() gitsigns.diffthis("~") end, "Diff buffer against last commit" },
|
||||||
|
g = { "<cmd>Git<CR>", "Git status" },
|
||||||
|
h = { gitsigns.toggle_deleted, "Show deleted hunks" },
|
||||||
|
L = { "<cmd>:sp<CR><C-w>T:Gllog --follow -- %:p<CR>", "Current buffer log" },
|
||||||
|
m = { "<Plug>(git-messenger)", "Current line blame" },
|
||||||
|
p = { gitsigns.preview_hunk, "Preview hunk" },
|
||||||
|
r = { gitsigns.reset_hunk, "Restore hunk" },
|
||||||
|
R = { gitsigns.reset_buffer, "Restore buffer" },
|
||||||
|
s = { gitsigns.stage_hunk, "Stage hunk" },
|
||||||
|
S = { gitsigns.stage_buffer, "Stage buffer" },
|
||||||
|
u = { gitsigns.undo_stage_hunk, "Undo stage hunk" },
|
||||||
|
["["] = { gitsigns.prev_hunk, "Previous hunk" },
|
||||||
|
["]"] = { gitsigns.next_hunk, "Next hunk" },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
local objects = {
|
||||||
|
["ih"] = { gitsigns.select_hunk, "Git hunk" },
|
||||||
|
}
|
||||||
|
|
||||||
|
local visual = {
|
||||||
|
["ih"] = { gitsigns.select_hunk, "Git hunk" },
|
||||||
|
|
||||||
|
-- Only the actual command can make use of the visual selection...
|
||||||
|
["<leader>g"] = {
|
||||||
|
name = "Git",
|
||||||
|
p = { ":Gitsigns preview_hunk<CR>", "Preview selection" },
|
||||||
|
r = { ":Gitsigns reset_hunk<CR>", "Restore selection" },
|
||||||
|
s = { ":Gitsigns stage_hunk<CR>", "Stage selection" },
|
||||||
|
u = { ":Gitsigns undo_stage_hunk<CR>", "Undo stage selection" },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
wk.register(keys, { buffer = bufnr })
|
||||||
|
wk.register(objects, { buffer = bufnr, mode = "o" })
|
||||||
|
wk.register(visual, { buffer = bufnr, mode = "x" })
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
EOF
|
|
@ -1,5 +0,0 @@
|
||||||
" Use the high-contrast theme
|
|
||||||
let g:gruvbox_contrast_dark='hard'
|
|
||||||
|
|
||||||
" Enable italics because urxvt supports them
|
|
||||||
let g:gruvbox_italic=1
|
|
|
@ -1,81 +0,0 @@
|
||||||
" Initialise light-line setting structure
|
|
||||||
let g:lightline={}
|
|
||||||
|
|
||||||
" Use the wombat colorscheme
|
|
||||||
let g:lightline.colorscheme='onedark'
|
|
||||||
|
|
||||||
" Status-line for active buffer
|
|
||||||
let g:lightline.active={
|
|
||||||
\ 'left': [
|
|
||||||
\ [ 'mode', 'paste' ],
|
|
||||||
\ [ 'gitbranch', 'readonly', 'filename', 'modified' ],
|
|
||||||
\ [ 'spell' ],
|
|
||||||
\ ],
|
|
||||||
\ 'right': [
|
|
||||||
\ [ 'lineinfo' ],
|
|
||||||
\ [ 'percent' ],
|
|
||||||
\ [ 'fileformat', 'fileencoding', 'filetype' ],
|
|
||||||
\ [ 'linter_check', 'linter_errors', 'linter_warn', 'linter_ok' ],
|
|
||||||
\ [ 'ctags_status' ],
|
|
||||||
\ ]
|
|
||||||
\ }
|
|
||||||
|
|
||||||
" Status-line for inactive buffer
|
|
||||||
let g:lightline.inactive={
|
|
||||||
\ 'left': [
|
|
||||||
\ [ 'filename' ],
|
|
||||||
\ ],
|
|
||||||
\ 'right': [
|
|
||||||
\ [ 'lineinfo' ],
|
|
||||||
\ [ 'percent' ],
|
|
||||||
\ ],
|
|
||||||
\ }
|
|
||||||
|
|
||||||
" Which component should be written using which function
|
|
||||||
let g:lightline.component_function={
|
|
||||||
\ 'readonly': 'LightlineReadonly',
|
|
||||||
\ 'modified': 'LightlineModified',
|
|
||||||
\ 'gitbranch': 'LightlineFugitive',
|
|
||||||
\ }
|
|
||||||
|
|
||||||
" Which component can be expanded by using which function
|
|
||||||
let g:lightline.component_expand={
|
|
||||||
\ 'linter_check': 'lightline#ale#checking',
|
|
||||||
\ 'linter_warn': 'lightline#ale#warnings',
|
|
||||||
\ 'linter_errors': 'lightline#ale#errors',
|
|
||||||
\ 'linter_ok': 'lightline#ale#ok',
|
|
||||||
\ }
|
|
||||||
|
|
||||||
" How to color custom components
|
|
||||||
let g:lightline.component_type={
|
|
||||||
\ 'readonly': 'error',
|
|
||||||
\ 'linter_checking': 'left',
|
|
||||||
\ 'linter_warn': 'warning',
|
|
||||||
\ 'linter_errors': 'error',
|
|
||||||
\ 'linter_ok': 'left',
|
|
||||||
\ }
|
|
||||||
|
|
||||||
" Show pretty icons instead of text for linting status
|
|
||||||
let g:lightline#ale#indicator_checking='⏳'
|
|
||||||
let g:lightline#ale#indicator_warnings='◆'
|
|
||||||
let g:lightline#ale#indicator_errors='✗'
|
|
||||||
let g:lightline#ale#indicator_ok='✓'
|
|
||||||
|
|
||||||
" Show a lock icon when editing a read-only file when it makes sense
|
|
||||||
function! LightlineReadonly()
|
|
||||||
return &ft!~?'help\|vimfiler\|netrw' && &readonly ? '' : ''
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Show a '+' when the buffer is modified, '-' if not, when it makes sense
|
|
||||||
function! LightlineModified()
|
|
||||||
return &ft=~'help\|vimfiler\|netrw' ? '' : &modified ? '+' : &modifiable ? '' : '-'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Show branch name with nice icon in status line, when it makes sense
|
|
||||||
function! LightlineFugitive()
|
|
||||||
if &ft!~?'help\|vimfiler\|netrw' && exists('*fugitive#head')
|
|
||||||
let branch=fugitive#head()
|
|
||||||
return branch!=#'' ? ' '.branch : ''
|
|
||||||
endif
|
|
||||||
return ''
|
|
||||||
endfunction
|
|
41
home/vim/plugin/settings/lspconfig.vim
Normal file
41
home/vim/plugin/settings/lspconfig.vim
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
lua << EOF
|
||||||
|
local lspconfig = require("lspconfig")
|
||||||
|
local lsp = require("ambroisie.lsp")
|
||||||
|
local utils = require("ambroisie.utils")
|
||||||
|
|
||||||
|
-- Inform servers we are able to do completion, snippets, etc...
|
||||||
|
local capabilities = vim.lsp.protocol.make_client_capabilities()
|
||||||
|
capabilities = require("cmp_nvim_lsp").update_capabilities(capabilities)
|
||||||
|
|
||||||
|
-- C/C++
|
||||||
|
if utils.is_executable("clangd") then
|
||||||
|
lspconfig.clangd.setup({
|
||||||
|
capabilities = capabilities,
|
||||||
|
on_attach = lsp.on_attach,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Nix
|
||||||
|
if utils.is_executable("rnix-lsp") then
|
||||||
|
lspconfig.rnix.setup({
|
||||||
|
capabilities = capabilities,
|
||||||
|
on_attach = lsp.on_attach,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Python
|
||||||
|
if utils.is_executable("pyright") then
|
||||||
|
lspconfig.pyright.setup({
|
||||||
|
capabilities = capabilities,
|
||||||
|
on_attach = lsp.on_attach,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Rust
|
||||||
|
if utils.is_executable("rust-analyzer") then
|
||||||
|
lspconfig.rust_analyzer.setup({
|
||||||
|
capabilities = capabilities,
|
||||||
|
on_attach = lsp.on_attach,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
EOF
|
63
home/vim/plugin/settings/lualine.vim
Normal file
63
home/vim/plugin/settings/lualine.vim
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
lua << EOF
|
||||||
|
local lualine = require("lualine")
|
||||||
|
local utils = require("ambroisie.utils")
|
||||||
|
|
||||||
|
local function list_spell_languages()
|
||||||
|
if not vim.opt.spell:get() then
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(vim.opt.spelllang:get(), ", ")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function list_lsp_clients()
|
||||||
|
local client_names = utils.list_lsp_clients()
|
||||||
|
|
||||||
|
if #client_names == 0 then
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
|
||||||
|
return "[ " .. table.concat(client_names, " ") .. " ]"
|
||||||
|
end
|
||||||
|
|
||||||
|
lualine.setup({
|
||||||
|
options = {
|
||||||
|
icons_enabled = false,
|
||||||
|
section_separators = "",
|
||||||
|
component_separators = "|",
|
||||||
|
},
|
||||||
|
sections = {
|
||||||
|
lualine_a = {
|
||||||
|
{ "mode" },
|
||||||
|
},
|
||||||
|
lualine_b = {
|
||||||
|
{ "branch" },
|
||||||
|
{ "filename", symbols = { readonly = "🔒" } },
|
||||||
|
},
|
||||||
|
lualine_c = {
|
||||||
|
{ list_spell_languages },
|
||||||
|
{ "lsp_progress" },
|
||||||
|
},
|
||||||
|
lualine_x = {
|
||||||
|
{ list_lsp_clients },
|
||||||
|
{
|
||||||
|
"diagnostics",
|
||||||
|
-- Only use the diagnostics API
|
||||||
|
sources = { "nvim_diagnostic" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
lualine_y = {
|
||||||
|
{ "fileformat" },
|
||||||
|
{ "encoding" },
|
||||||
|
{ "filetype" },
|
||||||
|
},
|
||||||
|
lualine_z = {
|
||||||
|
"location",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
extensions = {
|
||||||
|
"fugitive",
|
||||||
|
"quickfix",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
EOF
|
3
home/vim/plugin/settings/luasnip.vim
Normal file
3
home/vim/plugin/settings/luasnip.vim
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
lua << EOF
|
||||||
|
require("luasnip.loaders.from_vscode").load()
|
||||||
|
EOF
|
9
home/vim/plugin/settings/notify.vim
Normal file
9
home/vim/plugin/settings/notify.vim
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
lua << EOF
|
||||||
|
local notify = require("notify")
|
||||||
|
|
||||||
|
notify.setup({
|
||||||
|
stages = "slide",
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.notify = notify
|
||||||
|
EOF
|
119
home/vim/plugin/settings/null-ls.vim
Normal file
119
home/vim/plugin/settings/null-ls.vim
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
lua << EOF
|
||||||
|
local null_ls = require("null-ls")
|
||||||
|
local lsp = require("ambroisie.lsp")
|
||||||
|
local utils = require("ambroisie.utils")
|
||||||
|
|
||||||
|
null_ls.setup({
|
||||||
|
on_attach = lsp.on_attach,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- C, C++
|
||||||
|
null_ls.register({
|
||||||
|
null_ls.builtins.formatting.clang_format.with({
|
||||||
|
-- Only used if available, but prefer clangd formatting if available
|
||||||
|
condition = function()
|
||||||
|
return utils.is_executable("clang-format") and not utils.is_executable("clangd")
|
||||||
|
end,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Haskell
|
||||||
|
null_ls.register({
|
||||||
|
null_ls.builtins.formatting.brittany.with({
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("brittany"),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Nix
|
||||||
|
null_ls.register({
|
||||||
|
null_ls.builtins.formatting.nixpkgs_fmt.with({
|
||||||
|
-- Only used if available, but prefer rnix if available
|
||||||
|
condition = function()
|
||||||
|
return utils.is_executable("nixpkgs-fmt") and not utils.is_executable("rnix-lsp")
|
||||||
|
end,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Python
|
||||||
|
null_ls.register({
|
||||||
|
null_ls.builtins.diagnostics.flake8.with({
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("flake8"),
|
||||||
|
}),
|
||||||
|
null_ls.builtins.diagnostics.mypy.with({
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("mypy"),
|
||||||
|
}),
|
||||||
|
null_ls.builtins.diagnostics.pylint.with({
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("pylint"),
|
||||||
|
}),
|
||||||
|
null_ls.builtins.formatting.black.with({
|
||||||
|
extra_args = { "--fast" },
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("black"),
|
||||||
|
}),
|
||||||
|
null_ls.builtins.formatting.isort.with({
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("isort"),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
-- Shell (non-POSIX)
|
||||||
|
null_ls.register({
|
||||||
|
null_ls.builtins.code_actions.shellcheck.with({
|
||||||
|
-- Restrict to bash and zsh
|
||||||
|
filetypes = { "bash", "zsh" },
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("shellcheck"),
|
||||||
|
}),
|
||||||
|
null_ls.builtins.diagnostics.shellcheck.with({
|
||||||
|
-- Show error code in message
|
||||||
|
diagnostics_format = "[#{c}] #{m}",
|
||||||
|
-- Require explicit empty string test, use bash dialect
|
||||||
|
extra_args = { "-s", "bash", "-o", "avoid-nullary-conditions" },
|
||||||
|
-- Restrict to bash and zsh
|
||||||
|
filetypes = { "bash", "zsh" },
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("shellcheck"),
|
||||||
|
}),
|
||||||
|
null_ls.builtins.formatting.shfmt.with({
|
||||||
|
-- Indent with 4 spaces, simplify the code, indent switch cases,
|
||||||
|
-- add space after redirection, use bash dialect
|
||||||
|
extra_args = { "-i", "4", "-s", "-ci", "-sr", "-ln", "bash" },
|
||||||
|
-- Restrict to bash and zsh
|
||||||
|
filetypes = { "bash", "zsh" },
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("shfmt"),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Shell (POSIX)
|
||||||
|
null_ls.register({
|
||||||
|
null_ls.builtins.code_actions.shellcheck.with({
|
||||||
|
-- Restrict to POSIX sh
|
||||||
|
filetypes = { "sh" },
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("shellcheck"),
|
||||||
|
}),
|
||||||
|
null_ls.builtins.diagnostics.shellcheck.with({
|
||||||
|
-- Show error code in message
|
||||||
|
diagnostics_format = "[#{c}] #{m}",
|
||||||
|
-- Require explicit empty string test
|
||||||
|
extra_args = { "-o", "avoid-nullary-conditions" },
|
||||||
|
-- Restrict to POSIX sh
|
||||||
|
filetypes = { "sh" },
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("shellcheck"),
|
||||||
|
}),
|
||||||
|
null_ls.builtins.formatting.shfmt.with({
|
||||||
|
-- Indent with 4 spaces, simplify the code, indent switch cases,
|
||||||
|
-- add space after redirection, use POSIX
|
||||||
|
extra_args = { "-i", "4", "-s", "-ci", "-sr", "-ln", "posix" },
|
||||||
|
-- Only used if available
|
||||||
|
condition = utils.is_executable_condition("shfmt"),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
EOF
|
18
home/vim/plugin/settings/telescope.vim
Normal file
18
home/vim/plugin/settings/telescope.vim
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
lua << EOF
|
||||||
|
local telescope = require("telescope")
|
||||||
|
|
||||||
|
telescope.setup({
|
||||||
|
extensions = {
|
||||||
|
fzf = {
|
||||||
|
fuzzy = true,
|
||||||
|
override_generic_sorter = true,
|
||||||
|
override_file_sorter = true,
|
||||||
|
case_mode = "smart_case",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
telescope.load_extension("fzf")
|
||||||
|
telescope.load_extension("lsp_handlers")
|
||||||
|
telescope.load_extension("notify")
|
||||||
|
EOF
|
58
home/vim/plugin/settings/tree-sitter.vim
Normal file
58
home/vim/plugin/settings/tree-sitter.vim
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
lua << EOF
|
||||||
|
local ts_config = require("nvim-treesitter.configs")
|
||||||
|
ts_config.setup({
|
||||||
|
highlight = {
|
||||||
|
enable = true,
|
||||||
|
-- Avoid duplicate highlighting
|
||||||
|
additional_vim_regex_highlighting = false,
|
||||||
|
},
|
||||||
|
indent = {
|
||||||
|
enable = true,
|
||||||
|
},
|
||||||
|
context_commentstring = {
|
||||||
|
enable = true,
|
||||||
|
},
|
||||||
|
textobjects = {
|
||||||
|
select = {
|
||||||
|
enable = true,
|
||||||
|
-- Jump to matching text objects
|
||||||
|
lookahead = true,
|
||||||
|
keymaps = {
|
||||||
|
["aa"] = "@parameter.outer",
|
||||||
|
["ia"] = "@parameter.inner",
|
||||||
|
["ab"] = "@block.outer",
|
||||||
|
["ib"] = "@block.inner",
|
||||||
|
["ac"] = "@class.outer",
|
||||||
|
["ic"] = "@class.inner",
|
||||||
|
["af"] = "@function.outer",
|
||||||
|
["if"] = "@function.inner",
|
||||||
|
["ak"] = "@comment.outer",
|
||||||
|
["aS"] = "@statement.outer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
move = {
|
||||||
|
enable = true,
|
||||||
|
-- Add to jump list
|
||||||
|
set_jumps = true,
|
||||||
|
goto_next_start = {
|
||||||
|
["]m"] = "@function.outer",
|
||||||
|
["]S"] = "@statement.outer",
|
||||||
|
["]]"] = "@class.outer",
|
||||||
|
},
|
||||||
|
goto_next_end = {
|
||||||
|
["]M"] = "@function.outer",
|
||||||
|
["]["] = "@class.outer",
|
||||||
|
},
|
||||||
|
goto_previous_start = {
|
||||||
|
["[m"] = "@function.outer",
|
||||||
|
["[S"] = "@statement.outer",
|
||||||
|
["[["] = "@class.outer",
|
||||||
|
},
|
||||||
|
goto_previous_end = {
|
||||||
|
["[M"] = "@function.outer",
|
||||||
|
["[]"] = "@class.outer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
EOF
|
4
home/vim/plugin/settings/which-key.vim
Normal file
4
home/vim/plugin/settings/which-key.vim
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
lua << EOF
|
||||||
|
local wk = require("which-key")
|
||||||
|
wk.setup()
|
||||||
|
EOF
|
87
home/wm/default.nix
Normal file
87
home/wm/default.nix
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
mkRelatedOption = description: relatedWMs:
|
||||||
|
let
|
||||||
|
isActivatedWm = wm: config.my.home.wm.windowManager == wm;
|
||||||
|
in
|
||||||
|
(lib.mkEnableOption description) // {
|
||||||
|
default = builtins.any isActivatedWm relatedWMs;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./dunst
|
||||||
|
./i3
|
||||||
|
./i3bar
|
||||||
|
./rofi
|
||||||
|
./screen-lock
|
||||||
|
];
|
||||||
|
|
||||||
|
options.my.home.wm = with lib; {
|
||||||
|
windowManager = mkOption {
|
||||||
|
type = with types; nullOr (enum [ "i3" ]);
|
||||||
|
default = null;
|
||||||
|
example = "i3";
|
||||||
|
description = "Which window manager to use for home session";
|
||||||
|
};
|
||||||
|
|
||||||
|
dunst = {
|
||||||
|
enable = mkRelatedOption "dunst configuration" [ "i3" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
i3bar = {
|
||||||
|
enable = mkRelatedOption "i3bar configuration" [ "i3" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
rofi = {
|
||||||
|
enable = mkRelatedOption "rofi menu" [ "i3" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
screen-lock = {
|
||||||
|
enable = mkRelatedOption "automatic X screen locker" [ "i3" ];
|
||||||
|
|
||||||
|
command = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "${pkgs.i3lock}/bin/i3lock -n -c 000000";
|
||||||
|
example = "\${pkgs.i3lock}/bin/i3lock -n -i lock.png";
|
||||||
|
description = "Locker command to run";
|
||||||
|
};
|
||||||
|
|
||||||
|
cornerLock = {
|
||||||
|
enable = my.mkDisableOption ''
|
||||||
|
Move mouse to upper-left corner to lock instantly, lower-right corner to
|
||||||
|
disable auto-lock.
|
||||||
|
'';
|
||||||
|
|
||||||
|
delay = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = 5;
|
||||||
|
example = 15;
|
||||||
|
description = "How many seconds before locking this way";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
notify = {
|
||||||
|
enable = my.mkDisableOption "Notify when about to lock the screen";
|
||||||
|
|
||||||
|
delay = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = 5;
|
||||||
|
example = 15;
|
||||||
|
description = ''
|
||||||
|
How many seconds in advance should there be a notification.
|
||||||
|
This value must be at lesser than or equal to `cornerLock.delay`
|
||||||
|
when both options are enabled.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
timeout = mkOption {
|
||||||
|
type = types.ints.between 1 60;
|
||||||
|
default = 15;
|
||||||
|
example = 1;
|
||||||
|
description = "Inactive time interval to lock the screen automatically";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
73
home/wm/dunst/default.nix
Normal file
73
home/wm/dunst/default.nix
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.wm.dunst;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.dunst = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
global = {
|
||||||
|
alignment = "center"; # Put message in the middle of the box
|
||||||
|
browser = "xdg-open"; # use default browser to open links
|
||||||
|
dmenu =
|
||||||
|
lib.mkIf
|
||||||
|
config.my.home.wm.rofi.enable
|
||||||
|
"rofi -p dunst -dmenu"; # use rofi for menu
|
||||||
|
follow = "keyboard"; # follow keyboard focus
|
||||||
|
font = "Monospace 8"; # Simple looking font
|
||||||
|
frame_width = 3; # small frame
|
||||||
|
markup = "full"; # subset of HTML
|
||||||
|
max_icon_size = 32; # avoid icons that are too big
|
||||||
|
padding = 6; # distance between text and bubble border
|
||||||
|
progress_bar = true; # show a progress bar in notification bubbles
|
||||||
|
separator_color = "frame"; # use frame color to separate bubbles
|
||||||
|
sort = true; # sort messages by urgency
|
||||||
|
word_wrap = true; # Break long lines to make them readable
|
||||||
|
|
||||||
|
# Fixed size notifications, slightly recessed from the top right
|
||||||
|
width = 300;
|
||||||
|
height = 50;
|
||||||
|
origin = "top-right";
|
||||||
|
offset = "15x50";
|
||||||
|
};
|
||||||
|
|
||||||
|
urgency_low = {
|
||||||
|
background = "#191311";
|
||||||
|
foreground = "#3b7c87";
|
||||||
|
frame_color = "#3b7c87";
|
||||||
|
highlight = "#4998a6";
|
||||||
|
timeout = 10;
|
||||||
|
};
|
||||||
|
|
||||||
|
urgency_normal = {
|
||||||
|
background = "#191311";
|
||||||
|
foreground = "#5b8234";
|
||||||
|
frame_color = "#5b8234";
|
||||||
|
highlight = "#73a542";
|
||||||
|
timeout = 10;
|
||||||
|
};
|
||||||
|
|
||||||
|
urgency_critical = {
|
||||||
|
background = "#191311";
|
||||||
|
foreground = "#b7472a";
|
||||||
|
frame_color = "#b7472a";
|
||||||
|
highlight = "#d25637";
|
||||||
|
timeout = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
fullscreen_delay_everything = {
|
||||||
|
# delay notifications by default
|
||||||
|
fullscreen = "delay";
|
||||||
|
};
|
||||||
|
|
||||||
|
fullscreen_show_critical = {
|
||||||
|
# show critical notification
|
||||||
|
fullscreen = "show";
|
||||||
|
msg_urgency = "critical";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
376
home/wm/i3/default.nix
Normal file
376
home/wm/i3/default.nix
Normal file
|
@ -0,0 +1,376 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
isEnabled = config.my.home.wm.windowManager == "i3";
|
||||||
|
|
||||||
|
terminal =
|
||||||
|
if config.my.home.terminal.program != null
|
||||||
|
then config.my.home.terminal.program
|
||||||
|
else "i3-sensible-terminal";
|
||||||
|
|
||||||
|
alt = "Mod1"; # `Alt` key
|
||||||
|
modifier = "Mod4"; # `Super` key
|
||||||
|
movementKeys = [ "Left" "Down" "Up" "Right" ];
|
||||||
|
vimMovementKeys = [ "h" "j" "k" "l" ];
|
||||||
|
shutdownMode =
|
||||||
|
"(l)ock, (e)xit, switch_(u)ser, (h)ibernate, (r)eboot, (Shift+s)hutdown";
|
||||||
|
|
||||||
|
# Takes an attrset of bindings for movement keys, transforms it to Vim keys
|
||||||
|
toVimKeyBindings =
|
||||||
|
let
|
||||||
|
toVimKeys = builtins.replaceStrings movementKeys vimMovementKeys;
|
||||||
|
in
|
||||||
|
lib.my.renameAttrs toVimKeys;
|
||||||
|
|
||||||
|
# Takes an attrset of bindings for movement keys, add equivalent Vim keys
|
||||||
|
addVimKeyBindings = bindings: bindings // (toVimKeyBindings bindings);
|
||||||
|
# Generate an attrset of movement bindings, using the mapper function
|
||||||
|
genMovementBindings = f: addVimKeyBindings (lib.my.genAttrs' movementKeys f);
|
||||||
|
|
||||||
|
# Used in multiple scripts to show messages through keybindings
|
||||||
|
notify-send = "${pkgs.libnotify}/bin/notify-send";
|
||||||
|
|
||||||
|
# Screen backlight management
|
||||||
|
changeBacklight = "${pkgs.ambroisie.change-backlight}/bin/change-backlight";
|
||||||
|
|
||||||
|
# Audio and volume management
|
||||||
|
changeAudio = "${pkgs.ambroisie.change-audio}/bin/change-audio";
|
||||||
|
|
||||||
|
# Lock management
|
||||||
|
toggleXautolock =
|
||||||
|
let
|
||||||
|
systemctlUser = "${pkgs.systemd}/bin/systemctl --user";
|
||||||
|
notify = "${notify-send} -u low"
|
||||||
|
+ " -h string:x-canonical-private-synchronous:xautolock-toggle";
|
||||||
|
in
|
||||||
|
pkgs.writeScript "toggle-xautolock" ''
|
||||||
|
#!/bin/sh
|
||||||
|
if ${systemctlUser} is-active xautolock-session.service; then
|
||||||
|
${systemctlUser} stop --user xautolock-session.service
|
||||||
|
xset s off
|
||||||
|
${notify} "Disabled Xautolock"
|
||||||
|
else
|
||||||
|
${systemctlUser} start xautolock-session.service
|
||||||
|
xset s on
|
||||||
|
${notify} "Enabled Xautolock"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf isEnabled {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
ambroisie.dragger # drag-and-drop from the CLI
|
||||||
|
ambroisie.i3-get-window-criteria # little helper for i3 configuration
|
||||||
|
arandr # Used by a mapping
|
||||||
|
pamixer # Used by a mapping
|
||||||
|
playerctl # Used by a mapping
|
||||||
|
];
|
||||||
|
|
||||||
|
xsession.windowManager.i3 = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
config = {
|
||||||
|
inherit modifier;
|
||||||
|
|
||||||
|
bars =
|
||||||
|
let
|
||||||
|
barConfigPath =
|
||||||
|
config.xdg.configFile."i3status-rust/config-top.toml".target;
|
||||||
|
i3status-rs =
|
||||||
|
"${config.programs.i3status-rust.package}/bin/i3status-rs";
|
||||||
|
in
|
||||||
|
[
|
||||||
|
{
|
||||||
|
statusCommand = "${i3status-rs} ${barConfigPath}";
|
||||||
|
trayOutput = "primary";
|
||||||
|
position = "top";
|
||||||
|
|
||||||
|
colors = {
|
||||||
|
background = "#021215";
|
||||||
|
statusline = "#93a1a1";
|
||||||
|
separator = "#2aa198";
|
||||||
|
|
||||||
|
focusedWorkspace = {
|
||||||
|
border = "#2aa198";
|
||||||
|
background = "#073642";
|
||||||
|
text = "#eee895";
|
||||||
|
};
|
||||||
|
|
||||||
|
activeWorkspace = {
|
||||||
|
border = "#073642";
|
||||||
|
background = "#002b36";
|
||||||
|
text = "#839496";
|
||||||
|
};
|
||||||
|
|
||||||
|
inactiveWorkspace = {
|
||||||
|
border = "#002b36";
|
||||||
|
background = "#021215";
|
||||||
|
text = "#586e75";
|
||||||
|
};
|
||||||
|
|
||||||
|
urgentWorkspace = {
|
||||||
|
border = "#cb4b16";
|
||||||
|
background = "#dc322f";
|
||||||
|
text = "#fdf6e3";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fonts = {
|
||||||
|
names = [ "DejaVu Sans Mono" "FontAwesome5Free" ];
|
||||||
|
size = 8.0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
floating = {
|
||||||
|
inherit modifier;
|
||||||
|
|
||||||
|
criteria = [
|
||||||
|
{ class = "^tridactyl_editor$"; }
|
||||||
|
{ class = "^Blueman-.*$"; }
|
||||||
|
{ title = "^htop$"; }
|
||||||
|
{ class = "^Thunderbird$"; instance = "Mailnews"; window_role = "filterlist"; }
|
||||||
|
{ class = "^Pavucontrol.*$"; }
|
||||||
|
{ class = "^Arandr$"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
focus = {
|
||||||
|
followMouse = true; # It is annoying sometimes, but useful enough to use
|
||||||
|
mouseWarping = true; # Let's moving around when switching screens
|
||||||
|
};
|
||||||
|
|
||||||
|
fonts = {
|
||||||
|
names = [ "DejaVu Sans Mono" ];
|
||||||
|
size = 8.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
# I don't care for i3's default values, I specify them all explicitly
|
||||||
|
keybindings = lib.my.recursiveMerge [
|
||||||
|
{
|
||||||
|
# The basics
|
||||||
|
"${modifier}+Return" = "exec ${terminal} ${
|
||||||
|
lib.optionalString config.my.home.tmux.enable "-e tmux new-session"
|
||||||
|
}";
|
||||||
|
"${modifier}+Shift+Return" = "exec env TMUX=nil ${terminal}";
|
||||||
|
"${modifier}+Shift+q" = "kill";
|
||||||
|
"${modifier}+f" = "fullscreen toggle";
|
||||||
|
"${modifier}+Shift+c" = "reload";
|
||||||
|
"${modifier}+Shift+r" = "restart";
|
||||||
|
"${modifier}+Shift+e" =
|
||||||
|
"exec i3-nagbar -t warning -m 'Do you want to exit i3?' -b 'Yes' 'i3-msg exit'";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# Splits
|
||||||
|
"${modifier}+g" = "split h"; # Horizontally
|
||||||
|
"${modifier}+v" = "split v"; # Vertically
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# Layouts
|
||||||
|
"${modifier}+s" = "layout stacking";
|
||||||
|
"${modifier}+w" = "layout tabbed";
|
||||||
|
"${modifier}+e" = "layout toggle split";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# Toggle tiling/floating
|
||||||
|
"${modifier}+Control+space" = "floating toggle";
|
||||||
|
# Change focus between tiling/floating
|
||||||
|
"${modifier}+space" = "focus mode_toggle";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# Focus parent container
|
||||||
|
"${modifier}+q" = "focus parent";
|
||||||
|
# Focus child container
|
||||||
|
"${modifier}+a" = "focus child";
|
||||||
|
}
|
||||||
|
(lib.optionalAttrs config.my.home.wm.rofi.enable {
|
||||||
|
# Rofi tools
|
||||||
|
"${modifier}+d" = "exec rofi -show drun -disable-history";
|
||||||
|
"${modifier}+Shift+d" = "exec rofi -show run -disable-history";
|
||||||
|
"${modifier}+p" = "exec --no-startup-id flameshot gui";
|
||||||
|
"${modifier}+Shift+p" = "exec rofi -show emoji";
|
||||||
|
"${modifier}+b" =
|
||||||
|
let
|
||||||
|
inherit (config.my.home.bluetooth) enable;
|
||||||
|
prog = "${pkgs.ambroisie.rofi-bluetooth}/bin/rofi-bluetooth";
|
||||||
|
in
|
||||||
|
lib.mkIf enable "exec ${prog}";
|
||||||
|
})
|
||||||
|
(
|
||||||
|
# Changing container focus
|
||||||
|
genMovementBindings (
|
||||||
|
key: lib.nameValuePair
|
||||||
|
"${modifier}+${key}"
|
||||||
|
"focus ${lib.toLower key}"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
# Changing screen focus
|
||||||
|
genMovementBindings (
|
||||||
|
key: lib.nameValuePair
|
||||||
|
"${modifier}+${alt}+${key}"
|
||||||
|
"focus output ${lib.toLower key}"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
# Moving workspace to another screen
|
||||||
|
genMovementBindings (
|
||||||
|
key: lib.nameValuePair
|
||||||
|
"${modifier}+${alt}+Control+${key}"
|
||||||
|
"move workspace to output ${lib.toLower key}"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
# Moving container to another screen
|
||||||
|
genMovementBindings (
|
||||||
|
key: lib.nameValuePair
|
||||||
|
"${modifier}+${alt}+Shift+${key}"
|
||||||
|
"move container to output ${lib.toLower key}"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(addVimKeyBindings {
|
||||||
|
# Scroll through workspaces on given screen
|
||||||
|
"${modifier}+Control+Left" = "workspace prev_on_output";
|
||||||
|
"${modifier}+Control+Right" = "workspace next_on_output";
|
||||||
|
# Use scratchpad
|
||||||
|
"${modifier}+Control+Up" = "move to scratchpad";
|
||||||
|
"${modifier}+Control+Down" = "scratchpad show";
|
||||||
|
})
|
||||||
|
(
|
||||||
|
# Moving floating window
|
||||||
|
genMovementBindings (
|
||||||
|
key: lib.nameValuePair
|
||||||
|
"${modifier}+Shift+${key}"
|
||||||
|
"move ${lib.toLower key} 10 px"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
# Media keys
|
||||||
|
"XF86AudioRaiseVolume" = "exec --no-startup-id ${changeAudio} up 5";
|
||||||
|
"XF86AudioLowerVolume" = "exec --no-startup-id ${changeAudio} down 5";
|
||||||
|
"Control+XF86AudioRaiseVolume" = "exec --no-startup-id ${changeAudio} up 1";
|
||||||
|
"Control+XF86AudioLowerVolume" = "exec --no-startup-id ${changeAudio} down 1";
|
||||||
|
|
||||||
|
"Shift+XF86AudioRaiseVolume" = "exec --no-startup-id ${changeAudio} up --force 5";
|
||||||
|
"Shift+XF86AudioLowerVolume" = "exec --no-startup-id ${changeAudio} down --force 5";
|
||||||
|
"Control+Shift+XF86AudioRaiseVolume" = "exec --no-startup-id ${changeAudio} up --force 1";
|
||||||
|
"Control+Shift+XF86AudioLowerVolume" = "exec --no-startup-id ${changeAudio} down --force 1";
|
||||||
|
|
||||||
|
"XF86AudioMute" = "exec --no-startup-id ${changeAudio} toggle";
|
||||||
|
"XF86AudioMicMute" = "exec --no-startup-id ${changeAudio} toggle mic";
|
||||||
|
|
||||||
|
"XF86AudioPlay" = "exec playerctl play-pause";
|
||||||
|
"XF86AudioNext" = "exec playerctl next";
|
||||||
|
"XF86AudioPrev" = "exec playerctl previous";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# Screen management
|
||||||
|
"XF86Display" = "exec arandr";
|
||||||
|
"XF86MonBrightnessUp" = "exec --no-startup-id ${changeBacklight} up 10";
|
||||||
|
"XF86MonBrightnessDown" = "exec --no-startup-id ${changeBacklight} down 10";
|
||||||
|
"Control+XF86MonBrightnessUp" = "exec --no-startup-id ${changeBacklight} up 1";
|
||||||
|
"Control+XF86MonBrightnessDown" = "exec --no-startup-id ${changeBacklight} down 1";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# Sub-modes
|
||||||
|
"${modifier}+r" = "mode resize";
|
||||||
|
"${modifier}+Shift+space" = "mode floating";
|
||||||
|
}
|
||||||
|
(lib.optionalAttrs config.my.home.wm.screen-lock.enable {
|
||||||
|
"${modifier}+x" = "exec ${toggleXautolock}";
|
||||||
|
})
|
||||||
|
(
|
||||||
|
let
|
||||||
|
execDunstctl = "exec ${pkgs.dunst}/bin/dunstctl";
|
||||||
|
in
|
||||||
|
lib.optionalAttrs config.my.home.wm.dunst.enable {
|
||||||
|
"${modifier}+minus" = "${execDunstctl} close";
|
||||||
|
"${modifier}+Shift+minus" = "${execDunstctl} close-all";
|
||||||
|
"${modifier}+equal" = "${execDunstctl} history-pop";
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
keycodebindings =
|
||||||
|
let
|
||||||
|
toKeycode = n: if n == 0 then 19 else n + 9;
|
||||||
|
createWorkspaceBindings = mapping: command:
|
||||||
|
let
|
||||||
|
createWorkspaceBinding = num:
|
||||||
|
lib.nameValuePair
|
||||||
|
"${mapping}+${toString (toKeycode num)}"
|
||||||
|
"${command} ${toString num}";
|
||||||
|
oneToNine = builtins.genList (x: x + 1) 9;
|
||||||
|
in
|
||||||
|
lib.my.genAttrs' oneToNine createWorkspaceBinding;
|
||||||
|
in
|
||||||
|
lib.my.recursiveMerge [
|
||||||
|
(createWorkspaceBindings modifier "workspace number")
|
||||||
|
(createWorkspaceBindings "${modifier}+Shift" "move container to workspace number")
|
||||||
|
{
|
||||||
|
"${modifier}+${toString (toKeycode 0)}" = ''mode "${shutdownMode}"'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
modes =
|
||||||
|
let
|
||||||
|
makeModeBindings = attrs: (addVimKeyBindings attrs) // {
|
||||||
|
"Escape" = "mode default";
|
||||||
|
"Return" = "mode default";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
resize = makeModeBindings {
|
||||||
|
# Normal movements
|
||||||
|
"Left" = "resize shrink width 10 px or 10 ppt";
|
||||||
|
"Down" = "resize grow height 10 px or 10 ppt";
|
||||||
|
"Up" = "resize shrink height 10 px or 10 ppt";
|
||||||
|
"Right" = "resize grow width 10 px or 10 ppt";
|
||||||
|
# Small movements
|
||||||
|
"Control+Left" = "resize shrink width 1 px or 1 ppt";
|
||||||
|
"Control+Down" = "resize grow height 1 px or 1 ppt";
|
||||||
|
"Control+Up" = "resize shrink height 1 px or 1 ppt";
|
||||||
|
"Control+Right" = "resize grow width 1 px or 1 ppt";
|
||||||
|
# Big movements
|
||||||
|
"Shift+Left" = "resize shrink width 100 px or 100 ppt";
|
||||||
|
"Shift+Down" = "resize grow height 100 px or 100 ppt";
|
||||||
|
"Shift+Up" = "resize shrink height 100 px or 100 ppt";
|
||||||
|
"Shift+Right" = "resize grow width 100 px or 100 ppt";
|
||||||
|
};
|
||||||
|
|
||||||
|
floating = makeModeBindings {
|
||||||
|
# Normal movements
|
||||||
|
"Left" = "move left 10 px";
|
||||||
|
"Down" = "move down 10 px";
|
||||||
|
"Up" = "move up 10 px";
|
||||||
|
"Right" = "move right 10 px";
|
||||||
|
# Small movements
|
||||||
|
"Control+Left" = "move left 1 px";
|
||||||
|
"Control+Down" = "move down 1 px";
|
||||||
|
"Control+Up" = "move up 1 px";
|
||||||
|
"Control+Right" = "move right 1 px";
|
||||||
|
# Big movements
|
||||||
|
"Shift+Left" = "move left 100 px";
|
||||||
|
"Shift+Down" = "move down 100 px";
|
||||||
|
"Shift+Up" = "move up 100 px";
|
||||||
|
"Shift+Right" = "move right 100 px";
|
||||||
|
};
|
||||||
|
|
||||||
|
${shutdownMode} = makeModeBindings {
|
||||||
|
"l" = "exec --no-startup-id loginctl lock-session, mode default";
|
||||||
|
"s" = "exec --no-startup-id systemctl suspend, mode default";
|
||||||
|
"u" = "exec --no-startup-id dm-tool switch-to-greeter, mode default";
|
||||||
|
"e" = "exec --no-startup-id i3-msg exit, mode default";
|
||||||
|
"h" = "exec --no-startup-id systemctl hibernate, mode default";
|
||||||
|
"r" = "exec --no-startup-id systemctl reboot, mode default";
|
||||||
|
"Shift+s" = "exec --no-startup-id systemctl poweroff, mode default";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
startup = [
|
||||||
|
# FIXME
|
||||||
|
# { commdand; always; notification; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
87
home/wm/i3bar/default.nix
Normal file
87
home/wm/i3bar/default.nix
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.my.home.wm.i3bar;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
alsaUtils # Used by `sound` block
|
||||||
|
lm_sensors # Used by `temperature` block
|
||||||
|
font-awesome # Icon font
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.i3status-rust = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
bars = {
|
||||||
|
top = {
|
||||||
|
icons = "awesome5";
|
||||||
|
|
||||||
|
blocks = builtins.filter (attr: attr != { }) [
|
||||||
|
{
|
||||||
|
block = "music";
|
||||||
|
buttons = [ "prev" "play" "next" ];
|
||||||
|
max_width = 50;
|
||||||
|
dynamic_width = true;
|
||||||
|
hide_when_empty = true;
|
||||||
|
}
|
||||||
|
(lib.optionalAttrs config.my.home.bluetooth.enable {
|
||||||
|
block = "bluetooth";
|
||||||
|
mac = "4C:87:5D:06:40:D9";
|
||||||
|
hide_disconnected = true;
|
||||||
|
format = "Boson {percentage}";
|
||||||
|
})
|
||||||
|
(lib.optionalAttrs config.my.home.bluetooth.enable {
|
||||||
|
block = "bluetooth";
|
||||||
|
mac = "94:DB:56:00:EE:93";
|
||||||
|
hide_disconnected = true;
|
||||||
|
format = "Protons {percentage}";
|
||||||
|
})
|
||||||
|
(lib.optionalAttrs config.my.home.bluetooth.enable {
|
||||||
|
block = "bluetooth";
|
||||||
|
mac = "F7:78:BA:76:52:F7";
|
||||||
|
hide_disconnected = true;
|
||||||
|
format = "MX Ergo {percentage}";
|
||||||
|
})
|
||||||
|
{
|
||||||
|
block = "cpu";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
block = "disk_space";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
block = "net";
|
||||||
|
format = "{ssid} {ip} {signal_strength}";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
block = "backlight";
|
||||||
|
invert_icons = true;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
block = "battery";
|
||||||
|
format = "{percentage} ({time})";
|
||||||
|
full_format = "{percentage}";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
block = "temperature";
|
||||||
|
collapsed = false;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
block = "sound";
|
||||||
|
device_kind = "source"; # Microphone status
|
||||||
|
format = ""; # Only show icon
|
||||||
|
}
|
||||||
|
{
|
||||||
|
block = "sound";
|
||||||
|
show_volume_when_muted = true;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
block = "time";
|
||||||
|
format = "%F %T";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue