From c616e86a00374ab56fcc1a379e48b3a02ea9c95a Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 15 Oct 2015 19:23:50 +0200 Subject: [PATCH] Take into account half width chars as well --- spec/display-buffer-spec.coffee | 9 +++++++++ src/display-buffer.coffee | 11 ++++++++++- src/text-editor.coffee | 6 ++++-- src/token-iterator.coffee | 5 ++++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/spec/display-buffer-spec.coffee b/spec/display-buffer-spec.coffee index aafca68fe..ad1dba691 100644 --- a/spec/display-buffer-spec.coffee +++ b/spec/display-buffer-spec.coffee @@ -70,6 +70,15 @@ describe "DisplayBuffer", -> expect(displayBuffer.tokenizedLineForScreenRow(2).text).toBe("们的板作为우리포럼hello ") expect(displayBuffer.tokenizedLineForScreenRow(3).text).toBe("world this is a pretty long latin line") + describe "when there are half width characters", -> + it "takes them into account when finding the soft wrap column", -> + displayBuffer.setDefaultCharWidth(1, 0, 5) + buffer.setText("abcᆰᆱᆲネヌネノハヒフヒフヌᄡ○○○hello world this is a pretty long line") + + expect(displayBuffer.tokenizedLineForScreenRow(0).text).toBe("abcᆰᆱᆲネヌネノハヒ") + expect(displayBuffer.tokenizedLineForScreenRow(1).text).toBe("フヒフヌᄡ○○○hello ") + expect(displayBuffer.tokenizedLineForScreenRow(2).text).toBe("world this is a pretty long line") + describe "when editor.softWrapAtPreferredLineLength is set", -> it "uses the preferred line length as the soft wrap column when it is less than the configured soft wrap column", -> atom.config.set('editor.preferredLineLength', 100) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 2becff4e4..50e4741c8 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -189,12 +189,19 @@ class DisplayBuffer extends Model getLineHeightInPixels: -> @lineHeightInPixels setLineHeightInPixels: (@lineHeightInPixels) -> @lineHeightInPixels + getHalfWidthCharWidth: -> @halfWidthCharWidth + getDoubleWidthCharWidth: -> @doubleWidthCharWidth + getDefaultCharWidth: -> @defaultCharWidth - setDefaultCharWidth: (defaultCharWidth, doubleWidthCharWidth=defaultCharWidth) -> + + setDefaultCharWidth: (defaultCharWidth, doubleWidthCharWidth, halfWidthCharWidth) -> + doubleWidthCharWidth ?= defaultCharWidth + halfWidthCharWidth ?= defaultCharWidth if defaultCharWidth isnt @defaultCharWidth or doubleWidthCharWidth isnt @doubleWidthCharWidth @defaultCharWidth = defaultCharWidth @doubleWidthCharWidth = doubleWidthCharWidth + @halfWidthCharWidth = halfWidthCharWidth @updateWrappedScreenLines() if @isSoftWrapped() and @getEditorWidthInChars()? defaultCharWidth @@ -281,6 +288,8 @@ class DisplayBuffer extends Model if iterator.hasDoubleWidthCharacterAt(textIndex) charWidth = @getDoubleWidthCharWidth() + else if iterator.hasHalfWidthCharacterAt(textIndex) + charWidth = @getHalfWidthCharWidth() else charWidth = @getDefaultCharWidth() diff --git a/src/text-editor.coffee b/src/text-editor.coffee index e4b0c8a37..58d590687 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -2976,11 +2976,13 @@ class TextEditor extends Model getLineHeightInPixels: -> @displayBuffer.getLineHeightInPixels() setLineHeightInPixels: (lineHeightInPixels) -> @displayBuffer.setLineHeightInPixels(lineHeightInPixels) + getHalfWidthCharWidth: -> @displayBuffer.getHalfWidthCharWidth() + getDoubleWidthCharWidth: -> @displayBuffer.getDoubleWidthCharWidth() getDefaultCharWidth: -> @displayBuffer.getDefaultCharWidth() - setDefaultCharWidth: (defaultCharWidth, doubleWidthCharWidth=defaultCharWidth) -> - @displayBuffer.setDefaultCharWidth(defaultCharWidth, doubleWidthCharWidth) + setDefaultCharWidth: (defaultCharWidth, doubleWidthCharWidth, halfWidthCharWidth) -> + @displayBuffer.setDefaultCharWidth(defaultCharWidth, doubleWidthCharWidth, halfWidthCharWidth) setHeight: (height, reentrant=false) -> if reentrant diff --git a/src/token-iterator.coffee b/src/token-iterator.coffee index 4c4686635..9a5b63892 100644 --- a/src/token-iterator.coffee +++ b/src/token-iterator.coffee @@ -1,5 +1,5 @@ {SoftTab, HardTab, PairedCharacter, SoftWrapIndent} = require './special-token-symbols' -{isDoubleWidthCharacter} = require './text-utils' +{isDoubleWidthCharacter, isHalfWidthCharacter} = require './text-utils' module.exports = class TokenIterator @@ -86,5 +86,8 @@ class TokenIterator hasDoubleWidthCharacterAt: (charIndex) -> isDoubleWidthCharacter(@getText()[charIndex]) + hasHalfWidthCharacterAt: (charIndex) -> + isHalfWidthCharacter(@getText()[charIndex]) + isAtomic: -> @isSoftTab() or @isHardTab() or @isSoftWrapIndentation() or @isPairedCharacter()