diff --git a/home/features/neovim/config/ftplugin/lua.lua b/home/features/neovim/config/ftplugin/lua.lua
index d41d664..0dce483 100644
--- a/home/features/neovim/config/ftplugin/lua.lua
+++ b/home/features/neovim/config/ftplugin/lua.lua
@@ -24,6 +24,14 @@ local function runLocal(functionName)
   end
 end
 
+-- local tempest = require("my.tempest")
+-- tempest.set_keymap({
+--   mapping = "<leader>lf",
+--   action = "<cmd>source %<cr>",
+--   buffer = true,
+--   desc = "Run .[s]etup() in current file"
+-- })
+
 vim.keymap.set(
   "n",
   "<leader>lf",
diff --git a/home/features/neovim/config/init.lua b/home/features/neovim/config/init.lua
index 2784b6d..bba7b4b 100644
--- a/home/features/neovim/config/init.lua
+++ b/home/features/neovim/config/init.lua
@@ -8,5 +8,3 @@ local nix = require("nix")
 tempest.configureMany(nix.pre)
 require("my.lazy").setup()
 tempest.configureMany(nix.post)
-
-require("my.helpers.folding").setup()
diff --git a/home/features/neovim/config/lazy-lock.json b/home/features/neovim/config/lazy-lock.json
index 9444d54..7329366 100644
--- a/home/features/neovim/config/lazy-lock.json
+++ b/home/features/neovim/config/lazy-lock.json
@@ -25,10 +25,11 @@
   "lastplace": { "branch": "main", "commit": "0bb6103c506315044872e0f84b1f736c4172bb20" },
   "lean": { "branch": "main", "commit": "202513a398e780dac32d36159181a8299d9cfd12" },
   "live-command": { "branch": "main", "commit": "d460067d47948725a6f25b20f31ea8bbfdfe4622" },
-  "lspconfig": { "branch": "master", "commit": "b1729954329236f59d075bec79fdee7a6f3ce88b" },
+  "lspconfig": { "branch": "master", "commit": "641e567f975feab3815b47c7d29e6148e07afa77" },
   "lspkind.nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" },
   "luasnip": { "branch": "master", "commit": "03c8e67eb7293c404845b3982db895d59c0d1538" },
   "mini.ai": { "branch": "main", "commit": "ebb04799794a7f94628153991e6334c3304961b8" },
+  "mini.align": { "branch": "main", "commit": "969bdcdf9b88e30bda9cb8ad6f56afed208778ad" },
   "mini.comment": { "branch": "main", "commit": "a56581c40c19fa26f2b39da72504398de3173c5a" },
   "mini.files": { "branch": "main", "commit": "84efb81e5207ae8c41f54abdafb79c6212fc0971" },
   "mini.operators": { "branch": "main", "commit": "7cb4dc66c51a3d736d347bbc517dc73dc7d28888" },
