1.5. Vim

1.5.1. Basic Vim

  • Insert text mode I

  • Save a file :w

  • Leave any mode Esc

  • To resource vimrc, set this in .bashrc:

export MYVIMRC="/home/andrew/.vimrc"
  • To resource (with tab completion): :so $MYVIMRC

1.5.2. .vimrc

Start with a basic .vimrc file:

" GENERAL
set t_ut=                   " background color erase
set number                      " show line numbers
set textwidth=80            " line length
set colorcolumn=+1          " show colour colum at line length
set tabstop=4           " tabs that appear 4 spaces wide
set clipboard=unnamed   " auto yank to clipboard

" COLORS
" enable syntax highlighting:
    syntax on
" autodetect filetypes:
    filetype plugin indent on
" 256 colours in vim:
    set t_Co=256
" colorcoloum color is dark grey not red:
    highlight ColorColumn ctermbg=233 guibg=#808080

" NAVIGATION
" put cursor right to the bottom or top when scrolling:
    set scrolloff=0
" fast terminal update
    set ttyfast

1.5.2.1. xoria256

  • This file is located in ./vim/colors and is called by .vimrc

  • In my opinion the colours are quite good

  • This operates with (e.g.) all C++ files

" Vim color file
"
" Name:       xoria256.vim
" Version:    1.6
" Maintainer:       Dmitriy Y. Zotikov (xio) <xio@ungrund.org>
"
" Should work in recent 256 color terminals.  88-color terms like urxvt are
" NOT supported.
"
" Don't forget to install 'ncurses-term' and set TERM to xterm-256color or
" similar value.
"
" Color numbers (0-255) see:
" http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html
"
" For a specific filetype highlighting rules issue :syntax list when a file of
" that type is opened.
"
" TODO: link colours instead of setting values explicitly

" Initialization {{{
if &t_Co != 256 && ! has("gui_running")
  echoerr "Please use GUI or a 256-color terminal (which sets t_Co=256)."
  finish
endif

set background=dark

hi clear

if exists("syntax_on")
  syntax reset
endif

