]> git.phdru.name Git - dotfiles.git/blobdiff - lib/python/init.py
Rename *-history to *_history
[dotfiles.git] / lib / python / init.py
index 15bcb32596c22a22b8768f215dc208a7117db1bd..1313c500d7b00518e14a6bf40e7ee5149a24f526 100644 (file)
@@ -9,7 +9,10 @@
 
 
 def init():
-    import __builtin__
+    try:
+        import __builtin__ as builtins
+    except ImportError:
+        import builtins
     import os
     import sys
 
@@ -33,7 +36,7 @@ def init():
                 or os.path.expanduser('~/.inputrc')
             readline.read_init_file(initfile)
 
-            histfile = os.path.expanduser('~/.python-history')
+            histfile = os.path.expanduser('~/.python_history')
             try:
                 readline.read_history_file(histfile)
             except IOError:
@@ -114,16 +117,28 @@ def init():
     else:
         try:
             locale.setlocale(locale.LC_ALL, '')
-
         except (ImportError, locale.Error):
             pass  # no locale support or unsupported locale
 
-    # set displayhook
+    # set displayhook and excepthook
 
     from pprint import pprint
+    pager = os.environ.get("PAGER") or 'more'
 
-    class BasePPrintPager:
-        def pipe(self, value):
+    # 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)
+
+        def pprint(self, value):
             pprint(value, stream=self.stdin)
 
         def close(self):
@@ -132,36 +147,48 @@ def init():
     try:
         from subprocess import Popen, PIPE
     except ImportError:
-        class PPrintPager(BasePPrintPager):
+        class Pager(BasePager):
             def __init__(self):
                 self.pipe = Popen(pager, shell=True, stdin=PIPE)
                 self.stdin = self.pipe.stdin
 
             def close(self):
-                BasePPrintPager.close(self)
+                BasePager.close(self)
                 self.pipe.wait()
     else:
-        class PPrintPager(BasePPrintPager):
+        class Pager(BasePager):
             def __init__(self):
                 self.stdin = os.popen(pager, 'w')
-    pager = os.environ.get("PAGER") or 'more'
 
     def displayhook(value):
         if value is not None:
-            __builtin__._ = value
-        pprint_pager = PPrintPager()
-        pprint_pager.pipe(value)
-        pprint_pager.close()
+            builtins._ = value
+        pager = Pager()
+        pager.pprint(value)
+        pager.close()
 
     sys.displayhook = displayhook
 
-    from traceback import print_exception
+    from traceback import format_exception
 
     def excepthook(etype, evalue, etraceback):
-        print_exception(etype, evalue, etraceback)
+        lines = format_exception(etype, evalue, etraceback)
+        pager = Pager()
+        for line in lines:
+            pager.write(
+                '\033[31m' + line.rstrip('\n') + '\033[0m\n')  # red, reset
+        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
 
@@ -205,8 +232,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
 
@@ -217,7 +244,7 @@ def init():
         def __call__(self):
             return repr(self)
 
-    __builtin__.pwd = Pwd()
+    builtins.pwd = Pwd()
 
     # exit REPL with 'exit', 'quit' or simple 'x'
 
@@ -228,11 +255,11 @@ def init():
         def __call__(self, msg=None):
             sys.exit(msg)
 
-    __builtin__.x = _Exit()
+    builtins.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
+    if isinstance(builtins.exit, str):
+        builtins.exit = builtins.quit = x  # noqa: x is defined as _Exit
 
     # print conten of a file
 
@@ -244,9 +271,9 @@ def init():
             fp = open(filename, 'rU')
             text = fp.read()
             fp.close()
-            print text
+            print(text)
 
-    __builtin__.cat = _Cat()
+    builtins.cat = _Cat()
 
     # call shell
 
@@ -258,7 +285,7 @@ def init():
         def __call__(self, cmdline):
             os.system(cmdline)
 
-    __builtin__.sh = _Sh()
+    builtins.sh = _Sh()
 
     # paginate a file
 
@@ -269,7 +296,7 @@ def init():
         def __call__(self, filename):
             os.system("%s '%s'" % (pager, filename.replace("'", '"\'"')))
 
-    __builtin__.pager = _Pager()
+    builtins.pager = _Pager()
 
     # edit a file
 
@@ -282,7 +309,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()