diff --git a/src/token-iterator.coffee b/src/token-iterator.coffee index a8b9db59e..800f76d03 100644 --- a/src/token-iterator.coffee +++ b/src/token-iterator.coffee @@ -9,8 +9,8 @@ class TokenIterator reset: (@line) -> @index = null - @bufferStart = 0 - @bufferEnd = 0 + @bufferStart = @line.startBufferColumn + @bufferEnd = @bufferStart @screenStart = 0 @screenEnd = 0 @scopes = @line.openScopes.map (id) -> atom.grammars.scopeForId(id) diff --git a/src/tokenized-line.coffee b/src/tokenized-line.coffee index de1c45e96..2183ac349 100644 --- a/src/tokenized-line.coffee +++ b/src/tokenized-line.coffee @@ -227,58 +227,30 @@ class TokenizedLine column screenColumnForBufferColumn: (targetBufferColumn, options) -> - bufferColumn = @startBufferColumn - screenColumn = 0 - for tag, index in @tags - if tag > 0 - switch @specialTokens[index] - when HardTab - bufferDelta = 1 - screenDelta = tag - when SoftWrapIndent - bufferDelta = 0 - screenDelta = tag - else - bufferDelta = screenDelta = tag - - nextBufferColumn = bufferColumn + bufferDelta - if nextBufferColumn > targetBufferColumn - overshoot = targetBufferColumn - bufferColumn - bufferColumn += overshoot - screenColumn += Math.min(screenDelta, overshoot) - break - else - bufferColumn = nextBufferColumn - screenColumn += screenDelta - - screenColumn + iterator = TokenIterator.instance.reset(this) + while iterator.next() + tokenBufferStart = iterator.getBufferStart() + tokenBufferEnd = iterator.getBufferEnd() + if tokenBufferStart <= targetBufferColumn < tokenBufferEnd + overshoot = targetBufferColumn - tokenBufferStart + return Math.min( + iterator.getScreenStart() + overshoot, + iterator.getScreenEnd() + ) + iterator.getScreenEnd() bufferColumnForScreenColumn: (targetScreenColumn) -> - bufferColumn = @startBufferColumn - screenColumn = 0 - for tag, index in @tags - if tag > 0 - switch @specialTokens[index] - when HardTab - bufferDelta = 1 - screenDelta = tag - when SoftWrapIndent - bufferDelta = 0 - screenDelta = tag - else - bufferDelta = screenDelta = tag - - nextScreenColumn = screenColumn + screenDelta - if nextScreenColumn > targetScreenColumn - overshoot = targetScreenColumn - screenColumn - screenColumn += overshoot - bufferColumn += Math.min(bufferDelta, overshoot) - break - else - screenColumn = nextScreenColumn - bufferColumn += bufferDelta - - bufferColumn + iterator = TokenIterator.instance.reset(this) + while iterator.next() + tokenScreenStart = iterator.getScreenStart() + tokenScreenEnd = iterator.getScreenEnd() + if tokenScreenStart <= targetScreenColumn < tokenScreenEnd + overshoot = targetScreenColumn - tokenScreenStart + return Math.min( + iterator.getBufferStart() + overshoot, + iterator.getBufferEnd() + ) + iterator.getBufferEnd() getMaxScreenColumn: -> if @fold