Enhance multiline input handling in HermesCLI

- Patched prompt_toolkit to recognize Shift+Enter as a distinct key for inserting new lines, improving the multiline input experience.
- Added Alt+Enter as a fallback for terminals that do not support Shift+Enter, ensuring consistent functionality across different environments.
- Updated user instructions to reflect the new key bindings for multiline input.
This commit is contained in:
teknium1
2026-02-17 21:53:19 -08:00
parent d7cef744ec
commit d9a8e421a4

19
cli.py
View File

@@ -37,10 +37,18 @@ from prompt_toolkit.layout.dimension import Dimension
from prompt_toolkit.widgets import TextArea
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.completion import Completer, Completion
from prompt_toolkit.keys import Keys
import threading
import queue
import tempfile
# Patch prompt_toolkit to recognize Shift+Enter as a distinct key.
# By default, the xterm "disambiguated modified keys" sequence for Shift+Enter
# (\x1b[27;2;13~) is mapped to ControlM (same as plain Enter). We remap it to
# a unique key tuple so we can bind Shift+Enter to insert a newline.
from prompt_toolkit.input.ansi_escape_sequences import ANSI_SEQUENCES
ANSI_SEQUENCES["\x1b[27;2;13~"] = (Keys.Escape, Keys.ControlJ) # Shift+Enter
# Load environment variables first
from dotenv import load_dotenv
env_path = Path(__file__).parent / '.env'
@@ -829,7 +837,7 @@ class HermesCLI:
print()
print(" Tip: Just type your message to chat with Hermes!")
print(" Multi-line: End a line with \\ to continue on next line")
print(" Multi-line: Shift+Enter for a new line (Alt+Enter as fallback)")
print()
def show_tools(self):
@@ -1549,9 +1557,14 @@ class HermesCLI:
self._pending_input.put(text)
event.app.current_buffer.reset()
@kb.add('s-enter')
@kb.add('escape', 'c-j')
def handle_shift_enter(event):
"""Shift+Enter inserts a newline for multi-line input."""
"""Shift+Enter inserts a newline (via patched ANSI sequence)."""
event.current_buffer.insert_text('\n')
@kb.add('escape', 'enter')
def handle_alt_enter(event):
"""Alt+Enter also inserts a newline (fallback for terminals without Shift+Enter)."""
event.current_buffer.insert_text('\n')
@kb.add('c-c')