Show More
@@ -13,13 +13,13 b' from IPython.core.interactiveshell import InteractiveShell' | |||||
13 | from IPython.utils.py3compat import PY3, cast_unicode_py2, input |
|
13 | from IPython.utils.py3compat import PY3, cast_unicode_py2, input | |
14 | from IPython.utils.terminal import toggle_set_term_title, set_term_title |
|
14 | from IPython.utils.terminal import toggle_set_term_title, set_term_title | |
15 | from IPython.utils.process import abbrev_cwd |
|
15 | from IPython.utils.process import abbrev_cwd | |
16 | from traitlets import Bool, CBool, Unicode, Dict |
|
16 | from traitlets import Bool, CBool, Unicode, Dict, Integer | |
17 |
|
17 | |||
18 | from prompt_toolkit.completion import Completer, Completion |
|
18 | from prompt_toolkit.completion import Completer, Completion | |
19 | from prompt_toolkit.enums import DEFAULT_BUFFER, SEARCH_BUFFER |
|
19 | from prompt_toolkit.enums import DEFAULT_BUFFER, SEARCH_BUFFER | |
20 | from prompt_toolkit.filters import HasFocus, HasSelection, Condition |
|
20 | from prompt_toolkit.filters import HasFocus, HasSelection, Condition | |
21 | from prompt_toolkit.history import InMemoryHistory |
|
21 | from prompt_toolkit.history import InMemoryHistory | |
22 | from prompt_toolkit.shortcuts import create_prompt_application, create_eventloop |
|
22 | from prompt_toolkit.shortcuts import create_prompt_application, create_eventloop, create_prompt_layout | |
23 | from prompt_toolkit.interface import CommandLineInterface |
|
23 | from prompt_toolkit.interface import CommandLineInterface | |
24 | from prompt_toolkit.key_binding.manager import KeyBindingManager |
|
24 | from prompt_toolkit.key_binding.manager import KeyBindingManager | |
25 | from prompt_toolkit.key_binding.vi_state import InputMode |
|
25 | from prompt_toolkit.key_binding.vi_state import InputMode | |
@@ -27,9 +27,9 b' from prompt_toolkit.key_binding.bindings.vi import ViStateFilter' | |||||
27 | from prompt_toolkit.keys import Keys |
|
27 | from prompt_toolkit.keys import Keys | |
28 | from prompt_toolkit.layout.lexers import Lexer |
|
28 | from prompt_toolkit.layout.lexers import Lexer | |
29 | from prompt_toolkit.layout.lexers import PygmentsLexer |
|
29 | from prompt_toolkit.layout.lexers import PygmentsLexer | |
30 | from prompt_toolkit.styles import PygmentsStyle |
|
30 | from prompt_toolkit.styles import PygmentsStyle, DynamicStyle | |
31 |
|
31 | |||
32 | from pygments.styles import get_style_by_name |
|
32 | from pygments.styles import get_style_by_name, get_all_styles | |
33 | from pygments.lexers import Python3Lexer, BashLexer, PythonLexer |
|
33 | from pygments.lexers import Python3Lexer, BashLexer, PythonLexer | |
34 | from pygments.token import Token |
|
34 | from pygments.token import Token | |
35 |
|
35 | |||
@@ -89,6 +89,12 b' class IPythonPTLexer(Lexer):' | |||||
89 | class TerminalInteractiveShell(InteractiveShell): |
|
89 | class TerminalInteractiveShell(InteractiveShell): | |
90 | colors_force = True |
|
90 | colors_force = True | |
91 |
|
91 | |||
|
92 | space_for_menu = Integer(6, config=True, help='Number of line at the bottom of the screen ' | |||
|
93 | 'to reserve for the completion menu') | |||
|
94 | ||||
|
95 | def _space_for_menu_changed(self, old, new): | |||
|
96 | self._update_layout() | |||
|
97 | ||||
92 | pt_cli = None |
|
98 | pt_cli = None | |
93 |
|
99 | |||
94 | autoedit_syntax = CBool(False, config=True, |
|
100 | autoedit_syntax = CBool(False, config=True, | |
@@ -108,10 +114,13 b' class TerminalInteractiveShell(InteractiveShell):' | |||||
108 | help="Enable mouse support in the prompt" |
|
114 | help="Enable mouse support in the prompt" | |
109 | ) |
|
115 | ) | |
110 |
|
116 | |||
111 | highlighting_style = Unicode('', config=True, |
|
117 | highlighting_style = Unicode('default', config=True, | |
112 | help="The name of a Pygments style to use for syntax highlighting" |
|
118 | help="The name of a Pygments style to use for syntax highlighting: \n %s" % ', '.join(get_all_styles()) | |
113 | ) |
|
119 | ) | |
114 |
|
120 | |||
|
121 | def _highlighting_style_changed(self, old, new): | |||
|
122 | self._style = self._make_style_from_name(self.highlighting_style) | |||
|
123 | ||||
115 | highlighting_style_overrides = Dict(config=True, |
|
124 | highlighting_style_overrides = Dict(config=True, | |
116 | help="Override highlighting format for specific tokens" |
|
125 | help="Override highlighting format for specific tokens" | |
117 | ) |
|
126 | ) | |
@@ -220,13 +229,33 b' class TerminalInteractiveShell(InteractiveShell):' | |||||
220 | if cell and (cell != last_cell): |
|
229 | if cell and (cell != last_cell): | |
221 | history.append(cell) |
|
230 | history.append(cell) | |
222 |
|
231 | |||
|
232 | self._style = self._make_style_from_name(self.highlighting_style) | |||
|
233 | style = DynamicStyle(lambda: self._style) | |||
|
234 | ||||
|
235 | self._app = create_prompt_application( | |||
|
236 | key_bindings_registry=kbmanager.registry, | |||
|
237 | history=history, | |||
|
238 | completer=IPythonPTCompleter(self.Completer), | |||
|
239 | enable_history_search=True, | |||
|
240 | style=style, | |||
|
241 | mouse_support=self.mouse_support, | |||
|
242 | **self._layout_options() | |||
|
243 | ) | |||
|
244 | self.pt_cli = CommandLineInterface(self._app, | |||
|
245 | eventloop=create_eventloop(self.inputhook)) | |||
|
246 | ||||
|
247 | def _make_style_from_name(self, name): | |||
|
248 | """ | |||
|
249 | Small wrapper that make an IPython compatible style from a style name | |||
|
250 | ||||
|
251 | We need that to add style for prompt ... etc. | |||
|
252 | """ | |||
|
253 | style_cls = get_style_by_name(name) | |||
223 | style_overrides = { |
|
254 | style_overrides = { | |
224 | Token.Prompt: '#009900', |
|
255 | Token.Prompt: style_cls.styles.get( Token.Keyword, '#009900'), | |
225 |
Token.PromptNum: '#00ff00 bold' |
|
256 | Token.PromptNum: style_cls.styles.get( Token.Literal.Number, '#00ff00 bold') | |
226 | } |
|
257 | } | |
227 | if self.highlighting_style: |
|
258 | if name is 'default': | |
228 | style_cls = get_style_by_name(self.highlighting_style) |
|
|||
229 | else: |
|
|||
230 | style_cls = get_style_by_name('default') |
|
259 | style_cls = get_style_by_name('default') | |
231 | # The default theme needs to be visible on both a dark background |
|
260 | # The default theme needs to be visible on both a dark background | |
232 | # and a light background, because we can't tell what the terminal |
|
261 | # and a light background, because we can't tell what the terminal | |
@@ -243,21 +272,27 b' class TerminalInteractiveShell(InteractiveShell):' | |||||
243 | style = PygmentsStyle.from_defaults(pygments_style_cls=style_cls, |
|
272 | style = PygmentsStyle.from_defaults(pygments_style_cls=style_cls, | |
244 | style_dict=style_overrides) |
|
273 | style_dict=style_overrides) | |
245 |
|
274 | |||
246 | app = create_prompt_application(multiline=True, |
|
275 | return style | |
247 | lexer=IPythonPTLexer(), |
|
|||
248 | get_prompt_tokens=self.get_prompt_tokens, |
|
|||
249 | get_continuation_tokens=self.get_continuation_tokens, |
|
|||
250 | key_bindings_registry=kbmanager.registry, |
|
|||
251 | history=history, |
|
|||
252 | completer=IPythonPTCompleter(self.Completer), |
|
|||
253 | enable_history_search=True, |
|
|||
254 | style=style, |
|
|||
255 | mouse_support=self.mouse_support, |
|
|||
256 | reserve_space_for_menu=6, |
|
|||
257 | ) |
|
|||
258 |
|
276 | |||
259 | self.pt_cli = CommandLineInterface(app, |
|
277 | def _layout_options(self): | |
260 | eventloop=create_eventloop(self.inputhook)) |
|
278 | """ | |
|
279 | Return the current layout option for the current Terminal InteractiveShell | |||
|
280 | """ | |||
|
281 | return { | |||
|
282 | 'lexer':IPythonPTLexer(), | |||
|
283 | 'reserve_space_for_menu':self.space_for_menu, | |||
|
284 | 'get_prompt_tokens':self.get_prompt_tokens, | |||
|
285 | 'get_continuation_tokens':self.get_continuation_tokens, | |||
|
286 | 'multiline':False, | |||
|
287 | } | |||
|
288 | ||||
|
289 | ||||
|
290 | def _update_layout(self): | |||
|
291 | """ | |||
|
292 | Ask for a re computation of the application layout, if for example , | |||
|
293 | some configuration options have changed. | |||
|
294 | """ | |||
|
295 | self._app.layout = create_prompt_layout(**self._layout_options()) | |||
261 |
|
296 | |||
262 | def prompt_for_code(self): |
|
297 | def prompt_for_code(self): | |
263 | document = self.pt_cli.run(pre_run=self.pre_prompt) |
|
298 | document = self.pt_cli.run(pre_run=self.pre_prompt) |
General Comments 0
You need to be logged in to leave comments.
Login now