Clean vimrc with plugin files
If you start to work in Vim, you start to edit your .vimrc file. Or, in the case of a Neovim user you might be editing your init.vim file. Either way it can quickly grow unwieldy. By unwieldy, I mean a bunch of lines of Vim script that don't necessarily connect contextually with the lines around them. If this doesn't bother you, you can stop reading now. Come back to this article when it does.
An Example
I just started using Neovim on my computer and I've been configuring it the way I want it. It hasn't grown very large, so it is still a good example for a blog post.
filetype plugin indent on
syntax on
color industry
set nu
set encoding=utf-8 "need for YCM
set splitright
set tabstop=2 shiftwidth=2 expandtab
set statusline=2
let mapleader = ","
" Window navigation with Alt
inoremap <A-h> <C-\><C-N><C-w>h
inoremap <A-j> <C-\><C-N><C-w>j
inoremap <A-k> <C-\><C-N><C-w>k
inoremap <A-l> <C-\><C-N><C-w>l
nnoremap <A-h> <C-w>h
nnoremap <A-j> <C-w>j
nnoremap <A-k> <C-w>k
nnoremap <A-l> <C-w>l
" Terminal Mode mappings
tnoremap <F12> <C-\><C-n>
tnoremap <A-h> <C-\><C-N><C-w>h
tnoremap <A-j> <C-\><C-N><C-w>j
tnoremap <A-k> <C-\><C-N><C-w>k
tnoremap <A-l> <C-\><C-N><C-w>l
tnoremap <expr> <C-R> '<C-\><C-N>"'.nr2char(getchar()).'pi'
let g:python_host_prog='C:\Python27\python'
let g:python3_host_prog='C:\Python37\python'
noremap <leader>emu :!START /MIN E:\AppData\AndroidSDK\emulator\emulator -avd Pixel_2_API_27<cr>
function! Writing()
setlocal nonumber " no linenumbers
setlocal guioptions-=r
setlocal guioptions-=L
setlocal wrap
setlocal linebreak
setlocal display+=lastline
setlocal spell
" Work with wrapped lines
nnoremap <buffer> j gj
nnoremap <buffer> k gk
nnoremap <buffer> 0 g0
nnoremap <buffer> $ g$
endfunction
let wiki_1 = {}
let wiki_1.ext = ".md"
let wiki_1.syntax = "markdown"
let g:vimwiki_list = [wiki_1]
" Move this to the appropriate ftplugin
augroup RunWritingProgramForWritingFiles
autocmd!
autocmd BufNewFile,BufRead {*.txt,*.markdown} call Writing()
augroup END
What's in there right now?
- Basic Vim configurations to make my workspace feel the way I like
- A commented section that deals with window navigation
- A few lines related to development. Only 1 I'm sure I need
- A function called Writing
- Configuration for the vimwiki plug-in
- An auto command block that uses the Writing function
- And notice it has a comment about ftplugin
So how should we approach cleanup of this file? You could start by moving the Writing function and the auto command block next to each other. That might be enough for a file this small, but let's go further.
We have 3 (probably 4) sections that could be pulled out into their own files
- Window Navigation: move to winnav.vim
- Writing: move to writing.vim
- Include the auto command block
- Wiki configuration: move to wiki_setup.vim
If you've moved the sections then restarted your (Neo)Vim session you've suddenly lost your configurations. What to do? What to do?
(Don't) Use the source Luke
You could add source lines to your .vimrc file so it looks like this
filetype plugin indent on
syntax on
color industry
set nu
set encoding=utf-8 "need for YCM
set splitright
set tabstop=2 shiftwidth=2 expandtab
set statusline=2
let mapleader = ","
let g:python_host_prog='C:\Python27\python'
let g:python3_host_prog='C:\Python37\python'
noremap <leader>emu :!START /MIN E:\AppData\AndroidSDK\emulator\emulator -avd Pixel_2_API_27<cr>
source winnav.vim
source writing.vim
source wiki_setup.vim
That would be fine. It does have the benefit of giving you easy breadcrumbs to follow. We could do that. Fun tip, you could change source to runtime if you want. However, it still seems a little messy and it isn't the point of this article anyway ;)
Plug it in, plug it in
There are lots of special folder names in Vim configurations. I hope to get to others in future articles. For now, let us discuss the plugin folder. More information can be found from :help standard-plugin, but basically this folder is where you put stuff you want automatically loaded on startup. These are the simplest plug-ins and that is what we are doing. Creating simple plug-ins.
A possible downside you might see to this (other than the afore mentioned lack of breadcrumbs) is turning it off if you don't want it. This is actually easier now. Before, these multi-line sections would require a surrounding if block or commenting out of each line. You can still comment out out each line as you'd like but you could also just put the command finish at the top of the file. This also makes it easy to wrap control commands to stop it from getting loaded in certain situations.
Conclusion
There are lots of ways to organize your files and you need to find what works for you. If you like putting files in the smallest contextual units, this is a pretty good way to do so without cluttering up your configurations.
This is what our .vimrc file looks like now.
filetype plugin indent on
syntax on
color industry
set nu
set encoding=utf-8 "need for YCM
set splitright
set tabstop=2 shiftwidth=2 expandtab
set statusline=2
let mapleader = ","
let g:python_host_prog='C:\Python27\python'
let g:python3_host_prog='C:\Python37\python'
noremap <leader>emu :!START /MIN E:\AppData\AndroidSDK\emulator\emulator -avd Pixel_2_API_27<cr>
We could probably move those last 3 lines out too.
We didn't get into a full plug-in with more idiosyncrasies. Hopefully this gets you part of the way there if you are interested.