diff --git a/app/llmchat.py b/app/llmchat.py index 805d72d..48e037f 100644 --- a/app/llmchat.py +++ b/app/llmchat.py @@ -77,7 +77,7 @@ def clear_ctx(stub, state): # main initialization llm = LLMChat(config_file=CONFIG_FILE, message_limit=20) -chat = DeckChat(start_state=llm, chat_prefix='> ', paginate=8) +chat = DeckChat(start_state=llm, chat_prefix='> ') chat.command('default', send_msg) chat.command('clear', clear_ctx) chat.command('system', set_sys_prompt) diff --git a/deck/chat.py b/deck/chat.py index 08da60d..a29d23d 100644 --- a/deck/chat.py +++ b/deck/chat.py @@ -4,9 +4,10 @@ # Created by Luxferre in 2025, released into public domain from deck.input import input +from deck.pager import print_paged class DeckChat: - def __init__(self, start_state={}, chat_prefix='> ', command_prefix='/', paginate=0): + def __init__(self, start_state={}, chat_prefix='> ', command_prefix='/'): """Init the chat class""" self.command_prefix = command_prefix # prefix that commands start with self.chat_prefix = chat_prefix # prefix to write before input @@ -14,7 +15,6 @@ class DeckChat: 'default': lambda m,s: (m,s) # echo handler by default } self.state = start_state # internal state object (impl-specific) - self.paginate_n = paginate # paginate the responses exceeding N>0 lines def command(self, command, handler): """ @@ -43,15 +43,6 @@ class DeckChat: res = (cmd, arg) return res - def _paginate_output(self, text): - """Splits output for small terminals.""" - lines = text.split('\n') - for i in range(0, len(lines), self.paginate_n): - chunk = lines[i:i + self.paginate_n] - for line in chunk: print(line) - if i + self.paginate_n < len(lines): - input("-- Press Enter --") - def start(self): """Start the chat loop""" while True: @@ -60,10 +51,7 @@ class DeckChat: if len(input_msg) == 0: continue cmd, msg = self._detect_command(input_msg) output, self.state = self.command_handlers[cmd](msg, self.state) - if self.paginate_n > 0: - self._paginate_output(output.strip()) - else: - print(output) + print_paged(output.strip()) if self.state is None: break except (KeyboardInterrupt, EOFError): diff --git a/deck/pager.py b/deck/pager.py new file mode 100644 index 0000000..0ad34c0 --- /dev/null +++ b/deck/pager.py @@ -0,0 +1,44 @@ +# deck.pager: Simple text pagination library for T-Deck +# Usage: from deck.pager import print_paged +# Created by Luxferre in 2025, released into public domain + +import os +from deck.input import input + +# detect terminal size +TERM_ROWS = os.getenv('TERM_ROWS', 24) +TERM_COLS = os.getenv('TERM_COLS', 80) +try: # if running on CPython + TERM_COLS, TERM_ROWS = os.get_terminal_size() +except: + pass + +# additional constants +REAL_TERM_ROWS = TERM_ROWS - 1 # for the "press Enter" message +CONT_MSG = '--- Press Enter ---' + +def term_size(): + """Return the detected terminal size (rows, columns)""" + return (TERM_ROWS, TERM_COLS) + +def reflow(text): + """Split the text into lines not exceeding the terminal width""" + out = [] + for line in text.split('\n'): + line = line.rstrip() + while len(line) > 0: + out.append(line[0:TERM_COLS]) + line = line[TERM_COLS:] + return out + +def print_paged(text): + """Reflow and print the text in a paginated manner""" + lines = reflow(text) + ll = len(lines) + for i in range(0, ll, REAL_TERM_ROWS): + chunk = lines[i:i + REAL_TERM_ROWS] + for line in chunk: print(line) + if i + REAL_TERM_ROWS < ll: + input(CONT_MSG) + +