124 lines
3.3 KiB
Python
124 lines
3.3 KiB
Python
# vim:fileencoding=utf-8:noet
|
|
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
|
|
|
from weakref import ref
|
|
from warnings import warn
|
|
|
|
try:
|
|
from IPython.core.prompts import PromptManager
|
|
has_prompt_manager = True
|
|
except ImportError:
|
|
has_prompt_manager = False
|
|
from IPython.core.magic import Magics, magics_class, line_magic
|
|
|
|
from powerline.ipython import IPythonPowerline, IPythonInfo
|
|
|
|
if has_prompt_manager:
|
|
from powerline.ipython import RewriteResult
|
|
|
|
|
|
@magics_class
|
|
class PowerlineMagics(Magics):
|
|
def __init__(self, ip, powerline):
|
|
super(PowerlineMagics, self).__init__(ip)
|
|
self._powerline = powerline
|
|
|
|
@line_magic
|
|
def powerline(self, line):
|
|
if line == 'reload':
|
|
self._powerline.reload()
|
|
else:
|
|
raise ValueError('Expected `reload`, but got {0}'.format(line))
|
|
|
|
|
|
old_prompt_manager = None
|
|
|
|
|
|
class ShutdownHook(object):
|
|
def __init__(self, ip):
|
|
self.powerline = lambda: None
|
|
ip.hooks.shutdown_hook.add(self)
|
|
|
|
def __call__(self):
|
|
from IPython.core.hooks import TryNext
|
|
powerline = self.powerline()
|
|
if powerline is not None:
|
|
powerline.shutdown()
|
|
raise TryNext()
|
|
|
|
|
|
if has_prompt_manager:
|
|
class PowerlinePromptManager(PromptManager):
|
|
def __init__(self, powerline, shell):
|
|
self.powerline = powerline
|
|
self.powerline_segment_info = IPythonInfo(shell)
|
|
self.shell = shell
|
|
|
|
def render(self, name, color=True, *args, **kwargs):
|
|
res = self.powerline.render(
|
|
is_prompt=name.startswith('in'),
|
|
side='left',
|
|
output_width=True,
|
|
output_raw=not color,
|
|
matcher_info=name,
|
|
segment_info=self.powerline_segment_info,
|
|
)
|
|
self.txtwidth = res[-1]
|
|
self.width = res[-1]
|
|
ret = res[0] if color else res[1]
|
|
if name == 'rewrite':
|
|
return RewriteResult(ret)
|
|
else:
|
|
return ret
|
|
|
|
class ConfigurableIPythonPowerline(IPythonPowerline):
|
|
def init(self, ip):
|
|
config = ip.config.Powerline
|
|
self.config_overrides = config.get('config_overrides')
|
|
self.theme_overrides = config.get('theme_overrides', {})
|
|
self.config_paths = config.get('config_paths')
|
|
if has_prompt_manager:
|
|
renderer_module = '.pre_5'
|
|
else:
|
|
renderer_module = '.since_5'
|
|
super(ConfigurableIPythonPowerline, self).init(
|
|
renderer_module=renderer_module)
|
|
|
|
def do_setup(self, ip, shutdown_hook):
|
|
global old_prompt_manager
|
|
|
|
if old_prompt_manager is None:
|
|
old_prompt_manager = ip.prompt_manager
|
|
prompt_manager = PowerlinePromptManager(
|
|
powerline=self,
|
|
shell=ip.prompt_manager.shell,
|
|
)
|
|
ip.prompt_manager = prompt_manager
|
|
|
|
magics = PowerlineMagics(ip, self)
|
|
shutdown_hook.powerline = ref(self)
|
|
ip.register_magics(magics)
|
|
|
|
|
|
def load_ipython_extension(ip):
|
|
if has_prompt_manager:
|
|
shutdown_hook = ShutdownHook(ip)
|
|
powerline = ConfigurableIPythonPowerline(ip)
|
|
powerline.setup(ip, shutdown_hook)
|
|
else:
|
|
from powerline.bindings.ipython.since_5 import PowerlinePrompts
|
|
ip.prompts_class = PowerlinePrompts
|
|
ip.prompts = PowerlinePrompts(ip)
|
|
warn(DeprecationWarning(
|
|
'post_0_11 extension is deprecated since IPython 5, use\n'
|
|
' from powerline.bindings.ipython.since_5 import PowerlinePrompts\n'
|
|
' c.TerminalInteractiveShell.prompts_class = PowerlinePrompts\n'
|
|
))
|
|
|
|
|
|
def unload_ipython_extension(ip):
|
|
global old_prompt_manager
|
|
if old_prompt_manager is not None:
|
|
ip.prompt_manager = old_prompt_manager
|
|
old_prompt_manager = None
|