]> git.phdru.name Git - dotfiles.git/blobdiff - lib/python/init.py
init.py: refactor paging
[dotfiles.git] / lib / python / init.py
index d835c1c9a39b78edc9946c54dc31f688a3fb4b4b..15bcb32596c22a22b8768f215dc208a7117db1bd 100644 (file)
@@ -4,36 +4,44 @@
 # into your .profile (use whatever syntax and initialization file
 # is appropriate for your shell):
 #
-# PYTHONSTARTUP=$HOME/init.py # or where you really put it
+# PYTHONSTARTUP=$HOME/init.py  # or where you really put it
 # export PYTHONSTARTUP
 
+
 def init():
-    import sys, os
     import __builtin__
+    import os
+    import sys
+
+    # readline/pyreadline
 
-    pyreadlinew32_startup = os.path.join(sys.prefix,
-        'lib', 'site-packages', 'pyreadline', 'configuration', 'startup.py')
+    pyreadlinew32_startup = os.path.join(
+        sys.prefix, 'lib', 'site-packages',
+        'pyreadline', 'configuration', 'startup.py')
 
     if os.path.exists(pyreadlinew32_startup):
         execfile(pyreadlinew32_startup)
 
     else:
-        # From Bruce Edge
+        # From Bruce Edge:
+        # https://mail.python.org/pipermail/python-list/2001-March/062888.html
 
         try:
-            import rlcompleter, readline
-            initfile = os.environ.get('INPUTRC') or os.path.expanduser('~/.inputrc')
+            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
+                pass  # No such file
 
             def savehist():
-                histfilesize = os.environ.get('HISTFILESIZE') or \
-                               os.environ.get('HISTSIZE')
+                histfilesize = os.environ.get('HISTFILESIZE') \
+                    or os.environ.get('HISTSIZE')
                 if histfilesize:
                     try:
                         histfilesize = int(histfilesize)
@@ -47,9 +55,11 @@ def init():
             atexit.register(savehist)
 
         except (ImportError, AttributeError):
-            pass # no readline or atexit, or readline doesn't have
-                 # {read,write}_history_file - ignore the error
+            # no readline or atexit, or readline doesn't have
+            # {read,write}_history_file - ignore the error
+            pass
 
+    # terminal
 
     term = os.environ.get('TERM', '')
     if 'linux' in term:
@@ -57,27 +67,28 @@ def init():
     else:
         background = os.environ.get('BACKGROUND', 'light').lower()
 
-    # From Randall Hopper
+    # 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
 
         if background == 'dark':
-            ps1_color = '3' # yellow
-            stdout_color = '7' # bold white
+            ps1_color = '3'  # yellow
+            stdout_color = '7'  # bold white
         else:
-            ps1_color = '4' # blue
-            stdout_color = '0' # bold black
+            ps1_color = '4'  # blue
+            stdout_color = '0'  # bold black
 
         sys.ps1 = '\001\033[3%sm\002>>>\001\033[0m\002 ' % ps1_color
-        sys.ps2 = '\001\033[1;32m\002...\001\033[0m\002 ' # bold green
-
+        sys.ps2 = '\001\033[1;32m\002...\001\033[0m\002 '  # bold green
 
         # From Denis Otkidach
 
         class ColoredFile:
-            def __init__(self, fp, begin, end='\033[0m'): # reset all attributes
+            def __init__(self, fp, begin,
+                         end='\033[0m'):  # reset all attributes
                 self.__fp = fp
                 self.__begin = begin
                 self.__end = end
@@ -92,32 +103,79 @@ def init():
                 return getattr(self.__fp, attr)
 
         sys.stdout = ColoredFile(sys.stdout, '\033[1;3%sm' % stdout_color)
-        sys.stderr = ColoredFile(sys.stderr, '\033[31m') # red
+        sys.stderr = ColoredFile(sys.stderr, '\033[31m')  # red
 
         break
 
     try:
         import locale
     except ImportError:
-        pass # locale was not compiled
+        pass  # locale was not compiled
     else:
         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: Paul Magwene with a lot of my fixes
+    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
+
+    # From: Paul Magwene:
+    # https://mail.python.org/pipermail/python-list/2001-March/086191.html
+    # With a lot of my fixes:
 
     class DirLister:
         def __getitem__(self, key):
@@ -150,15 +208,7 @@ def init():
     __builtin__.ls = DirLister()
     __builtin__.cd = DirChanger()
 
-
-    # From Thomas Heller
-    #
-    #import pdb
-    #
-    #def info(*args):
-    #   pdb.pm()
-    #sys.excepthook = info
-
+    # print working directory
 
     class Pwd:
         def __repr__(self):
@@ -169,6 +219,7 @@ def init():
 
     __builtin__.pwd = Pwd()
 
+    # exit REPL with 'exit', 'quit' or simple 'x'
 
     class _Exit:
         def __repr__(self):
@@ -179,8 +230,59 @@ def init():
 
     __builtin__.x = _Exit()
 
-    if isinstance(__builtin__.exit, str): # In Python 2.5+ exit and quit are objects
-        __builtin__.exit = __builtin__.quit = x
+    # 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
+
+    # print conten of a file
+
+    class _Cat:
+        def __repr__(self):
+            return "Usage: cat('filename')"
+
+        def __call__(self, filename):
+            fp = open(filename, 'rU')
+            text = fp.read()
+            fp.close()
+            print text
+
+    __builtin__.cat = _Cat()
+
+    # call shell
+
+    class _Sh:
+        def __repr__(self):
+            os.system(os.environ["SHELL"])
+            return ''
+
+        def __call__(self, cmdline):
+            os.system(cmdline)
+
+    __builtin__.sh = _Sh()
+
+    # paginate a file
+
+    class _Pager:
+        def __repr__(self):
+            return "Usage: pager('filename')"
+
+        def __call__(self, filename):
+            os.system("%s '%s'" % (pager, filename.replace("'", '"\'"')))
+
+    __builtin__.pager = _Pager()
+
+    # edit a file
+
+    class _Editor:
+        def __repr__(self):
+            return "Usage: edit('filename')"
+
+        def __call__(self, filename):
+            editor = os.environ.get("VISUAL") \
+                or os.environ.get("EDITOR") or 'vi'
+            os.system("%s '%s'" % (editor, filename.replace("'", '"\'"')))
+
+    __builtin__.edit = __builtin__.editor = _Editor()
 
 
 init()