##// END OF EJS Templates
New prompts class for terminal interface
Thomas Kluyver -
Show More
@@ -0,0 +1,36 b''
1 from pygments.token import Token
2
3 class Prompts(object):
4 def __init__(self, shell):
5 self.shell = shell
6
7 def in_prompt_tokens(self, cli=None):
8 return [
9 (Token.Prompt, 'In ['),
10 (Token.PromptNum, str(self.shell.execution_count)),
11 (Token.Prompt, ']: '),
12 ]
13
14 def _width(self):
15 in_tokens = self.in_prompt_tokens()
16 return sum(len(s) for (t, s) in in_tokens)
17
18 def continuation_prompt_tokens(self, cli=None, width=None):
19 if width is None:
20 width = self._width()
21 return [
22 (Token.Prompt, (' ' * (width - 5)) + '...: '),
23 ]
24
25 def rewrite_prompt_tokens(self):
26 width = self._width()
27 return [
28 (Token.Prompt, ('-' * (width - 2)) + '> '),
29 ]
30
31 def out_prompt_tokens(self):
32 return [
33 (Token.OutPrompt, 'Out['),
34 (Token.OutPromptNum, str(self.shell.execution_count)),
35 (Token.OutPrompt, ']: '),
36 ]
@@ -2339,16 +2339,9 b' class InteractiveShell(SingletonConfigurable):'
2339 2339 """
2340 2340 if not self.show_rewritten_input:
2341 2341 return
2342
2343 rw = self.prompt_manager.render('rewrite') + cmd
2344 2342
2345 try:
2346 # plain ascii works better w/ pyreadline, on some machines, so
2347 # we use it and only print uncolored rewrite if we have unicode
2348 rw = str(rw)
2349 print(rw)
2350 except UnicodeEncodeError:
2351 print("------> " + cmd)
2343 # This is overridden in TerminalInteractiveShell to use fancy prompts
2344 print("------> " + cmd)
2352 2345
2353 2346 #-------------------------------------------------------------------------
2354 2347 # Things related to extracting values/expressions from kernel and user_ns
@@ -11,7 +11,7 b' from IPython.core.interactiveshell import InteractiveShell'
11 11 from IPython.utils.py3compat import cast_unicode_py2, input
12 12 from IPython.utils.terminal import toggle_set_term_title, set_term_title
13 13 from IPython.utils.process import abbrev_cwd
14 from traitlets import Bool, Unicode, Dict, Integer, observe
14 from traitlets import Bool, Unicode, Dict, Integer, observe, Instance
15 15
16 16 from prompt_toolkit.enums import DEFAULT_BUFFER, SEARCH_BUFFER, EditingMode
17 17 from prompt_toolkit.filters import HasFocus, HasSelection, Condition, ViInsertMode, EmacsInsertMode, IsDone
@@ -29,6 +29,7 b' from pygments.token import Token'
29 29 from .debugger import TerminalPdb, Pdb
30 30 from .pt_inputhooks import get_inputhook_func
31 31 from .interactiveshell import get_default_editor, TerminalMagics
32 from .prompts import Prompts
32 33 from .ptutils import IPythonPTCompleter, IPythonPTLexer
33 34
34 35 _use_simple_prompt = 'IPY_TEST_SIMPLE_PROMPT' in os.environ or not sys.stdin.isatty()
@@ -98,6 +99,11 b' class TerminalInteractiveShell(InteractiveShell):'
98 99 editor = Unicode(get_default_editor(),
99 100 help="Set the editor used by IPython (default to $EDITOR/vi/notepad)."
100 101 ).tag(config=True)
102
103 prompts = Instance(Prompts)
104
105 def _prompts_default(self):
106 return Prompts(self)
101 107
102 108 term_title = Bool(True,
103 109 help="Automatically set the terminal title"
@@ -120,18 +126,6 b' class TerminalInteractiveShell(InteractiveShell):'
120 126 else:
121 127 toggle_set_term_title(False)
122 128
123 def get_prompt_tokens(self, cli):
124 return [
125 (Token.Prompt, 'In ['),
126 (Token.PromptNum, str(self.execution_count)),
127 (Token.Prompt, ']: '),
128 ]
129
130 def get_continuation_tokens(self, cli, width):
131 return [
132 (Token.Prompt, (' ' * (width - 5)) + '...: '),
133 ]
134
135 129 def init_prompt_toolkit_cli(self):
136 130 if self.simple_prompt:
137 131 # Fall back to plain non-interactive output for tests.
@@ -261,8 +255,8 b' class TerminalInteractiveShell(InteractiveShell):'
261 255 return {
262 256 'lexer':IPythonPTLexer(),
263 257 'reserve_space_for_menu':self.space_for_menu,
264 'get_prompt_tokens':self.get_prompt_tokens,
265 'get_continuation_tokens':self.get_continuation_tokens,
258 'get_prompt_tokens':self.prompts.in_prompt_tokens,
259 'get_continuation_tokens':self.prompts.continuation_prompt_tokens,
266 260 'multiline':True,
267 261 'display_completions_in_columns': self.display_completions_in_columns,
268 262
@@ -439,6 +433,19 b' class TerminalInteractiveShell(InteractiveShell):'
439 433 # work correctly.
440 434 system = InteractiveShell.system_raw
441 435
436 def auto_rewrite_input(self, cmd):
437 """Overridden from the parent class to use fancy rewriting prompt"""
438 if not self.show_rewritten_input:
439 return
440
441 tokens = self.prompts.rewrite_prompt_tokens()
442 if self.pt_cli:
443 self.pt_cli.print_tokens(tokens)
444 print(cmd)
445 else:
446 prompt = ''.join(s for t, s in tokens)
447 print(prompt, cmd, sep='')
448
442 449
443 450 if __name__ == '__main__':
444 451 TerminalInteractiveShell.instance().interact()
General Comments 0
You need to be logged in to leave comments. Login now