let colors_name = "xoria256"
"}}}
" Colours {{{1
"" General {{{2
hi Normal       ctermfg=252 guifg=#d0d0d0 ctermbg=234 guibg=#1c1c1c cterm=none gui=none
hi Cursor                                 ctermbg=214 guibg=#ffaf00
hi CursorColumn                           ctermbg=238 guibg=#444444
hi CursorLine                             ctermbg=237 guibg=#3a3a3a cterm=none gui=none
hi Error        ctermfg=15  guifg=#ffffff ctermbg=1   guibg=#800000
hi ErrorMsg     ctermfg=15  guifg=#ffffff ctermbg=1   guibg=#800000
hi FoldColumn   ctermfg=247 guifg=#9e9e9e ctermbg=233 guibg=#121212
hi Folded       ctermfg=255 guifg=#eeeeee ctermbg=60  guibg=#5f5f87
hi IncSearch    ctermfg=0   guifg=#000000 ctermbg=223 guibg=#ffdfaf cterm=none gui=none
hi LineNr       ctermfg=247 guifg=#9e9e9e ctermbg=233 guibg=#121212
hi MatchParen   ctermfg=188 guifg=#dfdfdf ctermbg=68  guibg=#5f87df cterm=bold gui=bold
" TODO
" hi MoreMsg
hi NonText      ctermfg=247 guifg=#9e9e9e ctermbg=233 guibg=#121212 cterm=bold gui=bold
hi Pmenu        ctermfg=0   guifg=#000000 ctermbg=250 guibg=#bcbcbc
hi PmenuSel     ctermfg=255 guifg=#eeeeee ctermbg=243 guibg=#767676
hi PmenuSbar                              ctermbg=252 guibg=#d0d0d0
hi PmenuThumb   ctermfg=243 guifg=#767676
hi Search       ctermfg=0   guifg=#000000 ctermbg=149 guibg=#afdf5f
hi SignColumn   ctermfg=248 guifg=#a8a8a8
hi SpecialKey   ctermfg=77  guifg=#5fdf5f
" hi SpellBad     ctermfg=160 guifg=fg      ctermbg=bg                cterm=underline               guisp=#df0000
hi SpellBad                               ctermbg=238                                               guisp=#df0000
hi SpellCap     ctermfg=189 guifg=#dfdfff ctermbg=bg  guibg=bg      cterm=underline gui=underline
hi SpellRare    ctermfg=168 guifg=#df5f87 ctermbg=bg  guibg=bg      cterm=underline gui=underline
hi SpellLocal   ctermfg=98  guifg=#875fdf ctermbg=bg  guibg=bg      cterm=underline gui=underline
hi StatusLine   ctermfg=15  guifg=#ffffff ctermbg=239 guibg=#4e4e4e cterm=bold gui=bold
hi StatusLineNC ctermfg=249 guifg=#b2b2b2 ctermbg=237 guibg=#3a3a3a cterm=none gui=none
hi TabLine      ctermfg=fg  guifg=fg      ctermbg=242 guibg=#666666 cterm=none gui=none
hi TabLineFill  ctermfg=fg  guifg=fg      ctermbg=237 guibg=#3a3a3a cterm=none gui=none
" FIXME
hi Title        ctermfg=225 guifg=#ffdfff
hi Todo         ctermfg=0   guifg=#000000 ctermbg=184 guibg=#dfdf00
hi Underlined   ctermfg=39  guifg=#00afff                           cterm=underline gui=underline
hi VertSplit    ctermfg=237 guifg=#3a3a3a ctermbg=237 guibg=#3a3a3a cterm=none gui=none
" hi VIsualNOS    ctermfg=24  guifg=#005f87 ctermbg=153 guibg=#afdfff cterm=none gui=none
" hi Visual       ctermfg=24  guifg=#005f87 ctermbg=153 guibg=#afdfff
hi Visual       ctermfg=255 guifg=#eeeeee ctermbg=96  guibg=#875f87
" hi Visual       ctermfg=255 guifg=#eeeeee ctermbg=24  guibg=#005f87
hi VisualNOS    ctermfg=255 guifg=#eeeeee ctermbg=60  guibg=#5f5f87
hi WildMenu     ctermfg=0   guifg=#000000 ctermbg=150 guibg=#afdf87 cterm=bold gui=bold

"" Syntax highlighting {{{2
hi Comment      ctermfg=244 guifg=#808080
hi Constant     ctermfg=229 guifg=#ffffaf
hi Identifier   ctermfg=182 guifg=#dfafdf                           cterm=none
hi Ignore       ctermfg=238 guifg=#444444
hi Number       ctermfg=180 guifg=#dfaf87
hi PreProc      ctermfg=150 guifg=#afdf87
hi Special      ctermfg=174 guifg=#df8787
hi Statement    ctermfg=110 guifg=#87afdf                           cterm=none gui=none
hi Type         ctermfg=146 guifg=#afafdf                           cterm=none gui=none

"" Special {{{2
""" .diff {{{3
hi diffAdded    ctermfg=150 guifg=#afdf87
hi diffRemoved  ctermfg=174 guifg=#df8787
""" vimdiff {{{3
hi diffAdd      ctermfg=bg  guifg=bg      ctermbg=151 guibg=#afdfaf
"hi diffDelete   ctermfg=bg  guifg=bg      ctermbg=186 guibg=#dfdf87 cterm=none gui=none
hi diffDelete   ctermfg=bg  guifg=bg      ctermbg=246 guibg=#949494 cterm=none gui=none
hi diffChange   ctermfg=bg  guifg=bg      ctermbg=181 guibg=#dfafaf
hi diffText     ctermfg=bg  guifg=bg      ctermbg=174 guibg=#df8787 cterm=none gui=none
""" HTML {{{3
" hi htmlTag      ctermfg=146  guifg=#afafdf
" hi htmlEndTag   ctermfg=146  guifg=#afafdf
hi htmlTag      ctermfg=244
hi htmlEndTag   ctermfg=244
hi htmlArg  ctermfg=182  guifg=#dfafdf
hi htmlValue        ctermfg=187  guifg=#dfdfaf
hi htmlTitle        ctermfg=254  ctermbg=95
" hi htmlArg        ctermfg=146
" hi htmlTagName    ctermfg=146
" hi htmlString     ctermfg=187
""" XML {{{3
hi link xmlTagName  Statement
" hi link xmlTag            Comment
" hi link xmlEndTag Statement
hi link xmlTag              xmlTagName
hi link xmlEndTag   xmlTag
hi link xmlAttrib   Identifier
""" django {{{3
hi djangoVarBlock ctermfg=180  guifg=#dfaf87
hi djangoTagBlock ctermfg=150  guifg=#afdf87
hi djangoStatement ctermfg=146  guifg=#afafdf
hi djangoFilter ctermfg=174  guifg=#df8787
""" python {{{3
hi pythonExceptions ctermfg=174
""" NERDTree {{{3
hi Directory      ctermfg=110  guifg=#87afdf
hi treeCWD        ctermfg=180  guifg=#dfaf87
hi treeClosable   ctermfg=174  guifg=#df8787
hi treeOpenable   ctermfg=150  guifg=#afdf87
hi treePart       ctermfg=244  guifg=#808080
hi treeDirSlash   ctermfg=244  guifg=#808080
hi treeLink       ctermfg=182  guifg=#dfafdf
""" rst #{{{3
hi link rstEmphasis Number

""" VimDebug {{{3
" FIXME
" you may want to set SignColumn highlight in your .vimrc
" :help sign
" :help SignColumn

" hi currentLine term=reverse cterm=reverse gui=reverse
" hi breakPoint  term=NONE    cterm=NONE    gui=NONE
" hi empty       term=NONE    cterm=NONE    gui=NONE

" sign define currentLine linehl=currentLine
" sign define breakPoint  linehl=breakPoint  text=>>
" sign define both        linehl=currentLine text=>>
" sign define empty       linehl=empty
""" vimHelp {{{3
hi link helpExample Number
hi link helpNumber String
hi helpURL ctermfg=110 guifg=#87afdf                           cterm=underline gui=underline
hi link helpHyperTextEntry helpURL

Update .vimrc

" COLORS
" use colors/xoria256:
    colorscheme xoria256

1.5.2.2. Pathogen

mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

Update .vimrc

" COLORS
execute pathogen#infect()

1.5.2.3. vimextensionopenfoam

The other color mapping I have is for OpenFOAM dictionaries, supplied by Tobias Holzmann:

https://bitbucket.org/shor-ty/vimextensionopenfoam/src/master/

1.5.2.4. Vundle

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

put this in .vimrc

" VUNDLE
    set nocompatible              " be iMproved, required
    filetype off                  " required

" set the runtime path to include Vundle and initialize
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()

" let Vundle manage Vundle, required
    Plugin 'VundleVim/Vundle.vim'

" All of your Plugins must be added before the following line
    call vundle#end()

Load vim, run plugin installer and quit the file it shows

vim
:PluginInstall
:q

1.5.2.5. YouCompleteMe

My version of VIM = 7.4.1689 (laptop)

VIM version on desktop = 8.0

For autocompletion when typing

https://github.com/Valloric/YouCompleteMe#linux-64-bit

cd ~/.vim/bundle
git clone https://github.com/Valloric/YouCompleteMe.git
sudo apt install build-essential cmake python3-dev
cd ~/.vim/bundle/YouCompleteMe
git submodule update --init --recursive
./install.py --clangd-completer

Add to .vimrc in Vundle section:

Plugin 'Valloric/YouCompleteMe'

Install vim like for Vundle:

vim
:PluginInstall
:q

It wont find the clang interpreter, because it doesnt know

sudo apt-get install build-essential cmake
sudo apt-get install python-dev python3-dev
cd ~/.vim/bundle/YouCompleteMe
./install.py --clangd-completer

Install vim like for Vundle:

vim
:PluginInstall
:q

Also add the location of the flag configuration (i’m not using this one):

let g:ycm_global_ycm_extra_conf = '/home/andrew/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py'

There is an OpenFOAM completion version:

import os
import ycm_core

foam_app = os.environ['FOAM_APP']
foam_src = os.environ['FOAM_SRC']

# These are the compilation flags that will be used in case there's no
# compilation database set (by default, one is not set).
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.

flags = [
    '-m64',
    '-Dlinux64',
    '-DWM_DP',
    '-Wall',
    '-Wextra',
    '-Wno-unused-parameter',
    '-Wold-style-cast',
    '-Wnon-virtual-dtor',
    '-DNoRepository',
    '-Wno-unused-result',
    '-ftemplate-depth-100',
    '-std=c++11',
    '-x',
    'c++',
    '-I' + foam_src + '/transportModels/',
    '-I' + foam_app + '/solvers/multiphase/twoPhaseEulerFoam/twoPhaseSystem/'\
    + 'lnInclude',
    '-I' + foam_src + '/transportModels/incompressible/lnInclude',
    '-I' + foam_src + '/finiteVolume/lnInclude',
    '-I' + foam_src + '/fvOptions/lnInclude',
    '-I' + foam_src + '/OpenFOAM/lnInclude',
    '-I./src/PBESystem/',
    '-I.',
    '-I' + foam_src + '/OSspecific/POSIX/lnInclude',
    '-I./build/ext/gtest/src/googletest/include/'
]

compilation_database_folder = ''

if compilation_database_folder:
    database = ycm_core.CompilationDatabase(compilation_database_folder)
else:
    database = None


def DirectoryOfThisScript():
    return os.path.dirname(os.path.abspath(__file__))


def MakeRelativePathsInFlagsAbsolute(flags, working_directory):
    if not working_directory:
        return list(flags)
    new_flags = []
    make_next_absolute = False
    path_flags = ['-isystem', '-I', '-iquote', '--sysroot=']
    for flag in flags:
        new_flag = flag

        if make_next_absolute:
            make_next_absolute = False
            if not flag.startswith('/'):
                new_flag = os.path.join(working_directory, flag)

        for path_flag in path_flags:
            if flag == path_flag:
                make_next_absolute = True
                break

            if flag.startswith(path_flag):
                path = flag[len(path_flag):]
                new_flag = path_flag + os.path.join(working_directory, path)
                break

        if new_flag:
            new_flags.append(new_flag)
    return new_flags


def FlagsForFile(filename):
  if database:
    # Bear in mind that compilation_info.compiler_flags_ does NOT return a
    # python list, but a "list-like" StringVec object
    compilation_info = database.GetCompilationInfoForFile( filename )
    final_flags = MakeRelativePathsInFlagsAbsolute(
      compilation_info.compiler_flags_,
      compilation_info.compiler_working_dir_ )

    # NOTE: This is just for YouCompleteMe; it's highly likely that your project
    # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
    # ycm_extra_conf IF YOU'RE NOT 100% YOU NEED IT.
    #try:
      #final_flags.remove( '-stdlib=libc++' )
    #except ValueError:
      #pass
  else:
    relative_to = DirectoryOfThisScript()
    final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )

  return {
    'flags': final_flags,
    'do_cache': True
  }

Add the Openfoam completion without diagnostics (because diagnostics doesnt really work):

" OpenFOAM completion (enabled) - without diagnostics, with one character for completion
let g:ycm_global_ycm_extra_conf = '/home/andrew/.vim/bundle/YouCompleteMe/openfoamConfig/.ycm_extra_conf.py'
let g:ycm_enable_diagnostic_signs = 0
let g:ycm_enable_diagnostic_highlighting = 0
let g:ycm_min_num_of_chars_for_completion = 1
  • Question: How to get rid of ID when it just recognises repeated words?

  • Question: This doesnt really recogonise the language as far as I can tell, it just looks up libraries and then is consistent. How to regognise the language? maybe ./install.sh --clang-completer --system-clang

  • Try this some other time:

http://www.alexeyshmalko.com/2014/youcompleteme-ultimate-autocomplete-plugin-for-vim/

cd ~/.vim/bundle
git clone https://github.com/Valloric/YouCompleteMe.git
cd YouCompleteMe
git submodule update --init --recursive
./install.sh --clang-completer --system-clang

1.5.2.6. Riv

This is used for restructred text (DONT USE IT).

" RST
    Plugin 'Rykka/riv.vim'

For example, this command will create a quick html page:

:Riv2HtmlAndBrowse

I couldn’t get RST server to work (Plugin ‘Rykka/InstantRst’)

1.5.2.7. NERDTree

git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle/nerdtree

NERDTree commands:

  • :NERDTree - starts a new nerd tree window

  • :NERDTreeClose - closes NerdTree

From within NERDTree:

  • o - opens a file or directory

  • go - opens file but keeps you in NERDTree

  • x - closes a directory

  • C - change root to current directory

  • ? - Toggle help

Split screen:

  • Ctrl+ww cycle though all windows

  • Ctrl+wh takes you left a window

  • Ctrl+wj takes you down a window

  • Ctrl+wk takes you up a window

  • Ctrl+wl takes you right a window

  • i - open file with split horizontal pane

  • s - open file with split vertical pane

1.5.2.8. AutoSave

” Autosave

Plugin ‘907th/vim-auto-save’

let g:auto_save = 1 ” enable AutoSave on Vim startup

1.5.2.9. Silver Searcher

apt-get install silversearcher-ag

1.5.2.10. Python docstring colours

Create a file:

~/.vim/after/syntax/python.vim

Add this to file:

syn region Comment start=/"""/ end=/"""/

1.5.2.11. VIM Obsession

To enable saving of sessions within .tmux.conf (VIM 8.0 and NERDTree do not mix)

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-obsession.git
vim -u NONE -c "helptags vim-obsession/doc" -c q

1.5.2.12. VIM Sessions

To enable saving of sessions

1.5.2.13. VIM Environment

Top is VIM:

  • Top left: NERDTree

  • Top middle: OpenFOAM code

  • Top right: RST code

Bottom is TMUX:

  • Bottom left: python -m http.server

  • Bottom middle: OpenFOAM Run Directory setBubble -noOverwrite

  • Bottom right, top: Compilation of OpenFOAM unicode wclean, wmake

  • Bottom right, bottom: Compilation of RST code make html

../_images/VIM.png

How to start TMUX session

  • Start a Terminal Window (maximise window)

  • tmux

  • To restore tmux session ctrl+a, ctrl+r

  • To save a tmux session ctrl+a, ctrl+s

  • To kill tmux server ctrl+a, :kill-server

  • Move left alt+h

  • Move down alt+j

  • Move up alt+k

  • Move right alt+l

  • Open split vertically alt+v

  • Open split horizontally alt+b

  • Close split alt+c

How to use VIM

  • (Save session) :SaveSession session saved to ~/Session.vim

  • Move left ctrl+h

  • Move down ctrl+j

  • Move up ctrl+k

  • Move right ctrl+l

  • Close file :q

  • To intent text: v, highlight text, >

NERDTree

  • Bookmark folder :Bookmark (Highlight the folder in NERDTree)

  • (Open file o will overrite any previous open file, opens to the left of open files)

  • Open file over current file select window and left click on file

  • (Horizontal split s opens to the left of open files)

  • (Vertical split i opens to the left and to the bottom on open files)

  • Remove bookmark cursor over bookmark, D, deletes bookmark

  • Make directory current C

To reach a bookmark: cursor over bookmark and return to enter, or maybe second time, double click bookmark

Startup process (without saved sessions)

$ tmux
ctrl + a ctrl + r
vim (will also start NERDTree)

Shutdown process

ctrl + a : kill-server

Can save locations using TMUX (makesure VIM is closed)

ctrl + a ctrl + s