diff --git a/home/features/neovim/config/lua/my/helpers/folding.lua b/home/features/neovim/config/lua/my/helpers/folding.lua
deleted file mode 100644
index fddaa71..0000000
--- a/home/features/neovim/config/lua/my/helpers/folding.lua
+++ /dev/null
@@ -1,23 +0,0 @@
-local M = {}
-
-local function createFold(name)
-  local commentstring = vim.o.commentstring
-  local start_comment = string.gsub(commentstring, "%%s", "{{{ " .. name)
-  local end_comment = string.gsub(commentstring, "%%s", "}}}")
-
-  -- Leave visual mode
-  local esc = vim.api.nvim_replace_termcodes("<esc>", true, false, true)
-  vim.api.nvim_feedkeys(esc, "x", false)
-
-  vim.cmd(":'>put='" .. end_comment .. "'")
-  vim.cmd(":'<-1put='" .. start_comment .. "'")
-end
-
-function M.setup()
-  vim.keymap.set("v", "<C-i>", function()
-    local name = vim.fn.input("Fold name: ")
-    createFold(name)
-  end, { desc = "Create fold markers around area" })
-end
-
-return M
diff --git a/home/features/neovim/config/lua/my/helpers/wrap.lua b/home/features/neovim/config/lua/my/helpers/wrap.lua
deleted file mode 100644
index d95f453..0000000
--- a/home/features/neovim/config/lua/my/helpers/wrap.lua
+++ /dev/null
@@ -1,43 +0,0 @@
-local M = {}
-
-local function swap(key)
-  vim.keymap.set({ "n", "v" }, key, "g" .. key, { buffer = true })
-  vim.keymap.set({ "n", "v" }, "g" .. key, key, { buffer = true })
-end
-
-local function unswap(key)
-  vim.keymap.del({ "n", "v" }, key)
-  vim.keymap.del({ "n", "v" }, "g" .. key)
-end
-
-function M.enable()
-  vim.opt.wrap = true
-
-  swap("j")
-  swap("k")
-  swap("<up>")
-  swap("<down>")
-  swap("0")
-  swap("$")
-end
-
-function M.disable()
-  vim.opt.wrap = false
-
-  unswap("j")
-  unswap("k")
-  unswap("<up>")
-  unswap("<down>")
-  unswap("0")
-  unswap("$")
-end
-
-function M.toggle()
-  if vim.opt.wrap == true then
-    M.disable()
-  else
-    M.enable()
-  end
-end
-
-return M
diff --git a/home/features/neovim/config/lua/my/lazy.lua b/home/features/neovim/config/lua/my/lazy.lua
index d4c5b4d..8bebd72 100644
--- a/home/features/neovim/config/lua/my/lazy.lua
+++ b/home/features/neovim/config/lua/my/lazy.lua
@@ -1,8 +1,8 @@
 local M = {}
 
-local function importFrom(p)
-  return { import = p }
-end
+-- local function importFrom(p)
+--   return { import = p }
+-- end
 
 function M.setup()
   require("lazy").setup({
diff --git a/home/features/neovim/config/lua/my/tempest.lua b/home/features/neovim/config/lua/my/tempest.lua
index 965bb73..2909d00 100644
--- a/home/features/neovim/config/lua/my/tempest.lua
+++ b/home/features/neovim/config/lua/my/tempest.lua
@@ -57,7 +57,8 @@ function H.mergeTables(t1, t2)
 end
 -- }}}
 -- }}}
