samba
8/27/2015 - 5:42 AM

Python RC with Color Prompt :)

Python RC with Color Prompt :)

# ~/.pythonrc

import sys

# enable syntax completion via tab
try:
    import readline
except ImportError:
    print "Module readline not available."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")
    readline.parse_and_bind("bind ^I rl_complete") # for Mac OS X

try:
    import pprint
except:
    pass

import re
import sys
import os
import math
import random
import uuid
import hashlib
import datetime
import time
import getpass
import socket



def concat(*props):
    return ';'.join([ str(i) for i in props ])




class Prompt(object):

    CTRL_BASE = '\001\033[%sm\002'
    CTRL_RESET = '\001\033[0m\002'

    RE_PARSER_COLOR = re.compile(r'<([a-zA-Z]+)>')
    RE_PARSER_ATTRIB = re.compile('\{([a-zA-Z\_\-]+)\}')

    CODE_BOLD = 1
    CODE_DIM = 2
    CODE_UNDERLINE = 4
    CODE_BLINK = 5
    CODE_INVERT = 7
    CODE_HIDDEN = 8

    CODE_RESET_ALL = 0
    CODE_RESET_OFFSET = 20
    CODE_BACKGROUND_OFFSET = 10
    
    COLOR_DEFAULT = 39
    COLOR_BLACK = 30
    COLOR_RED = 31
    COLOR_GREEN = 32
    COLOR_YELLOW = 33
    COLOR_BLUE = 34
    COLOR_MAGENTA = 35
    COLOR_CYAN = 36
    COLOR_GRAY_LIGHT = 37
    COLOR_GRAY_DARK = 90
    COLOR_RED_LIGHT = 91
    COLOR_GREEN_LIGHT = 92
    COLOR_YELLOW_LIGHT = 93
    COLOR_BLUE_LIGHT = 94
    COLOR_MAGENTA_LIGHT = 95
    COLOR_CYAN_LIGHT = 96
    COLOR_WHITE = 97

    KEYWORDS = {
        "ERROR": (CTRL_BASE % (concat(COLOR_RED, CODE_BOLD, CODE_BLINK))),
        "red": (CTRL_BASE % (COLOR_RED)),
        "cyan": (CTRL_BASE % (COLOR_CYAN)),
        "yellow": (CTRL_BASE % (COLOR_YELLOW)),
        "green": (CTRL_BASE % (COLOR_GREEN)),
        "blue": (CTRL_BASE % (COLOR_BLUE)),
        "lightblue": (CTRL_BASE % (COLOR_BLUE_LIGHT)),
        "boldlightblue": (CTRL_BASE % (concat(COLOR_BLUE_LIGHT, CODE_BOLD))),
        "reset": (CTRL_RESET)
    }

    
    @classmethod
    def colorize(cls, text):
        return cls.RE_PARSER_COLOR.sub(lambda m: cls.KEYWORDS.get(m.group(1), ''), text)


    @property
    def user(self):
        return getpass.getuser()

    @property
    def host(self):
        return socket.gethostname()

    @property
    def path(self):
        rel = os.path.relpath(os.curdir, os.path.expanduser('~'))
        if rel.startswith('..'):
            return os.path.abspath(os.curdir)
        elif rel == '.':
            return '~'
        else:
            return (rel or '~')

    @property
    def time(self):
        return datetime.datetime.now().time().strftime('%H:%M:%S')
   
    @property
    def pyversion(self):
        info = sys.version_info
        return '%d.%d' % info[0:2]

    def __init__(self, prompt_format):
        self.prompt_format = prompt_format
   
    def __str__(self):
        basetext = self.RE_PARSER_ATTRIB.sub(lambda m: getattr(self, m.group(1), ''), self.prompt_format)
        return  self.colorize(basetext) + self.CTRL_RESET


print Prompt.colorize('You are in <cyan>python.<reset>\n') + Prompt.CTRL_RESET

sys.ps1 = Prompt("<cyan>python<reset><red>{pyversion} <yellow>{time} <green>{user}<reset>@<yellow>{host} <boldlightblue>{path}<reset> > ")
sys.ps2 = '<yellow>..><reset> '

#sys.ps1 = '\001\033[96m\002py> \001\033[0m\002'
#sys.ps2 = '\001\033[96m\002..> \001\033[0m\002'


# vim: ft=python