You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dotfiles/pythonrc.py

138 lines
4.0 KiB
Python

"""
This file is executed when the Python interactive shell is started if
$PYTHONSTARTUP is in your environment and points to this file. It's just
regular Python commands, so do what you will. Your ~/.inputrc file can greatly
complement this file.
"""
import os
try:
import readline
import rlcompleter
import atexit
except ImportError:
print("You need readline, rlcompleter, and atexit")
readline.parse_and_bind("tab: complete")
#readline.parse_and_bind ("bind ^I rl_complete")
class Completer(object):
def __init__(self):
# Enable a History
self.HISTFILE=os.path.expanduser("%s/.pyhistory" % os.environ["HOME"])
# Read the existing history if there is one
if os.path.exists(self.HISTFILE):
readline.read_history_file(self.HISTFILE)
# Set maximum number of items that will be written to the history file
readline.set_history_length(300)
atexit.register(self.savehist)
def savehist(self):
import readline
readline.write_history_file(self.HISTFILE)
c = Completer()
WELCOME=''
# Color Support
class TermColors(dict):
"""Gives easy access to ANSI color codes. Attempts to fall back to no color
for certain TERM values. (Mostly stolen from IPython.)"""
COLOR_TEMPLATES = (
("Black" , "0;30"),
("Red" , "0;31"),
("Green" , "0;32"),
("Brown" , "0;33"),
("Blue" , "0;34"),
("Purple" , "0;35"),
("Cyan" , "0;36"),
("LightGray" , "0;37"),
("DarkGray" , "1;30"), ("LightRed" , "1;31"),
("LightGreen" , "1;32"),
("Yellow" , "1;33"),
("LightBlue" , "1;34"),
("LightPurple" , "1;35"),
("LightCyan" , "1;36"),
("White" , "1;37"),
("Normal" , "0"),
)
NoColor = ''
_base = '\001\033[%sm\002'
def __init__(self):
if os.environ.get('TERM') in ('xterm-color', 'xterm-256color', 'linux',
'screen', 'screen-256color', 'screen-bce'):
self.update(dict([(k, self._base % v) for k,v in self.COLOR_TEMPLATES]))
else:
self.update(dict([(k, self.NoColor) for k,v in self.COLOR_TEMPLATES]))
_c = TermColors()
import sys
# Enable Color Prompts
sys.ps1 = '%s>>> %s' % (_c['Green'], _c['Normal'])
sys.ps2 = '%s... %s' % (_c['Red'], _c['Normal'])
# Enable Pretty Printing for stdout
def my_displayhook(value):
if value is not None:
try:
import __builtin__
__builtin__._ = value
except ImportError:
__builtins__._ = value
import pprint
pprint.pprint(value)
del pprint
sys.displayhook = my_displayhook
EDITOR = os.environ.get('EDITOR', 'vim')
EDIT_CMD = '\e'
from tempfile import mkstemp
from code import InteractiveConsole
class EditableBufferInteractiveConsole(InteractiveConsole):
def __init__(self, *args, **kwargs):
self.last_buffer = [] # This holds the last executed statement
InteractiveConsole.__init__(self, *args, **kwargs)
def runsource(self, source, *args):
self.last_buffer = [ source.encode('latin-1') ]
return InteractiveConsole.runsource(self, source, *args)
def raw_input(self, *args):
line = InteractiveConsole.raw_input(self, *args)
if line == EDIT_CMD:
fd, tmpfl = mkstemp('.py')
os.write(fd, b'\n'.join(self.last_buffer))
os.close(fd)
os.system('%s %s' % (EDITOR, tmpfl))
line = open(tmpfl).read()
os.unlink(tmpfl)
tmpfl = ''
lines = line.split( '\n' )
for i in range(len(lines) - 1): self.push( lines[i] )
line = lines[-1]
return line
# clean up namespace
del sys
if __name__ == "__main__":
c = EditableBufferInteractiveConsole(locals=locals())
c.interact(banner=WELCOME)
# Exit the Python shell on exiting the InteractiveConsole
import sys
sys.exit()