---
date: 2014-09-13
title: My Pythony Puppet Ruby vim IDE
category:   devops
featured_image: https://i.imgur.com/0k24Ambl.png
---

Despite my penchant for tools written in Ruby (Puppet, Gitlab,
Jekyll/Octopress etc) I do not actually like Ruby. I am more of a Python
guy. I also like Vim, so whenever I use a GUI IDE I end up with
something littered with `:w` and `ZZ`.

Despite my pythonic leanings, I also need something that can handle Ruby
and Puppet's DSL. To which end, this is a bit of a mixture.
Fortunately, nothing in either world really contradicts the other, so it
works pretty nicely.

First, the basic environments. Git is needed everywhere, plus I need to
isolate the environments of the various projects.

    sudo apt install git python python-dev python-virtualenv \
        virtualenvwrapper curl libxml2-dev libxslt-dev zlib1g-dev ruby-dev
    echo "pip install pyflakes" >> ~/.virtualenvs/postmkvirtualenv
    curl -sSL https://get.rvm.io | bash -s stable --ruby

Now we have Git, Virtualenv (and virtualenvwrapper) and RVM installed.

Vim
---

This the core of everything. I use quite a few plugins:

-   [Autoclose](https://github.com/andrewle/vim-autoclose): Inserts
    matching bracket, paren, brace or quote
-   [Colour Sampler
    Pack](https://github.com/vim-scripts/Colour-Sampler-Pack): Gives me
    a nice colour scheme
-   [Gundo](https://github.com/sjl/gundo.vim): Visualise the undo tree
-   [Lusty](https://github.com/sjbach/lusty): Manage files within Vim
-   [PEP-8](https://github.com/cburroughs/pep8): Validate the style of
    Python files
-   [PyDoc](https://github.com/vim-scripts/pydoc.vim): Python
    documentation view- and search-tool (uses pydoc)
-   [Pathogen](https://github.com/tpope/vim-pathogen): Plugin Manager
-   [Scroll Colours](https://github.com/vim-scripts/ScrollColors):
    Colorsheme Scroller, Chooser, and Browser
-   [Supertab](https://github.com/ervandew/supertab): Tab completion
-   [VirtualEnv](https://github.com/jmcantrell/vim-virtualenv): Works
    with Virtualenvs
-   [Vim Puppet](https://github.com/rodjek/vim-puppet): Puppet niceties
-   [Tabular](https://github.com/godlygeek/tabular): Text filtering and
    alignment
-   [Markdown](https://github.com/hallison/vim-markdown): Markdown
    syntax highlighter with snippets support

I keep all this under Git control (available
[here](https://gitlab.chriscowley.me.uk/chriscowleyunix/vim-configuration)).
You can just clone my repo and create a symlink for your `.vimrc`. If
you would rather see what you are doing, then you can replicate my set
up like this:

    mkdir -p ${HOME}/.vim/{autoload,bundle}
    cd ${HOME}/.vim/
    git init
    git submodule add https://github.com/andrewle/vim-autoclose.git bundle/vim-autoclose
    git submodule add https://github.com/vim-scripts/Colour-Sampler-Pack.git bundle/colour-sampler-pack
    git submodule add https://github.com/sjl/gundo.vim.git bundle/gundo
    git submodule add https://github.com/sjbach/lusty.git bundle/lusty
    git submodule add https://github.com/cburroughs/pep8.git bundle/pep8
    git submodule add https://github.com/vim-scripts/pydoc.vim.git bundle/pydoc
    git submodule add https://github.com/tpope/vim-pathogen.git bundle/pathogen
    git submodule add https://github.com/vim-scripts/ScrollColors.git bundle/scrollColors
    git submodule add https://github.com/ervandew/supertab.git bundle/supertab
    git submodule add https://github.com/jmcantrell/vim-virtualenv.git bundle/vim-virtualenv
    git submodule add https://github.com/rodjek/vim-puppet.git bundle/puppet
    git submodule add https://github.com/godlygeek/tabular.git bundle/tabular
    git submodule add https://github.com/hallison/vim-markdown.git bundle/markdown
    git submodule init
    git submodule update
    git submodule foreach git submodule init
    git submodule foreach git submodule update
    ln -s ../bundle/pathogen/autoload/pathogen.vim autoload/pathogen.vim
    mv $HOME/.vimrc .
    ln -s '$HOME/.vim/.vimrc' $HOME/.vimrc

Add the following to your `.vimrc`:

    " pathogen
    let g:pathogen_disabled = [ 'pathogen' ]    " don't load self
    call pathogen#infect()                      " load everyhting else
    call pathogen#helptags()                    " load plugin help files

    " code folding
    set foldmethod=indent
    set foldlevel=2
    set foldnestmax=4

    " indentation
    set autoindent
    set softtabstop=4 shiftwidth=4 expandtab

    " visual
    highlight Normal ctermbg=black
    set background=dark
    set cursorline
    set t_Co=256

    " syntax highlighting
    syntax on
    filetype on                 " enables filetype detection
    filetype plugin indent on   " enables filetype specific plugins

    " colorpack
    colorscheme vibrantink

    " gundo
    nnoremap <F5> :GundoToggle<CR>

    " lusty
    set hidden
    let g:LustyJugglerSuppressRubyWarning = 1"

    " pep8
    let g:pep8_map='<leader>8'

    " supertab
    au FileType python set omnifunc=pythoncomplete#Complete
    let g:SuperTabDefaultCompletionType = "context"
    set completeopt=menuone,longest,preview

There's quite a lot going on there. Refer to the various plugin docs
linked above to find what it all does. This would be a good moment to
commit all that.

    git add .
    git commit -m "Initial commit"

Tmux
----

I use this so I can have a single console window, with multiple panes.
Tmux is configured with the file `$HOME/.tmux.conf`, mine contains:

    set-window-option -g mode-keys vi
    bind h select-pane -L
    bind j select-pane -D
    bind k select-pane -U
    bind l select-pane -R
    unbind -n C-b
    set -g prefix C-a

    # easy-to-remember split pane commands
    bind h split-window -h
    bind v split-window -v
    unbind '"'
    unbind %

    bind -n M-Left select-pane -L
    bind -n M-Right select-pane -R
    bind -n M-Up select-pane -U
    bind -n M-Down select-pane -D
    set-window-option -g window-status-current-bg yellow

    # Just click it
    set-option -g mouse-select-pane on
    set-option -g mouse-select-window on
    set-option -g mouse-resize-pane on

    # Scroll your way into copy mode (scrollback buffer)
    # and select text for copying with the mouse
    setw -g mode-mouse on

    set -g set-titles on
    set -g set-titles-string "#T"

Now I can use `Ctrl+a` instead of `Ctrl+b`. You may not need to do this,
but I have little hands.I also change the kes for splitting my windows
(*'h'* horizontally, *v* vertically). I make a few changes from the
defaults:

-   `Ctrl+a` instead of `Ctrl+b` is my prefix. This matches `screen`,
    plusI am more comfortable as I have small hands.
-   I can move around panes with either `vi` keys, arrows or just with
    the mouse.
-   I change the keys to split windows to `h` (horizontal) and `v`
    (vertical).

This all works pretty well for me, although not perfectly. At the moment
my clipboard gets intercepted by Tmux,which is top of my my list to fix.
