Even more neovim changes
diff --git a/modules/neovim/coc/default.nix b/modules/neovim/coc/default.nix
index 80c2c6a..c8f9ab2 100644
--- a/modules/neovim/coc/default.nix
+++ b/modules/neovim/coc/default.nix
@@ -32,6 +32,7 @@
         "cSpell.checkOnlyEnabledfileTypes" = false;
         "diagnostic.virtualText" = true;
         "diagnostic.virtualTextCurrentLineOnly" = false;
+        "suggest.virtualText" = true;
         "cSpell.dictionaryDefinitions" = [
           {
             name = "imperative";
@@ -60,6 +61,7 @@
           markdown = ["tex"];
         };
         "snippets.autoTrigger" = false;
+        "codeLens.enable" = true;
       };
     };
     plugins = with pkgs.vimPlugins; [
@@ -74,6 +76,7 @@
       coc-markdownlint
       coc-texlab
       coc-pyright
+      coc-java
 
       # Spellchecker
       nixpkgs-minion.legacyPackages.${system}.vimPlugins.coc-spell-checker
@@ -98,6 +101,8 @@
       rust-analyzer
       texlab
       omnisharp-roslyn
+      jdt-language-server
+      jdk
       nodePackages.pyright
       (python3.withPackages (pyPkgs:
         with pyPkgs; [
diff --git a/modules/neovim/coc/keybinds.vim b/modules/neovim/coc/keybinds.vim
index bbc1694..a0a4371 100644
--- a/modules/neovim/coc/keybinds.vim
+++ b/modules/neovim/coc/keybinds.vim
@@ -11,13 +11,20 @@
 let g:UltiSnipsExpandTrigger="<NUL>"
 let g:UltiSnipsJumpForwardTrigger="<NUL>"
 let g:UltiSnipsJumpBackwardTrigger="<NUL>"
+
 inoremap <silent><expr> <CR> coc#pum#visible() ? "\<C-g>u" . coc#pum#confirm() :
-      \ coc#jumpable() ? "\<C-g>u<Esc>:call coc#snippet#next()\<CR>" :
+      \ coc#jumpable() ? "\<Esc>:call coc#snippet#next()\<CR>" :
+      \ tablemode#table#IsTable('.') && !(tablemode#spreadsheet#GetLastRow(".") == line('.')) && !(tablemode#spreadsheet#GetLastRow(".") == 0) ? "\<Esc>:call tablemode#spreadsheet#cell#Motion('j')\<CR>:call tablemode#spreadsheet#MoveToStartOfCell()\<CR>" . mode() :
+      \ tablemode#table#IsTable('.') ? "<Esc>$a<CR>" :
       \ "\<Plug>(PearTreeExpand)"
+
+inoremap <silent><expr> <S-CR> tablemode#table#IsTable('.') ? "\<Esc>:call tablemode#spreadsheet#cell#Motion('k')\<CR>:call tablemode#spreadsheet#MoveToStartOfCell()\<CR>" . mode() : "\<S-CR>"
+
 inoremap <silent><expr> <Tab> coc#pum#visible() ? coc#pum#next(0) :
       \ coc#expandableOrJumpable() ? "\<C-g>u\<C-r>=coc#rpc#request('doKeymap', ['snippets-expand-jump',''])\<CR>" :
-      \ (pear_tree#GetSurroundingPair() != [] ? pear_tree#insert_mode#JumpOut() : (CheckBackSpace() ? "\<TAB>" :
-      \ coc#refresh()))
+      \ pear_tree#GetSurroundingPair() != [] ? pear_tree#insert_mode#JumpOut() : 
+      \ tablemode#table#IsTable('.') ? "\<Esc>:call tablemode#spreadsheet#cell#Motion('l')\<CR>" . mode() :
+      \ CheckBackSpace() ? "\<TAB>" : coc#refresh()
 
 function! CheckBackSpace() abort
   let col = col('.') - 1
@@ -25,34 +32,48 @@
 endfunction
 
 inoremap <silent><expr> <S-Tab> coc#pum#visible() ? coc#pum#prev(0) : 
-      \ coc#jumpable() ? "\<C-g>u<Esc>:call coc#snippet#prev()\<CR>" :
+      \ coc#jumpable() ? "\<Esc>:call coc#snippet#prev()\<CR>" :
+      \ tablemode#table#IsTable('.') ? "\<Esc>:call tablemode#spreadsheet#cell#Motion('h')\<CR>" . mode() :
       \ "\<S-Tab>"
 xnoremap <silent> <Tab> <Plug>(coc-snippets-select)
 
 nnoremap <silent><expr> <CR> coc#jumpable() ?
       \ ":call coc#snippet#next()\<CR>" :
+      \ tablemode#table#IsTable('.') ? "\<Esc>:call tablemode#spreadsheet#cell#Motion('j')\<CR>:call tablemode#spreadsheet#MoveToStartOfCell()\<CR>" :
       \ "\<CR>"
 
+nnoremap <silent><expr> <S-CR> tablemode#table#IsTable('.') ? "\<Esc>:call tablemode#spreadsheet#cell#Motion('k')\<CR>:call tablemode#spreadsheet#MoveToStartOfCell()\<CR>" : "\<S-CR>"
+
 nnoremap <silent><expr> <Tab> coc#jumpable() ?
       \ ":call coc#snippet#next()\<CR>" :
-      \ (pear_tree#GetSurroundingPair() != [] ? pear_tree#insert_mode#JumpOut() : "\<Tab>")
+      \ pear_tree#GetSurroundingPair() != [] ? pear_tree#insert_mode#JumpOut() :
+      \ tablemode#table#IsTable('.') ? "\<Esc>:call tablemode#spreadsheet#cell#Motion('l')\<CR>" :
+      \ "\<Tab>"
 
 nnoremap <silent><expr> <S-Tab> coc#jumpable() ?
       \ ":call coc#snippet#prev()\<CR>" :
+      \ tablemode#table#IsTable('.') ? "\<Esc>:call tablemode#spreadsheet#cell#Motion('h')\<CR>" :
       \ "\<S-Tab>"
 
 snoremap <silent><expr> <CR> coc#jumpable() ?
-      \ "\<C-g>u<Esc>:call coc#snippet#next()\<CR>" :
+      \ "\<Esc>:call coc#snippet#next()\<CR>" :
       \ "\<CR>"
 
 snoremap <silent><expr> <Tab> coc#jumpable() ?
-      \ "\<C-g>u<Esc>:call coc#snippet#next()\<CR>" :
+      \ "\<Esc>:call coc#snippet#next()\<CR>" :
       \ (pear_tree#GetSurroundingPair() != [] ? pear_tree#insert_mode#JumpOut() : "\<Tab>")
 
 snoremap <silent><expr> <S-Tab> coc#jumpable() ?
-      \ "\<C-g>u<Esc>:call coc#snippet#prev()\<CR>" :
+      \ "\<Esc>:call coc#snippet#prev()\<CR>" :
       \ "\<S-Tab>"
 
+noremap <C-CR> <CR>
+
+nnoremap <nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
+nnoremap <nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
+inoremap <nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<C-f>"
+inoremap <nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<C-b>"
+
 function! s:show_documentation()
 if (index(['vim','help'], &filetype) >= 0)
 execute 'h '.expand('<cword>')
diff --git a/modules/neovim/coc/snippets/markdown.snippets b/modules/neovim/coc/snippets/markdown.snippets
index b6e7af8..d637b88 100644
--- a/modules/neovim/coc/snippets/markdown.snippets
+++ b/modules/neovim/coc/snippets/markdown.snippets
@@ -73,6 +73,10 @@
 <!-- spell-checker:enable -->
 endsnippet
 
+snippet spellwords "Add extra words for spellchecking"
+<!-- spell-checker:words ${1} -->${0}
+endsnippet
+
 snippet normaldistribution "A normal distribution" i
 X\sim N(${1:mean}, ${2:variance})${0}
 endsnippet
@@ -84,3 +88,15 @@
 snippet sum "A sum" i
 \sum^{${1:n}}_{${2:r}=${3:1}}${4}${0}
 endsnippet
+
+snippet qed "quod erat demonstrandum - the thing we wanted to prove has been" w
+Q.E.D.
+endsnippet
+
+snippet forallinzplus "For all in the positive integers" i
+\forall ${1:n} \in \\${2:Z}^${3:+}${0}
+endsnippet
+
+snippet piby "By by something" i
+\frac{${1}\pi}{${2}}${0}
+endsnippet
diff --git a/modules/neovim/coc/theme.vim b/modules/neovim/coc/theme.vim
index a5f52f5..d7558f1 100644
--- a/modules/neovim/coc/theme.vim
+++ b/modules/neovim/coc/theme.vim
@@ -16,3 +16,7 @@
 call g:Highlight("DiagnosticVirtualTextHint", g:darkblue, g:transparent)
 call g:Highlight("DiagnosticVirtualTextWarn", g:darkyellow, g:transparent)
 call g:Highlight("DiagnosticVirtualTextError", g:darkred, g:transparent)
+
+call g:Highlight("CocCodeLens", g:lightgrey, g:transparent)
+call g:Highlight("CocPumVirtualText", g:lightgrey, g:transparent)
+call g:Highlight("CocInlayHint", g:darkpurple, g:transparent)