Daniel Siepmann - Coding is Art

Blog Post

Unix Setup: neovim

Published: , Updated:

Topics: video, vim

Introduction

I'll explain my current setup of neovim. I'm using this editor since some years as the only editor. I'm a full time developer, mostly working on PHP based websites using the open source CMS TYPO3. Therefore my neovim is tuned to ease work in that specific area. I've also worked with ReStructuredText (=rst), Python and TypeScript. Most parts should be re usable for other areas, some are very specific to TYPO3 but might give insights and ideas on how to improve workflows for other projects.

The post will explain my folder directory and setup, as well as plugins and foreign tools that are integrated into neovim.

vi vs vim vs neovim

I'm not going to much into detail here. I'm using neovim because when I switched it was a bit ahead regarding asynchronous processing. I would still recommend neovim if you plan to write your own plugins, as neovim allows you to easily write them using foreign languages like Python. If you are interested in writing custom plugins, check out https://github.com/neovim/neovim/wiki/Related-projects#api-clients.

I would not recommend to use vi but vim or neovim. Which one is up to you, but of course everyone should choose the right tool. So it doesn't matter to much whether you are using any kind of vim or use emacs, Sublime Text, Atom, Visual Studio Code or an IDE like NetBeans, Eclipse, etc.

I'm using neovim in terminal 100%. But there are other nice UIs for vim and neovim, if you are more into using a GUI. In case you prefer GUIs and neovim, check out https://github.com/neovim/neovim/wiki/Related-projects#gui.

Configuration

I've structured my configuration into multiple files and folders. You can find out more about the structure at the older blog post "Folder specific settings in Vim" at section "Current structure of Vim configuration".

That might not be a good starting point. But once the configuration is growing, it might help to keep an overview.

Plugins

Probably the most interesting part for most readers, but in the end I find those lists more or less useless. You can find plugins on GitHub and via https://vimawesome.com/. I find it unlikely that you find good plugins by reading other peoples blogs or configurations. You either need a plugin for a use case and search for it, or watch videos and find an interesting solution solved by plugins.

Still here it comes, reduced to the most important:

Disclaimer:
I'm not really updating my plugins until there is something missing or a bug. I keep the environment as it is, as long as it serves me well.

Colorscheme

Not much to say, everyone has his own preferences. I'm using my own custom theme. That one uses the same color as my website, my terminal, my desktop environment, etc.

Vim already has some colorschemes. But one can also easily add further. Some are available here:

autocommands

I'm making heavy use of autocommands in certain areas. They are explained here https://neovim.io/doc/user/autocmd.html and here https://learnvimscriptthehardway.stevelosh.com/chapters/12.html.

A concrete example is my daily work with TYPO3 (an open source content management system). Such systems have many different caches in use to speed up the system. Those caches need to be cleared during development. When all caches are moved to file system, that is easily done:

augroup typo3
    autocmd!
    " Clear some caches depending on files saved.
    " Only works if cwd is document root

    autocmd BufWritePost **/Configuration/Backend/Routes.php :silent !rm **/var/cache/code/cache_core/BackendRoutesFromPackages_*
augroup END

The same can be used to restart web server on configuration changes.

key mappings

One of the great powers of vim are the key mappings. They are short and most of the time easy to remember. Thanks to different modes, there are very few mappings that require keys like CTRL, SHIFT or ALT.

Users can define their own mappings or adjust existing mappings. In order to not accidentally replace existing mappings, one can prefix mappings with so called leader.

More information about leader is available at:

The following is a short list of my own mappings, which I've set up to access some often used features of plugins:

let mapleader = ","

nnoremap H ^
nnoremap L $

" Toggle paste mode
nnoremap v :set paste!
" Stop highlighting of search results.
nnoremap nh :nohlsearch

nnoremap p :CtrlP
nnoremap l :CtrlPBuffer
nnoremap r :CtrlPBufTag

nnoremap k :NERDTreeToggle
nnoremap f :NERDTreeFind
nnoremap b :TagbarToggle
nnoremap u :UndotreeToggle

nnoremap a :PhpactorContextMenu
nnoremap au :PhpactorImportClass

nnoremap  tn :TestNearest
nnoremap  tl :TestLast
nnoremap  tf :TestFile

nnoremap so :call SortParagraph()
nnoremap  gtt :call OpenPHPUnitTestFilename()

Custom Functions

I've added some small functions to my own vim which you might find useful.

" Copy the current relative file path to clipboard
function! CopyRelativeFilePath()
    execute ':let @+ = expand("%")'
endfunction
" Copy the current full file path to clipboard
function! CopyFullFilePath()
    execute ':let @+ = expand("%:p")'
endfunction
" Remove trailing whitespace
function! StripTrailingWhitespace()
    execute ':%s/\s\+$//e'
endfunction

External tools (ctags)

Neither vi, nor vim or neovim follows the "all in one" approach. Instead they follow the "do one thing well". They therefore don't include some important parts themselves, but support them by 3rd party tools.

One prominent example are "tags". All three support the tags file format for navigating code. This feature nowadays is known as "Goto Definition". An editor therefore needs to know where something is defined. The editors provide that feature out of the box, but don't provide the indexing. Instead tool like ctags are used.

ctags is definitely a must have, as long as no plugin and LSP (=Language Server Protocol) is integrated. This allows navigating via the editor itself. Also mentioned plugins like tagbar and ctrlp will use this tool. So even when using LSP, you still might wanna use ctags.

Video

Video v30: Unix Setup: neovim
Size: 134.26 MB
YouTube: 9hdiv8YBhy4

I'll explain my current setup of neovim.