]> git.phdru.name Git - dotfiles.git/blobdiff - lib/python/init.py
init.py: Hide errors during `.write_history_file()`
[dotfiles.git] / lib / python / init.py
index 363a10a1e6d0aaf8ceb66e64dda3296d44f0dc3b..8720caa9bf1120075310a8a54296704b47e7332b 100644 (file)
@@ -9,7 +9,10 @@
 
 
 def init():
-    import __builtin__
+    try:
+        import __builtin__ as builtins
+    except ImportError:
+        import builtins
     import os
     import sys
 
@@ -27,28 +30,44 @@ 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')
             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)
@@ -69,10 +88,13 @@ def init():
     # From Randall Hopper:
     # https://mail.python.org/pipermail/python-list/2001-March/112696.html
 
+    _term_found = False
     for _term in ['linux', 'rxvt', 'screen', 'term', 'vt100']:
-        if _term not in term:
-            continue
+        if _term in term:
+            _term_found = True
+            break
 
+    if _term_found:
         if background == 'dark':
             ps1_color = '3'  # yellow
             stdout_color = '7'  # bold white
@@ -104,7 +126,24 @@ 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__
+            try:
+                result = builtin_input(prompt)
+            except EOFError:
+                result = None
+            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
@@ -113,18 +152,93 @@ def init():
     else:
         try:
             locale.setlocale(locale.LC_ALL, '')
+        except (ImportError, locale.Error):
+            pass  # no locale support or unsupported locale
 
-            from pprint import pprint
+    # set displayhook and excepthook
 
-            def displayhook(value):
-                if value is not None:
-                    __builtin__._ = value
-                    pprint(value)
+    from pprint import pprint
+    from traceback import format_exception, print_exc
 
-            sys.displayhook = displayhook
+    pager = os.environ.get("PAGER") or 'more'
 
-        except (ImportError, locale.Error):
-            pass  # no locale support or unsupported locale
+    # 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.stdout.write(value)
+
+        def pprint(self, value):
+            pprint(value,
+                   stream=ColoredFile(self.stdout,
+                                      '\033[1;3%sm' % stdout_color))
+
+        def close(self):
+            self.stdout.close()
+
+    try:
+        from subprocess import Popen, PIPE
+    except ImportError:
+        class Pager(BasePager):
+            def __init__(self):
+                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()
+
+    def displayhook(value):
+        if value is not None:
+            builtins._ = value
+        pager = Pager()
+        try:
+            pager.pprint(value)
+        except:  # noqa
+            pager.stdout = ColoredFile(pager.stdout, '\033[31m')  # red
+            print_exc(file=pager)
+        pager.close()
+
+    sys.displayhook = displayhook
+
+    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(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
+
+    # import pdb
+    #
+    # def info(*args):
+    #    pdb.pm()
+    # sys.excepthook = info
 
     # utilities
 
@@ -160,17 +274,8 @@ def init():
             path = os.path.expanduser(os.path.expandvars(path or '~'))
             os.chdir(path)
 
-    __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
+    builtins.ls = DirLister()
+    builtins.cd = DirChanger()
 
     # print working directory
 
@@ -181,7 +286,7 @@ def init():
         def __call__(self):
             return repr(self)
 
-    __builtin__.pwd = Pwd()
+    builtins.pwd = Pwd()
 
     # exit REPL with 'exit', 'quit' or simple 'x'
 
@@ -192,11 +297,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
 
@@ -208,9 +309,9 @@ def init():
             fp = open(filename, 'rU')
             text = fp.read()
             fp.close()
-            print text
+            print(text)
 
-    __builtin__.cat = _Cat()
+    builtins.cat = _Cat()
 
     # call shell
 
@@ -222,7 +323,7 @@ def init():
         def __call__(self, cmdline):
             os.system(cmdline)
 
-    __builtin__.sh = _Sh()
+    builtins.sh = _Sh()
 
     # paginate a file
 
@@ -231,10 +332,9 @@ 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()
+    builtins.pager = _Pager()
 
     # edit a file
 
@@ -247,7 +347,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()