2017-04-09 20 views
9

Tôi đang sử dụng Python 2's cmd module để tạo dòng lệnh cho chương trình. Mọi thứ hoạt động độc đáo miễn là tôi không thêm màu vào lời nhắc của tôi.Một số ký tự dính vào lời nhắc được tô màu của tôi bằng Python cmd

đang làm việc:

from cmd import Cmd 

class App(Cmd): 

    def __init__(self): 
     Cmd.__init__(self) 
     self.prompt = "PG ["+ (str('username'), 'green') +"@"+ str('hostname') +"]: " 

    def do_exit(self, line): 
     ''' 
     ''' 
     return True 

App().cmdloop() 

Khi tôi thay đổi mã của tôi như dưới đây, nếu tôi nhập một lệnh dài hoặc cố gắng tìm kiếm trong lịch sử lệnh, một số nhân vật dính vào cửa sổ của tôi.

đang Vấn đề:

from cmd import Cmd 

class App(Cmd): 

    def __init__(self): 
     Cmd.__init__(self) 
     self.prompt = "PG ["+ self.colorize(str('username'), 'green') +"@"+ str('hostname') +"]: " 

    colorcodes = {'green':{True:'\x1b[32m',False:'\x1b[39m'}} 


    def colorize(self, val, color): 
     return self.colorcodes[color][True] + val + self.colorcodes[color][False] 

    def do_exit(self, line): 
     ''' 
     ''' 
     return True 

App().cmdloop() 

Bạn có thể thấy vấn đề này trong asciicasts. Vấn đề cũng tồn tại với cmd2 module.

+0

@cxw Có, Đó là Python2 và 'cmd' nhưng vấn đề này tồn tại trong' cmd2' quá! – RaminNietzsche

Trả lời

6

Chỉ cần thêm đánh dấu để mã màu của bạn:

colorcodes = {'green':{True:'\x01\x1b[32m\x02',False:'\x01\x1b[39m\x02'}} 
            # ^^^^  ^^^^   ^^^^  ^^^^ 

Trong asciicast của bạn, bạn có vấn đề khi bạn rời khỏi chế độ i-tìm kiếm và nhanh chóng được in lại. Đó là bởi vì Python không biết rằng các ký tự thoát không thực sự chiếm không gian trên màn hình. Đặt \x01 trước mỗi trình tự thoát và \x02 sau mỗi trình tự thoát, yêu cầu Python giả định các ký tự đó chiếm không gian và do đó lời nhắc sẽ được in lại chính xác.

Đây là giải pháp tương tự như trong this answer, có vấn đề tương ứng trong ngữ cảnh khác. Có một open issue để đề cập đến điều này trong tài liệu hướng dẫn đọc Python, nhưng tôi không thấy rằng nó chưa được thực hiện.

Tôi đã thử nghiệm các giá trị ở trên colorcodes với Python 2.7.12 trên Cygwin, chạy bằng mintty. Trong lời nhắc, username in màu xanh lục và mọi thứ khác được in mặc định (màu xám nhạt). Tôi đã sử dụng mô-đun cmd hệ thống tiêu chuẩn, không phảicmd2 (mà bạn đã liên kết).

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