Внутренняя ошибка рубина в vim

У меня была эта проблема некоторое время с vim. В первый раз я делаю все, что взаимодействует с рубином, например :ruby puts "test", я получаю <internal:gem_prelude>:1:in 'require': cannot load such file -- rubygems.rb (LoadError).

Некоторая диагностическая информация, которая может быть полезна: моя ОС - OS X 10.11.2, Vim - версия 7.4, ruby ​​- 2.1.2, установленный с rvm, моя оболочка - zsh (но это также происходит с bash) и мой vim полностью ваниль.

 $  ruby --version
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
 $  rvm list

rvm rubies

=* ruby-2.1.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

 $  which -a ruby
/Users/marcusbuffett/.rvm/rubies/ruby-2.1.2/bin/ruby
/usr/local/bin/ruby
/usr/local/bin/ruby
/usr/bin/ruby
 $  vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Mar 18 2016 09:07:16)
MacOS X (unix) version
Included patches: 1-1401
Compiled by Homebrew
Huge version without GUI.  Features included (+) or not (-):
+acl             +farsi           +mouse_netterm   +syntax
+arabic          +file_in_path    +mouse_sgr       +tag_binary
+autocmd         +find_in_path    -mouse_sysmouse  +tag_old_static
-balloon_eval    +float           +mouse_urxvt     -tag_any_white
-browse          +folding         +mouse_xterm     -tcl
++builtin_terms  -footer          +multi_byte      +terminfo
+byte_offset     +fork()          +multi_lang      +termresponse
+channel         -gettext         -mzscheme        +textobjects
+cindent         -hangul_input    +netbeans_intg   +title
-clientserver    +iconv           +packages        -toolbar
+clipboard       +insert_expand   +path_extra      +user_commands
+cmdline_compl   +job             +perl            +vertsplit
+cmdline_hist    +jumplist        +persistent_undo +virtualedit
+cmdline_info    +keymap          +postscript      +visual
+comments        +langmap         +printer         +visualextra
+conceal         +libcall         +profile         +viminfo
+cryptv          +linebreak       +python          +vreplace
+cscope          +lispindent      -python3         +wildignore
+cursorbind      +listcmds        +quickfix        +wildmenu
+cursorshape     +localmap        +reltime         +windows
+dialog_con      -lua             +rightleft       +writebackup
+diff            +menu            +ruby            -X11
+digraphs        +mksession       +scrollbind      -xfontset
-dnd             +modify_fname    +signs           -xim
-ebcdic          +mouse           +smartindent     -xsmp
+emacs_tags      -mouseshape      -sniff           -xterm_clipboard
+eval            +mouse_dec       +startuptime     -xterm_save
+ex_extra        -mouse_gpm       +statusline      -xpm
+extra_search    -mouse_jsbterm   -sun_workshop
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/local/share/vim"
Compilation: /usr/bin/clang -c -I. -Iproto -DHAVE_CONFIG_H   -F/usr/local/Frameworks -DMACOS_X_UNIX  -Os -w -pipe -march=native -mmacosx-version-min=10.11 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: /usr/bin/clang   -L. -L/Users/travis/.sm/pkg/active/lib -fPIC -Bstatic -fstack-protector -L/usr/local/lib -F/usr/local/Frameworks -Wl,-headerpad_max_install_names -o vim        -lm  -lncurses -liconv -framework Cocoa   -fstack-protector  -L/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE -lperl -framework Python   -lruby-static -framework CoreFoundation -lobjc -L/Users/marcusbuffett/.rvm/rubies/ruby-2.1.2/lib

Ответ 1

Предполагая, что ruby работает для вас обычно при использовании из командной строки, я подозреваю, что проблема связана с тем, что вы пытаетесь использовать RVM ruby ​​в VIM и VIM не использует логин shell по умолчанию. RVM, с другой стороны, выполняет инициализацию в сценариях init оболочки, которые запускаются только в оболочках входа, которые вы получаете, например. когда вы открываете терминал.

Теперь, когда у вас также есть рубин системы, установленный в /usr/local, VIM видит эту систему ruby ​​вместо RVM. И я думаю, у вас нет рубигемов, установленных в системе ruby.

Итак, одним быстрым методом является принудительно использовать VIM для использования оболочки входа, так что она ведет себя так же, как и в командной строке. На это отвечает этот вопрос SO, и я цитирую оттуда:

# ~/.vimrc
set shell=bash\ -l

Другим вариантом было бы вручную установить VIM PATH, чтобы первый найденный ruby был одним из RVM, а не системным.

Ответ 2

Вы можете просто запустить ruby, как и любую другую команду, с помощью :!ruby -e "puts 'Hello'" или - для запуска текущего файла - :!ruby %:p.

Предостережение. Это само по себе переключится обратно на вашу оболочку, пока вы не нажмете клавишу, чтобы вернуться в vim, в отличие от выполнения кода в командном окне, например, :ruby. Я считаю целесообразным компромисс, учитывая, что он значительно более универсален. См. Ниже обходной путь.


Последний может быть особенно полезен в сочетании с:

if __FILE__ == $0
  run_some_command || assert_something || run_only_this_test_file
end

Вы можете, например, добавить autocmd в буфер записи к определенным именам файлов (например, * _test.rb), который автоматически запускает тест при сохранении, если вас это интересует.


Альтернатива экранированию экрана в командной строке

Если мерцание вас раздражает, вы также можете сохранить результат в переменной, создать новый буфер и поместить в него результат с помощью :let res=system('ruby '.expand('%:p')) | new | put=res

Ответ 3

Вы можете попробовать

rvm fix-permissions && & && rvm переустановить 2.1.2

Я думаю, что я видел это в stackoverflow раньше как правильный ответ для аналогичной проблемы, отличной от vim.