From 29e99d37421ef786b30eb2b55fd98d115ed8dfe3 Mon Sep 17 00:00:00 2001 From: chengyongru Date: Tue, 7 Jul 2026 13:32:20 +0800 Subject: [PATCH] docs: document Alt+Enter multiline input maintainer edit: document the supported interactive CLI multiline shortcut and trim comments left after removing Shift+Enter support. --- docs/cli-reference.md | 2 ++ docs/quick-start.md | 2 ++ nanobot/cli/commands.py | 10 ++-------- tests/cli/test_cli_input.py | 8 +------- 4 files changed, 7 insertions(+), 15 deletions(-) diff --git a/docs/cli-reference.md b/docs/cli-reference.md index 6d4fc1c9..415161d1 100644 --- a/docs/cli-reference.md +++ b/docs/cli-reference.md @@ -80,6 +80,8 @@ Default paths: | `nanobot agent --no-markdown` | Print plain text instead of Rich-rendered Markdown | | `nanobot agent --logs` | Show runtime logs while chatting | +In interactive mode, `Enter` sends the current message. Press `Alt+Enter` to add a newline before sending. + Interactive mode exits with `exit`, `quit`, `/exit`, `/quit`, `:q`, or `Ctrl+D`. ## WebUI diff --git a/docs/quick-start.md b/docs/quick-start.md index f16ffe69..74a55f0d 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -278,6 +278,8 @@ Then update ~/.nanobot/config.json to add a model preset named "primary" for my Tell me exactly what changed and whether I need to run /restart. ``` +In interactive mode, `Enter` sends the current message. Press `Alt+Enter` to add a newline before sending. + Exit interactive mode with `exit`, `quit`, `/exit`, `/quit`, `:q`, or `Ctrl+D`. ## 7. Choose Your Next Step diff --git a/nanobot/cli/commands.py b/nanobot/cli/commands.py index 7cd6c5b9..eae7eefb 100644 --- a/nanobot/cli/commands.py +++ b/nanobot/cli/commands.py @@ -309,9 +309,7 @@ def _build_cli_key_bindings() -> KeyBindings: * Enter -> submit the current input (keeps the familiar single-line Enter-to-send feel even though the buffer is multiline-capable). - * Alt+Enter -> insert a newline. Universally supported across - terminal emulators, so this is the reliable way to - compose multi-line input. + * Alt+Enter -> insert a newline for multi-line input. """ kb = KeyBindings() @@ -323,11 +321,7 @@ def _build_cli_key_bindings() -> KeyBindings: def _(event): event.current_buffer.insert_text("\n") - # On the same LF-as-Enter terminals (WSL) we preserve plain Enter for, - # Alt+Enter arrives as ESC + LF ("\x1b\x0a" = Escape + ControlJ) rather than - # ESC + CR, so the "escape","enter" binding above never matches: Escape is - # swallowed and the bare LF triggers prompt_toolkit's default submit. Bind - # ESC + ControlJ too so Alt+Enter reliably inserts a newline there as well. + # LF-as-Enter terminals send Alt+Enter as ESC + LF rather than ESC + CR. @kb.add("escape", Keys.ControlJ) # Alt+Enter on LF-as-Enter terminals def _(event): event.current_buffer.insert_text("\n") diff --git a/tests/cli/test_cli_input.py b/tests/cli/test_cli_input.py index e719003f..c7857f1f 100644 --- a/tests/cli/test_cli_input.py +++ b/tests/cli/test_cli_input.py @@ -112,13 +112,7 @@ async def test_raw_lf_enter_still_submits_like_wsl_terminals(): @pytest.mark.asyncio async def test_alt_enter_inserts_newline_on_lf_terminals(): - """On LF-as-Enter terminals (WSL), Alt+Enter arrives as ESC + LF - ("\\x1b\\x0a" = Escape + ControlJ) rather than the ESC + CR that the - "escape","enter" binding matches. Without a dedicated ESC + ControlJ - binding the Escape is swallowed and the bare LF submits, so the documented - Alt+Enter newline fallback breaks on exactly the terminal path plain Enter - is preserved for. Drive a real PromptSession to prove it inserts a newline. - """ + """LF-as-Enter terminals send Alt+Enter as ESC + LF, which needs its own binding.""" from prompt_toolkit.application import create_app_session from prompt_toolkit.input import create_pipe_input from prompt_toolkit.output import DummyOutput