【问题标题】:⌃⇧H in TextMate to 'Tidy' HTML causes NoMethodError⌃⇧H 在 TextMate 到“整洁”的 HTML 导致 NoMethodError
【发布时间】:2011-03-25 06:03:21
【问题描述】:

我昨天第一次尝试在 HTML 文档中使用“Tidy”,结果...

/tmp/temp_textmate.Z2P0KX:30:in `<main>': undefined method `empty?' for nil:NilClass (NoMethodError)

我没有对包中的代码做任何事情...

#!/usr/bin/env ruby -wKU

require ENV['TM_SUPPORT_PATH'] + '/lib/ui.rb'
require ENV['TM_SUPPORT_PATH'] + '/lib/exit_codes.rb'

result = `"${TM_TIDY:-tidy}" -f /tmp/tm_tidy_errors -iq -utf8 \
          -wrap 0 --tab-size $TM_TAB_SIZE --indent-spaces $TM_TAB_SIZE \
        --indent yes \
          ${TM_XHTML:+-asxhtml --output-xhtml yes} \
          ${TM_SELECTED_TEXT:+--show-body-only yes} \
          --enclose-text yes \
          --doctype strict \
        --wrap-php no \
          --tidy-mark no`
status = $?.exitstatus

at_exit { File.unlink('/tmp/tm_tidy_errors') } # Clean up error log

if status == 2 # Errors

  msg = "Errors: " + File.read('/tmp/tm_tidy_errors')
  TextMate.exit_show_tool_tip msg

elsif status == 1 # Warnings - use output but also display notification with warnings

  log = File.read('/tmp/tm_tidy_errors').to_a.select do |line|
    ! (ENV['TM_SELECTED_TEXT'] and (line.include?('Warning: missing <!DOCTYPE> declaration') or line.include?("Warning: inserting missing 'title' element")))
  end.join rescue nil

  unless log.empty?
    options = {
      :title   => "Tidy Warnings",
      :summary => "Warnings for tidying your document (press escape to close):",
      :log     => log
    }
    TextMate::UI.simple_notification(options)
  end

end

if ENV['TM_SOFT_TABS'] == "YES"
  print result
else
  in_pre = false
  result.each_line do |line|
    unless in_pre
      tab_size = ENV["TM_TAB_SIZE"].to_i
      space, text = /( *)(.*)/m.match(line)[1..2]
      line = "\t" * (space.length / tab_size).floor + " "  * (space.length % tab_size) + text
    end

    print line

    in_pre = true  if line.include?("<pre>")
    in_pre = false if line.include?("</pre>")
  end
end

问题行是unless log.empty?

我在 OS X 10.6.6 上运行 TextMate 1.5.10 (1631)。我最近安装了 rvm 并将默认 Ruby 升级到 1.9.2,但强制 TextMate 使用 1.8.7 并没有解决问题。

【问题讨论】:

  • 你标题中的向上箭头是故意的吗?!?
  • @slugster,是的,这是故意的,因为 Ctrl-Shift-H 是 TextMate 中 Tidy 的默认等效键。关于这个问题,我只是在本地测试了一下,没有问题,但是由于命令是用 Ruby 编写的,您可以尝试在这个问题中添加 Ruby 标记。我不太了解 Ruby,无法提供更多帮助。据我所知,我的命令版本与您的相同。由于在检查警告时发生错误,我猜测是 Tidy 安装有问题。
  • @Chuck - 谢谢。我已按照您的建议添加了“ruby”标签。

标签: ruby textmate tidy textmatebundles


【解决方案1】:

我遇到了同样的问题。我已将我的 Textmate 设置为使用 RVM 版本的 ruby​​,以便我可以快速测试脚本。

我通过取消选中我创建的环境变量的“TM_RUBY”解决了这个问题。

似乎正在发生的事情是包装 /usr/bin/tidy 命令的 Textmate 脚本在使用非 OSX 附带的 ruby​​ 版本时无法正常执行。

我很想知道 Lion 出来后会发生什么。希望 Textmate 能够重新审视这些内置脚本,并给它们一些“除尘”。

【讨论】:

  • 会很棒的。除了他们没有。三年后,问题依然存在。来吧:一个超级强大的文本编辑器,你用 brew 或 macports 安装软件就不能使用它吗?伤心...
【解决方案2】:

如果您查看分配给 log 的作业,您会看到:

log = File.read('/tmp/tm_tidy_errors').to_a.select do |line| ... end.join rescue nil

如果/tmp/tm_tidy_errors 文件不存在或无法读取或其他任何情况,最后的rescue nil 会将nil 放入log。然后脚本会在nil 上调用.empty? 方法,但nil 对象没有这样的方法,脚本会崩溃并死掉。

您可以通过将rescue nil 更改为rescue '' 或将unless log.empty? 更改为unless log.nil? || log.empty? 来抑制问题,但这可能不是真正的问题。

您是否设置了TM_TIDY 环境变量?你的PATH 中有tidy 命令吗?看起来您的 Tidy 安装不正确(或可能根本不存在)。我的 OSX 有/usr/bin/tidy,显然这是标准的。尝试在终端中手动运行那个大的tidy 命令,看看会发生什么。

【讨论】:

    【解决方案3】:

    我也遇到了同样的问题,在一台运行 OS X 10.9.5 且 Ruby 升级到 ruby​​ 2.0.0 的机器上。通过采用 mu is too short 的建议将 unless log.empty? 更改为 unless long.nil? || log.empty? 来修复它。这让 Tidy 可以正常运行,但我的 HTML 选择的顶部仍然显示烦人的错误:

    ruby: warning: -K is specified; it is for 1.8 compatibility and may cause odd behavior
    /Applications/TextMate.app/Contents/SharedSupport/Support/lib/ui.rb:129: warning: assigned but unused variable - pid
    

    我通过将脚本的第一行从 #!/usr/bin/env ruby -wKU 更改为 #!/usr/bin/env ruby -wKU -W0 来关闭它。显然问题仍然存在,但是对于一些有用但不是必需的东西,就像这个功能一样,我认为它已经足够好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多