2016-09-14 3 views
5

Я хотел бы расширить консольное приложение по умолчанию, которое встроено в стандартное с bundle gem, применяя некоторые параметры конфигурации IRB.Настройка консоли IRB для gem

Looking at the documentation, я вижу, что должно быть возможно, например, изменить приглашение, и это отлично работает на интерактивном сеансе. Например, я могу играть с отображаемой строкой, как это:

2.1.4 :001 > conf.prompt_mode=:SIMPLE 
=> :SIMPLE 
>> 
?> conf.prompt_mode=:DEFAULT 
=> :DEFAULT 
irb(main):004:0> 

Однако, я не могу найти, как перевести это в синтаксис для использования в приложении консоли. Например, этот сценарий:

require 'irb' 
IRB.conf[:PROMPT_MODE] = :SIMPLE 
IRB.start 

Просто начинается с общей сконфигурированной строкой:

2.1.4 :001 > 

я провел некоторое время, пытаясь найти пример использование IRB для пользовательского РЕПЛ без загрузки глобальных значений по умолчанию, но не нашел ничего, что я могу скопировать.

Я вижу, что недокументированный метод IRB.setup имеет какое-то отношение к этому, он каким-то образом устанавливает всю конфигурацию. Я единственный вариант, чтобы написать свою собственную версию IRB.start, которая применяет мою желаемую конфигурацию после вызова IRB.setup, или есть поддержка того, что я хочу сделать встроенным, но не задокументированным в стандартном местоположении?


E.g. следующие работы, но я чувствую, что это немного тяжело, расширяет IRB-модуль таким образом (а также подвержен ошибкам при изменении внутренних элементов IRB).

require 'irb' 

def IRB.custom_start custom_conf = {} 
    STDOUT.sync = true 

    IRB.setup(nil) 

    custom_conf.each do |k,v| 
    IRB.conf[k] = v 
    end 

    if @CONF[:SCRIPT] 
    irb = IRB::Irb.new(nil, @CONF[:SCRIPT]) 
    else 
    irb = IRB::Irb.new 
    end 

    @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC] 
    @CONF[:MAIN_CONTEXT] = irb.context 

    trap("SIGINT") do 
    irb.signal_handle 
    end 

    begin 
    catch(:IRB_EXIT) do 
     irb.eval_input 
    end 
    ensure 
    irb_at_exit 
    end 
end 

IRB.custom_start :PROMPT_MODE => :SIMPLE 

ответ

2

Вы можете применить пользовательские конфигурации двумя способами.

Первый - использовать irbrc file. Это может быть сложно в создании консольного приложения (вызов IRB.start из рубинового файла вместо irb с консоли).

Второй подход, который вы описали в сообщении. Вы можете написать свой собственный метод IRB::start на основе the original one. Есть точно такие же потенциальные проблемы, как при использовании недокументированного API - он может сломаться в будущем с более новыми версиями irb.

Вы должны подумать, действительно ли вам нужно создать консольное приложение на верхней панели irb. Например, вы можете решить эту проблему, используя Pry. Он позволяет define configuration перед началом интерактивного сеанса.

+1

Благодарим за то, что вы указали мне снова в Pry. Я смотрел на него раньше, но основное внимание на функции отладки заставило меня подумать, что это не подходит. Это может быть лучше, чем «irb» для меня, даже если для корректно документированной поддержки для изменения конфигурации программно. –

1
require 'irb' 
IRB.conf[:PROMPT_MODE] = :SIMPLE 
IRB.start 

подход выше не работает, потому что conf[:PROMPT_MODE] получает более-riden в методе, называемом IRB.init_confighere

Когда IRB.start называется, он вызывает IRB.setup, который в свою очередь вызывает метод IRB.init_config - который сверх- аттракционы conf[:PROMPT_MODE] установка.


Вот один из подходов, который решает проблему (опирается на внутренние знания о реализации).

require 'irb' 

module IRB 
    singleton_class.send(:alias_method, :old_setup, :setup) 

    def IRB.setup(ap_path) 
    IRB.old_setup(ap_path) 

    conf[:PROMPT_MODE] = :SIMPLE 
    end 
end 

IRB.start 
+0

Это чище, чем мое решение, но разделяет проблему с тем, что он работает с реализацией, а не с «официальным» интерфейсом. –

+0

@NeilSlater Да, поэтому я сказал, что «опирается на внутренние знания о реализации». Я думаю, 'setup' является общедоступным методом, следовательно, является частью открытого интерфейса. Это просто не документировано очень хорошо. – Rashmirathi

Смежные вопросы