docwhat's avatardocwhat's blog

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_PATH and GEM_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 .so gem 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}"
done

Homebrew 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!

Comments

Gravatar for matias
Matias

I’ve been having the same problem and it’s driving me crazy! But after copy and paste the code to my .zshrc I get this error when I try to enter the vim command:

vim                                                                                                                                                           (ruby-2.2.0)
env: illegal option -- u
usage: env [-i] [name=value ...] [utility [argument ...]]

I’m using zsh with oh-my-zsh framework

Gravatar for matias
Matias

UPDATE:

I could fix the problem without ruby version ,it seems that my problem was that my vim-ruby plugin was trying to come with a list of instance_method for a variable that had a “vartype” of gets, like this:

some_var = gets.chomp
some_var.#(and it'll crash)

But after following this steps, everything is working great now, sorry for inconvenience!!

https://github.com/vim-ruby/vim-ruby/pull/229

Submit a Comment

docwhat

The personal blog of Christian Höltje.
docwhat docwhat contact