From adaa3d36537463dfac74a2292f2b9112c8ffbd61 Mon Sep 17 00:00:00 2001
From: Jens Nolte <jens@nightmarestudio.de>
Date: Tue, 16 Jun 2020 22:34:41 +0200
Subject: [PATCH] neovim: Improve LanguageClient keybindings

---
 pkgs/neovim/default.nix | 57 +++++++++++++++++++++++------------------
 1 file changed, 32 insertions(+), 25 deletions(-)

diff --git a/pkgs/neovim/default.nix b/pkgs/neovim/default.nix
index 9fe8260..171ce1d 100644
--- a/pkgs/neovim/default.nix
+++ b/pkgs/neovim/default.nix
@@ -3,10 +3,8 @@
 pkgs.neovim.override {
   configure = {
     customRC = ''
-      " Map ' ' to trigger the leader key ('\').
-      " When using map instead of using `let mapleader = "<Space>"` there is no delay until the cursor moves visibly and the command in the command bar ('showcmd') reads '\' instead of '<20>'.
-      map <Space> \
-      "let mapleader = " "
+      " Configure ' ' as the leader key (would be '\' by default).
+      let mapleader = " "
 
       inoremap fd <Esc>
       vnoremap fd <Esc>
@@ -21,6 +19,7 @@ pkgs.neovim.override {
 
       " Enable line numbers
       set number
+      set relativenumber
 
       " Highlight active line (this works well with gruvbox)
       set cursorline
@@ -54,9 +53,9 @@ pkgs.neovim.override {
       set wildmode=longest:full,full
 
       " Save with Ctrl-S (if file has changed)
-      noremap <C-s> <Cmd>update<CR>
+      nnoremap <C-s> <Cmd>update<CR>
 
-      noremap <C-p> <Cmd>Files<CR>
+      nnoremap <C-p> <Cmd>Files<CR>
 
       " Use `ALT+{h,j,k,l}` to navigate windows from any mode
       tnoremap <A-h> <C-\><C-N><C-w>h
@@ -72,10 +71,6 @@ pkgs.neovim.override {
       nnoremap <A-k> <C-w>k
       nnoremap <A-l> <C-w>l
 
-      " Always show the sign column (to prevent jumps when loading git- or the language client)
-      " Disabled because it also adds a sign column to NERDTree
-      "set signcolumn=yes
-
       " NERDTree
       " Show hidden files by default
       let g:NERDTreeShowHidden = 1
@@ -102,21 +97,33 @@ pkgs.neovim.override {
 
       let g:LanguageClient_useVirtualText = "No"
 
-      let g:LanguageClient_serverCommands = { 'haskell': ['hie-wrapper', '--lsp'] }
-
-      function LC_maps()
-        if has_key(g:LanguageClient_serverCommands, &filetype)
-          nnoremap <buffer> <silent> K <Cmd>call LanguageClient#textDocument_hover()<CR>
-          nnoremap <buffer> <silent> gd <Cmd>call LanguageClient#textDocument_definition()<CR>
-          nnoremap <buffer> <silent> <F2> <Cmd>call LanguageClient#textDocument_rename()<CR>
-        endif
-      endfunction
-
-      nnoremap <silent> <Leader>lh <Cmd>call LanguageClient#textDocument_hover()<CR>
-      nnoremap <silent> <Leader>le <Cmd>call LanguageClient#explainErrorAtPoint()<CR>
-      nnoremap <silent> <Leader>lr <Cmd>LanguageClientStop<CR><Cmd>LanguageClientStart<CR>
-
-      autocmd FileType * call LC_maps()
+      let g:LanguageClient_serverCommands = {
+      \   'haskell': ['hie-wrapper', '--lsp'],
+      \   'cpp': ['clangd', '--background-index',]
+      \ }
+
+      function SetupLanguageClient()
+        " Always show the sign column (to prevent jumps when loading git- or the language client)
+        set signcolumn=yes
+
+        nnoremap <Leader>la <Cmd>call LanguageClient_workspace_applyEdit()<CR>
+        nnoremap <Leader>lc <Cmd>call LanguageClient#textDocument_definition()<CR>
+        nnoremap <Leader>ld <Cmd>call LanguageClient#textDocument_definition()<CR>
+        nnoremap <Leader>le <Cmd>call LanguageClient#explainErrorAtPoint()<CR>
+        nnoremap <Leader>lf <Cmd>call LanguageClient#textDocument_formatting()<CR>
+        nnoremap <Leader>lh <Cmd>call LanguageClient#textDocument_hover()<CR>
+        nnoremap <Leader>lm <Cmd>call LanguageClient_contextMenu()<CR>
+        nnoremap <Leader>lr <Cmd>call LanguageClient#textDocument_rename()<CR>
+        nnoremap <Leader>ls <Cmd>call LanguageClient_textDocument_documentSymbol()<CR>
+        nnoremap <Leader>lt <Cmd>call LanguageClient#textDocument_typeDefinition()<CR>
+        nnoremap <Leader>lx <Cmd>call LanguageClient#textDocument_references()<CR>
+        nnoremap <Leader>lq <Cmd>LanguageClientStop<CR><Cmd>LanguageClientStart<CR>
+      endfunction()
+
+      augroup LSP
+        autocmd!
+        autocmd FileType c,h,cpp,hpp,hs call SetupLanguageClient()
+      augroup END
 
 
       " Use deoplete for autocompletion.
-- 
GitLab