vim 8
17 Feb 2017 (Updated 31 May 2017)
I decided to custom-compile vim 8 so that I could reduce my plugins down to just one: vim-go. Vim no longer needs a plugin manager!
Of course, I went down a rabbit hole (as often happens when upgrading to a major new version of one's favourite text editor) and decided to focus on getting better at buffer management in vim. I decided I wanted to get better at switching between buffers, which resulted in me writing a few functions for my .vimrc.
After experimenting with :Explore, I decided that the shell
is still the best way to navigate the filesystem, and that what I really needed
was a way to just "throw" files into an already-running vim, from the command line.
I needed to get vim's client/server mode working.
Here's what client/server mode vim looks like in action. Launch vim with this argument:
vim --servername VIM
Then, from another terminal, find some files you want to open, and throw them into buffers in vim, like so:
vim --remote a_file_i_want_to_edit.txt another_file.txt
Here's how I downloaded and compiled vim 8 for my system so that it would work with client/server mode.
First, I had to be sure I had all the right dev tools installed. Running this apt-get command will pull in lots of other dependencies; just say yes to them all.
# sudo apt-get install git libncurses5-dev \
    libgtk-3-dev \
    libx11-dev libxpm-dev libxt-dev
Then, run as root:
# cd /usr/local/src
# git clone https://github.com/vim/vim.git
# cd vim
# ./configure --prefix=/usr/local/vim8 \
            --with-features=huge \
            --enable-gui=gtk3 \
            --enable-multibyte
# make
# make install
It turns out that compiling in X11/gtk3 support enables the client/server features to work, even when running plain vim from a terminal.
NOTE that if you do as I did above, you will want /usr/local/vim8/bin in your PATH.
You may not need to do this step, but I had my old vim 7 plugin dir structure, so I cleaned that up. (Run as non-root user):
$ rm -rf ~/.vim/autoload $ rm -rf ~/.vim/plugged $ mkdir -p ~/.vim/pack/plugins/start $ git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go
I ended up with the following tree structor for my vim config:
$ tree -L 4 ~/.vim
/home/mwood/.vim
├── colors
│   └── manni.vim
└── pack
    └── plugins
        └── start
            └── vim-go
My vim colors file looks like this, and is optimized for the light grey backgrounds I like:
set background=light let colors_name = "manni" hi TabLine NONE hi link TabLine TabLinefill hi Normal cterm=none ctermbg=White ctermfg=Black hi Error cterm=none ctermbg=Red ctermfg=Black hi StatusLine cterm=none ctermfg=White ctermbg=Black hi StatusLineNC cterm=none ctermfg=Grey ctermbg=Black hi LineNr cterm=none ctermfg=Black ctermbg=LightGrey hi diffFile cterm=bold hi diffLine ctermfg=DarkCyan hi diffAdded ctermfg=DarkGreen hi diffRemoved ctermfg=DarkRed hi Normal term=none cterm=none ctermfg=0 ctermbg=255 hi Comment term=bold cterm=italic ctermfg=244 hi Constant term=underline cterm=none ctermfg=124 hi Label term=underline cterm=none ctermfg=124 hi Special term=bold cterm=none ctermfg=0 hi Identifier term=underline cterm=none ctermfg=0 hi Statement term=bold cterm=none ctermfg=22 hi PreProc term=underline cterm=none ctermfg=94 hi Type term=underline cterm=none ctermfg=89 hi Number term=bold cterm=none ctermfg=124 hi Visual term=bold cterm=none ctermbg=251 hi Search term=bold cterm=none ctermbg=224 hi CursorLine term=none cterm=none ctermbg=253 hi Title term=none cterm=none ctermfg=4 hi Function term=none cterm=none ctermfg=18 hi NonText term=none cterm=none ctermfg=250 hi SpecialKey term=none cterm=none ctermfg=250
And my latest vimrc, with a spiffy :Buf buffer
switching command:
" enable vim features instead of strict vi compatibility
set nocompatible
" do not wrap long lines; have them scroll off the side
set nowrap
" try to detect the filetype
filetype on
" enable syntax highlighting
syntax on
" enable loading the plugin file for specific file types
filetype plugin on
" enable loading the indent file for specific file types
filetype indent on
" tell vim it's OK to use 256 colors at the terminal
set t_Co=256
" show matching brackets and parens
set showmatch
" sync syntax highlighting in a 5000-line window
" syntax sync minlines=5000
" sync syntax highlighting from the start of the file
syntax sync fromstart
" do not make backup~ files
set nobackup
" do not make backup~ files
set nowritebackup
" set character encoding to UTF-8
set encoding=utf-8
" show 3 lines above or below cursor when scrolling
set scrolloff=3
" show insert, replace, or visual mode in last line
set showmode
" show command in last line
set showcmd
" flash screen on bell
set visualbell
" assumes fast connection
set ttyfast
" show line and column number
set ruler
" every window gets a status line
set laststatus=2
" show spaces and tabs; to turn off for copying, use `:set nolist`
set list
set listchars=tab:→\ ,space:·,trail:·,nbsp:·
" switch off search pattern highlighting
set nohlsearch
" make command line one line high
set ch=1
" turn off mouse pointer when typing begins
set mousehide
" put mouse in command-line mode, so mouse clicks don't move cursor
set mouse=c
" set manni color scheme
colorscheme manni
" set leader to comma
let mapleader = ","
" local leader to backslash. (local leader is used for only specific file
" types)
let maplocalleader = "\\"
" Status Line
" ------------
" %< means truncate on the left if too long
" %F is full path to the file we are editing
set statusline=%<%F
" %m shows [+] if the file is modified but not saved
set statusline+=%m
" %r shows [RO] if a file is read-only
set statusline+=%r
" %h shows [Help] if we are in a help buffer
set statusline+=%h
" %w shows [Preview] if we are in a preview window
set statusline+=%w
" separation point between the left and right items
set statusline+=%=
" prints the fileformat; that is, the kind of newline (one of unix, dos or mac)
" (If you type `:set fileformat?`, vim will tell you the current file format)
set statusline+=%{&fileformat}
" a literal forward slash
set statusline+=/
" %Y shows the filetype, such as VIM or HTML or GO
set statusline+=%Y
" %l shows the line number, and %8l uses 8 left-padded spaces to do so
set statusline+=%8l
" a literal comma
set statusline+=,
" %v shows the virtual column number;
" instead of counting a tab as one char, it counts it as the number
" of spaces it uses in the display
" %-8v leaves 8 spaces to the right to do so
set statusline+=%-8v
" disable recording macros: I hit this key accidentally too often
nnoremap q 
" Window Manipulation
" -------------------
" Note to self:
" :resize will resize a horizontal split, *and* you can give it
" relative lines, like :resize +5 or :resize -5
" :vertical resize can be used for vertical splits.
" remap window switching to leader then navigation letter
nnoremap j 
nnoremap k 
nnoremap l 
nnoremap h 
" remap window equal resizing to leader equals
nnoremap = 
" when opening horizontal splits, place cursor in new split
set splitbelow
" when opening vertical splits, place cursor in new split
set splitright
function DestroyButKeepWindow()
  " get the number of the buffer we will close
  let l:current_bufnum = bufnr('%')
  " open a new empty buffer in this window
  enew
  " destroy the original buffer
  execute "bdelete " . l:current_bufnum
endfunction
" Make :Bd call the window closer
command Bd call DestroyButKeepWindow()
" Explore
" -------
" Note to self:
" :Explore brings up explorer
" :Sexplore brings up explorer in a horizontal split
" :Vexplore brings up explorer in a vertical split
" Remove explorer banner
let g:netrw_banner = 0
" Ruby
" ----
augroup filetype_ruby
  autocmd!
  autocmd FileType ruby setlocal shiftwidth=2
  autocmd FileType ruby setlocal softtabstop=2
  autocmd FileType ruby setlocal expandtab
augroup END
" Golang
" ------
augroup filetype_golang
  autocmd!
  autocmd FileType go setlocal shiftwidth=2
  autocmd FileType go setlocal tabstop=2
  autocmd FileType go setlocal softtabstop=0
  autocmd FileType go setlocal noexpandtab
  "autocmd FileType go nmap d (go-def-vertical)
  "autocmd FileType go nmap D (go-doc-vertical)
  "autocmd FileType go nmap b (go-doc-browser)
  "autocmd FileType go nmap i (go-implements)
  "autocmd FileType go nmap n (go-info)
  "autocmd FileType go nmap r (go-rename)
augroup END
let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_structs = 1
let g:go_highlight_operators = 1
let g:go_highlight_build_constraints = 1
let g:go_fmt_command = "goimports"