 
   getPattern: ->
     @pattern
+
+  getCharacterRangeInformation: (char, point) ->
+    pattern = ///#{_.escapeRegExp(char)}///g
+    total = scanBufferRow(@editor, point.row, pattern).filter (range) =>
+      not isEscapedCharRange(@editor, range)
+    [left, right] = _.partition(total, ({start}) -> start.isLessThan(point))
+    balanced = (total.length % 2) is 0
+    {total, left, right, balanced}
+
+  filterEvent: ->
+    true
 
   scanPair: (which, direction, from, fn) ->
     switch direction

    @quoteChar = pair[0]
    @pattern = ///(#{_.escapeRegExp(pair[0])})///g

  getCharacterRangeInformation: (char, point) ->
    pattern = ///#{_.escapeRegExp(char)}///g
    total = scanBufferRow(@editor, point.row, pattern).filter (range) =>
      not isEscapedCharRange(@editor, range)
    [left, right] = _.partition(total, ({start}) -> start.isLessThan(point))
    {total, left, right}

  find: (from, options) ->
    # HACK: Cant determine open/close from quote char itself
    # So preset open/close state to get desiable result.
    {total, left, right} = @getCharacterRangeInformation(@quoteChar, from)
    quoteIsBalanced = (total.length % 2) is 0
    onQuoteChar = right[0]?.start.isEqual(from) # from point is on quote char
    if quoteIsBalanced and onQuoteChar
      nextQuoteIsOpen = left.length % 2 is 0
    else
      nextQuoteIsOpen = left.length is 0

        event.stop()
        return

      return if isEscapedCharRange(@editor, event.range)
      if @filterEvent(event)
        fn(event)

  findPair: (which, direction, from, fn) ->
    stack = []
