On Sun 1 Dec 2013 at 02:31:54PM -0800, Patrick Kristiansen wrote: > Great work!
Thank you for the compliment :). Slamhound is a great tool, so I hope I can convince more people to try it out. > Regarding the screencast: I would be very interested to hear about > your Clojure development setup with Vim, especially the plugins and > configuration you are using. > > I see you are using some sort of split view with Vim on top and a REPL > at the bottom. Is that GNU screen split in two or something? The split view is a tmux feature. I typically run a headless nREPL in one pane, then use the zoom feature to focus on the pane running Vim. I was once a GNU screen user, but tmux is superior in most aspects, and also sports some of the prettiest C I've ever seen. As for Vim, version 7.3.803+ now ships with Clojure runtime files¹, which I use together with fireplace.vim². Many people don't know that fireplace exposes a generic eval function³ that makes writing Vim<->nREPL plugins extremely easy. For instance, vim-slamhound is essentially just this bit of VimScript: ``` function! slamhound#reconstruct(file, textwidth) let file = escape(a:file, '"') let tw = a:textwidth < 1 ? 80 : a:textwidth call fireplace#eval( \ "(require 'slam.hound 'clojure.pprint)" \ . '(let [file (clojure.java.io/file "' . file . '")]' \ . ' (binding [clojure.pprint/*print-right-margin* ' . tw . ']' \ . ' (slam.hound/swap-in-reconstructed-ns-form file)))' \ ) edit endfunction command -bar Slamhound call slamhound#reconstruct(expand('%'), &textwidth) ``` As Vim users we have to settle for building strings rather than composing S-expressions, but this works quite well despite. Finally, I use vim-sexp⁴ for manipulating code. I wrote this plugin earlier in the year because I wanted to work with Clojure's S-expressions as first-class text-objects. The builtin bracket and string text objects are often lacking in subtle ways, so I spent a bit of time making text objects for all three types of compound forms, patterns and strings, comments, and a generic element type. Combining these with Vim's operators makes hacking on Clojure a very pleasant experience. Vim-sexp also provides commands for wrapping, splicing, raising, capturing, emitting, and moving S-expressions, as well as paredit-like bracket and quote insertion (i.e. balanced insert, auto-insertion of leading and trailing spaces). Unlike paredit.el, however, vim-sexp does *not* try very hard at all to keep brackets and quotes balanced, since that is not very Vim-like. IMHO manipulating S-expressions in Vim should generally be done precisely with operator + text-object, not sloppily with the backspace key. I had hoped to release a screencast on vim-sexp months ago, but I never did finish it. When I do complete it, I plan on announcing it to the VimClojure mailing list⁵, which is recommend for discussions specific to Vim and Clojure. I hope you find this information useful. Exactly one year ago I became very unsatisfied with Vim for working with Clojure, and toyed with Emacs for a bit (evil-mode). It was nice, but I decided to stay with Vim and create the tools that I felt I was missing. Today, I am a very happy hacker! Cheers, guns ¹ Otherwise available at https://github.com/guns/vim-clojure-static courtesy of Meikel Brandmeyer, the primary author of these files. ² https://github.com/tpope/vim-fireplace ³ https://github.com/guns/vim-fireplace/blob/master/plugin/fireplace.vim#L525-L527 ⁴ https://github.com/guns/vim-sexp ⁵ https://groups.google.com/forum/#!forum/vimclojure
pgpa87x6to9IW.pgp
Description: PGP signature