[TxMt] improvement suggestion for "comment line/selection"

Thomas Krajacic tkrajacic at inode.at
Tue Dec 5 10:59:23 UTC 2006


Thank you very much.
I might try the subversion thingie now :)

Thomas
On Dec 5, 2006, at 03:54, James Edward Gray II wrote:

> On Dec 4, 2006, at 4:55 PM, Thomas Krajacic wrote:
>
>> mmhmm, could you tell me how to fix it manually maybe. I don't  
>> want to mess with subversion.
>
> Navigate to the command in the bundle editor, switch output to  
> Insert as Snippet, and change the command content to the code below.
>
> I agree with Jacob though, it's probably time to have a checkout if  
> you don't want to wait 10 weeks for a new update.
>
> James Edward Gray II
>
> #!/usr/bin/env ruby
>
> require "#{ENV["TM_SUPPORT_PATH"]}/lib/escape"
>
> def out(*args)
>   print( *args.map do |arg|
>     escaped = e_sn(arg)
>     $selected ? escaped.gsub("}", "\\}") : escaped
>   end )
> end
>
> # by James Edward Gray II <james (at) grayproductions.net>
>
> # find all available comment variables
> var_suffixes = [""]
> 2.upto(1.0/0.0) do |n|
>   if ENV.include? "TM_COMMENT_START_#{n}"
>     var_suffixes << "_#{n}"
>   else
>     break
>   end
> end
>
> text    = STDIN.read
> default = nil  # the comment we will insert, if none are removed
>
> # maintain selection
> if text == ENV["TM_SELECTED_TEXT"]
>   $selected = true
>   print "${0:"
>   at_exit { print "}" }
> else
>   $selected = false
> end
>
> # try a removal for each comment...
> var_suffixes.each do |suffix|
>   # build comment
>   com = { :start     => ENV["TM_COMMENT_START#{suffix}"] || "# ",
>           :end       => ENV["TM_COMMENT_END#{suffix}"]   || "",
>           :mode      => ENV["TM_COMMENT_MODE#{suffix}"]  || (ENV 
> ["TM_COMMENT_END#{suffix}"] ? "block" : "line"),
>           :no_indent => ENV["TM_COMMENT_DISABLE_INDENT#{suffix}"] }
>
>   com[:esc_start], com[:esc_end] = [com[:start], com[:end]].map do | 
> str|
>     str.gsub(/[\\|()\[\].?*+{}^$]/, '\\\\\&').
>         gsub(/\A\s+|\s+\z/, '(?:\&)?')
>   end
>
>   # save the first one as our insertion default
>   default = com if default.nil?
>
>   # try a removal
>   case com[:mode]
>   when "line"  # line by line comment
>     if text != "" && text.map { |l| !!(l =~ /\A\s*(#{com 
> [:esc_start]}|$)/) }.
>                           uniq == [true]
>       out text.gsub( /^(\s*)#{com[:esc_start]}(.*)#{com[:esc_end]} 
> (\s*)$/,
>                      '\1\2\3' )
>       exit
>     end
>   when "block" # block comment
>     regex = /\A(\s*)#{com[:esc_start]}(.*?)#{com[:esc_end]}(\s*)\z/m
>     if text =~ regex
>       out text.sub(regex, '\1\2\3')
>       exit
>     end
>   end
> end
>
> # none of our removals worked, so preform an insert (minding indent  
> setting)
> case default[:mode]
> when "line"  # apply comment line by line
>   if default[:no_indent] || text.empty?
>     out text.gsub(/^.*$/, "#{default[:start]}\\&#{default[:end]}")
>   else
>     indent = text.scan(/^[\t ]*(?=\S)/).min { |lhs, rhs| lhs.length  
> <=> rhs.length } || ""
>     text.map do |line|
>       if line =~ /^(#{indent})(.*)$(\n?)/ then
>         out $1 + default[:start] + $2 + default[:end] + $3
>       elsif line =~ /^(.*)$(\n?)/ then
>         out indent + default[:start] + $1 + default[:end] + $2
>       end
>     end
>   end
> when "block" # apply comment around selection
>   if text =~ /\A[ \t]*\z/
>     out default[:start], text
>     print "${0}"
>     out default[:end]
>   elsif default[:no_indent]
>     out default[:start], text, default[:end]
>   else
>     lines = text.to_a
>     if lines.empty?
>       out default[:start], default[:end]
>     else
>       lines[-1].sub!(/^(.*)$/, "\\1#{default[:end]}")
>       out lines.shift.sub(/^(\s*)(.*)$/, "\\1#{default[:start]}\\2")
>       out *lines unless lines.empty?
>     end
>   end
> end
>
>
> ______________________________________________________________________
> For new threads USE THIS: textmate at lists.macromates.com
> (threading gets destroyed and the universe will collapse if you don't)
> http://lists.macromates.com/mailman/listinfo/textmate




More information about the textmate mailing list