[TxMt] new command: Universal Un/Comment (BBEdit-ish)
Chris Thomas
chris at m-audio.com
Tue Dec 21 19:02:20 UTC 2004
On Dec 21, 2004, at 7:46 AM, Eric Hsu wrote:
> This version is actually better than BBEdit's, in my opinion, because
> 1. it can uncomment many different comment formats for silly languages
> like PHP that support several; and
> 2. it places comment delimiters at the original level of indent (and
> not the first column like BB does); and
> 3. we can all customize it.
Here's what I use (requires Ruby 1.8). (I typically want to preserve
the existing inline comments, so I don't personally find those first
two properties desirable.)
file_extension = File.extname(ARGV[0])
file_extension = file_extension[1..file_extension.size]
# default to shell-style comments
comment_strings = ['#','']
StringMap = {
['c','cp','cpp','h','m','mm','p','pas',
'java','js','htc','c++','h++'] => ['//',''], # C family and some
variants of Pascal
['f','f77'] => ['C ',''], # Fortran
['inf','f90'] => ['!',''], # Inform, modern Fortran
['script','adb','ads','sql','ddl',
'dml'] => ['--',''], # AppleScript, Ada, SQL
['html','xml','plist','php'] => ['<!--','-->'], # XML, HTML
['mli','ml', 'mll','mly'] => ['(*','*)'], # OCaml uses Pascal comments
['bib','ltx','tex','ps','eps'] => ['%',''] # Latex etc
}
key = StringMap.keys.detect {|k| k.include?(file_extension)}
(comment_strings = StringMap[key]) if not key.nil?
comment_expr = /^\s*#{comment_strings[0]}(.*)#{comment_strings[1]}/
choose_mode = true
uncomment = false
def process_line(instring, uncomment, comment_strings, comment_expr)
if uncomment then
# uncomment
match = comment_expr.match(instring)
if match != nil then
puts match[1]
else
puts instring
end
else
# comment
puts comment_strings[0] + instring.chomp + comment_strings[1]
end
end
# if the first line is commented, assume the user wants to uncomment
# and vice versa
first_line = $stdin.gets
uncomment = comment_expr.match(first_line)
uncomment = false if uncomment.nil?
process_line(first_line, uncomment, comment_strings, comment_expr)
$stdin.each_line { |instring| process_line(instring, uncomment,
comment_strings, comment_expr) }
More information about the textmate
mailing list