From 2261f367f4aeda49c28d1990eaeb71555ea28916 Mon Sep 17 00:00:00 2001 From: Jason Sallis Date: Mon, 6 Oct 2008 19:01:33 -0600 Subject: [PATCH] Removed command to insert matching start bracket because it's just too flaky with a file full of identical brackets. (Might add it back in later once it's tweaked) Instead, added macro to overtype ')' --- .../Insert Matching Start Bracket.tmCommand | 320 ------------------ Macros/Overtype ')'.tmMacro | 68 ++++ info.plist | 1 - 3 files changed, 68 insertions(+), 321 deletions(-) delete mode 100644 Commands/Insert Matching Start Bracket.tmCommand create mode 100644 Macros/Overtype ')'.tmMacro diff --git a/Commands/Insert Matching Start Bracket.tmCommand b/Commands/Insert Matching Start Bracket.tmCommand deleted file mode 100644 index 2b6e878..0000000 --- a/Commands/Insert Matching Start Bracket.tmCommand +++ /dev/null @@ -1,320 +0,0 @@ - - - - - beforeRunningCommand - nop - command - #!/usr/bin/env ruby -# Borrowed and modified from Objective-C bundle Command of same name -# except generates (..) instead of [..] -require "#{ENV['TM_SUPPORT_PATH']}/lib/escape" -require ENV['TM_SUPPORT_PATH'] + "/lib/exit_codes" - -class Lexer - include Enumerable - def initialize - @label = nil - @pattern = nil - @handler = nil - @input = nil - - reset - - yield self if block_given? - end - - def input(&reader) - if @input.is_a? self.class - @input.input(&reader) - else - class << reader - alias_method :next, :call - end - - @input = reader - end - end - - def add_token(label, pattern, &handler) - unless @label.nil? - @input = clone - end - - @label = label - @pattern = /(#{pattern})/ - @handler = handler || lambda { |label, match| [label, match] } - - reset - end - - def next(peek = false) - while @tokens.empty? and not @finished - new_input = @input.next - if new_input.nil? or new_input.is_a? String - @buffer += new_input unless new_input.nil? - new_tokens = @buffer.split(@pattern) - while new_tokens.size > 2 or (new_input.nil? and not new_tokens.empty?) - @tokens << new_tokens.shift - @tokens << @handler[@label, new_tokens.shift] unless new_tokens.empty? - end - @buffer = new_tokens.join - @finished = true if new_input.nil? - else - separator, new_token = @buffer.split(@pattern) - new_token = @handler[@label, new_token] unless new_token.nil? - @tokens.push( *[ separator, - new_token, - new_input ].select { |t| not t.nil? and t != "" } ) - reset(:buffer) - end - end - peek ? @tokens.first : @tokens.shift - end - - def peek - self.next(true) - end - - def each - while token = self.next - yield token - end - end - - private - - def reset(*attrs) - @buffer = String.new if attrs.empty? or attrs.include? :buffer - @tokens = Array.new if attrs.empty? or attrs.include? :tokens - @finished = false if attrs.empty? or attrs.include? :finished - end -end - - -class ObjcParser - - attr_reader :list - def initialize(args) - @list = args - end - - def get_position - return nil,nil if @list.empty? - has_message = true - - a = @list.pop - endings = [:close,:post_op,:at_string,:at_selector,:identifier] -openings = [:open,:return,:control] - if a.tt == :identifier && !@list.empty? && endings.include?(@list[-1].tt) - insert_point = find_object_start - else - @list << a - has_message = false unless methodList - insert_point = find_object_start - end -return insert_point, has_message - end - - def methodList - old = Array.new(@list) - - a = selector_loop(@list) - if !a.nil? && a.tt == :selector - if file_contains_selector? a.text - return true - else - internal = Array.new(@list) - b = a.text - until internal.empty? - tmp = selector_loop(internal) - return true if tmp.nil? - b = tmp.text + b - if file_contains_selector? b - @list = internal - return true - end - end - end - else - end -@list = old -return false - end - - def file_contains_selector?(methodName) - fileNames = ["#{ENV['TM_BUNDLE_SUPPORT']}/cocoa.txt.gz"] - userMethods = "#{ENV['TM_PROJECT_DIRECTORY']}/.methods.TM_Completions.txt.gz" - - fileNames += [userMethods] if File.exists? userMethods - candidates = [] - fileNames.each do |fileName| - zGrepped = %x{zgrep ^#{e_sh methodName }[[:space:]] #{e_sh fileName }} - candidates += zGrepped.split("\n") - end - - return !candidates.empty? - end - - def selector_loop(l) - until l.empty? - obj = l.pop - case obj.tt - when :selector - return obj - when :close - return nil if match_bracket(obj.text,l).nil? - when :open - return nil - end - end - return nil - end - - def match_bracket(type,l) - partner = {")"=>"(",")"=>"(","}"=>"{"}[type] - up = 1 - until l.empty? - obj = l.pop - case obj.text - when type - up +=1 - when partner - up -=1 - end - return obj.beg if up == 0 - end - end - - def find_object_start - openings = [:operator,:selector,:open,:return,:control] - until @list.empty? || openings.include?(@list[-1].tt) - obj = @list.pop - case obj.tt - when :close - tmp = match_bracket(obj.text, @list) - b = tmp unless tmp.nil? - when :star - b, ate = eat_star(b,obj.beg) - return b unless ate - when :nil - b = nil - else - b = obj.beg - end - end - return b - end - - def eat_star(prev, curr) - openings = [:operator,:selector,:open,:return,:control,:star] - if @list.empty? || openings.include?(@list[-1].tt) - return curr, true - else - return prev, false - end - end -end - -if __FILE__ == $PROGRAM_NAME - require "stringio" - line = ENV['TM_CURRENT_LINE'] - caret_placement =ENV['TM_LINE_INDEX'].to_i - 1 - - up = 0 - pat = /"(?:\\.|[^"\\])*"|\[|\]/ - line.scan(pat).each do |item| - case item - when "(" - up+=1 - when ")" - up -=1 - end - end - if caret_placement ==-1 - print ")$0" + e_sn(line[caret_placement+1..-1]) - TextMate.exit_insert_snippet - end - - if up != 0 - print e_sn(line[0..caret_placement])+")$0"+e_sn(line[caret_placement+1..-1]) - TextMate.exit_insert_snippet - end - - to_parse = StringIO.new(line[0..caret_placement]) - lexer = Lexer.new do |l| - l.add_token(:return, /\breturn\b/) - l.add_token(:nil, /\bnil\b/) - l.add_token(:control, /\b(?:if|while|for|do)(?:\s*)\(/)# /\bif|while|for|do(?:\s*)\(/) - l.add_token(:at_string, /"(?:\\.|\(^"\\\))*"/) - l.add_token(:selector, /\b[A-Za-z_0-9]+:/) - l.add_token(:identifier, /\b[A-Za-z_0-9]+\b/) - l.add_token(:bind, /(?:->)|\./) - l.add_token(:post_op, /\+\+|\-\-/) - l.add_token(:at, /@/) - l.add_token(:star, /\*/) - l.add_token(:close, /\)|\]|\}/) - l.add_token(:open, /\(|\[|\{/) - l.add_token(:operator, /[&-+\/=%!:\,\?;<>\|\~\^]/) - - l.add_token(:terminator, /;\n*|\n+/) - l.add_token(:whitespace, /\s+/) - l.add_token(:unknown, /./) - - l.input { to_parse.gets } - #l.input {STDIN.read} - end - - offset = 0 - tokenList = [] - A = Struct.new(:tt, :text, :beg) - - lexer.each do |token| - tokenList << A.new(*(token<<offset)) unless [:whitespace,:terminator].include? token[0] - offset +=token[1].length - end - if tokenList.empty? - print e_sn(line[0..caret_placement])+")$0"+e_sn(line[caret_placement+1..-1]) - TextMate.exit_insert_snippet - end - - par = ObjcParser.new(tokenList) - b, has_message = par.get_position - - if !line[caret_placement+1].nil? && line[caret_placement+1].chr == ")" - if b.nil? || par.list.empty? || par.list[-1].text == "(" - print e_sn(line[0..caret_placement])+")$0"+e_sn(line[caret_placement+2..-1]) - TextMate.exit_insert_snippet - end - end - - if b.nil? - print e_sn(line[0..caret_placement])+")$0"+e_sn(line[caret_placement+1..-1]) - elsif !has_message && (b < caret_placement ) - print e_sn(line[0..b-1]) unless b == 0 - ins = (/\s/ =~ line[caret_placement].chr ? "$0)" : " $0)") - print "(" +e_sn(line[b..caret_placement]) + ins +e_sn(line[caret_placement+1..-1]) - elsif b < caret_placement - print e_sn(line[0..b-1]) unless b == 0 - print "(" +e_sn(line[b..caret_placement]) +")$0"+e_sn(line[caret_placement+1..-1]) - else - print e_sn(line[0..caret_placement])+")$0"+e_sn(line[caret_placement+1..-1]) - end -end - - fallbackInput - line - input - selection - keyEquivalent - ) - name - Insert Matching Start Bracket - output - insertAsSnippet - scope - source.nu - string - comment - uuid - 1FA43C8F-D361-43F2-9A04-ABC36ADF7D08 - - diff --git a/Macros/Overtype ')'.tmMacro b/Macros/Overtype ')'.tmMacro new file mode 100644 index 0000000..f9e921e --- /dev/null +++ b/Macros/Overtype ')'.tmMacro @@ -0,0 +1,68 @@ + + + + + commands + + + argument + x + command + insertText: + + + command + moveLeft: + + + command + moveRightAndModifySelection: + + + command + moveRightAndModifySelection: + + + argument + + action + replaceAll + findInProjectIgnoreCase + + findString + x(\)|(.?)) + ignoreCase + + regularExpression + + replaceAllScope + selection + replaceString + (?2:\))$1 + wrapAround + + + command + findWithOptions: + + + command + moveLeft: + + + command + moveRight: + + + keyEquivalent + ) + name + Overtype ')' + scope + source.nu + scopeType + local + uuid + BC242329-75D6-4222-BC4F-43ADD863FCB9 + + diff --git a/info.plist b/info.plist index e9490d8..fc27b05 100644 --- a/info.plist +++ b/info.plist @@ -196,7 +196,6 @@ CD9FF10E-B2AD-446C-8580-B050643473CF D3B3174B-C30D-499A-95E1-62B1C541AD72 E63988FF-4701-4B7B-8877-43621D8AB749 - 1FA43C8F-D361-43F2-9A04-ABC36ADF7D08 D4C7ED85-CF4C-4C73-B7D5-A2736056DAD9 B6B1CA54-1685-4E75-9DB7-294B0CAA0BA8 3F50B291-69C1-4B58-B8AD-847776AFE7E2