是否可以配置IRB提示符以动态更改?

5

我希望能在IRB中浏览文件系统,并使提示符反映当前的工作目录,但我不知道如何使提示符在每个命令后更新。最终,我想在日常工作中更多地使用IRB,逐渐放弃bash。我在我的.irbrc中尝试了以下内容:

require 'fileutils'
include FileUtils

IRB.conf[:PROMPT][:CUSTOM] = {
    :PROMPT_N => "\e[1m:\e[m ",
    :PROMPT_I => "\e[1m#{pwd} >\e[m ",
    :PROMPT_S => "FOO",
    :PROMPT_C => "\e[1m#{pwd} >\e[m ",
    :RETURN => ""
}
IRB.conf[:PROMPT_MODE] = :CUSTOM

但是IRB提示没有更新:
julianmann@mango:~ > irb
/users/julianmann > puts pwd
/users/julianmann
/users/julianmann > cd 'dev'
/users/julianmann > puts pwd
/users/julianmann/dev
/users/julianmann > 

我希望提示框的内容能够更改。

5个回答

8

以下是获取工作目录的快速技巧。虽然有些脆弱,但它适用于ruby 1.8.7和1.9.2。

将您的提示字符串设置为以下内容:

"%N(%m):%03n:%i %~> ".tap {|s| def s.dup; gsub('%~', Dir.pwd); end }

"%~" 指令并非 irb 本身所能理解,因此我使用它来进行替换。这种方法依赖于 irb 调用 dup 来生成提示符的事实。

1
我正在查看Object#tap的文档,但还没有完全理解它,但它似乎是一种强大的内联重新定义方法的方式。太棒了! - Julian Mann
@julian-mann 是的,tap非常有用。但是要小心,如果你在没有Rails的情况下使用ruby < 1.8.7,因为它没有tap。 - Kelvin
a.tap { |i| ... } is basically i = a; ... ; a = i - Dorian
@Dorian 不完全是。tap 没有:1. 重新分配 a 到结尾;2. 定义分配在封闭范围内的任何本地变量。相反,这两者是等效的 - Tap: s="a"; s2="b"; s2.tap{|s| p "Inside: #{s}" }; p [s, s2] / Lambda: s="a"; s2="b"; lambda {|s| p "Inside: #{s}" }.call(s2); p [s, s2]. 注意块变量s不会覆盖块外现有的s - Kelvin
1
(我知道这是一个旧的线程)它引导我朝着正确的方向,我创建了一个新类class MyPrompt < String,然后将提示设置为MyPrompt.new('some nice prompt')。然后我可以更好地控制提示并覆盖方法而不会干扰String类。 - 244an
@244an 那是个好主意。(请注意,我的解决方案也不会干扰字符串类;它只是在一个单独的字符串实例上重新定义了一个方法。) - Kelvin

3

另一种选择是使用 fresh。它基于 irb 替代品 ripl,并且将当前目录显示为命令提示符 :]


1
谢谢!我已经下载了,真的很酷,正是我想要的。我也被Rush吸引了,但文档说它没有当前目录的概念,这和语法让我失去了兴趣。Fresh的好处在于当我使用bash时,它表现得像预期的那样(大多数情况下)-浏览非常容易。而且当我想做一些Ruby编程时,它就在那里。 - Julian Mann

0

虽然有点静态,但看一下可能会对你有所帮助 在Linux(Ubuntu 14.04)中

只需按照一些简单的步骤,您就可以更改irb控制台的恼人提示

打开您的终端

转到位置/home/leapfrog/.rvm/scripts

$ cd ~/.rvm/scripts

打开文件“irbrc.rb”,使用超级用户权限来覆盖它。
$ sudo gedit irbrc.rb

你可以看到类似这样的一段代码。用后面的代码替换前面的代码。
# Set up the prompt to be RVM specific.
#@prompt = {
# :PROMPT_I => "#{rvm_ruby_string} :%03n > ", # default prompt
# :PROMPT_S => "#{rvm_ruby_string} :%03n%l> ", # known continuation
# :PROMPT_C => "#{rvm_ruby_string} :%03n > ",
# :PROMPT_N => "#{rvm_ruby_string} :%03n?> ", # unknown continuation
# :RETURN => " => %s \n",
# :AUTO_INDENT => true
#}

@prompt = {
 :PROMPT_I => "ROR: %03n > ", # default prompt
 :PROMPT_S => "%03n%l> ", # known continuation
 :PROMPT_C => "%03n > ",
 :PROMPT_N => "%03n?> ", # unknown continuation
 :RETURN => " O/P => %s \n",
 :AUTO_INDENT => true
}

只需保存文件并重新启动irb控制台即可。 更多模式,请参见此链接 https://cbabhusal.wordpress.com/2014/12/22/ruby-rvm-change-prompt-of-irb/


0

你必须像这样运行(alias) irb

irb --prompt custom

或者在你的 .irbrc 文件中添加 IRB.conf[:PROMPT_MODE] = :CUSTOM
附注:这不是你问题的确切答案。但你可以尝试使用 RUSH
它没有当前工作目录的概念,但很容易配置。

抱歉 - 我应该提到我在 .irbrc 中有 RB.conf[:PROMPT_MODE] = :CUSTOM - 我会编辑问题。 - Julian Mann
RUSH 看起来确实很酷,我会去试试。谢谢! - Julian Mann

0
如果它能对讨论有所贡献,尽管有些晚了:在IRB环境初始化后,可能可以通过IRB.conf[:MAIN_CONTEXT]上的一些值来更改提示符。
对于c = IRB.conf[:MAIN_CONTEXT]的绑定,影响提示符格式的字段可能包括以下内容。
  • c.prompt_c
  • c.prompt_i
  • c.prompt_n
  • c.prompt_s
  • c.return_format
  • c.auto_indent_mode
  • c.prompt_mode

直接更新prompt_i字段的示例:


irb(main):009:0> IRB.conf[:MAIN_CONTEXT].prompt_i="%N %m %i >>"
=> "%N %m %i >>"

irb main 0 >>

IRB模块文档(3.0.0)中记录的格式说明集之外,目前可能不支持在IRB中使用在提示显示时将被评估的表达式。每个提示字符串都可以仅用作文字格式字符串。

尽管有一些限制,但在初始化IRB后更新IRB提示可能是可能的。

免责声明:这不能保证更新与提示相关的所有状态值,在IRB.conf[:MAIN_CONTEXT]下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接