【问题标题】:Rails Console output breaks when modifying修改时 Rails 控制台输出中断
【发布时间】:2018-07-06 13:31:18
【问题描述】:

这里完全缺乏直觉。 首先我以为我只在从编辑器复制和粘贴代码时发生。不幸的是,它更常见。我唯一要做的就是尝试在当前输入中间的某处插入更多代码或修改它。

预期行为:

  • 修改输入没有副作用。

实际发生的情况:

  • 修改输入时经常出现混乱。
  • 如果发生这种情况,每次按键都会复制并插入当前输入以及按下的字符。

重要提示:

  • 终端中的编码设置为 UTF-8

  • 问题在不同的模拟器(终结者、gnome-terminal)上仍然存在

  • 使用不同的 Ruby 运行时控制台(IRB、Pry)时问题仍然存在

  • 问题似乎与 Ruby 运行时有关,而不是 Linux shell(我猜...)

问题出现时间:

  • 自系统安装以来。没有出现在我的 MacBook Air 上

系统:

  • ArchLinux,虽然同事报告说他的 MacBook Pro 上发生了同样的事情。

如何重现(对我有用):

  • 开放式导轨控制台
  • 键入示例代码:Shift.where(name: "som").where(name: "dom").where(name: "pom")
  • 导航光标以修改第一个 where 语句。
  • 将“som”更改为“SOM”
  • 应该看到它破裂
  • 反复按随机键可以看到它更坏。

图片:

  • 很好的意见

  • 现在我将导航到第一个 where 语句以将“som”更改为大写“SOM”

  • 我基本上是导航光标并按下 SHIFT+S、SHIFT+O、SHIFT+M

希望它足够清楚:-) 谢谢!


编辑 1:

  • 尝试使用 zsh 代替 bash,没有帮助

  • 禁用 spring gem,没有帮助

编辑 2:

reddit 上的人们建议我应该检查是否有任何 Ruby readline 警告,例如。 “未安装 Readline”。它们都没有出现在任何地方。还重新安装了 ruby​​ 2.4.1,在我的情况下似乎不是问题。

编辑 3:

我无法在其他 Rails 项目中重现该问题。 Rails 5.1.1 出现问题,同时 5.0.3 工作正常。 Rails 本身(或者更确切地说是其中的一个宝石)可能是原因吗?

【问题讨论】:

  • 告诉我们您使用的是哪个 shell 会很有用。我记得遇到过类似的问题(macos),但很长一段时间都没有发生过——也许是因为我开始使用zsh。另一个问题:如何将光标导航到指定位置?使用鼠标光标或键盘(在后一种情况下,您是逐个字符还是使用一些全字跳转机制,这可能会有所不同吗?)?
  • 在运行 ruby​​ 2.3.1p112 和 Rails 4.2.1 的 ubuntu 16.04 LTS 上的 GNOME Terminal 3.18.3 中运行良好。
  • 您使用的是 Spring gem 吗?已知在某些情况下会干扰控制台输出。从您的 Gemfile 中取消注释 Spring gem,并在后台终止所有 Spring 作业。然后重新测试。
  • 您可能还想查看您的终端配置为使用哪个终端仿真。我会尝试不同的常见行为,看看行为是否会发生变化。
  • @JaySchneider 我正在使用 bash。 jump-whole-word 和 char 都产生相同的结果。也希望安装 zsh 但它没有帮助:-( 所以 zsh 上的结果相同。

标签: ruby-on-rails ruby terminal irb pry


【解决方案1】:

我有一个非常相似的问题,我把它归结为我的颜色。

我的 IRBRC 中有以下内容:

class String

  def _colorize(color_code)
    "\e[#{color_code}m#{self}\e[0m"
  end

  def red
    _colorize(31)
  end

  def yellow
    _colorize(33)
  end
end

IRB.conf[:PROMPT][:MY_PROMPT] = {
  :AUTO_INDENT => true,            # enables auto-indent mode
  :PROMPT_I => "[ME]".red + " > ".yellow,               # normal prompt
  :PROMPT_S => "[ME]".red + "   ".yellow,               # prompt for continuated strings
  :PROMPT_C => "[ME]".red + " * ".yellow,               # prompt for continuated statement
  :RETURN =>   "[ME]".red + "=> ".yellow + "%s\n".red        # format to return value
}
IRB.conf[:PROMPT_MODE] = :MY_PROMPT

当我删除 .red.yellow 时,一切都很好。

我认为这是因为我的着色字符(如 \e[31m)被计为长度为 5 个字符而不是 0 个字符。

我的解决办法是暂时去掉我的颜色。希望有人会提出比这更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2012-04-20
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多