]> git.phdru.name Git - dotfiles.git/blobdiff - lib/python/init.py
init.py: refactor paging
[dotfiles.git] / lib / python / init.py
index 363a10a1e6d0aaf8ceb66e64dda3296d44f0dc3b..15bcb32596c22a22b8768f215dc208a7117db1bd 100644 (file)
@@ -27,6 +27,7 @@ def init():
         # https://mail.python.org/pipermail/python-list/2001-March/062888.html
 
         try:
+            import rlcompleter  # noqa: need for completion
             import readline
             initfile = os.environ.get('INPUTRC') \
                 or os.path.expanduser('~/.inputrc')
@@ -114,17 +115,61 @@ def init():
         try:
             locale.setlocale(locale.LC_ALL, '')
 
-            from pprint import pprint
+        except (ImportError, locale.Error):
+            pass  # no locale support or unsupported locale
 
-            def displayhook(value):
-                if value is not None:
-                    __builtin__._ = value
-                    pprint(value)
+    # set displayhook
 
-            sys.displayhook = displayhook
+    from pprint import pprint
 
-        except (ImportError, locale.Error):
-            pass  # no locale support or unsupported locale
+    class BasePPrintPager:
+        def pipe(self, value):
+            pprint(value, stream=self.stdin)
+
+        def close(self):
+            self.stdin.close()
+
+    try:
+        from subprocess import Popen, PIPE
+    except ImportError:
+        class PPrintPager(BasePPrintPager):
+            def __init__(self):
+                self.pipe = Popen(pager, shell=True, stdin=PIPE)
+                self.stdin = self.pipe.stdin
+
+            def close(self):
+                BasePPrintPager.close(self)
+                self.pipe.wait()
+    else:
+        class PPrintPager(BasePPrintPager):
+            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()
+
+    sys.displayhook = displayhook
+
+    from traceback import print_exception
+
+    def excepthook(etype, evalue, etraceback):
+        print_exception(etype, evalue, etraceback)
+
+    sys.excepthook = excepthook
+
+    # From Thomas Heller:
+    # https://mail.python.org/pipermail/python-list/2001-April/099020.html
+
+    # import pdb
+    #
+    # def info(*args):
+    #    pdb.pm()
+    # sys.excepthook = info
 
     # utilities
 
@@ -163,15 +208,6 @@ def init():
     __builtin__.ls = DirLister()
     __builtin__.cd = DirChanger()
 
-    # From Thomas Heller:
-    # https://mail.python.org/pipermail/python-list/2001-April/099020.html
-
-    # import pdb
-    #
-    # def info(*args):
-    #    pdb.pm()
-    # sys.excepthook = info
-
     # print working directory
 
     class Pwd:
@@ -231,7 +267,6 @@ def init():
             return "Usage: pager('filename')"
 
         def __call__(self, filename):
-            pager = os.environ.get("PAGER") or 'more'
             os.system("%s '%s'" % (pager, filename.replace("'", '"\'"')))
 
     __builtin__.pager = _Pager()