2017-04-09 5 views
9

私はPython 2's cmd moduleを使ってプログラムのコマンドラインを作っています。私は私のプロンプトに色を追加しない限り、すべてうまく動作します。いくつかの文字はPythonの私の色付きプロンプトに固執しますcmd

の作業コード:私は長いコマンドを入力するか、コマンド履歴に検索しようとした場合、私は、以下のように自分のコードを変更

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() 

は、一部の文字が私のプロンプトに固執します。

問題コード:

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() 

あなたはasciicastsでこの問題を見ることができます。この問題はcmd2 moduleにも存在します。

+0

@cxwはい、Python2と 'cmd'ですが、この問題は' cmd2'でもあります! – RaminNietzsche

答えて

6

ちょうどあなたのカラーコードにマーカーを追加します。あなたは、I-検索モードを終了し、プロンプトが再印刷されたときに

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

をごasciicastでは、あなたが問題を抱えています。これは、エスケープ文字が実際に画面上のスペースを占めていないことをPythonが認識していないためです。それぞれのエスケープシーケンスの前に\x01と各エスケープシーケンスの後に\x02を置くと、それらの文字がスペースを取らないと仮定してプロンプトが正しく再印刷されると仮定します。

これは、異なる状況で対応する問題を抱えていたthis answerと同じ解決策です。 Pythonのreadlineのドキュメントでこれを言及するのはopen issueですが、まだ完了していません。

私は上記のcolorcodesの値をCygwin上のPython 2.7.12でminttyで実行してテストしました。プロンプトでusernameが緑色に印刷され、それ以外のものはすべてデフォルト(明るい灰色)に印刷されました。私は標準システムcmdモジュールではなく、cmd2(リンクしています)を使用しました。

関連する問題