Как запустить правильную версию Ruby при выполнении через MacVim (!ruby)

Недавно я видел, как Гэри Бернхардт хвастается ярлыком vim, который он использует для выполнения кода Ruby из vim. Ярлык

:map ,t :w\|:!ruby %<cr>.  

Кажется, что этот метод всегда выполняет System Ruby, в моем случае это 1.8.7. Я не решаюсь обновить это, так как слышал, что изменение интерпретатора System Ruby может вызвать некоторые шаткие проблемы. Есть ли способ заставить эту команду использовать настройку версии для каталога с RVM?


person Ryan    schedule 04.08.2011    source источник
comment
Это точка намеренно (после <cr>)?   -  person sidyll    schedule 04.08.2011
comment
Нет, это было просто по привычке.   -  person Ryan    schedule 04.08.2011


Ответы (2)


Самый прямой способ указать ruby — указать его полный путь в команде :! (вместо того, чтобы полагаться на то, какой ruby будет найден первым в каталогах PATH):

  • Чтобы использовать Рубин в /path/to/your/preferred/ruby:

    :!/path/to/your/preferred/ruby %
    
  • Чтобы использовать установленный RVM ruby-1.9.2-head:

    :!~/.rvm/bin/ruby-1.9.2-head %
    
  • Чтобы использовать установленный RVM ruby-1.9.2-head с набором драгоценных камней rails3-dev:

    :!~/.rvm/bin/ruby-1.9.2-head@rails3-dev %
    

Таким образом, ваша команда карты может выглядеть так:

:map ,t :w\|:!~/.rvm/bin/ruby-1.9.2-head@rails3-dev %<cr>

Также обычно можно настроить действующее значение переменной среды PATH так, чтобы нужный ruby был найден первым, но это не всегда может быть так просто, как хотелось бы. В частности, команды :! обрабатываются оболочкой, настроенной с помощью параметра Vim shell (:set shell?, чтобы увидеть его значение). Файлы конфигурации для этой оболочки могут изменить значение PATH, которое Vim дает оболочке (сравните PATH Vim (:echo $PATH) с PATH, которую в конечном итоге используют :! команды (:!echo $PATH), чтобы увидеть, могут ли файлы конфигурации вашей оболочки корректировать PATH).

Вы можете попробовать изменить PATH, который Vim и его дочерние элементы используют следующим образом:

:let $PATH = $HOME . '/.rvm/wrappers/ruby-1.9.2-head@rails3-dev:' . $PATH

Вы должны проверить действующий PATH с помощью :!echo $PATH и :!which ruby, чтобы узнать, изменяет ли ваша оболочка PATH (возможно, :set shell=/bin/sh, если у вас есть эта проблема).

Примечание. Я никогда не видел такого конкретного использования каталогов-оболочек RVM, в будущих версиях RVM это может сломаться. Обычное использование заключается в создании оболочки и вызове ее непосредственно из ~/.rvm/bin (аналогично первой части этого поста) вместо помещения ~/.rvm/wrapper/whatever в PATH.

person Chris Johnsen    schedule 04.08.2011
comment
Спасибо, этот пост очень помог. Один вопрос: если бы я изменил PATH так, чтобы RVM-версия Ruby была первой, повлияет ли это на ОС, которая ищет ожидаемую версию? Другими словами, можно ли предположить, что ОС укажет ожидаемый путь к Ruby, а не просто выполнит саму команду ruby ​​и вернет все, что определено в PATH? - person Ryan; 04.08.2011
comment
Маловероятно, что это повлияет на использование Ruby «системой», но возможно (в ограниченной степени). В лучшем случае это повлияет только на «системные» программы Ruby, запущенные с измененным PATH и имеющие #!/usr/bin/env ruby в качестве первой строки или вызываемые как ruby /path/to/program (возможно, ошибка для любой программы, которая чувствительна к тому, какая установка Ruby используется). PATH, как и любая переменная среды, наследуется от родительского процесса, поэтому изменение PATH в ваших экземплярах Vim повлияет только на его дочерние процессы (т.е. не процессы, запущенные launchd, init , inetd, cron и т. д.). - person Chris Johnsen; 05.08.2011

На вашей карте вместо простого ruby (который будет первым в вашем $PATH) используйте полный путь. Предположим, например, что вы хотите использовать установленный MacPorts Ruby:

:map ,t :w\|:!/opt/local/ruby %<cr>.
person sidyll    schedule 04.08.2011