Codi.vim - the interactive scratchpad for hackers


The interactive scratchpad for hackers.

Codi demo.

Using Codi as a Python scratchpad through the shell wrapper

Codi is an interactive scratchpad for hackers, with a similar interface to Numi. It opens a pane synchronized to your main buffer which displays the results of evaluating each line as you type (with NeoVim or Vim with +job and +channel, asynchronously). It's extensible to nearly any language that provides a REPL (interactive interpreter)!

Languages with built-in support: Python, JavaScript, CoffeeScript, Haskell, PureScript, Ruby, OCaml, R, Clojure/ClojureScript, PHP, Lua, C++, Julia, Elm, Elixir, TypeScript, Mathjs

Pull requests for new language support welcome!

Note: without async support, evaluation will trigger on cursor hold rather than text change.

For more information, check out the documentation. Watch a screencast!


Use your favorite package manager (vim-plugVundlepathogen.vim), or add this directory to your Vim runtime path.

For example, if you're using vim-plug, add the following line to ~/.vimrc:

Plug 'metakirby5/codi.vim'


  • OS X or Linux (Windows support coming soon!)
  • Vim 7.4 (with +job and +channel for asynchronous evaluation) or NeoVim (still in its infancy - please report bugs!)
  • uname
  • If not using NeoVim, script (BSD or Linux, man page should say at least 2013)

Each interpreter also depends on its REPL. These are loaded on-demand. For example, if you only want to use the Python Codi interpreter, you will not need ghci.

Default interpreter dependencies:

  • Python: python
  • JavaScript: node
  • CoffeeScript: coffee
  • Haskell: ghci (be really careful with lazy evaluation!)
  • PureScript pulp psci
  • Ruby: irb
  • OCaml: ocaml
  • R: R
  • Clojure: planck
  • PHP: psysh
  • Lua: lua
  • C++: cling
  • Julia: julia
  • Elm: elm
  • Elixir: iex
  • TypeScript: tsun
  • Mathjs: mathjs


  • Codi [filetype] activates Codi for the current buffer, using the provided filetype or the buffer's filetype.
  • Codi! deactivates Codi for the current buffer.
  • Codi!! [filetype] toggles Codi for the current buffer, using the provided filetype or the buffer's filetype.

Shell wrapper

A nice way to use Codi is through a shell wrapper that you can stick in your ~/.bashrc:

# Codi
# Usage: codi [filetype] [filename]
codi() {
  local syntax="${1:-python}"
  vim -c \
    "let g:startify_disable_at_vimenter = 1 |\
    set bt=nofile ls=0 noru nonu nornu |\
    hi ColorColumn ctermbg=NONE |\
    hi VertSplit ctermbg=NONE |\
    hi NonText ctermfg=0 |\
    Codi $syntax" "$@"


  • g:codi#interpreters is a list of user-defined interpreters. See the documentation for more information.
  • g:codi#aliases is a list of user-defined interpreter filetype aliases. See the documentation for more information.

The below options can also be set on a per-interpreter basis via g:codi#interpreters:

  • g:codi#autocmd determines what autocommands trigger updates. See the documentation for more information.
  • g:codi#width is the width of the Codi split.
  • g:codi#rightsplit is whether or not Codi spawns on the right side.
  • g:codi#rightalign is whether or not to right-align the Codi buffer.
  • g:codi#autoclose is whether or not to close Codi when the associated buffer is closed.
  • g:codi#raw is whether or not to display interpreter results without alignment formatting (useful for debugging).
  • g:codi#sync is whether or not to force synchronous execution. No reason to touch this unless you want to compare async to sync.


  • CodiEnterPreCodiEnterPost: When a Codi pane enters.
  • CodiUpdatePreCodiUpdatePost: When a Codi pane updates.
  • CodiLeavePreCodiLeavePost: When a Codi pane leaves.


  • Why doesn't X work in Codi, when it works in a normal source file?
    • Codi is not meant to be a replacement for actually running your program; it supports nothing more than what the underlying REPL supports. This is why Haskell language pragmas don't work and OCaml statements must end with ;;.
  • Codi leaves a bunch of old processes running, what's going on?
    • The cause of this issue is still unknown, but it happens infrequently. See :h codi-introduction-warnings for more information.
  • Codi doesn't seem to work on my setup.
    • Check :h codi-introduction-gotchas.

Thanks to

  • @DanielFGray and @purag for testing, feedback, and suggestions
  • @Joaquin-V for helping me discover critical bugs with vanilla settings
  • Everyone who has reported an issue or sent in a pull request :)

Original repository:

June 4, 2021
Notify of
Inline Feedbacks
View all comments
© HAKIN9 MEDIA SP. Z O.O. SP. K. 2023

Download Free eBook

Step 1 of 4


We’re committed to your privacy. Hakin9 uses the information you provide to us to contact you about our relevant content, products, and services. You may unsubscribe from these communications at any time. For more information, check out our Privacy Policy.