diff --git a/cli/Sources/Noora/Utilities/TerminalText+DisplayWidth.swift b/cli/Sources/Noora/Utilities/TerminalText+DisplayWidth.swift index 74949c48..30fdac9f 100644 --- a/cli/Sources/Noora/Utilities/TerminalText+DisplayWidth.swift +++ b/cli/Sources/Noora/Utilities/TerminalText+DisplayWidth.swift @@ -10,7 +10,10 @@ extension Character { /// There is no standard for this, but it seems like most terminals treat /// emojis and ideographs as double width. public var displayWidth: Int { - if unicodeScalars.contains(where: \.properties.isEmojiPresentation) { + let hasEmojiPresentation = unicodeScalars.contains(where: \.properties.isEmojiPresentation) + let hasEmojiVariationSelector = unicodeScalars.contains { $0.value == 0xFE0F } + + if hasEmojiPresentation || hasEmojiVariationSelector { return 2 } else if unicodeScalars.contains(where: \.properties.isIdeographic) { return 2 diff --git a/cli/Tests/NooraTests/Utilities/DisplayWidthTests.swift b/cli/Tests/NooraTests/Utilities/DisplayWidthTests.swift index 4ccb3c38..e9a7a919 100644 --- a/cli/Tests/NooraTests/Utilities/DisplayWidthTests.swift +++ b/cli/Tests/NooraTests/Utilities/DisplayWidthTests.swift @@ -6,6 +6,7 @@ struct DisplayWidthTests { @Test func measures_common_widths() { #expect("abc".displayWidth == 3) #expect("βœ“".displayWidth == 1) + #expect("βœ“οΈ".displayWidth == 2) #expect("πŸ˜€".displayWidth == 2) #expect("πŸ‡ΊπŸ‡Έ".displayWidth == 2) #expect("η•Œ".displayWidth == 2)