about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--flake.lock1073
-rw-r--r--flake.nix2
-rw-r--r--home-manager/soispha/config/neovim/nixvim/clipboard/default.nix2
-rw-r--r--home-manager/soispha/config/neovim/nixvim/default.nix49
-rw-r--r--home-manager/soispha/config/neovim/nixvim/mappings/default.nix8
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/colorscheme/default.nix (renamed from home-manager/soispha/config/neovim/nixvim/colorscheme/default.nix)0
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/colorscheme/lua/nightfox.lua (renamed from home-manager/soispha/config/neovim/nixvim/colorscheme/lua/nightfox.lua)3
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/default.nix11
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lf-nvim/default.nix8
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lf-nvim/lua/lf-nvim.lua43
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/default.nix11
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/bashls.nix5
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/ltex.nix39
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/lua-ls.nix8
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/nil_ls.nix10
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/rust-analyzer.nix10
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/texlab.nix7
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lualine/default.nix48
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/default.nix12
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/luasnip.lua9
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/all.lua51
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/html/at.lua28
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/html/html.lua105
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/nix/delimiter.lua24
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/delimiter.lua36
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/environments.lua130
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/fonts.lua110
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/greek.lua140
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/math.lua537
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/new.lua51
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/static.lua94
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/system.lua168
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/tmp.lua24
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/nvim-cmp/default.nix47
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/nvim-lint/default.nix8
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/nvim-lint/lua/nvim-lint.lua20
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/raw_plugins/default.nix15
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/treesitter/default.nix31
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/vim-tex/default.nix55
39 files changed, 2952 insertions, 80 deletions
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 00000000..f16f16a5
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,1073 @@
+{
+  "nodes": {
+    "agenix": {
+      "inputs": {
+        "darwin": "darwin",
+        "home-manager": [
+          "home-manager"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1690228878,
+        "narHash": "sha256-9Xe7JV0krp4RJC9W9W9WutZVlw6BlHTFMiUP/k48LQY=",
+        "owner": "ryantm",
+        "repo": "agenix",
+        "rev": "d8c973fd228949736dedf61b7f8cc1ece3236792",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ryantm",
+        "repo": "agenix",
+        "type": "github"
+      }
+    },
+    "beautysh": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "poetry2nix": [
+          "poetry2nix"
+        ],
+        "utils": [
+          "flake-utils"
+        ]
+      },
+      "locked": {
+        "lastModified": 1680308980,
+        "narHash": "sha256-aUEHV0jk2qIFP3jlsWYWhBbm+w/N9gzH3e4I5DcdB5s=",
+        "owner": "lovesegfault",
+        "repo": "beautysh",
+        "rev": "9845efc3ea3e86cc0d41465d720a47f521b2799c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "lovesegfault",
+        "repo": "beautysh",
+        "type": "github"
+      }
+    },
+    "crane": {
+      "inputs": {
+        "flake-compat": [
+          "flake-compat"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "rust-overlay": [
+          "rust-overlay"
+        ]
+      },
+      "locked": {
+        "lastModified": 1691803597,
+        "narHash": "sha256-khWW1Owzselq5o816Lb7x624d6QGnv+kpronK3ndkr4=",
+        "owner": "ipetkov",
+        "repo": "crane",
+        "rev": "7809d369710abb17767b624f9e72b500373580bc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ipetkov",
+        "repo": "crane",
+        "type": "github"
+      }
+    },
+    "darwin": {
+      "inputs": {
+        "nixpkgs": [
+          "agenix",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1673295039,
+        "narHash": "sha256-AsdYgE8/GPwcelGgrntlijMg4t3hLFJFCRF3tL5WVjA=",
+        "owner": "lnl7",
+        "repo": "nix-darwin",
+        "rev": "87b9d090ad39b25b2400029c64825fc2a8868943",
+        "type": "github"
+      },
+      "original": {
+        "owner": "lnl7",
+        "ref": "master",
+        "repo": "nix-darwin",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1692199161,
+        "narHash": "sha256-GqKApvQ1JCf5DzH/Q+P4nwuHb6MaQGaWTu41lYzveF4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "4eed2457b053c4bbad7d90d2b3a1d539c2c9009c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1673956053,
+        "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": [
+          "lanzaboote",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1680392223,
+        "narHash": "sha256-n3g7QFr85lDODKt250rkZj2IFS3i4/8HBU2yKHO3tqw=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "dcc36e45d054d7bb554c9cdab69093debd91a0b5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "inputs": {
+        "systems": [
+          "systems"
+        ]
+      },
+      "locked": {
+        "lastModified": 1689068808,
+        "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake_update": {
+      "inputs": {
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "flake_version_update": [
+          "flake_version_update"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "shell_library": [
+          "shell_library"
+        ],
+        "systems": [
+          "systems"
+        ]
+      },
+      "locked": {
+        "lastModified": 1690979688,
+        "narHash": "sha256-sjemOoAVKv9G71mOvKT5z6RBKshJE62sSwJv+ozj2to=",
+        "ref": "refs/heads/prime",
+        "rev": "3de9c171ffa7b802be517662aac5afb39c42c341",
+        "revCount": 34,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/flake_update.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/flake_update.git"
+      }
+    },
+    "flake_version_update": {
+      "inputs": {
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "systems": [
+          "systems"
+        ]
+      },
+      "locked": {
+        "lastModified": 1685288691,
+        "narHash": "sha256-oP6h34oJ8rm6KlUpyZrX+ww3hnoWny2ecrEXxkU7F3c=",
+        "ref": "refs/heads/prime",
+        "rev": "e9a97e01eca780bd16e1dbdbd8856b59558f4959",
+        "revCount": 5,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/flake_version_update.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/flake_version_update.git"
+      }
+    },
+    "generate_firefox_extensions": {
+      "inputs": {
+        "crane": [
+          "crane"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "rust-overlay": [
+          "rust-overlay"
+        ]
+      },
+      "locked": {
+        "lastModified": 1684560731,
+        "narHash": "sha256-N6RKBHES7bj6XJ+TLiZTggmFuNIT2SSYKUab4YY/io0=",
+        "ref": "refs/heads/prime",
+        "rev": "3ac9f0f8ce9e6bdeb46d07806b6465cb3f80c518",
+        "revCount": 7,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/generate_firefox_extension.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/generate_firefox_extension.git"
+      }
+    },
+    "gitignore": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1660459072,
+        "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "type": "github"
+      }
+    },
+    "grades": {
+      "inputs": {
+        "crane": [
+          "crane"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "rust-overlay": [
+          "rust-overlay"
+        ]
+      },
+      "locked": {
+        "lastModified": 1688237666,
+        "narHash": "sha256-2q7oy/MtoAFCyd1JlYp3X1WY6kf3CI/mtOzQE+33GcY=",
+        "ref": "refs/heads/prime",
+        "rev": "e41b20a28b1a9977a02b7817330fb1bb9615dda5",
+        "revCount": 50,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/grades.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/grades.git"
+      }
+    },
+    "home-manager": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1692260837,
+        "narHash": "sha256-2FpkX1zl+7ni7djK7NeE1ZGupRUwZgjW+RPCSBgDf4k=",
+        "owner": "nix-community",
+        "repo": "home-manager",
+        "rev": "6a94c1a59737783c282c4031555a289c28b961e4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "master",
+        "repo": "home-manager",
+        "type": "github"
+      }
+    },
+    "impermanence": {
+      "locked": {
+        "lastModified": 1690797372,
+        "narHash": "sha256-GImz19e33SeVcIvBB7NnhbJSbTpFFmNtWLh7Z85Y188=",
+        "owner": "nix-community",
+        "repo": "impermanence",
+        "rev": "e3a7acd113903269a1b5c8b527e84ce7ee859851",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "impermanence",
+        "type": "github"
+      }
+    },
+    "lanzaboote": {
+      "inputs": {
+        "crane": [
+          "crane"
+        ],
+        "flake-compat": [
+          "flake-compat"
+        ],
+        "flake-parts": "flake-parts",
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs_stable_release"
+        ],
+        "pre-commit-hooks-nix": [
+          "pre-commit-hooks"
+        ],
+        "rust-overlay": [
+          "rust-overlay"
+        ]
+      },
+      "locked": {
+        "lastModified": 1682802423,
+        "narHash": "sha256-Fb5TeRTdvUlo/5Yi2d+FC8a6KoRLk2h1VE0/peMhWPs=",
+        "owner": "nix-community",
+        "repo": "lanzaboote",
+        "rev": "64b903ca87d18cef2752c19c098af275c6e51d63",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "v0.3.0",
+        "repo": "lanzaboote",
+        "type": "github"
+      }
+    },
+    "neovim_config": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1684612007,
+        "narHash": "sha256-V7pnVTC3cDoyXkQM3/6KL9T9uzKIVoS0HZPzM92XT9k=",
+        "ref": "refs/heads/prime",
+        "rev": "0ebe3665717941ce87ade67fba4edad98c38c9a0",
+        "revCount": 11,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/neovim-config.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/neovim-config.git"
+      }
+    },
+    "nix-flake-tests": {
+      "locked": {
+        "lastModified": 1677844186,
+        "narHash": "sha256-ErJZ/Gs1rxh561CJeWP5bohA2IcTq1rDneu1WT6CVII=",
+        "owner": "antifuchs",
+        "repo": "nix-flake-tests",
+        "rev": "bbd9216bd0f6495bb961a8eb8392b7ef55c67afb",
+        "type": "github"
+      },
+      "original": {
+        "owner": "antifuchs",
+        "repo": "nix-flake-tests",
+        "type": "github"
+      }
+    },
+    "nix-github-actions": {
+      "inputs": {
+        "nixpkgs": [
+          "poetry2nix",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1688870561,
+        "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=",
+        "owner": "nix-community",
+        "repo": "nix-github-actions",
+        "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nix-github-actions",
+        "type": "github"
+      }
+    },
+    "nixNeovim": {
+      "inputs": {
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "home-manager": [
+          "home-manager"
+        ],
+        "nix-flake-tests": "nix-flake-tests",
+        "nixneovimplugins": [
+          "nixNeovimPlugins"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "nmd": "nmd",
+        "nmt": "nmt"
+      },
+      "locked": {
+        "lastModified": 1692281989,
+        "narHash": "sha256-b1WPbUNVWahAHvMxWnp+0zzswUj8lReX/c28O2Au2Og=",
+        "owner": "nixNeovim",
+        "repo": "nixNeovim",
+        "rev": "929c6c4a188947801ac354e1c5d110937fca9449",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixNeovim",
+        "repo": "nixNeovim",
+        "type": "github"
+      }
+    },
+    "nixNeovimPlugins": {
+      "inputs": {
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "poetry2nix": [
+          "poetry2nix"
+        ]
+      },
+      "locked": {
+        "lastModified": 1692451981,
+        "narHash": "sha256-vOTOLbXzCJ/0FR6CSddVAkzXzRPkTp7cKGR4laxZgO0=",
+        "owner": "soispha",
+        "repo": "nixNeovimPlugins",
+        "rev": "a934f6e9ef2bdbcf0a0a181f01e0f6e1580a36a9",
+        "type": "github"
+      },
+      "original": {
+        "owner": "soispha",
+        "repo": "nixNeovimPlugins",
+        "type": "github"
+      }
+    },
+    "nixVim": {
+      "inputs": {
+        "beautysh": [
+          "beautysh"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "pre-commit-hooks": [
+          "pre-commit-hooks"
+        ]
+      },
+      "locked": {
+        "lastModified": 1692350035,
+        "narHash": "sha256-hcC5vVjbNYzv7hPu3e27jUvt6mBzGIdzoAt2mlZyWvE=",
+        "owner": "nix-community",
+        "repo": "nixvim",
+        "rev": "07af7710e297308a553f09f6ceeb729aa5b5a27c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixvim",
+        "type": "github"
+      }
+    },
+    "nixlib": {
+      "locked": {
+        "lastModified": 1689469483,
+        "narHash": "sha256-2SBhY7rZQ/iNCxe04Eqxlz9YK9KgbaTMBssq3/BgdWY=",
+        "owner": "nix-community",
+        "repo": "nixpkgs.lib",
+        "rev": "02fea408f27186f139153e1ae88f8ab2abd9c22c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixpkgs.lib",
+        "type": "github"
+      }
+    },
+    "nixos-generators": {
+      "inputs": {
+        "nixlib": "nixlib",
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1690133435,
+        "narHash": "sha256-YNZiefETggroaTLsLJG2M+wpF0pJPwiauKG4q48ddNU=",
+        "owner": "nix-community",
+        "repo": "nixos-generators",
+        "rev": "b1171de4d362c022130c92d7c8adc4bf2b83d586",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-generators",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1692356644,
+        "narHash": "sha256-AYkPFT+CbCVSBmh0WwIzPpwhEJ4Yy3A7JZvUkGJIg5o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "8ecc900b2f695d74dea35a92f8a9f9b32c8ea33d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_stable_release": {
+      "locked": {
+        "lastModified": 1692339729,
+        "narHash": "sha256-TUK76/Pqm9qIDjEGd27Lz9EiBIvn5F70JWDmEQ4Y5DQ=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ae521bd4e460b076a455dca8b13f4151489a725c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nmd": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1687627428,
+        "narHash": "sha256-7zGfXuNS5RHqhpEdz2fwrtqvF86JRo5U1hrxZSYgcm8=",
+        "owner": "~rycee",
+        "repo": "nmd",
+        "rev": "824a380546b5d0d0eb701ff8cd5dbafb360750ff",
+        "type": "sourcehut"
+      },
+      "original": {
+        "owner": "~rycee",
+        "repo": "nmd",
+        "type": "sourcehut"
+      }
+    },
+    "nmt": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1683843030,
+        "narHash": "sha256-2K9tFpypgSORyUTRAL7MFRKCXU4GykmhIDrrIydtPdI=",
+        "owner": "jooooscha",
+        "repo": "nmt",
+        "rev": "f30b96093eb056f1bcc60199545344b4e4a72c5a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "jooooscha",
+        "repo": "nmt",
+        "type": "github"
+      }
+    },
+    "poetry2nix": {
+      "inputs": {
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nix-github-actions": "nix-github-actions",
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1692369730,
+        "narHash": "sha256-VcCb/XxybOv0Py1Gnhmih9mfwyCUVDds/gID2VcscAo=",
+        "owner": "nix-community",
+        "repo": "poetry2nix",
+        "rev": "e4cd574cac251dd44bdbc77c1e98d790fe27b781",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "poetry2nix",
+        "type": "github"
+      }
+    },
+    "pre-commit-hooks": {
+      "inputs": {
+        "flake-compat": [
+          "flake-compat"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "gitignore": [
+          "gitignore"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "nixpkgs-stable": [
+          "nixpkgs_stable_release"
+        ]
+      },
+      "locked": {
+        "lastModified": 1692274144,
+        "narHash": "sha256-BxTQuRUANQ81u8DJznQyPmRsg63t4Yc+0kcyq6OLz8s=",
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "rev": "7e3517c03d46159fdbf8c0e5c97f82d5d4b0c8fa",
+        "type": "github"
+      },
+      "original": {
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "type": "github"
+      }
+    },
+    "ragenix": {
+      "inputs": {
+        "agenix": [
+          "agenix"
+        ],
+        "crane": [
+          "crane"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "rust-overlay": [
+          "rust-overlay"
+        ]
+      },
+      "locked": {
+        "lastModified": 1682237245,
+        "narHash": "sha256-xbBR7LNK+d5Yi/D6FXQGc1R6u2VV2nwr/Df5iaEbOEQ=",
+        "owner": "yaxitech",
+        "repo": "ragenix",
+        "rev": "281f68c3d477904f79ff1cd5807a8c226cd80a50",
+        "type": "github"
+      },
+      "original": {
+        "owner": "yaxitech",
+        "repo": "ragenix",
+        "type": "github"
+      }
+    },
+    "river_init_lesser": {
+      "inputs": {
+        "crane": [
+          "crane"
+        ],
+        "flake-compat": [
+          "flake-compat"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "rust-overlay": [
+          "rust-overlay"
+        ]
+      },
+      "locked": {
+        "lastModified": 1683353540,
+        "narHash": "sha256-tOf9gfFzWjZxIF/2BAU64aH55xfic6SapKsFqVn6U/8=",
+        "ref": "refs/heads/prime",
+        "rev": "aedd2bf8863802443d7b6df94646c239d67b2796",
+        "revCount": 10,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/river_keymap_init.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/river_keymap_init.git"
+      }
+    },
+    "root": {
+      "inputs": {
+        "agenix": "agenix",
+        "beautysh": "beautysh",
+        "crane": "crane",
+        "disko": "disko",
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils",
+        "flake_update": "flake_update",
+        "flake_version_update": "flake_version_update",
+        "generate_firefox_extensions": "generate_firefox_extensions",
+        "gitignore": "gitignore",
+        "grades": "grades",
+        "home-manager": "home-manager",
+        "impermanence": "impermanence",
+        "lanzaboote": "lanzaboote",
+        "neovim_config": "neovim_config",
+        "nixNeovim": "nixNeovim",
+        "nixNeovimPlugins": "nixNeovimPlugins",
+        "nixVim": "nixVim",
+        "nixos-generators": "nixos-generators",
+        "nixpkgs": "nixpkgs",
+        "nixpkgs_stable_release": "nixpkgs_stable_release",
+        "poetry2nix": "poetry2nix",
+        "pre-commit-hooks": "pre-commit-hooks",
+        "ragenix": "ragenix",
+        "river_init_lesser": "river_init_lesser",
+        "rust-overlay": "rust-overlay",
+        "serverphone": "serverphone",
+        "shell_library": "shell_library",
+        "snap-sync": "snap-sync",
+        "strip_js_comments": "strip_js_comments",
+        "systems": "systems",
+        "templates": "templates",
+        "user_js": "user_js",
+        "video_pause": "video_pause",
+        "yambar_cpu": "yambar_cpu",
+        "yambar_memory": "yambar_memory"
+      }
+    },
+    "rust-overlay": {
+      "inputs": {
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1692410823,
+        "narHash": "sha256-YM1QCenpghNqgleUmoCJUArTuMEBqScyQuhepA6JZaI=",
+        "owner": "oxalica",
+        "repo": "rust-overlay",
+        "rev": "598b2f04ed252eb5808b108d7a10084c0c548753",
+        "type": "github"
+      },
+      "original": {
+        "owner": "oxalica",
+        "repo": "rust-overlay",
+        "type": "github"
+      }
+    },
+    "serverphone": {
+      "inputs": {
+        "crane": [
+          "crane"
+        ],
+        "flake-compat": [
+          "flake-compat"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "rust-overlay": [
+          "rust-overlay"
+        ],
+        "systems": [
+          "systems"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686995419,
+        "narHash": "sha256-rKg1LHgHAf+zOrZd7uObnVAJagXvtERCExvW3VSoCaE=",
+        "ref": "refs/heads/prime",
+        "rev": "9432b1352af0d1f189a52afbcedd2cfd09ba4e13",
+        "revCount": 48,
+        "type": "git",
+        "url": "https://codeberg.org/vhack.eu/serverphone.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/vhack.eu/serverphone.git"
+      }
+    },
+    "shell_library": {
+      "inputs": {
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "flake_version_update": [
+          "flake_version_update"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "systems": [
+          "systems"
+        ]
+      },
+      "locked": {
+        "lastModified": 1685306243,
+        "narHash": "sha256-KxWY17X52QPRSgSoOJM6o0E+iwLuno/aJtliSDXP0p4=",
+        "ref": "refs/heads/prime",
+        "rev": "1694fd6dd2092d15a732ad74befc3f0ecd8b87f0",
+        "revCount": 76,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/shell_library.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/shell_library.git"
+      }
+    },
+    "snap-sync": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1653097113,
+        "narHash": "sha256-jKoGBh8dtS9XZkUuZZcLDqreMUdyVZ16z1+Xc63TC4Q=",
+        "owner": "qubidt",
+        "repo": "snap-sync",
+        "rev": "84e2ad00800cf43d0952b61add7e77797eced82d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "qubidt",
+        "repo": "snap-sync",
+        "type": "github"
+      }
+    },
+    "strip_js_comments": {
+      "inputs": {
+        "crane": [
+          "crane"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "tree_sitter_js": "tree_sitter_js"
+      },
+      "locked": {
+        "lastModified": 1676149199,
+        "narHash": "sha256-Yitp7KDJfL1xPUeJwoBLNbUJlt03yvC3SsyA8FE1PMA=",
+        "ref": "refs/heads/prime",
+        "rev": "1be9cbf4b1a58dbc5164dfb4ddaa862488f7b42d",
+        "revCount": 9,
+        "type": "git",
+        "url": "https://codeberg.org/ene/strip_js_comments.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/ene/strip_js_comments.git"
+      }
+    },
+    "systems": {
+      "locked": {
+        "lastModified": 1680978846,
+        "narHash": "sha256-Gtqg8b/v49BFDpDetjclCYXm8mAnTrUzR0JnE2nv5aw=",
+        "owner": "nix-systems",
+        "repo": "x86_64-linux",
+        "rev": "2ecfcac5e15790ba6ce360ceccddb15ad16d08a8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "x86_64-linux",
+        "type": "github"
+      }
+    },
+    "templates": {
+      "inputs": {
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "systems": [
+          "systems"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687494747,
+        "narHash": "sha256-E/4JG/Ya4WwQZovo8BLN73WnzELAaG2MPyWp10VHvDg=",
+        "ref": "refs/heads/prime",
+        "rev": "602f92ee001608e3fbdd6d574feacb60e0670fa3",
+        "revCount": 17,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/flake-templates.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/flake-templates.git"
+      }
+    },
+    "tree_sitter_js": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1674585307,
+        "narHash": "sha256-2SAJBnY8pmynGqB8OVqHeeAKovskO+C/XiJbLTKSlcM=",
+        "owner": "tree-sitter",
+        "repo": "tree-sitter-javascript",
+        "rev": "15e85e80b851983fab6b12dce5a535f5a0df0f9c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tree-sitter",
+        "repo": "tree-sitter-javascript",
+        "type": "github"
+      }
+    },
+    "user_js": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1691983650,
+        "narHash": "sha256-oA1bIpPc27Kk89n3JGpni7RkcIDRVAsTjUfjRHbKS24=",
+        "owner": "arkenfox",
+        "repo": "user.js",
+        "rev": "915f39959c7e077f00477e6ce34a0f9f9e3e7c6b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "arkenfox",
+        "repo": "user.js",
+        "type": "github"
+      }
+    },
+    "video_pause": {
+      "inputs": {
+        "crane": [
+          "crane"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1681665568,
+        "narHash": "sha256-MFuebmGkzfThpxHWSJCvii6EHGa2wEwLfZgJL2FduiY=",
+        "ref": "refs/heads/prime",
+        "rev": "72c95f998368aa83e574bccebb0ed459656e1239",
+        "revCount": 3,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/video-pause.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/video-pause.git"
+      }
+    },
+    "yambar_cpu": {
+      "inputs": {
+        "crane": [
+          "crane"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1678635450,
+        "narHash": "sha256-AER+dXb9YoFdTLtNRG8PSIFCPo5qiZBSrLHmLkbnanM=",
+        "ref": "refs/heads/prime",
+        "rev": "9668588173cbdffa325247a35de93f31e4511f9a",
+        "revCount": 5,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/yambar_cpu.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/yambar_cpu.git"
+      }
+    },
+    "yambar_memory": {
+      "inputs": {
+        "crane": [
+          "crane"
+        ],
+        "flake-utils": [
+          "flake-utils"
+        ],
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1678015290,
+        "narHash": "sha256-oEZzslefttctJHPhHLVOBPqRh59p51CTmgaKQC+MXn8=",
+        "ref": "refs/heads/prime",
+        "rev": "9b273d73f151e7f47cde5ed3feba38797b43619b",
+        "revCount": 3,
+        "type": "git",
+        "url": "https://codeberg.org/soispha/yambar_memory.git"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://codeberg.org/soispha/yambar_memory.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
index a7fd7576..f875c033 100644
--- a/flake.nix
+++ b/flake.nix
@@ -42,7 +42,7 @@
       };
     };
     nixNeovimPlugins = {
-      url = "github:nixNeovim/nixNeovimPlugins";
+      url = "github:soispha/nixNeovimPlugins";
       inputs = {
         flake-utils.follows = "flake-utils";
         nixpkgs.follows = "nixpkgs";
diff --git a/home-manager/soispha/config/neovim/nixvim/clipboard/default.nix b/home-manager/soispha/config/neovim/nixvim/clipboard/default.nix
index 761f0c17..0a686190 100644
--- a/home-manager/soispha/config/neovim/nixvim/clipboard/default.nix
+++ b/home-manager/soispha/config/neovim/nixvim/clipboard/default.nix
@@ -1,6 +1,6 @@
 {...}: {
   programs.nixvim = {
-    clipboard.provides = {
+    clipboard.providers = {
       wl-copy.enable = true;
     };
   };
diff --git a/home-manager/soispha/config/neovim/nixvim/default.nix b/home-manager/soispha/config/neovim/nixvim/default.nix
index f216fb05..a96bc476 100644
--- a/home-manager/soispha/config/neovim/nixvim/default.nix
+++ b/home-manager/soispha/config/neovim/nixvim/default.nix
@@ -1,39 +1,26 @@
-{
-  pkgs,
-  ...
-}: {
+{...}: {
   imports = [
-    ./options
-    ./mappings
-    ./colorscheme
+    ./autocmds
     ./clipboard
+    ./mappings
+    ./options
+    ./plugins
   ];
   programs.nixvim = {
     enable = true;
-    defaultEditor = true;
-
-    # to install plugins just activate their modules
-    plugins = {
-      lsp = {
-        enable = true;
-        hls.enable = true;
-        rust-analyzer.enable = true;
-      };
-      treesitter = {
-        enable = true;
-        indent = true;
-      };
-      mini = {
-        enable = true;
-        ai.enable = true;
-        jump.enable = true;
-      };
-    };
 
-    # Not all plugins have own modules
-    # You can add missing plugins here
-    # `pkgs.vimExtraPlugins` is added by the overlay you added at the beginning
-    # For a list of available plugins, look here: [available plugins](https://github.com/jooooscha/nixpkgs-vim-extra-plugins/blob/main/plugins.md)
-    extraPlugins = [pkgs.vimExtraPlugins.nightfox-nvim];
+    # source: https://www.patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=Neovim
+    extraConfigLuaPre = ''
+      ---------------------------------------------------------------------------
+      --
+      --     ███╗   ██╗███████╗ ██████╗ ██╗   ██╗██╗███╗   ███╗
+      --     ████╗  ██║██╔════╝██╔═══██╗██║   ██║██║████╗ ████║
+      --     ██╔██╗ ██║█████╗  ██║   ██║██║   ██║██║██╔████╔██║
+      --     ██║╚██╗██║██╔══╝  ██║   ██║╚██╗ ██╔╝██║██║╚██╔╝██║
+      --     ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║
+      --     ╚═╝  ╚═══╝╚══════╝ ╚═════╝   ╚═══╝  ╚═╝╚═╝     ╚═╝
+      --
+      ---------------------------------------------------------------------------
+    '';
   };
 }
diff --git a/home-manager/soispha/config/neovim/nixvim/mappings/default.nix b/home-manager/soispha/config/neovim/nixvim/mappings/default.nix
index 237319a0..575ad465 100644
--- a/home-manager/soispha/config/neovim/nixvim/mappings/default.nix
+++ b/home-manager/soispha/config/neovim/nixvim/mappings/default.nix
@@ -13,7 +13,7 @@
       };
     in {
       insert =
-        lib.recursiveUpate {
+        lib.recursiveUpdate {
           "hh" = {
             action = ''
               function()
@@ -29,7 +29,7 @@
             '';
             desc = "completion trigger/ forward in completen menu";
           };
-          "<S-Tab>" = {
+          "<C-Space>" = {
             action = ''
               function()
                 local cmp = require('cmp');
@@ -78,6 +78,10 @@
             desc = "jump to command line";
           };
 
+          "\\f" = {
+            action = "require('lf').start()";
+            desc = "open lf in a floating window";
+          };
 
           # Splits
           "<C-t>" = {
diff --git a/home-manager/soispha/config/neovim/nixvim/colorscheme/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/colorscheme/default.nix
index 9864c5cf..9864c5cf 100644
--- a/home-manager/soispha/config/neovim/nixvim/colorscheme/default.nix
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/colorscheme/default.nix
diff --git a/home-manager/soispha/config/neovim/nixvim/colorscheme/lua/nightfox.lua b/home-manager/soispha/config/neovim/nixvim/plugins/colorscheme/lua/nightfox.lua
index 1ca4f743..b00626a2 100644
--- a/home-manager/soispha/config/neovim/nixvim/colorscheme/lua/nightfox.lua
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/colorscheme/lua/nightfox.lua
@@ -1,4 +1,3 @@
--- Default options
 require('nightfox').setup({
     options = {
         -- Compiled file's destination location
@@ -49,5 +48,3 @@ require('nightfox').setup({
     specs = {},
     groups = {},
 })
-
-vim.cmd.colorscheme("duskfox");
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/default.nix
index 150798c3..0622203e 100644
--- a/home-manager/soispha/config/neovim/nixvim/plugins/default.nix
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/default.nix
@@ -1,5 +1,14 @@
 {...}: {
   imports = [
-    ./treesiter
+    ./colorscheme
+    ./lf-nvim
+    ./lsp
+    ./lualine
+    ./luasnip
+    ./nvim-cmp
+    ./nvim-lint
+    ./raw_plugins
+    ./treesitter
+    ./vim-tex
   ];
 }
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lf-nvim/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lf-nvim/default.nix
new file mode 100644
index 00000000..a42c6f33
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lf-nvim/default.nix
@@ -0,0 +1,8 @@
+{lib, ...}: {
+  programs.nixvim = {
+    # TODO package lf-nvim though a module
+    extraConfigLuaPost = ''
+      ${lib.strings.fileContents ./lua/lf-nvim.lua}
+    '';
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lf-nvim/lua/lf-nvim.lua b/home-manager/soispha/config/neovim/nixvim/plugins/lf-nvim/lua/lf-nvim.lua
new file mode 100644
index 00000000..f6b249ce
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lf-nvim/lua/lf-nvim.lua
@@ -0,0 +1,43 @@
+local fn = vim.fn
+
+-- Defaults
+require("lf").setup({
+    default_action = "drop", -- default action when `Lf` opens a file
+    -- TODO document these mappings:
+    default_actions = {    -- default action keybindings
+        ["<C-t>"] = "tabedit",
+        ["<C-x>"] = "split",
+        ["<C-v>"] = "vsplit",
+        ["<C-o>"] = "tab drop",
+    },
+
+    winblend = 10,                                 -- psuedotransparency level
+    dir = "",                                      -- directory where `lf` starts ('gwd' is git-working-directory, ""/nil is CWD)
+    direction = "float",                           -- window type: float horizontal vertical
+    border = "rounded",                            -- border kind: single double shadow curved
+    height = fn.float2nr(fn.round(0.75 * o.lines)), -- height of the *floating* window
+    width = fn.float2nr(fn.round(0.75 * o.columns)), -- width of the *floating* window
+    escape_quit = true,                            -- map escape to the quit command (so it doesn't go into a meta normal mode)
+    focus_on_open = true,                          -- focus the current file when opening Lf (experimental)
+    mappings = true,                               -- whether terminal buffer mapping is enabled
+    tmux = false,                                  -- tmux statusline can be disabled on opening of Lf
+    default_file_manager = true,                   -- make lf default file manager
+    disable_netrw_warning = true,                  -- don't display a message when opening a directory with `default_file_manager` as true
+    highlights = {                                 -- highlights passed to toggleterm
+        Normal = { link = "Normal" },
+        NormalFloat = { link = 'Normal' },
+        FloatBorder = { guifg = "<VALUE>", guibg = "<VALUE>" },
+    },
+
+    -- Layout configurations
+    layout_mapping = "<M-u>", -- resize window with this key
+    views = {               -- window dimensions to rotate through
+        { width = 0.800, height = 0.800 },
+        { width = 0.600, height = 0.600 },
+        { width = 0.950, height = 0.950 },
+        { width = 0.500, height = 0.500, col = 0,   row = 0 },
+        { width = 0.500, height = 0.500, col = 0,   row = 0.5 },
+        { width = 0.500, height = 0.500, col = 0.5, row = 0 },
+        { width = 0.500, height = 0.500, col = 0.5, row = 0.5 },
+    }
+})
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/default.nix
index 8d5cfaf1..dc8210d1 100644
--- a/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/default.nix
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/default.nix
@@ -1,5 +1,10 @@
 {...}: {
-  programs.nixvim.plugins.lsp.servers = {
-
-  };
+  imports = [
+    ./servers/bashls.nix
+    ./servers/ltex.nix
+    ./servers/lua-ls.nix
+    ./servers/nil_ls.nix
+    ./servers/rust-analyzer.nix
+    ./servers/texlab.nix
+  ];
 }
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/bashls.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/bashls.nix
new file mode 100644
index 00000000..0577a335
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/bashls.nix
@@ -0,0 +1,5 @@
+{...}: {
+  programs.nixvim.plugins.lsp.servers = {
+    bashls.enable = true;
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/ltex.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/ltex.nix
new file mode 100644
index 00000000..9fc42473
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/ltex.nix
@@ -0,0 +1,39 @@
+{...}: {
+  programs.nixvim.plugins.lsp.servers = {
+    ltex = let
+      filetypes = [
+        "rust"
+        "java"
+        "cpp"
+        "shell"
+        "bash"
+
+        "bibtex"
+        "context"
+        "context.tex"
+        "latex"
+        "tex"
+
+        "html"
+        "markdown"
+        "org"
+        "restructuredtext"
+        "rsweave"
+
+        "git-commit"
+        "gitcommit"
+      ];
+    in {
+      enable = true;
+      inherit filetypes;
+      settings = {
+        enabled = filetypes;
+        completionEnabled = true;
+        language = "en-CA";
+        additionalRules = {
+          enablePickyRules = true;
+        };
+      };
+    };
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/lua-ls.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/lua-ls.nix
new file mode 100644
index 00000000..5a44b500
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/lua-ls.nix
@@ -0,0 +1,8 @@
+{...}: {
+  programs.nixvim.plugins.lsp.servers = {
+    lua-ls = {
+      enable = true;
+      settings.telemetry.enable = false;
+    };
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/nil_ls.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/nil_ls.nix
new file mode 100644
index 00000000..f0cccbdc
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/nil_ls.nix
@@ -0,0 +1,10 @@
+{...}: {
+  programs.nixvim.plugins.lsp.servers = {
+    nil_ls = {
+      enable = true;
+      settings = {
+        formatting.command = ["alejandra"];
+      };
+    };
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/rust-analyzer.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/rust-analyzer.nix
new file mode 100644
index 00000000..943a8c80
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/rust-analyzer.nix
@@ -0,0 +1,10 @@
+{...}: {
+  programs.nixvim.plugins.lsp.servers = {
+    rust-analyzer = {
+      enable = true;
+      settings = {
+        typing.autoClosingAngleBrackets.enable = true;
+      };
+    };
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/texlab.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/texlab.nix
new file mode 100644
index 00000000..59af8d39
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lsp/servers/servers/texlab.nix
@@ -0,0 +1,7 @@
+{...}: {
+  programs.nixvim.plugins.lsp.servers = {
+    texlab = {
+      enable = true;
+    };
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lualine/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lualine/default.nix
index 0ec255db..2c95b562 100644
--- a/home-manager/soispha/config/neovim/nixvim/plugins/lualine/default.nix
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lualine/default.nix
@@ -46,29 +46,27 @@
       '';
     };
   in {
-    options = {
-      icons_enabled = true;
-      theme = "nightfox";
-      component_separators = {
-        left = "";
-        right = "";
-      };
-      section_separators = {
-        left = "";
-        right = "";
-      };
-      disabled_filetypes = {
-        statusline = [];
-        winbar = [];
-      };
-      ignore_focus = {};
-      always_divide_middle = true;
-      globalstatus = false;
-      refresh = {
-        statusline = 1000;
-        tabline = 1000;
-        winbar = 1000;
-      };
+    iconsEnabled = true;
+    theme = "nightfox";
+    componentSeparators = {
+      left = "";
+      right = "";
+    };
+    sectionSeparators = {
+      left = "";
+      right = "";
+    };
+    disabledFiletypes = {
+      statusline = [];
+      winbar = [];
+    };
+    ignoreFocus = {};
+    alwaysDivideMiddle = true;
+    globalstatus = false;
+    refresh = {
+      statusline = 1000;
+      tabline = 1000;
+      winbar = 1000;
     };
     sections = {
       lualine_a = ["mode"];
@@ -85,7 +83,7 @@
       lualine_y = ["encoding" "fileformat" get_mixed_indent get_trailing_whitespace];
       lualine_z = [get_location_of_file];
     };
-    inactive_sections = {
+    inactiveSections = {
       lualine_a = [];
       lualine_b = [];
       lualine_c = ["filename"];
@@ -95,7 +93,7 @@
     };
     tabline = {};
     winbar = {};
-    inactive_winbar = {};
+    inactiveWinbar = {};
 
     # TODO add all installed and supported extensions here
     extensions = ["fugitive"];
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/default.nix
new file mode 100644
index 00000000..50a0b94c
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/default.nix
@@ -0,0 +1,12 @@
+{lib, ...}: {
+  programs.nixvim = {
+    plugins.luasnip = {
+      enable = true;
+    };
+    extraConfigLuaPost = ''
+      ${lib.strings.fileContents ./lua/luasnip.lua}
+      require("luasnip.loaders.from_lua").load({paths = "${./lua/snippets}"})
+      require("luasnip.loaders.from_lua").lazy_load({paths = "${./lua/snippets}"})
+    '';
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/luasnip.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/luasnip.lua
new file mode 100644
index 00000000..c7707c69
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/luasnip.lua
@@ -0,0 +1,9 @@
+require("luasnip").config.set_config({
+  -- Enable auto triggered snippets
+  enable_autosnippets = true,
+
+  -- Use Tab (or some other key if you prefer) to trigger visual selection
+  store_selection_keys = "<Tab>",
+})
+
+
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/all.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/all.lua
new file mode 100644
index 00000000..2fecd1e7
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/all.lua
@@ -0,0 +1,51 @@
+local get_visual = function(args, parent)
+  if (#parent.snippet.env.SELECT_RAW > 0) then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1, ''))
+  end
+end
+local function char_count_same(c1, c2)
+    local line = vim.api.nvim_get_current_line()
+    -- '%'-escape chars to force explicit match (gsub accepts patterns).
+    -- second return value is number of substitutions.
+    local _, ct1 = string.gsub(line, '%' .. c1, '')
+    local _, ct2 = string.gsub(line, '%' .. c2, '')
+    return ct1 == ct2
+end
+
+local function even_count(c)
+    local line = vim.api.nvim_get_current_line()
+    local _, ct = string.gsub(line, c, '')
+    return ct % 2 == 0
+end
+
+local function neg(fn, ...)
+    return not fn(...)
+end
+
+local function part(fn, ...)
+    local args = { ... }
+    return function() return fn(unpack(args)) end
+end
+
+-- This makes creation of pair-type snippets easier.
+local function pair(pair_begin, pair_end, expand_func, ...)
+    -- triggerd by opening part of pair, wordTrig=false to trigger anywhere.
+    -- ... is used to pass any args following the expand_func to it.
+    return s({ trig = pair_begin, wordTrig = false, snippetType = "autosnippet" }, {
+        t({ pair_begin }), d(1, get_visual), t({ pair_end })
+    }, {
+        condition = part(expand_func, part(..., pair_begin, pair_end))
+    })
+end
+
+return {
+    pair("(", ")", neg, char_count_same),
+    pair("{", "}", neg, char_count_same),
+    pair("[", "]", neg, char_count_same),
+    -- pair("<", ">", neg, char_count_same),
+    pair("'", "'", neg, even_count),
+    pair('"', '"', neg, even_count),
+    pair("`", "`", neg, even_count),
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/html/at.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/html/at.lua
new file mode 100644
index 00000000..8f84fd30
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/html/at.lua
@@ -0,0 +1,28 @@
+local get_visual = function(args, parent)
+    if (#parent.snippet.env.SELECT_RAW > 0) then
+        return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+    else
+        return sn(nil, i(1))
+    end
+end
+
+local line_begin = require("luasnip.extras.expand_conditions").line_begin
+
+return {
+    -- HEADER
+    s({ trig = "tr", regTrig = false, wordTrig = true, snippetType = "autosnippet" },
+        fmt(
+            [[
+          <tr>
+          <td><code>{}</code></td>
+            <th><code>{}</code></th>
+          </tr>
+        ]]   ,
+            {
+                d(1, get_visual),
+                d(2, get_visual),
+            }
+        ),
+        { condition = line_begin }
+    ),
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/html/html.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/html/html.lua
new file mode 100644
index 00000000..df42314b
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/html/html.lua
@@ -0,0 +1,105 @@
+local get_visual = function(args, parent)
+  if (#parent.snippet.env.SELECT_RAW > 0) then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1))
+  end
+end
+
+local line_begin = require("luasnip.extras.expand_conditions").line_begin
+
+return
+  {
+    -- HEADER
+    s({trig="h([123456])", regTrig=true, wordTrig=false, snippetType="autosnippet"},
+      fmt(
+        [[
+          <h{}>{}</h{}>
+        ]],
+        {
+          f( function(_, snip) return snip.captures[1] end ),
+          d(1, get_visual),
+          f( function(_, snip) return snip.captures[1] end ),
+        }
+      ),
+      {condition = line_begin}
+    ),
+    -- PARAGRAPH
+    s({trig="pp", snippetType="autosnippet"},
+      fmt(
+        [[
+          <p>{}</p>
+        ]],
+        {
+          d(1, get_visual),
+        }
+      ),
+      {condition = line_begin}
+    ),
+    -- UNORDERED LIST
+    s({trig="itt", snippetType="autosnippet"},
+      fmt(
+        [[
+          <ul>
+            <li>{}</li>{}
+          </ul>
+        ]],
+        {
+          i(1),
+          i(0)
+        }
+      ),
+      {condition = line_begin}
+    ),
+    -- LIST ITEM
+    s({trig="ii", snippetType="autosnippet"},
+      fmt(
+        [[
+            <li>{}</li>
+        ]],
+        {
+          d(1, get_visual),
+        }
+      ),
+      {condition = line_begin}
+    ),
+    -- DOCUMENT TEMPLATE
+    s({trig="base"},
+      fmt(
+        [[
+        <!doctype HTML>
+        <html lang="en">
+        <head>
+          <meta charset="UTF-8">
+          <title>{}</title>
+        </head>
+        <body>
+          {}
+        </body>
+        </html>
+        ]],
+        {
+          i(1, "FooBar"),
+          i(0)
+        }
+      ),
+      {condition = line_begin}
+    ),
+    -- ANCHOR TAG
+    s({trig = "([^%l])aa", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+      fmt(
+        [[
+          {}<a href="{}">{}</a>
+        ]],
+        {
+          f( function(_, snip) return snip.captures[1] end ),
+          i(1),
+          d(2, get_visual),
+        }
+      )
+    ),
+  }
+
+
+
+
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/nix/delimiter.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/nix/delimiter.lua
new file mode 100644
index 00000000..12e1df42
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/nix/delimiter.lua
@@ -0,0 +1,24 @@
+local get_visual = function(args, parent)
+  if (#parent.snippet.env.SELECT_RAW > 0) then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1, ''))
+  end
+end
+
+
+-- Return snippet tables
+return
+{
+   -- LEFT/RIGHT ALL BRACES
+   s({trig = "cmd;(.*);", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+     fmta(
+      [[<> = builtins.readFile "./cmds/<>.sh";]],
+       {
+         f( function(_, snip) return snip.captures[1] end ),
+         f( function(_, snip) return snip.captures[1] end ),
+       }
+     )
+   ),
+}
+
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/delimiter.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/delimiter.lua
new file mode 100644
index 00000000..36cae366
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/delimiter.lua
@@ -0,0 +1,36 @@
+local get_visual = function(args, parent)
+  if (#parent.snippet.env.SELECT_RAW > 0) then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1, ''))
+  end
+end
+
+local translation_table = {
+    ["("] = ")",
+    ["{"] = "}",
+    ["["] = "]",
+}
+
+-- Math context detection
+local tex = {}
+tex.in_mathzone = function() return vim.fn['vimtex#syntax#in_mathzone']() == 1 end
+tex.in_text = function() return not tex.in_mathzone() end
+
+-- Return snippet tables
+return
+{
+   -- LEFT/RIGHT ALL BRACES
+   s({trig = "([^%a])l([%(%[%{])", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+     fmta(
+       "<>\\left<><>\\right<>",
+       {
+         f( function(_, snip) return snip.captures[1] end ),
+         f( function(_, snip) return snip.captures[2] end ),
+         d(1, get_visual),
+         f( function(_, snip) return translation_table[snip.captures[2]] end ),
+       }
+     )
+   ),
+}
+
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/environments.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/environments.lua
new file mode 100644
index 00000000..e88bc16e
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/environments.lua
@@ -0,0 +1,130 @@
+local get_visual = function(args, parent)
+    if (#parent.snippet.env.SELECT_RAW > 0) then
+        return sn(nil, i(0, parent.snippet.env.SELECT_RAW))
+    else
+        return sn(nil, i(0, ''))
+    end
+end
+
+-- Math context detection
+local tex = {}
+tex.in_mathzone = function() return vim.fn['vimtex#syntax#in_mathzone']() == 1 end
+tex.in_text = function() return not tex.in_mathzone() end
+
+local line_begin = require("luasnip.extras.expand_conditions").line_begin
+
+-- Return snippet tables
+return {
+    -- EQUATION
+--     s({ trig = "nn", snippetType = "autosnippet" },
+--         fmta(
+--             [[
+--         \begin{equation*}
+--             <>
+--         \end{equation*}
+--       ]]     ,
+--             {
+--                 i(0),
+--             }
+--         ),
+--         { condition = line_begin }
+--     ),
+--     -- SPLIT EQUATION
+--     s({ trig = "ss", snippetType = "autosnippet" },
+--         fmta(
+--             [[
+--         \begin{equation*}
+--             \begin{split}
+--                 <>
+--             \end{split}
+--         \end{equation*}
+--       ]]     ,
+--             {
+--                 d(1, get_visual),
+--             }
+--         ),
+--         { condition = line_begin }
+--     ),
+--     -- ALIGN
+--     s({ trig = "all", snippetType = "autosnippet" },
+--         fmta(
+--             [[
+--         \begin{align*}
+--             <>
+--         \end{align*}
+--       ]]     ,
+--             {
+--                 i(0),
+--             }
+--         ),
+--         { condition = line_begin }
+--     ),
+--     -- ITEMIZE
+--     s({ trig = "itt", snippetType = "autosnippet" },
+--         fmta(
+--             [[
+--         \begin{itemize}
+--
+--             \item <>
+--
+--         \end{itemize}
+--       ]]     ,
+--             {
+--                 i(0),
+--             }
+--         ),
+--         { condition = line_begin }
+--     ),
+--     -- ENUMERATE
+--     s({ trig = "enn", snippetType = "autosnippet" },
+--         fmta(
+--             [[
+--         \begin{enumerate}
+--
+--             \item <>
+--
+--         \end{enumerate}
+--       ]]     ,
+--             {
+--                 i(0),
+--             }
+--         )
+--     ),
+--     -- INLINE MATH
+--     s({ trig = "([^%l])mm", regTrig = true, wordTrig = false, snippetType = "autosnippet" },
+--         fmta(
+--             "<>$<>$",
+--             {
+--                 f(function(_, snip) return snip.captures[1] end),
+--                 d(1, get_visual),
+--             }
+--         )
+--     ),
+--     -- INLINE MATH ON NEW LINE
+--     s({ trig = "^mm", regTrig = true, wordTrig = false, snippetType = "autosnippet" },
+--         fmta(
+--             "$<>$",
+--             {
+--                 i(0),
+--             })),
+--     -- FIGURE
+--     s({ trig = "fig" },
+--         fmta(
+--             [[
+--         \begin{figure}[htb!]
+--           \centering
+--           \includegraphics[width=<>\linewidth]{<>}
+--           \caption{<>}
+--           \label{fig:<>}
+--         \end{figure}
+--         ]]   ,
+--             {
+--                 i(1),
+--                 i(2),
+--                 i(3),
+--                 i(4),
+--             }
+--         ),
+--         { condition = line_begin }
+--     ),
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/fonts.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/fonts.lua
new file mode 100644
index 00000000..aeddf571
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/fonts.lua
@@ -0,0 +1,110 @@
+local get_visual = function(args, parent)
+  if (#parent.snippet.env.SELECT_RAW > 0) then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1, ''))
+  end
+end
+
+-- A logical OR of `line_begin` and the regTrig '[^%a]trig'
+function line_begin_or_non_letter(line_to_cursor, matched_trigger)
+  local line_begin = line_to_cursor:sub(1, -(#matched_trigger + 1)):match("^%s*$")
+  local non_letter = line_to_cursor:sub(-(#matched_trigger + 1), -(#matched_trigger + 1)):match("[^%a]")
+  return line_begin or non_letter
+end
+
+-- Math context detection
+local tex = {}
+tex.in_mathzone = function() return vim.fn['vimtex#syntax#in_mathzone']() == 1 end
+tex.in_text = function() return not tex.in_mathzone() end
+
+local line_begin = function(line_to_cursor, matched_trigger)
+  -- +1 because `string.sub("abcd", 1, -2)` -> abc
+  return line_to_cursor:sub(1, -(#matched_trigger + 1)):match("^%s*$")
+end
+
+-- Return snippet tables
+return
+  {
+--     -- TYPEWRITER i.e. \texttt
+--     s({trig = "([^%a])sd", regTrig = true, wordTrig = false, snippetType="autosnippet", priority=2000},
+--       fmta(
+--         "<>\\texttt{<>}",
+--         {
+--           f( function(_, snip) return snip.captures[1] end ),
+--           d(1, get_visual),
+--         }
+--       ),
+--       {condition = tex.in_text}
+--     ),
+--     -- ITALIC i.e. \textit
+--     s({trig = "([^%a])tii", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--       fmta(
+--         "<>\\textit{<>}",
+--         {
+--           f( function(_, snip) return snip.captures[1] end ),
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- BOLD i.e. \textbf
+--     s({trig = "tbb", snippetType="autosnippet"},
+--       fmta(
+--         "\\textbf{<>}",
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- MATH ROMAN i.e. \mathrm
+--     s({trig = "([^%a])rmm", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--       fmta(
+--         "<>\\mathrm{<>}",
+--         {
+--           f( function(_, snip) return snip.captures[1] end ),
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- MATH CALIGRAPHY i.e. \mathcal
+--     s({trig = "([^%a])mcc", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--       fmta(
+--         "<>\\mathcal{<>}",
+--         {
+--           f( function(_, snip) return snip.captures[1] end ),
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- MATH BOLDFACE i.e. \mathbf
+--     s({trig = "([^%a])mbf", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--       fmta(
+--         "<>\\mathbf{<>}",
+--         {
+--           f( function(_, snip) return snip.captures[1] end ),
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- MATH BLACKBOARD i.e. \mathbb
+--     s({trig = "([^%a])mbb", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--       fmta(
+--         "<>\\mathbb{<>}",
+--         {
+--           f( function(_, snip) return snip.captures[1] end ),
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- REGULAR TEXT i.e. \text (in math environments)
+--     s({trig = "([^%a])tee", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--       fmta(
+--         "<>\\text{<>}",
+--         {
+--           f( function(_, snip) return snip.captures[1] end ),
+--           d(1, get_visual),
+--         }
+--       ),
+--       { condition = tex.in_mathzone }
+--     ),
+  }
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/greek.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/greek.lua
new file mode 100644
index 00000000..419e47ef
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/greek.lua
@@ -0,0 +1,140 @@
+-- Return snippet tables
+return
+{
+  s({trig=";a", snippetType="autosnippet"},
+    {
+      t("\\alpha"),
+  }),
+  s({trig=";b", snippetType="autosnippet"},
+    {
+      t("\\beta"),
+  }),
+  s({trig=";g", snippetType="autosnippet"},
+    {
+      t("\\gamma"),
+  }),
+  s({trig=";G", snippetType="autosnippet"},
+    {
+      t("\\Gamma"),
+  }),
+  s({trig=";d", snippetType="autosnippet"},
+    {
+      t("\\delta"),
+  }),
+  s({trig=";D", snippetType="autosnippet"},
+    {
+      t("\\Delta"),
+  }),
+  s({trig=";e", snippetType="autosnippet"},
+    {
+      t("\\epsilon"),
+  }),
+  s({trig=";ve", snippetType="autosnippet"},
+    {
+      t("\\varepsilon"),
+  }),
+  s({trig=";z", snippetType="autosnippet"},
+    {
+      t("\\zeta"),
+  }),
+  s({trig=";h", snippetType="autosnippet"},
+    {
+      t("\\eta"),
+  }),
+  s({trig=";o", snippetType="autosnippet"},
+    {
+      t("\\theta"),
+  }),
+  s({trig=";vo", snippetType="autosnippet"},
+    {
+      t("\\vartheta"),
+  }),
+  s({trig=";O", snippetType="autosnippet"},
+    {
+      t("\\Theta"),
+  }),
+  s({trig=";k", snippetType="autosnippet"},
+    {
+      t("\\kappa"),
+  }),
+  s({trig=";l", snippetType="autosnippet"},
+    {
+      t("\\lambda"),
+  }),
+  s({trig=";L", snippetType="autosnippet"},
+    {
+      t("\\Lambda"),
+  }),
+  s({trig=";m", snippetType="autosnippet"},
+    {
+      t("\\mu"),
+  }),
+  s({trig=";n", snippetType="autosnippet"},
+    {
+      t("\\nu"),
+  }),
+  s({trig=";x", snippetType="autosnippet"},
+    {
+      t("\\xi"),
+  }),
+  s({trig=";X", snippetType="autosnippet"},
+    {
+      t("\\Xi"),
+  }),
+  s({trig=";i", snippetType="autosnippet"},
+    {
+      t("\\pi"),
+  }),
+  s({trig=";I", snippetType="autosnippet"},
+    {
+      t("\\Pi"),
+  }),
+  s({trig=";r", snippetType="autosnippet"},
+    {
+      t("\\rho"),
+  }),
+  s({trig=";s", snippetType="autosnippet"},
+    {
+      t("\\sigma"),
+  }),
+  s({trig=";S", snippetType="autosnippet"},
+    {
+      t("\\Sigma"),
+  }),
+  s({trig=";t", snippetType="autosnippet"},
+    {
+      t("\\tau"),
+  }),
+  s({trig=";f", snippetType="autosnippet"},
+    {
+      t("\\phi"),
+  }),
+  s({trig=";vf", snippetType="autosnippet"},
+    {
+      t("\\varphi"),
+  }),
+  s({trig=";F", snippetType="autosnippet"},
+    {
+      t("\\Phi"),
+  }),
+  s({trig=";c", snippetType="autosnippet"},
+    {
+      t("\\chi"),
+  }),
+  s({trig=";p", snippetType="autosnippet"},
+    {
+      t("\\psi"),
+  }),
+  s({trig=";P", snippetType="autosnippet"},
+    {
+      t("\\Psi"),
+  }),
+  s({trig=";w", snippetType="autosnippet"},
+    {
+      t("\\omega"),
+  }),
+  s({trig=";W", snippetType="autosnippet"},
+    {
+      t("\\Omega"),
+  }),
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/math.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/math.lua
new file mode 100644
index 00000000..e252ad43
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/math.lua
@@ -0,0 +1,537 @@
+local get_visual = function(args, parent)
+  if (#parent.snippet.env.SELECT_RAW > 0) then
+    return sn(nil, i(0, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(0, ''))
+  end
+end
+
+-- Math context detection
+local tex = {}
+tex.in_mathzone = function() return vim.fn['vimtex#syntax#in_mathzone']() == 1 end
+tex.in_text = function() return not tex.in_mathzone() end
+
+-- Return snippet tables
+return
+{
+--   -- SUPERSCRIPT
+--   s({trig = "([%w%)%]%}])'", wordTrig=false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>^{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- SUBSCRIPT
+--   s({trig = "([%w%)%]%}]);", wordTrig=false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>_{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- SUBSCRIPT AND SUPERSCRIPT
+--   s({trig = "([%w%)%]%}])__", wordTrig=false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>^{<>}_{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--         i(2),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- TEXT SUBSCRIPT
+--   s({trig = 'sd', snippetType="autosnippet", wordTrig=false},
+--     fmta("_{\\mathrm{<>}}",
+--       { d(1, get_visual) }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- SUPERSCRIPT SHORTCUT
+--   -- Places the first alphanumeric character after the trigger into a superscript.
+--   s({trig = '([%w%)%]%}])"([%w])', regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>^{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         f( function(_, snip) return snip.captures[2] end ),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- SUBSCRIPT SHORTCUT
+--   -- Places the first alphanumeric character after the trigger into a subscript.
+--   s({trig = '([%w%)%]%}]):([%w])', regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>_{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         f( function(_, snip) return snip.captures[2] end ),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- EULER'S NUMBER SUPERSCRIPT SHORTCUT
+--   s({trig = '([^%a])ee', regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>e^{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual)
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- ZERO SUBSCRIPT SHORTCUT
+--   s({trig = '([%a%)%]%}])00', regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>_{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         t("0")
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- MINUS ONE SUPERSCRIPT SHORTCUT
+--   s({trig = '([%a%)%]%}])11', regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>_{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         t("-1")
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- J SUBSCRIPT SHORTCUT (since jk triggers snippet jump forward)
+--   s({trig = '([%a%)%]%}])JJ', wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>_{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         t("j")
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- PLUS SUPERSCRIPT SHORTCUT
+--   s({trig = '([%a%)%]%}])%+%+', regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>^{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         t("+")
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- COMPLEMENT SUPERSCRIPT
+--   s({trig = '([%a%)%]%}])CC', regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>^{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         t("\\complement")
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- CONJUGATE (STAR) SUPERSCRIPT SHORTCUT
+--   s({trig = '([%a%)%]%}])%*%*', regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>^{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         t("*")
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- VECTOR, i.e. \vec
+--   s({trig = "([^%a])vv", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\vec{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- DEFAULT UNIT VECTOR WITH SUBSCRIPT, i.e. \unitvector_{}
+--   s({trig = "([^%a])ue", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\unitvector_{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- UNIT VECTOR WITH HAT, i.e. \uvec{}
+--   s({trig = "([^%a])uv", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\uvec{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- MATRIX, i.e. \vec
+--   s({trig = "([^%a])mt", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\mat{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- FRACTION
+--   s({trig = "([^%a])ff", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\frac{<>}{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--         i(2),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- ANGLE
+--   s({trig = "([^%a])gg", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\ang{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- ABSOLUTE VALUE
+--   s({trig = "([^%a])aa", regTrig = true, wordTrig = false, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\abs{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- SQUARE ROOT
+--   s({trig = "([^%\\])sq", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\sqrt{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- BINOMIAL SYMBOL
+--   s({trig = "([^%\\])bnn", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\binom{<>}{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--         i(2),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- LOGARITHM WITH BASE SUBSCRIPT
+--   s({trig = "([^%a%\\])ll", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\log_{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- DERIVATIVE with denominator only
+--   s({trig = "([^%a])dV", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\dvOne{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- DERIVATIVE with numerator and denominator
+--   s({trig = "([^%a])dvv", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\dv{<>}{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--         i(2)
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- DERIVATIVE with numerator, denominator, and higher-order argument
+--   s({trig = "([^%a])ddv", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\dvN{<>}{<>}{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--         i(2),
+--         i(3),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- PARTIAL DERIVATIVE with denominator only
+--   s({trig = "([^%a])pV", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\pdvOne{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- PARTIAL DERIVATIVE with numerator and denominator
+--   s({trig = "([^%a])pvv", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\pdv{<>}{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--         i(2)
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- PARTIAL DERIVATIVE with numerator, denominator, and higher-order argument
+--   s({trig = "([^%a])ppv", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\pdvN{<>}{<>}{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--         i(2),
+--         i(3),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- SUM with lower limit
+--   s({trig = "([^%a])sM", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\sum_{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- SUM with upper and lower limit
+--   s({trig = "([^%a])smm", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\sum_{<>}^{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--         i(2),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- INTEGRAL with upper and lower limit
+--   s({trig = "([^%a])intt", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\int_{<>}^{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         i(1),
+--         i(2),
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- BOXED command
+--   s({trig = "([^%a])bb", wordTrig = false, regTrig = true, snippetType="autosnippet"},
+--     fmta(
+--       "<>\\boxed{<>}",
+--       {
+--         f( function(_, snip) return snip.captures[1] end ),
+--         d(1, get_visual)
+--       }
+--     ),
+--     {condition = tex.in_mathzone}
+--   ),
+--   --
+--   -- BEGIN STATIC SNIPPETS
+--   --
+--
+--   -- DIFFERENTIAL, i.e. \diff
+--   s({trig = "df", snippetType="autosnippet", snippetType="autosnippet"},
+--     {
+--       t("\\diff"),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- BASIC INTEGRAL SYMBOL, i.e. \int
+--   s({trig = "in1", snippetType="autosnippet"},
+--     {
+--       t("\\int"),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- DOUBLE INTEGRAL, i.e. \iint
+--   s({trig = "in2", snippetType="autosnippet"},
+--     {
+--       t("\\iint"),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- TRIPLE INTEGRAL, i.e. \iiint
+--   s({trig = "in3", snippetType="autosnippet"},
+--     {
+--       t("\\iiint"),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- CLOSED SINGLE INTEGRAL, i.e. \oint
+--   s({trig = "oi1", snippetType="autosnippet"},
+--     {
+--       t("\\oint"),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- CLOSED DOUBLE INTEGRAL, i.e. \oiint
+--   s({trig = "oi2", snippetType="autosnippet"},
+--     {
+--       t("\\oiint"),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- GRADIENT OPERATOR, i.e. \grad
+--   s({trig = "gdd", snippetType="autosnippet"},
+--     {
+--       t("\\grad "),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- CURL OPERATOR, i.e. \curl
+--   s({trig = "cll", snippetType="autosnippet"},
+--     {
+--       t("\\curl "),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- DIVERGENCE OPERATOR, i.e. \divergence
+--   s({trig = "DI", snippetType="autosnippet"},
+--     {
+--       t("\\div "),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- LAPLACIAN OPERATOR, i.e. \laplacian
+--   s({trig = "laa", snippetType="autosnippet"},
+--     {
+--       t("\\laplacian "),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- PARALLEL SYMBOL, i.e. \parallel
+--   s({trig = "||", snippetType="autosnippet"},
+--     {
+--       t("\\parallel"),
+--     }
+--   ),
+--   -- CDOTS, i.e. \cdots
+--   s({trig = "cdd", snippetType="autosnippet"},
+--     {
+--       t("\\cdots"),
+--     }
+--   ),
+--   -- LDOTS, i.e. \ldots
+--   s({trig = "ldd", snippetType="autosnippet"},
+--     {
+--       t("\\ldots"),
+--     }
+--   ),
+--   -- EQUIV, i.e. \equiv
+--   s({trig = "eqq", snippetType="autosnippet"},
+--     {
+--       t("\\equiv "),
+--     }
+--   ),
+--   -- SETMINUS, i.e. \setminus
+--   s({trig = "stm", snippetType="autosnippet"},
+--     {
+--       t("\\setminus "),
+--     }
+--   ),
+--   -- SUBSET, i.e. \subset
+--   s({trig = "sbb", snippetType="autosnippet"},
+--     {
+--       t("\\subset "),
+--     }
+--   ),
+--   -- APPROX, i.e. \approx
+--   s({trig = "px", snippetType="autosnippet"},
+--     {
+--       t("\\approx "),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- PROPTO, i.e. \propto
+--   s({trig = "pt", snippetType="autosnippet"},
+--     {
+--       t("\\propto "),
+--     },
+--     {condition = tex.in_mathzone}
+--   ),
+--   -- COLON, i.e. \colon
+--   s({trig = "::", snippetType="autosnippet"},
+--     {
+--       t("\\colon "),
+--     }
+--   ),
+--   -- IMPLIES, i.e. \implies
+--   s({trig = ">>", snippetType="autosnippet"},
+--     {
+--       t("\\implies "),
+--     }
+--   ),
+--   -- DOT PRODUCT, i.e. \cdot
+--   s({trig = ",.", snippetType="autosnippet"},
+--     {
+--       t("\\cdot "),
+--     }
+--   ),
+--   -- CROSS PRODUCT, i.e. \times
+--   s({trig = "xx", snippetType="autosnippet"},
+--     {
+--       t("\\times "),
+--     }
+--   ),
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/new.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/new.lua
new file mode 100644
index 00000000..0ca73da4
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/new.lua
@@ -0,0 +1,51 @@
+local get_visual = function(args, parent)
+  if (#parent.snippet.env.SELECT_RAW > 0) then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1, ''))
+  end
+end
+local function char_count_same(c1, c2)
+    local line = vim.api.nvim_get_current_line()
+    -- '%'-escape chars to force explicit match (gsub accepts patterns).
+    -- second return value is number of substitutions.
+    local _, ct1 = string.gsub(line, '%' .. c1, '')
+    local _, ct2 = string.gsub(line, '%' .. c2, '')
+    return ct1 == ct2
+end
+
+local function even_count(c)
+    local line = vim.api.nvim_get_current_line()
+    local _, ct = string.gsub(line, c, '')
+    return ct % 2 == 0
+end
+
+local function neg(fn, ...)
+    return not fn(...)
+end
+
+local function part(fn, ...)
+    local args = { ... }
+    return function() return fn(unpack(args)) end
+end
+
+-- This makes creation of pair-type snippets easier.
+local function pair(pair_begin, pair_end, expand_func, ...)
+    -- triggerd by opening part of pair, wordTrig=false to trigger anywhere.
+    -- ... is used to pass any args following the expand_func to it.
+    return s({ trig = pair_begin, wordTrig = false, snippetType = "autosnippet" }, {
+        t({ pair_begin }), d(1, get_visual), t({ pair_end })
+    }, {
+        condition = part(expand_func, part(..., pair_begin, pair_end))
+    })
+end
+
+return {
+    pair("(", ")", neg, char_count_same),
+    pair("{", "}", neg, char_count_same),
+    pair("[", "]", neg, char_count_same),
+    pair("<", ">", neg, char_count_same),
+    pair("'", "'", neg, even_count),
+    pair('"', '"', neg, even_count),
+    pair("`", "`", neg, even_count),
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/static.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/static.lua
new file mode 100644
index 00000000..b064ce7b
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/static.lua
@@ -0,0 +1,94 @@
+local get_visual = function(args, parent)
+  if (#parent.snippet.env.SELECT_RAW > 0) then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1, ''))
+  end
+end
+
+local line_begin = require("luasnip.extras.expand_conditions").line_begin
+
+-- Environment/syntax context detection
+local tex = {}
+tex.in_mathzone = function() return vim.fn['vimtex#syntax#in_mathzone']() == 1 end
+tex.in_text = function() return not tex.in_mathzone() end
+tex.in_tikz = function()
+  local is_inside = vim.fn['vimtex#env#is_inside']("tikzpicture")
+  return (is_inside[1] > 0 and is_inside[2] > 0)
+end
+
+-- Return snippet tables
+return
+  {
+--     s({trig="LL", snippetType="autosnippet"},
+--       {
+--         t("& "),
+--       }
+--     ),
+--     s({trig="q"},
+--       {
+--         t("\\quad "),
+--       }
+--     ),
+--     s({trig="qq", snippetType="autosnippet"},
+--       {
+--         t("\\qquad "),
+--       }
+--     ),
+--     s({trig="np"},
+--       {
+--         t("\\newpage"),
+--       },
+--       {condition = line_begin}
+--     ),
+--     s({trig="which", snippetType="autosnippet"},
+--       {
+--         t("\\text{ for which } "),
+--       },
+--       {condition = tex.in_mathzone}
+--     ),
+--     s({trig="all", snippetType="autosnippet"},
+--       {
+--         t("\\text{ for all } "),
+--       },
+--       {condition = tex.in_mathzone}
+--     ),
+--     s({trig="and", snippetType="autosnippet"},
+--       {
+--         t("\\quad \\text{and} \\quad"),
+--       },
+--       {condition = tex.in_mathzone}
+--     ),
+--     s({trig="forall", snippetType="autosnippet"},
+--       {
+--         t("\\text{ for all } "),
+--       },
+--       {condition = tex.in_mathzone}
+--     ),
+--     s({trig = "toc", snippetType="autosnippet"},
+--       {
+--         t("\\tableofcontents"),
+--       },
+--       { condition = line_begin }
+--     ),
+     s({trig="inff", snippetType="autosnippet"},
+       {
+         t("\\infty"),
+       }
+     ),
+     s({trig="ii", snippetType="autosnippet"},
+       {
+         t("\\item "),
+       },
+       { condition = line_begin }
+     ),
+     s({trig = "--", snippetType="autosnippet"},
+       {t('% --------------------------------------------- %')},
+       {condition = line_begin}
+     ),
+--     -- HLINE WITH EXTRA VERTICAL SPACE
+--     s({trig = "hl"},
+--       {t('\\hline {\\rule{0pt}{2.5ex}} \\hspace{-7pt}')},
+--       {condition = line_begin}
+--     ),
+   }
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/system.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/system.lua
new file mode 100644
index 00000000..d551a818
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/system.lua
@@ -0,0 +1,168 @@
+local get_visual = function(args, parent)
+  if (#parent.snippet.env.SELECT_RAW > 0) then
+    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+  else
+    return sn(nil, i(1, ''))
+  end
+end
+
+local line_begin = require("luasnip.extras.expand_conditions").line_begin
+
+-- Math context detection
+local tex = {}
+tex.in_mathzone = function() return vim.fn['vimtex#syntax#in_mathzone']() == 1 end
+tex.in_text = function() return not tex.in_mathzone() end
+
+-- Return snippet tables
+return
+   {
+--     -- ANNOTATE (custom command for annotating equation derivations)
+--     s({trig = "ann", snippetType="autosnippet"},
+--       fmta(
+--         [[
+--       \annotate{<>}{<>}
+--       ]],
+--         {
+--           i(1),
+--           d(2, get_visual),
+--         }
+--       )
+--     ),
+--     -- REFERENCE
+--     s({trig = " RR", snippetType="autosnippet", wordTrig=false},
+--       fmta(
+--         [[
+--       ~\ref{<>}
+--       ]],
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- USE A LATEX PACKAGE
+--     s({trig = "pack", snippetType="autosnippet"},
+--       fmta(
+--         [[
+--         \usepackage{<>}
+--         ]],
+--         {
+--           d(1, get_visual),
+--         }
+--       ),
+--       { condition = line_begin }
+--     ),
+--     -- INPUT a LaTeX file
+--     s({trig = "inn", snippetType="autosnippet"},
+--       fmta(
+--         [[
+--       \input{<><>}
+--       ]],
+--         {
+--           i(1, "~/dotfiles/config/latex/templates/"),
+--           i(2)
+--         }
+--       ),
+--       { condition = line_begin }
+--     ),
+--     -- LABEL
+--     s({trig = "lbl", snippetType="autosnippet"},
+--       fmta(
+--         [[
+--       \label{<>}
+--       ]],
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- HPHANTOM
+--     s({trig = "hpp", snippetType="autosnippet"},
+--       fmta(
+--         [[
+--       \hphantom{<>}
+--       ]],
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     s({trig = "TODOO", snippetType="autosnippet"},
+--       fmta(
+--         [[\TODO{<>}]],
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     s({trig="nc"},
+--       fmta(
+--         [[\newcommand{<>}{<>}]],
+--         {
+--           i(1),
+--           i(2)
+--         }
+--       ),
+--       {condition = line_begin}
+--     ),
+--     s({trig="sii", snippetType="autosnippet"},
+--       fmta(
+--         [[\si{<>}]],
+--         {
+--           i(1),
+--         }
+--       )
+--     ),
+--     s({trig="SI", snippetType="autosnippet"},
+--       fmta(
+--         [[\SI{<>}{<>}]],
+--         {
+--           i(1),
+--           i(2)
+--         }
+--       )
+--     ),
+--     s({trig="url"},
+--       fmta(
+--         [[\url{<>}]],
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- VSPACE
+--     s({trig="vs"},
+--       fmta(
+--         [[\vspace{<>}]],
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- SECTION
+--     s({trig="h1", snippetType="autosnippet"},
+--       fmta(
+--         [[\section{<>}]],
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- SUBSECTION
+--     s({trig="h2", snippetType="autosnippet"},
+--       fmta(
+--         [[\subsection{<>}]],
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+--     -- SUBSUBSECTION
+--     s({trig="h3", snippetType="autosnippet"},
+--       fmta(
+--         [[\subsubsection{<>}]],
+--         {
+--           d(1, get_visual),
+--         }
+--       )
+--     ),
+   }
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/tmp.lua b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/tmp.lua
new file mode 100644
index 00000000..c0acfb3a
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/luasnip/lua/snippets/tex/tmp.lua
@@ -0,0 +1,24 @@
+local get_visual = function(args, parent)
+    if (#parent.snippet.env.SELECT_RAW > 0) then
+        return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
+    else
+        return sn(nil, i(1, ''))
+    end
+end
+
+local line_begin = require("luasnip.extras.expand_conditions").line_begin
+
+return {
+    --  s({trig="up"},
+    --     fmta(
+    --       [[
+    --         \usepackage<>{<>}
+    --       ]],
+    --       {
+    --         -- c(1, {t(""), sn(nil, {t("["), i(1, "options"), t("]")})}),
+    --         c(1, {sn(nil, {t("["), i(1, "options"), t("]")}), t("")}),
+    --         i(2, "name"),
+    --       }
+    --     )
+    --   ),
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/nvim-cmp/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/nvim-cmp/default.nix
new file mode 100644
index 00000000..d464a305
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/nvim-cmp/default.nix
@@ -0,0 +1,47 @@
+{...}: {
+  programs.nixvim.plugins.nvim-cmp = {
+    /*
+    TODO; integrate this:
+    ```lua
+      enabled = {
+      function()
+          -- disable completion in comments
+          local context = require 'cmp.config.context'
+          -- keep command mode completion enabled when cursor is in a comment
+          -- te
+          if vim.api.nvim_get_mode().mode == 'c' then
+              return true
+          else
+              return not context.in_treesitter_capture("comment")
+                  and not context.in_syntax_group("Comment")
+          end
+      end
+      },
+    ```
+    */
+    enable = true;
+
+    mapping = {
+      # TODO add support for desc and which key here
+      "<C-d>" = {
+        action = "cmp.mapping.scroll_docs(-4)";
+        #desc = "Scroll up by four lines";
+      };
+      "<C-f>" = {
+        action = "cmp.mapping.scroll_docs(4)";
+        #desc = "Scroll down by four lines";
+      };
+      "<C-Space>" = {
+        action = "cmp.mapping.complete()";
+        #desc = "Confirm snipped";
+      };
+    };
+
+    snippet.expand = "luasnip";
+
+    sources = [
+      {name = "nvim_lsp";}
+      {name = "luasnip";}
+    ];
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/nvim-lint/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/nvim-lint/default.nix
new file mode 100644
index 00000000..c55efacc
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/nvim-lint/default.nix
@@ -0,0 +1,8 @@
+{lib, ...}: {
+  programs.nixvim = {
+    # TODO package nvim-lint though a module
+    extraConfigLuaPost = ''
+      ${lib.strings.fileContents ./lua/nvim-lint.lua}
+    '';
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/nvim-lint/lua/nvim-lint.lua b/home-manager/soispha/config/neovim/nixvim/plugins/nvim-lint/lua/nvim-lint.lua
new file mode 100644
index 00000000..812d4827
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/nvim-lint/lua/nvim-lint.lua
@@ -0,0 +1,20 @@
+require('lint').linters_by_ft = {
+    -- text
+    markdown = {},
+    -- tex = {'chktex'}, -- maybe add some text linters ?
+
+    -- shell
+    sh = {'shellcheck',},
+    bash = {'shellcheck'},
+    zsh = {'shellcheck'},
+    dash = {'shellcheck'},
+
+    yaml = {'yamllint'},
+    nix = {'nix', 'statix'},
+}
+
+vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost" }, {
+    callback = function()
+        require("lint").try_lint()
+    end,
+})
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/raw_plugins/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/raw_plugins/default.nix
new file mode 100644
index 00000000..fdc30d7f
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/raw_plugins/default.nix
@@ -0,0 +1,15 @@
+{pkgs, ...}: {
+  programs.nixvim = {
+    # Not all plugins have own modules
+    # You can add missing plugins here
+    # `pkgs.vimExtraPlugins` is added by the overlay you added at the beginning
+    # For a list of available plugins, look here: [available plugins](https://github.com/jooooscha/nixpkgs-vim-extra-plugins/blob/main/plugins.md)
+    extraPlugins = with pkgs.vimExtraPlugins; [
+      nightfox-nvim
+      nvim-lint
+      lf-nvim
+
+      nvim-toggleterm-lua # required by lf-nvim
+    ];
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/treesitter/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/treesitter/default.nix
index 7a8a3a26..4aca6887 100644
--- a/home-manager/soispha/config/neovim/nixvim/plugins/treesitter/default.nix
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/treesitter/default.nix
@@ -1,11 +1,18 @@
 {...}: {
   programs.nixvim.plugins.treesitter = {
     enable = true;
-    #  A list of parser names; or "all"
-    #  ensure_installed = [ "c" "lua" "rust" ];
-    ensure_installed = "all";
 
-    # TODO make this work
+    ensureInstalled = "all";
+    indent = true;
+
+    # inject nixvim specific highlighting (eg in extraConfigLua).
+    nixvimInjections = true;
+
+    # TODO It would we wonderfull, if we could use treesitter in latex
+    #disabledLanguages = ["latex"];
+
+    /*
+    # TODO this is not supported by the nixVim modlue, nixNeovim supports this though ..
     highlight = {
       #  `false` will disable the whole extension
       enable = true;
@@ -15,20 +22,18 @@
       #  Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
       #  Using this option may slow down your editor; and you may see some duplicate highlights.
       #  Instead of true it can also be a list of languages
-      additional_vim_regex_highlighting = [""];
+      additionalVimRegexHighlighting = [""];
     };
+    */
 
-    indent = {
-      enable = true;
-    };
-    incremental_selection = {
+    incrementalSelection = {
       enable = true;
       keymaps = {
         # TODO include these
-        init_selection = "gnn"; #  set to `false` to disable one of the mappings
-        node_incremental = "grn";
-        scope_incremental = "grc";
-        node_decremental = "grm";
+        initSelection = "gnn"; #  set to `false` to disable one of the mappings
+        nodeIncremental = "grn";
+        scopeIncremental = "grc";
+        nodeDecremental = "grm";
       };
     };
   };
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/vim-tex/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/vim-tex/default.nix
new file mode 100644
index 00000000..39825fd3
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/vim-tex/default.nix
@@ -0,0 +1,55 @@
+{...}: {
+  programs.nixvim = {
+    options.conceallevel = 0;
+
+    #    globals.tex_conceal = "abdmg";
+    #    globals.tex_flavor = "latex";
+
+    plugins.vimtex = {
+      enable = true;
+      extraConfig = {
+        view_method = "zathura";
+        quickfix_mode = -1;
+        view_enabled = -1;
+        tex_conceal = "abdmg";
+        tex_flavor = "latex";
+
+        mappings_disable = {
+          n = ["tsf" "tsc" "tse" "ts$" "tsd" "tsD"];
+          x = ["tsd" "tsD" "tsf"];
+        };
+
+        toc_config = {
+          name = "TOC";
+          layers = ["content" "todo" "include"];
+          resize = false;
+          split_width = 49;
+          todo_sorted = -1;
+          show_help = false;
+          show_numbers = false;
+          mode = true;
+          layer_keys = {
+            content = "C";
+            label = "L";
+            todo = "j";
+            include = "I";
+          };
+        };
+
+        compiler_latexmk = {
+          build_dir = "build";
+          callback = false;
+          continuous = true;
+          executable = "latexmk";
+          hooks = [];
+          options = [
+            "-verbose"
+            "-file-line-error"
+            "-synctex=0"
+            "-interaction=nonstopmode"
+          ];
+        };
+      };
+    };
+  };
+}