From 64dc21830aa60dc757df48c715a73f704eed43e0 Mon Sep 17 00:00:00 2001 From: aycabta Date: Mon, 27 May 2019 05:01:04 +0900 Subject: [PATCH] Remove \1 and \2 that escape CSI before render --- lib/reline/line_editor.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index af634da650..f4e012688e 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -81,6 +81,7 @@ class Reline::LineEditor MenuInfo = Struct.new('MenuInfo', :target, :list) CSI_REGEXP = /\e\[(?:\d+;?)*[ABCDEFGHJKSTfminsuhl]/ + NON_PRINTING_ESCAPES = "\1\2" def initialize(config) @config = config @@ -164,6 +165,8 @@ class Reline::LineEditor lines = [String.new(encoding: @encoding)] height = 1 width = 0 + prompt = prompt.tr(NON_PRINTING_ESCAPES, '') + str = str.tr(NON_PRINTING_ESCAPES, '') rest = "#{prompt}#{str}".encode(Encoding::UTF_8) loop do break if rest.empty? @@ -803,6 +806,7 @@ class Reline::LineEditor private def calculate_width(str, allow_csi = false) if allow_csi str = str.gsub(CSI_REGEXP, '') + str = str.tr(NON_PRINTING_ESCAPES, '') end str.encode(Encoding::UTF_8).grapheme_clusters.inject(0) { |width, gc| width + Reline::Unicode.get_mbchar_width(gc)