Tovi Jaeschke


My Neovim Configuration

I love vim. I think its a brilliant editor, that makes editing code (and plain text) much more fluid than any other editor (and you don't need 10 fingers on each hand, looking at you Emacs!).

For this post, I'm going to share my vimrc, or more accurately my init.vim, and break down why I have it setup in the way that I do.

TLDR: My dotfiles can be found here

Setup and Plugins

let mapleader =","

if ! filereadable(expand('~/.config/nvim/autoload/plug.vim'))
	echo "Downloading junegunn/vim-plug to manage plugins..."
	silent !mkdir -p ~/.config/nvim/autoload/
	silent !curl "" > ~/.config/nvim/autoload/plug.vim
	autocmd VimEnter * PlugInstall

call plug#begin('~/.config/nvim/plugged')

  Plug 'neoclide/coc.nvim', {'branch': 'release'}

  Plug 'nvim-lua/popup.nvim'
  Plug 'nvim-lua/plenary.nvim'
  Plug 'nvim-telescope/telescope.nvim'
  Plug 'nvim-telescope/telescope-fzy-native.nvim'

  Plug 'ap/vim-css-color'

  Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
  Plug 'darrikonn/vim-gofmt', { 'do': ':GoUpdateBinaries' }

call plug#end()


The first section is just setting my mapleader to the key that I like. I see the space key getting used quite a bit by other people, which I don't particularly like because it feels like vim is a bit sluggish when typing, so I prefer the "," key. Next I'm just making sure that "plug" is up to date.

I generally find people using a lot of plugins, and I don't really think thats necessary. I find a good auto-completer, navigation helper, and some stuff to format the languages you work in often to be sufficient.

Sane defaults

" Some basics:
  set go=a
  set mouse=a
  set nohlsearch
  set clipboard+=unnamedplus
  set incsearch
  set ignorecase
  set smartcase
  set linebreak

  set noswapfile
  set nobackup
  set undodir=~/.config/nvim/undodir
  set undofile

	nnoremap c "_c
	set nocompatible
	filetype plugin on
	syntax on
	set encoding=utf-8
	set number relativenumber

" Tab 2 spaces
	filetype plugin indent on
  set tabstop=2 softtabstop=2 expandtab shiftwidth=2 smarttab

" Disables automatic commenting on newline:
	autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o

" Remember last cursor position
	autocmd BufReadPost * if @% !~# '\.git[\/\\]COMMIT_EDITMSG$' && line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif


These are fairly self explanatory. The most notable of the above is probably the set clipboard+=unnamedplus, which sets the default register to the system clipboard, and set nohlsearch, which turns off the highlighting when you search for something.


" coc
  inoremap <silent><expr> <TAB>
        \ pumvisible() ? "\<C-n>" :
        \ <SID>check_back_space() ? "\" :
        \ coc#refresh()
  inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

  function! s:check_back_space() abort
    let col = col('.') - 1
    return !col || getline('.')[col - 1]  =~# '\s'

  nmap <leader>gd <Plug>(coc-definition)
  nmap <leader>gr <Plug>(coc-references)
  nmap <leader>rr <Plug>(coc-rename)
  nnoremap <leader>prw :CocSearch <C-R>=expand("<cword>")<CR><CR>

  inoremap <expr> <C-j> pumvisible() ? "\<Down>" : "\<C-j>"
  inoremap <expr> <C-k> pumvisible() ? "\<Up>" : "\<C-k>"

This lets me tab through auto completion results, or use Ctrl-j and k to move up and down. It also binds keys to the most useful coc commands, such as jumping to definitions and references, and renaming something.


" Telescope remaps
  lua require("telescope")

  nnoremap <leader>gs :lua require('telescope.builtin').grep_string({ search = vim.fn.input("Grep For > ")})<CR>
  nnoremap <C-q> :lua require('telescope.builtin').git_files()<CR>
  nnoremap <C-a> :lua require('telescope.builtin').find_files()<CR>

  nnoremap <leader>fb <cmd>lua require('telescope.builtin').buffers()<cr>

Telescope is excellent for quickly navigating around a codebase. As you can see, I've bound keys to grep for strings, search for files, and reopen buffers easily. The lua require("telescope") initialises telescope with the setup function, with some keybindings for navigating the modal.


" Shortcutting split navigation, saving a keypress:
	nnoremap <C-h> <C-w>h
	nnoremap <C-j> <C-w>j
	nnoremap <C-k> <C-w>k
	nnoremap <C-l> <C-w>l

" Replace all is aliased to S.
	nnoremap <c-s> :%s//g<Left><Left>

" For chrome extension development
  nnoremap <c-h> :set syntax=

" Navigating with guides
	inoremap <leader><leader> <Esc>/<++><Enter>"_c4l
	vnoremap <leader><leader> <Esc>/<++><Enter>"_c4l
	map <leader><leader> <Esc>/<++><Enter>"_c4l

" Copy entire document
  noremap <leader>y <Esc>ggyG<C-o>
  map <leader>y <Esc>ggyG<C-o>

" Set gohtml template files to html syntax
  autocmd BufNewFile,BufRead *.gohtml set syntax=html

Here, I just map some of my most used commands to some quick key presses.