--- {{{ API wrappers
+
+-- API wrappers
 -- {{{ Keymaps
 function M.set_keymap(opts, context)
   if context == nil then
@@ -112,7 +113,64 @@ function M.create_autocmd(opts)
   })
 end
 -- }}}
+-- {{{ Wrapping
+local function swapLinewiseKeybinds(key)
+  vim.keymap.set({ "n", "v" }, key, "g" .. key, { buffer = true })
+  vim.keymap.set({ "n", "v" }, "g" .. key, key, { buffer = true })
+end
+
+local function unswapLinewiseKeybinds(key)
+  vim.keymap.del({ "n", "v" }, key)
+  vim.keymap.del({ "n", "v" }, "g" .. key)
+end
+
+M.wrapping = {}
+
+function M.wrapping.enable()
+  vim.opt.wrap = true
+
+  swapLinewiseKeybinds("j")
+  swapLinewiseKeybinds("k")
+  swapLinewiseKeybinds("<up>")
+  swapLinewiseKeybinds("<down>")
+  swapLinewiseKeybinds("0")
+  swapLinewiseKeybinds("$")
+end
+
+function M.wrapping.disable()
+  vim.opt.wrap = false
+
+  unswapLinewiseKeybinds("j")
+  unswapLinewiseKeybinds("k")
+  unswapLinewiseKeybinds("<up>")
+  unswapLinewiseKeybinds("<down>")
+  unswapLinewiseKeybinds("0")
+  unswapLinewiseKeybinds("$")
+end
+
+function M.wrapping.toggle()
+  if vim.opt.wrap == true then
+    M.wrapping.disable()
+  else
+    M.wrapping.enable()
+  end
+end
 -- }}}
+-- {{{ Folding
+function M.createVisualFold(name)
+  local commentstring = vim.o.commentstring
+  local start_comment = string.gsub(commentstring, "%%s", "{{{ " .. name)
+  local end_comment = string.gsub(commentstring, "%%s", "}}}")
+
+  -- Leave visual mode
+  local esc = vim.api.nvim_replace_termcodes("<esc>", true, false, true)
+  vim.api.nvim_feedkeys(esc, "x", false)
+
+  vim.cmd(":'>put='" .. end_comment .. "'")
+  vim.cmd(":'<-1put='" .. start_comment .. "'")
+end
+-- }}}
+
 -- {{{ Main config runtime
 local function recursive_assign(source, destination)
   for key, value in pairs(source) do
diff --git a/home/features/neovim/default.nix b/home/features/neovim/default.nix
index b8d3eee..a041c10 100644
--- a/home/features/neovim/default.nix
+++ b/home/features/neovim/default.nix
@@ -9,16 +9,18 @@
 let
   # Toggles for including tooling related to a given language
   packedTargets = {
+    csharp = false;
     elm = false;
+    tooling = true; # Stuff useful for config editing
     latex = true;
     lua = true;
     nix = true;
+    odin = false;
     purescript = false;
     python = false;
     rust = false;
     typst = true;
     web = true;
-    csharp = false;
   };
 
   korora = inputs.korora.lib;
@@ -32,7 +34,7 @@ let
   generated =
     with nlib;
     generateConfig {
-      # {{{ Pre-plugin config
+      # Pre-plugin config
       pre = {
         # {{{ General options
         "0:general-options" = {
@@ -104,7 +106,6 @@ let
             action.vim.opt.winblend = 0;
           };
           #  }}}
-
           # {{{ Starter page
           callback =
             # lua
@@ -191,15 +192,17 @@ let
               (unmap "<C-^>")
               (nmap "Q" ":wqa<cr>" "Save all files and [q]uit")
               (nmap "<leader>rw" ":%s/<C-r><C-w>/" "[R]eplace [w]ord in file")
-              (nmap "<leader>sw" (require "my.helpers.wrap" /toggle) "toggle word [w]rap")
-              (nmap "<leader>ss" (
-                # lua
-                thunk "vim.opt.spell = not vim.o.spell"
-              ) "toggle [s]pell checker")
+              (nmap "<leader>sw" (tempest /wrapping/toggle) "toggle word [w]rap")
+              (nmap "<leader>ss" (thunk "vim.opt.spell = not vim.o.spell") "toggle [s]pell checker")
               (nmap "<leader>yp" "<cmd>!curl --data-binary @% https://paste.rs | wl-copy<cr>"
                 "[y]ank [p]aste.rs link to clipboard"
               )
               # }}}
+              {
+                mode = "v";
+                mapping = "<C-i>";
+                action = _: tempest /createVisualFold (vim /fn/input "Fold name: ");
+              }
             ];
           # }}}
           # {{{ Autocmds
@@ -221,7 +224,7 @@ let
                 "tex"
               ];
               group = "EnableWrapMovement";
-              action = require "my.helpers.wrap" /enable;
+              action = tempest /wrapping/enable;
             }
             # }}}
           ];
@@ -317,8 +320,8 @@ let
         };
         # }}}
       };
-      # }}}
-      # {{{ Plugins
+
+      # Plugins
       lazy = {
         # {{{ libraries
         # {{{ plenary
@@ -753,6 +756,24 @@ let
             };
         };
         # }}}
+        # {{{ mini.align
+        mini-align = {
+          package = "echasnovski/mini.align";
+          name = "mini.align";
+
+          config = true;
+          keys = [
+            {
+              mode = "nxv";
+              mapping = "ga";
+            }
+            {
+              mode = "nxv";
+              mapping = "gA";
+            }
+          ];
+        };
+        # }}}
         # {{{ mini.comment
         mini-comment = {
           package = "echasnovski/mini.comment";
@@ -978,8 +999,15 @@ let
                 pkgs.nodePackages.purs-tidy
               ]
               ++ optionals csharp [ pkgs.csharp-ls ]
