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
|
||||
name: check config
|
||||
type: exec
|
||||
name: NixOS config check
|
||||
|
||||
steps:
|
||||
- name: format check
|
||||
image: nixos/nix
|
||||
commands:
|
||||
- nix-shell -p nixpkgs-fmt --run 'nixpkgs-fmt . --check'
|
||||
- name: nix flake check
|
||||
commands:
|
||||
- nix flake check
|
||||
|
||||
- name: notify
|
||||
image: plugins/matrix
|
||||
settings:
|
||||
homeserver:
|
||||
from_secret: matrix_homeserver
|
||||
roomid:
|
||||
from_secret: matrix_roomid
|
||||
username:
|
||||
from_secret: matrix_username
|
||||
password:
|
||||
from_secret: matrix_password
|
||||
trigger:
|
||||
status:
|
||||
- failure
|
||||
- success
|
||||
- name: notifiy
|
||||
commands:
|
||||
- nix run .#matrix-notifier
|
||||
environment:
|
||||
ADDRESS:
|
||||
from_secret: matrix_homeserver
|
||||
ROOM:
|
||||
from_secret: matrix_roomid
|
||||
USER:
|
||||
from_secret: matrix_username
|
||||
PASS:
|
||||
from_secret: matrix_password
|
||||
when:
|
||||
status:
|
||||
- failure
|
||||
- success
|
||||
...
|
||||
|
|
1
.envrc
1
.envrc
|
@ -6,3 +6,4 @@ use_flake() {
|
|||
|
||||
ulimit -s unlimited # Bypass current bug in `nix` flakes evaluation
|
||||
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 Lohr webhook and SSH key
|
||||
* Configure Jellyfin
|
||||
* Configure Jackett and NZBHydra2
|
||||
* Configure Prowlarr,Jackett and NZBHydra2
|
||||
* Configure Sonarr, Radarr, Bazarr
|
||||
* Configure Transmission's webui port
|
||||
* 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-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() {
|
||||
|
@ -78,7 +80,7 @@ get_pgp() {
|
|||
}
|
||||
|
||||
get_creds() {
|
||||
BW_SESSION="$(bw login --raw)"
|
||||
BW_SESSION="$(bw login --raw || bw unlock --raw)"
|
||||
export BW_SESSION
|
||||
|
||||
get_ssh
|
||||
|
|
73
flake.lock
73
flake.lock
|
@ -1,12 +1,33 @@
|
|||
{
|
||||
"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": {
|
||||
"locked": {
|
||||
"lastModified": 1619345332,
|
||||
"narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=",
|
||||
"lastModified": 1644229661,
|
||||
"narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28",
|
||||
"rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -23,11 +44,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1619558193,
|
||||
"narHash": "sha256-DljP5/9EX0eXEPhzCUFqFEHkkcFuXJBx1PTgcv0OgyM=",
|
||||
"lastModified": 1646559628,
|
||||
"narHash": "sha256-WDoqxH/IPTV8CkI15wwzvXYgXq9UPr8xd8WKziuaynw=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "18ad12d52b8cebbb57013865eec2be5125de050a",
|
||||
"rev": "afe96e7433c513bf82375d41473c57d1f66b4e68",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -39,11 +60,11 @@
|
|||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1619464443,
|
||||
"narHash": "sha256-R7WAb8EnkIJxxaF6GTHUPytjonhB4Zm0iatyWoW169A=",
|
||||
"lastModified": 1646497237,
|
||||
"narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "8e4fe32876ca15e3d5eb3ecd3ca0b224417f5f17",
|
||||
"rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -55,11 +76,11 @@
|
|||
},
|
||||
"nur": {
|
||||
"locked": {
|
||||
"lastModified": 1619628114,
|
||||
"narHash": "sha256-s3pQyvMfXVmbQOX224yOWQf6zi8406sShFF4u17LVQ0=",
|
||||
"lastModified": 1646721260,
|
||||
"narHash": "sha256-r8ZWtEwiRxLKOtsT2yvU9Rs1oqL/RsSkPkgupXsw1bU=",
|
||||
"owner": "nix-community",
|
||||
"repo": "NUR",
|
||||
"rev": "0615e756dc14986c4968fa478c0bd080d621cb2b",
|
||||
"rev": "25adb63e9381cb0342cdbe2d2d56266f4974a2c5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -69,12 +90,38 @@
|
|||
"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": {
|
||||
"inputs": {
|
||||
"agenix": "agenix",
|
||||
"futils": "futils",
|
||||
"home-manager": "home-manager",
|
||||
"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";
|
||||
inputs = {
|
||||
agenix = {
|
||||
type = "github";
|
||||
owner = "ryantm";
|
||||
repo = "agenix";
|
||||
ref = "main";
|
||||
inputs = {
|
||||
nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
futils = {
|
||||
type = "github";
|
||||
owner = "numtide";
|
||||
|
@ -31,9 +41,29 @@
|
|||
repo = "NUR";
|
||||
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
|
||||
inherit (futils.lib) eachDefaultSystem;
|
||||
|
||||
|
@ -51,58 +81,84 @@
|
|||
nur.overlay
|
||||
];
|
||||
}
|
||||
home-manager.nixosModules.home-manager
|
||||
{
|
||||
home-manager.users.ambroisie = import ./home;
|
||||
# Nix Flakes compatibility
|
||||
home-manager.useGlobalPkgs = true;
|
||||
home-manager.useUserPackages = true;
|
||||
}
|
||||
# Include generic settings
|
||||
./modules
|
||||
# Include bundles of settings
|
||||
./profiles
|
||||
];
|
||||
|
||||
buildHost = name: system: lib.nixosSystem {
|
||||
inherit system;
|
||||
modules = defaultModules ++ [
|
||||
(./. + "/${name}.nix")
|
||||
(./. + "/machines/${name}")
|
||||
];
|
||||
specialArgs = {
|
||||
# Use my extended lib in NixOS configuration
|
||||
inherit lib;
|
||||
# Inject inputs to use them in global registry
|
||||
inherit inputs;
|
||||
};
|
||||
};
|
||||
in
|
||||
eachDefaultSystem
|
||||
(system:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
in
|
||||
rec {
|
||||
apps = {
|
||||
diff-flake = futils.lib.mkApp { drv = packages.diff-flake; };
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
in
|
||||
rec {
|
||||
apps = {
|
||||
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 {
|
||||
name = "NixOS-config";
|
||||
buildInputs = with pkgs; [
|
||||
git-crypt
|
||||
gitAndTools.pre-commit
|
||||
gnupg
|
||||
nixpkgs-fmt
|
||||
];
|
||||
};
|
||||
devShell = pkgs.mkShell {
|
||||
name = "NixOS-config";
|
||||
|
||||
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;
|
||||
|
||||
overlays = {
|
||||
overlays = import ./overlays // {
|
||||
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 {
|
||||
aramis = "x86_64-linux";
|
||||
porthos = "x86_64-linux";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -10,6 +10,8 @@ in
|
|||
config.programs.bat = lib.mkIf cfg.enable {
|
||||
enable = true;
|
||||
config = {
|
||||
theme = "gruvbox-dark";
|
||||
|
||||
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 = [
|
||||
./bat.nix
|
||||
./direnv.nix
|
||||
./documentation.nix
|
||||
./bat
|
||||
./bluetooth
|
||||
./comma
|
||||
./direnv
|
||||
./discord
|
||||
./documentation
|
||||
./feh
|
||||
./firefox
|
||||
./flameshot
|
||||
./gammastep
|
||||
./gdb
|
||||
./git
|
||||
./gpg.nix
|
||||
./htop.nix
|
||||
./jq.nix
|
||||
./packages.nix
|
||||
./pager.nix
|
||||
./secrets # Home-manager specific secrets
|
||||
./ssh.nix
|
||||
./tmux.nix
|
||||
./gpg
|
||||
./gtk
|
||||
./htop
|
||||
./jq
|
||||
./mail
|
||||
./mpv
|
||||
./nix-index
|
||||
./nm-applet
|
||||
./packages
|
||||
./pager
|
||||
./power-alert
|
||||
./ssh
|
||||
./terminal
|
||||
./tmux
|
||||
./udiskie
|
||||
./vim
|
||||
./xdg.nix
|
||||
./wm
|
||||
./x
|
||||
./xdg
|
||||
./zathura
|
||||
./zsh
|
||||
];
|
||||
|
||||
|
@ -23,4 +41,7 @@
|
|||
|
||||
# Who am I?
|
||||
home.username = "ambroisie";
|
||||
|
||||
# Start services automatically
|
||||
systemd.user.startServices = "sd-switch";
|
||||
}
|
||||
|
|
|
@ -9,7 +9,9 @@ in
|
|||
|
||||
config.programs.direnv = lib.mkIf cfg.enable {
|
||||
enable = true;
|
||||
# A better `use_nix`
|
||||
enableNixDirenvIntegration = true;
|
||||
nix-direnv = {
|
||||
# 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
|
||||
*~
|
||||
~.swp
|
||||
|
||||
# Direnv files
|
||||
.envrc
|
||||
.direnv/
|
||||
|
|
|
@ -1,34 +1,72 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
cfg = config.my.home.git;
|
||||
|
||||
inherit (lib.my) mkMailAddress;
|
||||
in
|
||||
{
|
||||
options.my.home.git = with lib.my; {
|
||||
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 {
|
||||
enable = true;
|
||||
|
||||
# Who am I?
|
||||
userEmail = "bruno@belanyi.fr";
|
||||
userEmail = mkMailAddress "bruno" "belanyi.fr";
|
||||
userName = "Bruno BELANYI";
|
||||
|
||||
# I want the full experience
|
||||
package = pkgs.gitAndTools.gitFull;
|
||||
|
||||
aliases = {
|
||||
lol = "log --graph --decorate --pretty=oneline --abbrev-commit";
|
||||
git = "!git";
|
||||
lol = "log --graph --decorate --pretty=oneline --abbrev-commit --topo-order";
|
||||
lola = "lol --all";
|
||||
assume = "update-index --assume-unchanged";
|
||||
unassume = "update-index --no-assume-unchanged";
|
||||
assumed = "!git ls-files -v | grep ^h | cut -c 3-";
|
||||
pick = "log -p -G";
|
||||
push-new = "!git push -u origin "
|
||||
+ ''"$(git branch | grep '^* ' | cut -f2- -d' ')"'';
|
||||
};
|
||||
|
||||
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
|
||||
extraConfig = {
|
||||
# Makes it a bit more readable
|
||||
|
@ -62,13 +100,6 @@ in
|
|||
whitespace = "red reverse";
|
||||
};
|
||||
|
||||
"color.diff-highlight" = {
|
||||
oldNormal = "red bold";
|
||||
oldHighlight = "red bold 52";
|
||||
newNormal = "green bold";
|
||||
newHighlight = "green bold 22";
|
||||
};
|
||||
|
||||
commit = {
|
||||
# Show my changes when writing the message
|
||||
verbose = true;
|
||||
|
@ -89,16 +120,6 @@ in
|
|||
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 = {
|
||||
# Avoid useless merge commits
|
||||
rebase = true;
|
||||
|
@ -114,11 +135,33 @@ in
|
|||
autoSquash = 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
|
||||
includes = [
|
||||
{ path = ./epita.config; condition = "gitdir:~/git/EPITA/"; }
|
||||
{
|
||||
condition = "gitdir:~/git/EPITA/";
|
||||
contents = {
|
||||
user = {
|
||||
name = "Bruno BELANYI";
|
||||
email = mkMailAddress "bruno.belanyi" "epita.fr";
|
||||
};
|
||||
};
|
||||
}
|
||||
];
|
||||
|
||||
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;
|
||||
in
|
||||
{
|
||||
options.my.home.gpg = with lib.my; {
|
||||
enable = mkDisableOption "gpg configuration";
|
||||
options.my.home.gpg = with lib; {
|
||||
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 {
|
||||
|
@ -15,7 +22,7 @@ in
|
|||
services.gpg-agent = {
|
||||
enable = true;
|
||||
enableSshSupport = true; # One agent to rule them all
|
||||
pinentryFlavor = "tty";
|
||||
pinentryFlavor = cfg.pinentry;
|
||||
extraConfig = ''
|
||||
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";
|
||||
};
|
||||
|
||||
config.programs.ssh = {
|
||||
config.programs.ssh = lib.mkIf cfg.enable {
|
||||
enable = true;
|
||||
|
||||
matchBlocks = {
|
||||
|
@ -40,6 +40,12 @@ in
|
|||
identityFile = "~/.ssh/shared_rsa";
|
||||
user = "ambroisie";
|
||||
};
|
||||
|
||||
work = {
|
||||
hostname = "workspaces.dgexsol.fr";
|
||||
identityFile = "~/.ssh/shared_rsa";
|
||||
user = "bruno_belanyi";
|
||||
};
|
||||
};
|
||||
|
||||
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, ... }:
|
||||
let
|
||||
cfg = config.my.home.tmux;
|
||||
hasGUI = config.my.home.x.enable || (config.my.home.wm != null);
|
||||
in
|
||||
{
|
||||
options.my.home.tmux = with lib.my; {
|
||||
|
@ -13,7 +14,7 @@ in
|
|||
keyMode = "vi"; # Home-row keys and other niceties
|
||||
clock24 = true; # I'm one of those heathens
|
||||
escapeTime = 0; # Let vim do its thing instead
|
||||
historyLimit = 5000; # Bigger buffer
|
||||
historyLimit = 50000; # Bigger buffer
|
||||
terminal = "tmux-256color"; # I want accurate termcap info
|
||||
|
||||
plugins = with pkgs.tmuxPlugins; [
|
||||
|
@ -23,8 +24,16 @@ in
|
|||
pain-control
|
||||
# Better session management
|
||||
sessionist
|
||||
# X clipboard integration
|
||||
yank
|
||||
(lib.optionalAttrs hasGUI {
|
||||
# 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
|
||||
plugin = prefix-highlight;
|
||||
|
@ -41,7 +50,13 @@ in
|
|||
extraConfig = ''
|
||||
# Better vim mode
|
||||
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
|
||||
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
|
||||
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
|
||||
setlocal colorcolumn=100
|
||||
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
|
||||
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
|
||||
setlocal shiftwidth=2
|
||||
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
|
||||
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
|
||||
setlocal colorcolumn=99
|
||||
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
|
||||
nnoremap Y y$
|
||||
lua << EOF
|
||||
local wk = require("which-key")
|
||||
|
||||
" Run make silently, then skip the 'Press ENTER to continue'
|
||||
noremap <Leader>m :silent! :make! \| :redraw!<CR>
|
||||
local keys = {
|
||||
["<leader>"] = { "<cmd>nohls<CR>", "Clear search highlight" },
|
||||
}
|
||||
|
||||
" Remove search-highlighting
|
||||
noremap <Leader><Leader> :nohls<CR>
|
||||
wk.register(keys, { prefix = "<leader>" })
|
||||
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
|
||||
nmap ( [
|
||||
nmap ) ]
|
||||
omap ( [
|
||||
omap ) ]
|
||||
xmap ( [
|
||||
xmap ) ]
|
||||
lua << EOF
|
||||
local wk = require("which-key")
|
||||
|
||||
local keys = {
|
||||
-- Edition and navigation mappins
|
||||
["["] = {
|
||||
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"
|
||||
"autoload"
|
||||
"ftdetect"
|
||||
"lua"
|
||||
"plugin"
|
||||
];
|
||||
in
|
||||
|
@ -30,11 +31,9 @@ in
|
|||
|
||||
plugins = with pkgs.vimPlugins; [
|
||||
# Theming
|
||||
lightline-vim # Fancy status bar
|
||||
{
|
||||
plugin = onedark-vim; # Nice dark theme
|
||||
optional = true; # Needs to be `packadd`-ed manually...
|
||||
}
|
||||
vim-gruvbox8 # Nice dark theme
|
||||
lualine-nvim # A lua-based status line
|
||||
lualine-lsp-progress # Show progress for LSP servers
|
||||
|
||||
# tpope essentials
|
||||
vim-commentary # Easy comments
|
||||
|
@ -57,20 +56,53 @@ in
|
|||
vim-toml
|
||||
|
||||
# General enhancements
|
||||
fastfold # Better folding
|
||||
vim-qf # Better quick-fix list
|
||||
|
||||
# Other wrappers
|
||||
fzfWrapper # The vim plugin inside the 'fzf' package
|
||||
fzf-vim # Fuzzy commands
|
||||
git-messenger-vim # A simple blame window
|
||||
|
||||
# LSP and linting
|
||||
ale # Asynchronous Linting Engine
|
||||
lightline-ale # Status bar integration
|
||||
lsp_lines-nvim # Show diagnostics *over* regions
|
||||
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;
|
||||
|
||||
# Linters, formatters, etc...
|
||||
extraPackages = with pkgs; [
|
||||
# C/C++
|
||||
clang-tools
|
||||
|
||||
# Nix
|
||||
nixpkgs-fmt
|
||||
|
||||
# Shell
|
||||
shellcheck
|
||||
shfmt
|
||||
];
|
||||
};
|
||||
|
||||
config.xdg.configFile = lib.mkIf cfg.enable configFiles;
|
||||
|
|
|
@ -13,6 +13,13 @@ set wildmenu
|
|||
" Enable syntax high-lighting and file-type specific plugins
|
||||
syntax 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 {{{
|
||||
|
@ -65,13 +72,18 @@ set lazyredraw
|
|||
" Timeout quickly on shortcuts, I can't wait two seconds to delete in visual
|
||||
set timeoutlen=500
|
||||
|
||||
" Timeout quickly for CursorHold events (and also swap file)
|
||||
set updatetime=250
|
||||
|
||||
" Set dark mode by default
|
||||
set background=dark
|
||||
|
||||
" Load it manually because of autoload functions...
|
||||
packadd! onedark-vim
|
||||
" Use onedark
|
||||
colorscheme onedark
|
||||
" Include plug-in integration
|
||||
let g:gruvbox_plugin_hi_groups=1
|
||||
" Include filetype integration
|
||||
let g:gruvbox_filetype_hi_groups=1
|
||||
" Use my preferred colorscheme
|
||||
colorscheme gruvbox8
|
||||
" }}}
|
||||
|
||||
" 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