X-Git-Url: https://git.phdru.name/?p=dotfiles.git;a=blobdiff_plain;f=lib%2Fpython%2Finit.py;h=eb832c1b77f640d8899815d3633754bc1ebcf1d2;hp=a5e63231b5cf4fa4445a60f71d9e8f924a2649e6;hb=2098b777e6a193f50d3ac78d8f938a548ad66c50;hpb=058002bd47ad258567d8027e645ac60d59b2bda8 diff --git a/lib/python/init.py b/lib/python/init.py index a5e6323..eb832c1 100644 --- a/lib/python/init.py +++ b/lib/python/init.py @@ -9,7 +9,10 @@ def init(): - import __builtin__ + try: + import __builtin__ as builtins + except ImportError: + import builtins import os import sys @@ -33,23 +36,38 @@ def init(): or os.path.expanduser('~/.inputrc') readline.read_init_file(initfile) - histfile = os.path.expanduser('~/.python-history') - try: - readline.read_history_file(histfile) - except IOError: - pass # No such file + # if 'libedit' in readline.__doc__: + # readline.parse_and_bind("bind ^I rl_complete") + # else: + # readline.parse_and_bind("tab: complete") + + histfiles = ['~/.python_history'] + # if 'VIRTUAL_ENV' in os.environ: + # histfiles.append('$VIRTUAL_ENV/.python_history') + for histfile in histfiles: + try: + histfile = os.path.expandvars(histfile) + histfile = os.path.expanduser(histfile) + readline.read_history_file(histfile) + except IOError: + pass # No such file def savehist(): - histfilesize = os.environ.get('HISTFILESIZE') \ - or os.environ.get('HISTSIZE') - if histfilesize: + histsize = os.environ.get('HISTSIZE') + if histsize: try: - histfilesize = int(histfilesize) + histsize = int(histsize) except ValueError: pass else: - readline.set_history_length(histfilesize) - readline.write_history_file(histfile) + readline.set_history_length(histsize) + histfile = histfiles[-1] + histfile = os.path.expandvars(histfile) + histfile = os.path.expanduser(histfile) + try: + readline.write_history_file(histfile) + except IOError: + pass import atexit atexit.register(savehist) @@ -62,18 +80,24 @@ def init(): # terminal term = os.environ.get('TERM', '') - if 'linux' in term: - background = 'dark' + for _term in ['cygwin', 'linux', 'putty']: + if _term in term: + background = 'dark' + break else: background = os.environ.get('BACKGROUND', 'light').lower() # From Randall Hopper: # https://mail.python.org/pipermail/python-list/2001-March/112696.html - for _term in ['linux', 'rxvt', 'screen', 'term', 'vt100']: - if _term not in term: - continue + _term_found = False + for _term in ['cygwin', 'linux', 'putty', 'rxvt', + 'screen', 'term', 'vt100']: + if _term in term: + _term_found = True + break + if _term_found: if background == 'dark': ps1_color = '3' # yellow stdout_color = '7' # bold white @@ -105,7 +129,21 @@ def init(): sys.stdout = ColoredFile(sys.stdout, '\033[1;3%sm' % stdout_color) sys.stderr = ColoredFile(sys.stderr, '\033[31m') # red - break + def myinput(prompt=None): + save_stdout = sys.stdout + sys.stdout = sys.__stdout__ + result = builtin_input(prompt) + sys.stdout = save_stdout + return result + + try: + builtins.raw_input + except AttributeError: # PY3 + builtin_input = builtins.input + builtins.input = myinput + else: + builtin_input = builtins.raw_input + builtins.raw_input = myinput try: import locale @@ -117,58 +155,85 @@ def init(): except (ImportError, locale.Error): pass # no locale support or unsupported locale - # set displayhook + # set displayhook and excepthook from pprint import pprint + from traceback import format_exception, print_exc + pager = os.environ.get("PAGER") or 'more' + # if your pager is 'less', options '-F' and '-R' must be passed to it, + # and option '-X' is very much recommended + if pager == 'less': + less = os.environ.get("LESS") or '' + for opt in 'X', 'R', 'F': + if opt not in less: + less = opt + less + os.environ["LESS"] = less + class BasePager: def write(self, value): - self.stdin.write(value) + self.stdout.write(value) - def pprint(self, value): - pprint(value, stream=self.stdin) + if _term_found: + def pprint(self, value): + pprint(value, + stream=ColoredFile(self.stdout, + '\033[1;3%sm' % stdout_color)) def close(self): - self.stdin.close() + self.stdout.close() try: from subprocess import Popen, PIPE except ImportError: class Pager(BasePager): def __init__(self): - self.pipe = Popen(pager, shell=True, stdin=PIPE) - self.stdin = self.pipe.stdin + self.stdout = os.popen(pager, 'w') + else: + class Pager(BasePager): + def __init__(self): + self.pipe = Popen(pager, shell=True, stdin=PIPE, + universal_newlines=True) + self.stdout = self.pipe.stdin def close(self): BasePager.close(self) self.pipe.wait() - else: - class Pager(BasePager): - def __init__(self): - self.stdin = os.popen(pager, 'w') def displayhook(value): if value is not None: - __builtin__._ = value + builtins._ = value pager = Pager() - pager.pprint(value) + try: + pager.pprint(value) + except: # noqa + if _term_found: + pager.stdout = ColoredFile(pager.stdout, '\033[31m') # red + print_exc(file=pager) pager.close() sys.displayhook = displayhook - from traceback import format_exception - def excepthook(etype, evalue, etraceback): lines = format_exception(etype, evalue, etraceback) pager = Pager() + if _term_found: + pager.stdout = ColoredFile(pager.stdout, '\033[31m') # red for line in lines: - pager.write( - '\033[31m' + line.rstrip('\n') + '\033[0m\n') # red, reset + pager.write(line) pager.close() sys.excepthook = excepthook + # try: + # import cgitb + # except ImportError: + # pass + # else: + # # cgitb.enable() overrides sys.excepthook + # cgitb.enable(format='text') + # From Thomas Heller: # https://mail.python.org/pipermail/python-list/2001-April/099020.html @@ -212,8 +277,8 @@ def init(): path = os.path.expanduser(os.path.expandvars(path or '~')) os.chdir(path) - __builtin__.ls = DirLister() - __builtin__.cd = DirChanger() + builtins.ls = DirLister() + builtins.cd = DirChanger() # print working directory @@ -224,7 +289,7 @@ def init(): def __call__(self): return repr(self) - __builtin__.pwd = Pwd() + builtins.pwd = Pwd() # exit REPL with 'exit', 'quit' or simple 'x' @@ -235,11 +300,7 @@ def init(): def __call__(self, msg=None): sys.exit(msg) - __builtin__.x = _Exit() - - # In Python 2.5+ exit and quit are objects - if isinstance(__builtin__.exit, str): - __builtin__.exit = __builtin__.quit = x # noqa: x is defined as _Exit + builtins.x = _Exit() # print conten of a file @@ -251,9 +312,9 @@ def init(): fp = open(filename, 'rU') text = fp.read() fp.close() - print text + print(text) - __builtin__.cat = _Cat() + builtins.cat = _Cat() # call shell @@ -265,7 +326,7 @@ def init(): def __call__(self, cmdline): os.system(cmdline) - __builtin__.sh = _Sh() + builtins.sh = _Sh() # paginate a file @@ -276,7 +337,7 @@ def init(): def __call__(self, filename): os.system("%s '%s'" % (pager, filename.replace("'", '"\'"'))) - __builtin__.pager = _Pager() + builtins.pager = _Pager() # edit a file @@ -289,7 +350,7 @@ def init(): or os.environ.get("EDITOR") or 'vi' os.system("%s '%s'" % (editor, filename.replace("'", '"\'"'))) - __builtin__.edit = __builtin__.editor = _Editor() + builtins.edit = builtins.editor = _Editor() init()