Add imperative cspell dictionary and views

- Vim views allow us to stay in the same place
- A cspell imperative dictionary lets us add words without having to rebuild
diff --git a/modules/neovim/binds/binds.vim b/modules/neovim/binds/binds.vim
index e9aeec5..85e8886 100644
--- a/modules/neovim/binds/binds.vim
+++ b/modules/neovim/binds/binds.vim
@@ -35,6 +35,7 @@
 command W w
 command Wq wq
 call SetupCommandAlias("git","Git")
+call SetupCommandAlias("rg","Rg")
 
 set ignorecase
 set smartcase
@@ -43,3 +44,16 @@
 
 let g:cursorhold_updatetime = 1000
 autocmd CursorHoldI,CursorHold,BufLeave ?* silent! update
+
+set viewoptions-=options
+autocmd BufWinLeave ?* silent! mkview!
+
+function! s:loadViewOrUnfold()
+  try
+    loadview
+  catch
+    folddoclosed foldopen
+  endtry
+endfunction
+
+autocmd BufWinEnter ?* call s:loadViewOrUnfold()
diff --git a/modules/neovim/coc/default.nix b/modules/neovim/coc/default.nix
index c45a742..0a49dc7 100644
--- a/modules/neovim/coc/default.nix
+++ b/modules/neovim/coc/default.nix
@@ -3,6 +3,7 @@
   system,
   lib,
   nixpkgs-minion,
+  home,
   ...
 }: {
   programs.neovim = {
@@ -11,7 +12,14 @@
       settings = {
         "suggest.noselect" = false;
         "cSpell.checkOnlyEnabledfileTypes" = false;
-        "git.enableGutters" = false;  # We're using another plugin to do this
+        "cSpell.dictionaryDefinitions" = [
+          {
+            name = "imperative";
+            path = "${home.home.homeDirectory}/.local/share/cspell/dictionary.txt";
+          }
+        ];
+        "cSpell.dictionaries" = ["imperative"];
+        "git.enableGutters" = false; # We're using another plugin to do this
         "rust-analyzer.serverPath" = "${pkgs.rust-analyzer}/bin/rust-analyzer";
         languageserver = {
           nix = {