+              ++ optionals odin [ pkgs.ols ]
+              ++ optionals tooling [
+                pkgs.hyprls
+                # REASON: not yet available on stable
+                upkgs.just-lsp
+              ]
             );
           # }}}
+
           dependencies.lua = [
             "neoconf"
             "neodev"
@@ -1061,6 +1089,13 @@ let
               elmls = { };
               csharp_ls = { };
               ols = { }; # Odin
+              hyprls = { };
+
+              # I have the justfile formatter
+              just.on_attach = client: ''
+                ${client}.server_capabilities.documentFormattingProvider = false
+                ${client}.server_capabilities.documentRangeFormattingProvider = false
+              '';
             };
         };
         # }}}
@@ -1110,6 +1145,8 @@ let
               nix = [ "nixfmt" ];
               css = prettier;
               markdown = prettier;
+
+              just.lsp_format = "never";
             };
         };
         # }}}
@@ -1589,7 +1626,6 @@ let
         # }}}
         # }}}
       };
-      # }}}
     };
 
   # {{{ extraRuntime
@@ -1688,4 +1724,6 @@ in
     mirosSnippetCache
   ];
   # }}}
+
+  home.sessionVariables.MANPAGER = "${lib.getExe neovim} +Man!";
 }
diff --git a/home/features/neovim/snippets/common/unicode-misc.miros b/home/features/neovim/snippets/common/unicode-misc.miros
index 5c9443c..a14135c 100644
--- a/home/features/neovim/snippets/common/unicode-misc.miros
+++ b/home/features/neovim/snippets/common/unicode-misc.miros
@@ -9,3 +9,4 @@ block auto
   abbr sim ∼
   abbr approx ≃
   abbr cong ≅
+  abbr fcomp ∘
diff --git a/home/features/neovim/snippets/tex.miros b/home/features/neovim/snippets/tex.miros
index f0c02b6..fd355b6 100644
--- a/home/features/neovim/snippets/tex.miros
+++ b/home/features/neovim/snippets/tex.miros
@@ -87,9 +87,12 @@ block text
     string $
       name inline math
       snip \$$1\$$0
+    -- }}}
 
     abbr pause \pause
-    -- }}}
+    string emph
+      desc emphasise some text
+      snip \emph{$1}$0
 
   string forcecr
     desc Force the content onto a new line
@@ -271,7 +274,7 @@ block math
     for noperator <- @⟨ordop,land,lor,equiv,pmod,ldots,cdots,perp,angle,sup⟩
     abbr @noperator \\@noperator
 
-    for operator <- @⟨cancel,overline,hat,tilde,vec,bar,abs,norm,prob,diprod,sin,cos,sqrt,ln,lrb,zmod,gen,pmob⟩
+    for operator <- @⟨cancel,overline,hat,tilde,vec,bar,abs,norm,prob,diprod,sin,cos,sqrt,lrb,zmod,gen,pmob⟩
     string @operator
       snip \\@operator$|1⟨{$1}, $0⟩
 
diff --git a/home/features/neovim/snippets/typst.miros b/home/features/neovim/snippets/typst.miros
index be1d31e..c68dde5 100644
--- a/home/features/neovim/snippets/typst.miros
+++ b/home/features/neovim/snippets/typst.miros
@@ -54,7 +54,7 @@ block auto
     name limit to @limtarget
     snip lim_($1 → @limtargetsymbol) $0
 
-  for operator <- @⟨eq,neq,defas,leq,geq,lt,gt,iip,iib,iff⟩
+  for operator <- @⟨eq,neq,defas,leq,geq,llt,ggt,iip,iib,iff⟩
   for symbol <- @⟨@operator:=,≠,≔,≤,≥,<,>,⟹,⟸,⟺⟩
 
   abbr @operator @symbol