]> git.phdru.name Git - dotfiles.git/blobdiff - lib/python/init.py
lib/python/init.py: fix Pager
[dotfiles.git] / lib / python / init.py
index 7377a26912ec83ab2d87abc833b36a211460f244..9d20cd636a55c7a17bf0d9f8fcf65e44c7e7d5d2 100644 (file)
@@ -122,6 +122,8 @@ def init():
     # 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,
@@ -135,47 +137,52 @@ def init():
 
     class BasePager:
         def write(self, value):
-            self.stdin.write(value)
+            self.stdout.write(value)
 
         def pprint(self, value):
-            pprint(value, stream=self.stdin)
+            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:
             builtins._ = value
         pager = Pager()
-        pager.pprint(value)
+        try:
+            pager.pprint(value)
+        except:
+            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()
+        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