OS X Vim with Ruby crashes
On my OS X systems, Vim and
MacVim has been crashing a lot. The
main symptom is that anything using
Omni completion, such as
NeoComplCache, would try to use the
built in Ruby and cause vim to die with Vim: Caught deadly signal SEGV.
It turns out that this is due to vim loading ruby modules/libraries not compatible with the system Ruby.
I have RVM installed on my system and what was happening is that:
- RVM sets the GEM_PATHandGEM_HOME.
- I had a version of Ruby 1.8.7 in RVM. This is the same version as (Mac)Vim
and OS X has installed in /usr/.
- I had binary (compiled) gems installed for the RVM 1.8.7 Ruby. These are
files that end in .so.
- So (Mac)Vim tries to do completion, tries loading a binary gem from the
GEM_PATH, finds the RVM 1.8.7 version of the.sogem module, loads it, and crashes.
This isn’t surprising. My RVM doesn’t compile Ruby the same way Apple does. This is deliberate, because I want certain performance behaviors, etc.
Anyway, the solution is simple enough.
If you got your Vim and MacVim through HomeBrew (and
really, you should), then just add this to your ~/.zshrc:
for i in /usr/local/opt/vim/bin/*(N) /usr/local/opt/macvim/bin/*(N); do
  i=$(basename $i)
  alias "${i}"="env -u GEM_PATH -u GEM_HOME command ${i}"
doneHomebrew installs a symlink for most kegs into
/usr/local/opt/*package-name*, which makes it simple to find the list of all
binaries in a keg. The (N) is a ZSH-ism that says it is okay for the * to
return nothing. If you’re using bash, just remove the (N)
The upshot is that this unsets the GEM_PATH and GEM_HOME.
You may also want your EDITOR environment variable to include the
env -u GEM_PATH -u GEM_HOME part as well:
export GIT_EDITOR="env -u GEM_PATH -u GEM_HOME vim +1"
export EDITOR="env -u GEM_PATH -u GEM_HOME vim"Ciao!