From 58591852f87be30fb138ee12053ce108854d7385 Mon Sep 17 00:00:00 2001 From: rocky Date: Fri, 24 Jan 2025 20:45:55 -0500 Subject: [PATCH] Add --edit-mode option ... for prompt-toolkit only --- mathicsscript/__main__.py | 16 ++++++++- mathicsscript/termshell_prompt.py | 55 +++++++++++++++---------------- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/mathicsscript/__main__.py b/mathicsscript/__main__.py index b1d3d3a..8267be2 100755 --- a/mathicsscript/__main__.py +++ b/mathicsscript/__main__.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +# Copyright (C) 2025 Rocky Bernstein # -*- coding: utf-8 -*- import os @@ -239,7 +240,19 @@ def fmt_fun(query: Any) -> Any: shell.reset_lineno() +if click.__version__ >= "7.": + case_sensitive = {"case_sensitive": False} +else: + case_sensitive = {} + + @click.command() +@click.option( + "--edit-mode", + "-e", + type=click.Choice(["emacs", "vi"], **case_sensitive), + help="Set initial edit mode (when using prompt toolkit only)", +) @click.version_option(version=__version__) @click.option( "--full-form", @@ -364,6 +377,7 @@ def fmt_fun(query: Any) -> Any: ) @click.argument("file", nargs=1, type=click.Path(readable=True), required=False) def main( + edit_mode, full_form, persist, quiet, @@ -422,7 +436,7 @@ def main( readline = "none" if (execute or file and not persist) else readline.lower() if readline == "prompt": shell = TerminalShellPromptToolKit( - definitions, style, completion, unicode, prompt + definitions, style, completion, unicode, prompt, edit_mode ) else: want_readline = readline == "gnu" diff --git a/mathicsscript/termshell_prompt.py b/mathicsscript/termshell_prompt.py index b3328b9..b5d3f10 100644 --- a/mathicsscript/termshell_prompt.py +++ b/mathicsscript/termshell_prompt.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (C) 2021-2022 Rocky Bernstein +# Copyright (C) 2021-2022, 2025 Rocky Bernstein import locale import os @@ -8,42 +8,41 @@ import sys from typing import Optional -from mathics_pygments.lexer import MathematicaLexer, MToken -from mathicsscript.completion import MathicsCompleter -from mathicsscript.termshell import ( - CONFIGDIR, - HISTSIZE, - USER_INPUTRC, - is_pygments_style, - ShellEscapeException, - SymbolPygmentsStylesAvailable, - TerminalShellCommon, -) -from mathicsscript.version import __version__ - +from colorama import init as colorama_init from mathics.core.atoms import String from mathics.core.attributes import attribute_string_to_number from mathics.core.expression import Expression, from_python from mathics.core.rules import Rule from mathics.core.systemsymbols import SymbolMessageName - -from mathicsscript.bindkeys import bindings, read_inputrc, read_init_file - -from prompt_toolkit import PromptSession, HTML, print_formatted_text +from mathics_pygments.lexer import MathematicaLexer, MToken +from prompt_toolkit import HTML, PromptSession, print_formatted_text from prompt_toolkit.application.current import get_app from prompt_toolkit.enums import EditingMode from prompt_toolkit.history import FileHistory from prompt_toolkit.lexers import PygmentsLexer from prompt_toolkit.styles.pygments import style_from_pygments_cls - - from pygments import format, highlight, lex -from pygments.styles import get_style_by_name -from pygments.formatters.terminal import TERMINAL_COLORS from pygments.formatters import Terminal256Formatter -from pygments.styles import get_all_styles +from pygments.formatters.terminal import TERMINAL_COLORS +from pygments.styles import get_all_styles, get_style_by_name from pygments.util import ClassNotFound +# FIXME: __main__ shouldn't be needed. Fix term_background +from term_background.__main__ import is_dark_background + +from mathicsscript.bindkeys import bindings, read_init_file, read_inputrc +from mathicsscript.completion import MathicsCompleter +from mathicsscript.termshell import ( + CONFIGDIR, + HISTSIZE, + USER_INPUTRC, + ShellEscapeException, + SymbolPygmentsStylesAvailable, + TerminalShellCommon, + is_pygments_style, +) +from mathicsscript.version import __version__ + mma_lexer = MathematicaLexer() ALL_PYGMENTS_STYLES = list(get_all_styles()) @@ -54,11 +53,6 @@ color_scheme[MToken.OPERATOR] = ("magenta", "ansibrightmagenta") color_scheme[MToken.NUMBER] = ("ansiblue", "ansibrightblue") -from colorama import init as colorama_init - -# FIXME: __main__ shouldn't be needed. Fix term_background -from term_background.__main__ import is_dark_background - HISTFILE = osp.join(CONFIGDIR, "history-ptk") @@ -70,6 +64,7 @@ def __init__( want_completion: bool, use_unicode: bool, prompt: bool, + edit_mode: Optional[str], ): super(TerminalShellCommon, self).__init__("") self.input_encoding = locale.getpreferredencoding() @@ -79,6 +74,10 @@ def __init__( self.prompt = prompt self.session = PromptSession(history=FileHistory(HISTFILE)) + if edit_mode is not None: + self.session.editing_mode = ( + EditingMode.VI if edit_mode == "vi" else EditingMode.EMACS + ) # Try importing readline to enable arrow keys support etc. self.using_readline = False