commit 2e3d9899df317b59241d10c3a5a48fba0f6666ca Author: Damian Johnson atagar@torproject.org Date: Sun Jul 31 16:16:37 2016 -0700
Support python interpreter commands
Addressed the main gotcha Sambuddha was running into in Stem...
https://gitweb.torproject.org/stem.git/commit/?id=ae48d81
Then just took a little more work to address multi-line python input. --- nyx/curses.py | 2 +- nyx/panel/interpreter.py | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/nyx/curses.py b/nyx/curses.py index b5819cc..27cfbfc 100644 --- a/nyx/curses.py +++ b/nyx/curses.py @@ -305,7 +305,7 @@ def str_input(x, y, initial_text = '', backlog = None, tab_completion = None): if tab_completion: handler = functools.partial(_handle_tab_completion, handler, tab_completion)
- user_input = textbox.edit(lambda key: handler(textbox, key)).strip() + user_input = textbox.edit(lambda key: handler(textbox, key)).rstrip()
try: curses.curs_set(0) # hide cursor diff --git a/nyx/panel/interpreter.py b/nyx/panel/interpreter.py index ae929ca..4c63027 100644 --- a/nyx/panel/interpreter.py +++ b/nyx/panel/interpreter.py @@ -21,11 +21,12 @@ from nyx.curses import GREEN, MAGENTA, CYAN, BOLD, HIGHLIGHT USER_INPUT_BACKLOG_LIMIT = 100
PROMPT = ('>>> ', (GREEN, BOLD)) +MULTILINE_PROMPT = ('... ', ()) PROMPT_USAGE = ('to use this panel press enter', (CYAN, BOLD))
-def _format_prompt_input(user_input): - line = [PROMPT] +def _format_prompt_input(user_input, prompt = PROMPT): + line = [prompt] cmd, arg = user_input.split(' ', 1) if ' ' in user_input else (user_input, '')
if cmd.startswith('/'): @@ -56,7 +57,6 @@ class InterpreterPanel(nyx.panel.Panel): controller = tor_controller() self._autocompleter = stem.interpreter.autocomplete.Autocompleter(controller) self._interpreter = stem.interpreter.commands.ControlInterpreter(controller) - self._interpreter._run_python_commands = False
def key_handlers(self): def _scroll(key): @@ -75,7 +75,7 @@ class InterpreterPanel(nyx.panel.Panel): self.get_top() + max(1, min(len(self._lines) + 1, self.get_height() - 1)), backlog = self._user_inputs, tab_completion = self._autocompleter.matches - ).strip() + )
def _start_input_mode(): self._is_input_mode = True @@ -83,11 +83,12 @@ class InterpreterPanel(nyx.panel.Panel): while self._is_input_mode: user_input = _prompt_input()
- if not user_input: + if not user_input and not self._interpreter.is_multiline_context: self._is_input_mode = False break
self._user_inputs.append(user_input) + prompt = MULTILINE_PROMPT if self._interpreter.is_multiline_context else PROMPT
if len(self._user_inputs) > USER_INPUT_BACKLOG_LIMIT: self._user_inputs = self._user_inputs[-USER_INPUT_BACKLOG_LIMIT:] @@ -98,7 +99,7 @@ class InterpreterPanel(nyx.panel.Panel): self._is_input_mode = False break
- self._lines.append(_format_prompt_input(user_input)) + self._lines.append(_format_prompt_input(user_input, prompt))
if response: for line in response.split('\n'): @@ -118,7 +119,13 @@ class InterpreterPanel(nyx.panel.Panel): subwindow.addstr(0, 0, 'Control Interpreter:', HIGHLIGHT)
scroll = self._scroller.location(len(self._lines) + 1, subwindow.height - 1) - prompt = [PROMPT] if self._is_input_mode else [PROMPT, PROMPT_USAGE] + + if self._interpreter.is_multiline_context: + prompt = [MULTILINE_PROMPT] + elif self._is_input_mode: + prompt = [PROMPT] + else: + prompt = [PROMPT, PROMPT_USAGE]
if len(self._lines) > subwindow.height - 2: self._x_offset = 2