From 60ca800d4fc410ea9d49ef24dfb80577d4183f15 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Sun, 26 Mar 2023 00:01:30 +0900 Subject: [ruby/reline] Fix split_by_width to retain color sequences (https://github.com/ruby/reline/pull/490) * Fix split_by_width to retain color sequences * Add OSC escape sequence testcase of Reline::Unicode.split_by_width --- lib/reline/unicode.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'lib/reline/unicode.rb') diff --git a/lib/reline/unicode.rb b/lib/reline/unicode.rb index 6000c9f82a..de22d08581 100644 --- a/lib/reline/unicode.rb +++ b/lib/reline/unicode.rb @@ -160,16 +160,21 @@ class Reline::Unicode width = 0 rest = str.encode(Encoding::UTF_8) in_zero_width = false + seq = String.new(encoding: encoding) rest.scan(WIDTH_SCANNER) do |gc| case when gc[NON_PRINTING_START_INDEX] in_zero_width = true + lines.last << NON_PRINTING_START when gc[NON_PRINTING_END_INDEX] in_zero_width = false + lines.last << NON_PRINTING_END when gc[CSI_REGEXP_INDEX] lines.last << gc[CSI_REGEXP_INDEX] + seq << gc[CSI_REGEXP_INDEX] when gc[OSC_REGEXP_INDEX] lines.last << gc[OSC_REGEXP_INDEX] + seq << gc[OSC_REGEXP_INDEX] when gc[GRAPHEME_CLUSTER_INDEX] gc = gc[GRAPHEME_CLUSTER_INDEX] unless in_zero_width @@ -177,7 +182,7 @@ class Reline::Unicode if (width += mbchar_width) > max_width width = mbchar_width lines << nil - lines << String.new(encoding: encoding) + lines << seq.dup height += 1 end end -- cgit v1.2.3