docs: document Alt+Enter multiline input

maintainer edit: document the supported interactive CLI multiline shortcut and trim comments left after removing Shift+Enter support.
This commit is contained in:
chengyongru
2026-07-07 15:41:08 +08:00
committed by Xubin Ren
parent 01a0f5aaf3
commit 29e99d3742
4 changed files with 7 additions and 15 deletions
+2
View File
@@ -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
+2
View File
@@ -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
+2 -8
View File
@@ -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")
+1 -7
View File
@@ -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