From: "sikachu (Prem Sichanugrist)" Date: 2013-11-14T03:26:46+09:00 Subject: [ruby-core:58316] [ruby-trunk - Feature #9098] Indent heredoc against the left margin by default when "indented closing identifier" is turned on. Issue #9098 has been updated by sikachu (Prem Sichanugrist). @drbrain I could, but then the code would look ugly when the non-heredoc section is well-indented, and especially if the heredoc is pretty long. Consider this example code: module Rails class CommandsTasks # :nodoc: attr_reader :argv HELP_MESSAGE = <<-EOT Usage: rails COMMAND [ARGS] The most common rails commands are: generate Generate new code (short-cut alias: "g") console Start the Rails console (short-cut alias: "c") server Start the Rails server (short-cut alias: "s") dbconsole Start a console for the database specified in config/database.yml (short-cut alias: "db") new Create a new Rails application. "rails new my_app" creates a new application called MyApp in "./my_app" In addition to those, there are: application Generate the Rails application code destroy Undo code generated with "generate" (short-cut alias: "d") plugin new Generates skeleton for developing a Rails plugin runner Run a piece of code in the application environment (short-cut alias: "r") All commands can be run with -h (or --help) for more information. EOT COMMAND_WHITELIST = %(plugin generate destroy console server dbconsole application runner new version help) Compared to this: module Rails class CommandsTasks # :nodoc: attr_reader :argv HELP_MESSAGE = <<-EOT Usage: rails COMMAND [ARGS] The most common rails commands are: generate Generate new code (short-cut alias: "g") console Start the Rails console (short-cut alias: "c") server Start the Rails server (short-cut alias: "s") dbconsole Start a console for the database specified in config/database.yml (short-cut alias: "db") new Create a new Rails application. "rails new my_app" creates a new application called MyApp in "./my_app" In addition to those, there are: application Generate the Rails application code destroy Undo code generated with "generate" (short-cut alias: "d") plugin new Generates skeleton for developing a Rails plugin runner Run a piece of code in the application environment (short-cut alias: "r") All commands can be run with -h (or --help) for more information. EOT COMMAND_WHITELIST = %(plugin generate destroy console server dbconsole application runner new version help) From the code example, you could see that it looks much nicer when it's properly indented based on the level. The heredoc doesn't feel foreign and stand out-of-place anymore. ---------------------------------------- Feature #9098: Indent heredoc against the left margin by default when "indented closing identifier" is turned on. https://bugs.ruby-lang.org/issues/9098#change-42911 Author: sikachu (Prem Sichanugrist) Status: Assigned Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: syntax Target version: Next Major tl;dr: I would like to port +String#strip_heredoc+ (http://api.rubyonrails.org/classes/String.html#method-i-strip_heredoc) from Rails and enable it on `<<-` heredoc. Hi, I've been using here document (heredoc) for a while, and I've found out that it's very annoying that the content is always treated as flushed left. Per syntax doc: Note that the while the closing identifier may be indented, the content is always treated as if it is flush left. If you indent the content those spaces will appear in the output. So, this is the current result if you use heredoc in Ruby: class FancyHello def self.hello puts <<-README.inspect Hello World! README end end FancyHello.hello # => " Hello\n World!\n" In Rails, the core team has implemented +String#strip_heredoc+, which handles this scenario by remove leading white spaces from the string. However, not many user know that Rails has that method, and instead doing this to get around it: class FancyHello def self.hello puts <<-README.inspect Hello World! README end end FancyHello.hello # => "Hello\n World!\n" I really think that we could do better on this by removing the leading white spaces, matching +String#strip_heredoc+ method. So, after the change, I want to be able to do this, and get this result: class FancyHello def self.hello puts <<-README.inspect Hello World! README end end FancyHello.hello # => "Hello\n World!\n" Note: the behavior on `<