2012-01-10 27 views
6

Tôi đang làm việc với việc tạo màu cho một số đầu ra bằng cách sử dụng readline trong Ruby, nhưng tôi không có bất kỳ may mắn nào khi gói hàng hoạt động bình thường. Ví dụ:Chia nhỏ kết quả đầu ra được chia vạch với đường dây đọc

"\e[01;32mThis prompt is green and bold\e[00m > " 

Kết quả mong muốn sẽ là:

This prompt is green and bold > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

Những gì tôi thực sự nhận được là:

aaaaaaaaaaa is green and bold > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

Nếu tôi loại bỏ các mã màu, dòng gói hoạt động chính xác. Tôi biết với bash, điều này có thể xảy ra nếu các mã màu không chính xác chấm dứt, nhưng tôi đã thử tất cả mọi thứ tôi có thể nghĩ đến, bao gồm một vài đá quý khác nhau, và hành vi là như nhau. Nó cũng xảy ra trên nhiều hệ thống với các phiên bản khác nhau của Readline. Dự án cụ thể này đang sử dụng rb-readline như trái ngược với C readline.

+1

Bạn đã thử sử dụng https://rubygems.org/gems/colored để tô màu đầu ra của mình chưa? – Maher4Ever

+0

Vâng, tôi đã thử một cái cũng như tô màu. Đầu ra hoạt động tốt, nhưng khi sử dụng nó với một dấu nhắc readline, nó phá vỡ dòng gói. – Eugene

Trả lời

5

Tôi luôn luôn mở rộng chuỗi này khi tôi cần phải tô màu chuỗi cho bảng điều khiển. Sự cố trong mã của bạn có vẻ là trình kết thúc, chỉ nên có một số không "\ e [0m".

# encoding: utf-8 
class String 
    def console_red;   colorize(self, "\e[1m\e[31m"); end 
    def console_dark_red;  colorize(self, "\e[31m");  end 
    def console_green;  colorize(self, "\e[1m\e[32m"); end 
    def console_dark_green; colorize(self, "\e[32m");  end 
    def console_yellow;  colorize(self, "\e[1m\e[33m"); end 
    def console_dark_yellow; colorize(self, "\e[33m");  end 
    def console_blue;   colorize(self, "\e[1m\e[34m"); end 
    def console_dark_blue; colorize(self, "\e[34m");  end 
    def console_purple;  colorize(self, "\e[1m\e[35m"); end 

    def console_def;   colorize(self, "\e[1m"); end 
    def console_bold;   colorize(self, "\e[1m"); end 
    def console_blink;  colorize(self, "\e[5m"); end 

    def colorize(text, color_code) "#{color_code}#{text}\e[0m" end 
end 

puts "foo\nbar".console_dark_red 
+0

Cảm ơn. 2 0 hoặc 1, không quan trọng, nó cũng làm như vậy. Điều này trông giống như một lỗi trong readline với tôi. – Eugene

+0

Hm, bạn có "\ e [01; 32m" lúc đầu tôi có "\ e [1m \ e [32m". – sunkencity

+0

Thanh toán điều này: http://hintsforums.macworld.com/showthread.php?t=17068 dường như bạn có thể thêm các lần thoát khác để làm cho trình bao bỏ qua các mã màu khi tính độ dài dòng. – sunkencity

3

Vấn đề này không phải là ruby ​​cụ thể - nó cũng xuất hiện trong bash. Nếu bạn đeo vỏ bash

PS1="\e[01;32mThis prompt is green and bold\e[00m > " 

bạn sẽ thấy kết quả tương tự như trên. Nhưng nếu bạn đặt trong

PS1="\[\e[01;32m\]This prompt is green and bold\[\e[00m\] > " 

bạn sẽ nhận được kết quả mong muốn.

+0

BTW, nếu bạn tò mò về cách thức hoạt động của nó: có vẻ như \\ [blah \\] nói với bash/readline/bất cứ điều gì, với mục đích ước tính số ký tự trong dòng, bạn nên bỏ qua bất kỳ thứ gì giữa \\ [và \\]. Đối với một thiết bị đầu cuối cụ thể, số lượng ký tự trong một dòng được đoán/tính toán/đánh giá và chỉ đẩy xuống dòng tiếp theo khi tất cả các ký tự không bị bỏ qua đã được lấp đầy. – user208769

+0

Tôi đồng ý rằng điều này sẽ là khắc phục, nhưng khi tôi làm điều này, đầu ra của tôi sẽ biến thành: "[] Lời nhắc này có màu xanh lá cây và đậm []>" và dòng gói vẫn là một vấn đề. Điều này có thể được chứng minh bằng tập lệnh thử nghiệm đơn giản tại đây: https: //gist.github.com/1622119 – Eugene

+4

"Bản bash cụ thể \ [và \] thực tế được dịch sang \ 001 và \ 002 ..." - [câu trả lời từ SuperUser] (http://superuser.com/questions/301353/escape- không in-ký tự-in-a-chức năng-cho-một-bash-nhắc). –

18

Ok, sunkencity được dấu kiểm vì tôi đã kết thúc sử dụng hầu hết các giải pháp của mình, nhưng tôi đã phải sửa đổi nó như sau:

# encoding: utf-8 
class String 
    def console_red;   colorize(self, "\001\e[1m\e[31m\002"); end 
    def console_dark_red;  colorize(self, "\001\e[31m\002");  end 
    def console_green;  colorize(self, "\001\e[1m\e[32m\002"); end 
    def console_dark_green; colorize(self, "\001\e[32m\002");  end 
    def console_yellow;  colorize(self, "\001\e[1m\e[33m\002"); end 
    def console_dark_yellow; colorize(self, "\001\e[33m\002");  end 
    def console_blue;   colorize(self, "\001\e[1m\e[34m\002"); end 
    def console_dark_blue; colorize(self, "\001\e[34m\002");  end 
    def console_purple;  colorize(self, "\001\e[1m\e[35m\002"); end 

    def console_def;   colorize(self, "\001\e[1m\002"); end 
    def console_bold;   colorize(self, "\001\e[1m\002"); end 
    def console_blink;  colorize(self, "\001\e[5m\002"); end 

    def colorize(text, color_code) "#{color_code}#{text}\001\e[0m\002" end 
end 

Mỗi chuỗi cần được bọc trong \ 001 .. \ 002 để Readline biết bỏ qua các ký tự không in.

+0

Tuyệt vời, cảm ơn! Đã khắc phục sự cố nhắc Pry qua https://github.com/pry/pry/issues/493#issuecomment-8799007 –

Các vấn đề liên quan