From 58657c76d6dbf1c96be6aa0770c4e2631a2a5ea9 Mon Sep 17 00:00:00 2001 From: rubenanko <1.19073715e+08+rubenanko@users.noreply.github.com> Date: Tue, 23 Jun 2026 03:55:56 +0000 Subject: [PATCH 1/2] feat: implement multi-buffer system with scratch buffers and execution --- DESIGN_MULTI_BUFFERS.md | 41 ++++++++++++++++++++ base_events.py | 85 +++++++++++++++++++++++++++++++++++++++++ globals.py | 9 ++++- led.py | 14 +++++++ ui.py | 17 ++++++++- 5 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 DESIGN_MULTI_BUFFERS.md diff --git a/DESIGN_MULTI_BUFFERS.md b/DESIGN_MULTI_BUFFERS.md new file mode 100644 index 0000000..b6fed31 --- /dev/null +++ b/DESIGN_MULTI_BUFFERS.md @@ -0,0 +1,41 @@ +# Conception du Système de Multi-Buffers pour `led` + +## Objectif +Permettre à l'utilisateur de basculer entre le buffer principal (édition de fichier) et N buffers alternatifs indépendants. Ces buffers peuvent être utilisés pour saisir des commandes ou du texte temporaire sans affecter le fichier ouvert. + +## Changements Structurels + +### 1. État Global (`globals.py`) +Nous allons introduire une structure pour stocker l'état de chaque buffer. +- `GLOBALS["BUFFERS"]`: Une liste d'objets (dictionnaires) contenant l'état complet d'un buffer. +- `GLOBALS["CURRENT_BUFFER_INDEX"]`: L'index du buffer actuellement affiché. + +Chaque objet buffer contiendra : +- `BUFFER` (les lignes) +- `LINE_INDEX`, `COLUMN_INDEX` (liste des longueurs de lignes) +- `LINE_BUFFER_LEFT`, `LINE_BUFFER_RIGHT` +- `FILENAME` +- `LEXER` +- `IS_FILE_SAVED` +- `TYPE`: `"FILE"` ou `"SCRATCH"` + +### 2. Gestion des Événements (`base_events.py`) +- Ajout de `switch_buffer(direction)` : Sauvegarde l'état actuel dans `GLOBALS["BUFFERS"][current]` et charge `GLOBALS["BUFFERS"][new]`. +- Nouveaux raccourcis clavier : + - `CTRL_B` : Créer/Basculer vers le buffer suivant. + - `CTRL_G` : Revenir au buffer principal (index 0). + - `CTRL_E` : (Dans un buffer alternatif) Exécuter le contenu comme une commande shell ou commande led. + +### 3. Interface Utilisateur (`ui.py`) +- Mise à jour du bandeau supérieur pour afficher l'index du buffer actuel (ex: `[1/3]`) et son type. +- Si le buffer est de type `"SCRATCH"`, afficher un indicateur visuel différent. + +### 4. Exécution de Commandes +- Un nouveau module ou une fonction dans `base_events.py` pour traiter le contenu d'un buffer alternatif. + +## Flux de Travail +1. Modifier `globals.py` pour initialiser la liste des buffers. +2. Créer une fonction de synchronisation dans `base_events.py`. +3. Intercepter les touches de basculement. +4. Adapter `ui.py`. +5. Implémenter la logique d'exécution. diff --git a/base_events.py b/base_events.py index f1f00bf..cd8ba3c 100644 --- a/base_events.py +++ b/base_events.py @@ -10,6 +10,83 @@ def initBuffers(): GLOBALS["LINE_BUFFER_LEFT"] = GLOBALS["BUFFER"][GLOBALS["LINE_INDEX"]][:GLOBALS["COLUMN_INDEX"][GLOBALS["LINE_INDEX"]]] GLOBALS["LINE_BUFFER_RIGHT"] = GLOBALS["BUFFER"][GLOBALS["LINE_INDEX"]][GLOBALS["COLUMN_INDEX"][GLOBALS["LINE_INDEX"]]:] +def save_current_buffer_state(): + if not GLOBALS["BUFFERS"]: return + idx = GLOBALS["CURRENT_BUFFER_INDEX"] + state = { + "FILENAME": GLOBALS["FILENAME"], + "BUFFER": list(GLOBALS["BUFFER"]), + "LINE_INDEX": GLOBALS["LINE_INDEX"], + "COLUMN_INDEX": list(GLOBALS["COLUMN_INDEX"]), + "NUMBER_OF_DIGITS": GLOBALS["NUMBER_OF_DIGITS"], + "IS_FILE_SAVED": GLOBALS["IS_FILE_SAVED"], + "LEXER": GLOBALS["LEXER"], + "TYPE": GLOBALS["BUFFERS"][idx].get("TYPE", "FILE") + } + GLOBALS["BUFFERS"][idx] = state + +def load_buffer_state(idx): + state = GLOBALS["BUFFERS"][idx] + GLOBALS["FILENAME"] = state["FILENAME"] + GLOBALS["BUFFER"] = state["BUFFER"] + GLOBALS["LINE_INDEX"] = state["LINE_INDEX"] + GLOBALS["COLUMN_INDEX"] = state["COLUMN_INDEX"] + GLOBALS["NUMBER_OF_DIGITS"] = state["NUMBER_OF_DIGITS"] + GLOBALS["IS_FILE_SAVED"] = state["IS_FILE_SAVED"] + GLOBALS["LEXER"] = state["LEXER"] + GLOBALS["CURRENT_BUFFER_INDEX"] = idx + initBuffers() + +def create_scratch_buffer(): + state = { + "FILENAME": f"scratch_{len(GLOBALS['BUFFERS'])}", + "BUFFER": [""], + "LINE_INDEX": 0, + "COLUMN_INDEX": [0], + "NUMBER_OF_DIGITS": 1, + "IS_FILE_SAVED": True, + "LEXER": None, + "TYPE": "SCRATCH" + } + GLOBALS["BUFFERS"].append(state) + return len(GLOBALS["BUFFERS"]) - 1 + +def handle_buffer_switch(): + save_current_buffer_state() + next_idx = (GLOBALS["CURRENT_BUFFER_INDEX"] + 1) + if next_idx >= len(GLOBALS["BUFFERS"]): + next_idx = create_scratch_buffer() + load_buffer_state(next_idx) + +def handle_go_to_main_buffer(): + save_current_buffer_state() + load_buffer_state(0) + +def handle_execute_buffer(): + import subprocess + # On rejoint les lignes du buffer actuel + command = "\n".join(GLOBALS["BUFFER"]) + if not command.strip(): return + + # On pourrait parser ici des commandes spécifiques à 'led' + # Pour l'instant, on exécute comme une commande shell + try: + # On sort du mode plein écran temporairement pour voir la sortie ? + # Ou on capture et on affiche dans un nouveau buffer ? + # L'énoncé suggère d'utiliser le texte pour "exécuter des commandes shell" + # On va tenter une exécution simple et afficher le résultat dans un nouveau buffer + result = subprocess.run(command, shell=True, capture_output=True, text=True) + output = result.stdout + result.stderr + + save_current_buffer_state() + new_idx = create_scratch_buffer() + GLOBALS["BUFFERS"][new_idx]["BUFFER"] = output.split("\n") + GLOBALS["BUFFERS"][new_idx]["COLUMN_INDEX"] = [len(l) for l in GLOBALS["BUFFERS"][new_idx]["BUFFER"]] + GLOBALS["BUFFERS"][new_idx]["NUMBER_OF_DIGITS"] = get_max_digit_number(len(GLOBALS["BUFFERS"][new_idx]["BUFFER"])) + load_buffer_state(new_idx) + except Exception as e: + pass + def get_max_digit_number(integer: int)->int: if integer < 10: return 1 @@ -203,6 +280,14 @@ def handle_base_events(char: chr)->bool: GLOBALS["COLUMN_INDEX"][GLOBALS["LINE_INDEX"]] += 4 GLOBALS["IS_FILE_SAVED"] = False + elif char == GLOBALS["CTRL_B_KEY"]: + handle_buffer_switch() + + elif char == GLOBALS["CTRL_G_KEY"]: + handle_go_to_main_buffer() + + elif char == GLOBALS["CTRL_E_KEY"]: + handle_execute_buffer() else: char_decoded = char.decode("utf-8","replace") diff --git a/globals.py b/globals.py index b65aea2..42a773c 100644 --- a/globals.py +++ b/globals.py @@ -7,6 +7,11 @@ GLOBALS = {} #globals +GLOBALS["CURRENT_BUFFER_INDEX"] = 0 +GLOBALS["BUFFERS"] = [] +GLOBALS["PAPERCLIP"] = None + +# Les clés suivantes seront synchronisées avec GLOBALS["BUFFERS"][GLOBALS["CURRENT_BUFFER_INDEX"]] GLOBALS["FILENAME"] = None GLOBALS["BUFFER"]: List[str] = None #lines of the opened file GLOBALS["MODULE_BUFFER"]: List[str] = None # a display for modules @@ -17,7 +22,6 @@ GLOBALS["NUMBER_OF_DIGITS"]: int = None GLOBALS["IS_FILE_SAVED"]:bool = None GLOBALS["LEXER"] = None -GLOBALS["PAPERCLIP"] = None #KEY CODES GLOBALS["ESCAPE_KEY"] = b"\x1b" @@ -53,6 +57,9 @@ GLOBALS["CTRL_C_KEY"] = b"\x03" GLOBALS["CTRL_X_KEY"] = b"\x18" GLOBALS["CTRL_V_KEY"] = b"\x16" +GLOBALS["CTRL_B_KEY"] = b"\x02" # Switch/Create Buffer +GLOBALS["CTRL_G_KEY"] = b"\x07" # Go to Main Buffer +GLOBALS["CTRL_E_KEY"] = b"\x05" # Execute Buffer Content # reading the configuration with open(CONFIG_PATH,"r") as config: diff --git a/led.py b/led.py index 13fd74f..0e89e8d 100644 --- a/led.py +++ b/led.py @@ -31,6 +31,20 @@ def openFile(filename: str,line_index: int = 0): except Exception: GLOBALS["LEXER"] = TextLexer() + # Initialisation de la liste des buffers avec le fichier ouvert + from base_events import save_current_buffer_state + GLOBALS["BUFFERS"] = [{ + "FILENAME": GLOBALS["FILENAME"], + "BUFFER": list(GLOBALS["BUFFER"]), + "LINE_INDEX": GLOBALS["LINE_INDEX"], + "COLUMN_INDEX": list(GLOBALS["COLUMN_INDEX"]), + "NUMBER_OF_DIGITS": GLOBALS["NUMBER_OF_DIGITS"], + "IS_FILE_SAVED": GLOBALS["IS_FILE_SAVED"], + "LEXER": GLOBALS["LEXER"], + "TYPE": "FILE" + }] + GLOBALS["CURRENT_BUFFER_INDEX"] = 0 + initBuffers() def init(argv: List[str]): diff --git a/ui.py b/ui.py index fe743ad..e8c8156 100644 --- a/ui.py +++ b/ui.py @@ -25,7 +25,17 @@ def render(): save_status_char = "\x1b[1;32m~\x1b[0;0m" if GLOBALS["IS_FILE_SAVED"] else "\x1b[1;35m~\x1b[0;0m" current_digit_number = get_max_digit_number(GLOBALS["LINE_INDEX"]+1) cursor_coordinates = f'\x1b[{1 + (GLOBALS["COLUMN_INDEX"][GLOBALS["LINE_INDEX"]] + GLOBALS["NUMBER_OF_DIGITS"] + 3) // columns_number};{1 + (GLOBALS["COLUMN_INDEX"][GLOBALS["LINE_INDEX"]] + GLOBALS["NUMBER_OF_DIGITS"] + 3) % columns_number}f' - highlighted_buffer = highlight(GLOBALS["LINE_BUFFER_LEFT"] + GLOBALS["LINE_BUFFER_RIGHT"],GLOBALS["LEXER"],Terminal256Formatter(style=CONFIG["code-color-scheme"]))[:-1] + + # Gestion du lexer pour les buffers scratch (souvent None) + lexer = GLOBALS["LEXER"] + from pygments.lexers import TextLexer + if lexer is None: lexer = TextLexer() + + highlighted_buffer = highlight(GLOBALS["LINE_BUFFER_LEFT"] + GLOBALS["LINE_BUFFER_RIGHT"],lexer,Terminal256Formatter(style=CONFIG["code-color-scheme"]))[:-1] + + # Indicateur de buffer + buffer_type = GLOBALS["BUFFERS"][GLOBALS["CURRENT_BUFFER_INDEX"]].get("TYPE", "FILE") + buffer_info = f'[{GLOBALS["CURRENT_BUFFER_INDEX"]+1}/{len(GLOBALS["BUFFERS"])}] ({buffer_type}) ' #building the file display buffer inf = max(0,GLOBALS["LINE_INDEX"]-((lines_number-displayed_lines_number)//2)) @@ -55,4 +65,7 @@ def render(): file_highlighted_buffer = f'{top_file_buffer if len(top_file_buffer) > 0 else ""}\x1b[1;31m{GLOBALS["LINE_INDEX"]+1}{" " * (GLOBALS["NUMBER_OF_DIGITS"] - get_max_digit_number(GLOBALS["LINE_INDEX"]+1))} > \x1b[7;39m{GLOBALS["BUFFER"][GLOBALS["LINE_INDEX"]]}\x1b[0;0m{fill_line(len(GLOBALS["BUFFER"][GLOBALS["LINE_INDEX"]])+ 3 + GLOBALS["NUMBER_OF_DIGITS"],columns_number)}\n{bottom_file_buffer}' #actual rendering - print(f'\x1b[1;1f\x1b[0;33m{GLOBALS["LINE_INDEX"]+1}\x1b[0;0m{" " * (GLOBALS["NUMBER_OF_DIGITS"] - current_digit_number)} {save_status_char} {highlighted_buffer}{" " * ((columns_number - 3 - GLOBALS["NUMBER_OF_DIGITS"] - len(GLOBALS["LINE_BUFFER_LEFT"] + GLOBALS["LINE_BUFFER_RIGHT"])) % columns_number)}\n{"—"*columns_number}\n{file_highlighted_buffer}{" "*(lines_number-displayed_lines_number)*columns_number}{cursor_coordinates}',end="",flush=True) \ No newline at end of file + header = f'\x1b[0;33m{GLOBALS["LINE_INDEX"]+1}\x1b[0;0m{" " * (GLOBALS["NUMBER_OF_DIGITS"] - current_digit_number)} {save_status_char} \x1b[1;36m{buffer_info}\x1b[0;0m{highlighted_buffer}' + padding = " " * (max(0, columns_number - (len(buffer_info) + 3 + GLOBALS["NUMBER_OF_DIGITS"] + len(GLOBALS["LINE_BUFFER_LEFT"] + GLOBALS["LINE_BUFFER_RIGHT"])))) + + print(f'\x1b[1;1f{header}{padding}\n{"—"*columns_number}\n{file_highlighted_buffer}{" "*(lines_number-displayed_lines_number)*columns_number}{cursor_coordinates}',end="",flush=True) \ No newline at end of file From e703b91ce10292234d6f93f140c25cb0a614fd84 Mon Sep 17 00:00:00 2001 From: rubenanko Date: Tue, 23 Jun 2026 19:42:09 +0700 Subject: [PATCH 2/2] feat(): remove buffer info, change BUFFERS index for key --- base_events.py | 50 ++++++-------------------------------------------- config.json | 2 +- globals.py | 7 +++---- led.py | 2 +- ui.py | 8 ++------ 5 files changed, 13 insertions(+), 56 deletions(-) diff --git a/base_events.py b/base_events.py index cd8ba3c..9f980c3 100644 --- a/base_events.py +++ b/base_events.py @@ -12,7 +12,7 @@ def initBuffers(): def save_current_buffer_state(): if not GLOBALS["BUFFERS"]: return - idx = GLOBALS["CURRENT_BUFFER_INDEX"] + key = GLOBALS["CURRENT_BUFFER_KEY"] state = { "FILENAME": GLOBALS["FILENAME"], "BUFFER": list(GLOBALS["BUFFER"]), @@ -21,12 +21,12 @@ def save_current_buffer_state(): "NUMBER_OF_DIGITS": GLOBALS["NUMBER_OF_DIGITS"], "IS_FILE_SAVED": GLOBALS["IS_FILE_SAVED"], "LEXER": GLOBALS["LEXER"], - "TYPE": GLOBALS["BUFFERS"][idx].get("TYPE", "FILE") + "TYPE": GLOBALS["BUFFERS"][key].get("TYPE", "FILE") } - GLOBALS["BUFFERS"][idx] = state + GLOBALS["BUFFERS"][key] = state -def load_buffer_state(idx): - state = GLOBALS["BUFFERS"][idx] +def load_buffer_state(key): + state = GLOBALS["BUFFERS"][key] GLOBALS["FILENAME"] = state["FILENAME"] GLOBALS["BUFFER"] = state["BUFFER"] GLOBALS["LINE_INDEX"] = state["LINE_INDEX"] @@ -34,7 +34,7 @@ def load_buffer_state(idx): GLOBALS["NUMBER_OF_DIGITS"] = state["NUMBER_OF_DIGITS"] GLOBALS["IS_FILE_SAVED"] = state["IS_FILE_SAVED"] GLOBALS["LEXER"] = state["LEXER"] - GLOBALS["CURRENT_BUFFER_INDEX"] = idx + GLOBALS["CURRENT_BUFFER_KEY"] = key initBuffers() def create_scratch_buffer(): @@ -51,42 +51,10 @@ def create_scratch_buffer(): GLOBALS["BUFFERS"].append(state) return len(GLOBALS["BUFFERS"]) - 1 -def handle_buffer_switch(): - save_current_buffer_state() - next_idx = (GLOBALS["CURRENT_BUFFER_INDEX"] + 1) - if next_idx >= len(GLOBALS["BUFFERS"]): - next_idx = create_scratch_buffer() - load_buffer_state(next_idx) - def handle_go_to_main_buffer(): save_current_buffer_state() load_buffer_state(0) -def handle_execute_buffer(): - import subprocess - # On rejoint les lignes du buffer actuel - command = "\n".join(GLOBALS["BUFFER"]) - if not command.strip(): return - - # On pourrait parser ici des commandes spécifiques à 'led' - # Pour l'instant, on exécute comme une commande shell - try: - # On sort du mode plein écran temporairement pour voir la sortie ? - # Ou on capture et on affiche dans un nouveau buffer ? - # L'énoncé suggère d'utiliser le texte pour "exécuter des commandes shell" - # On va tenter une exécution simple et afficher le résultat dans un nouveau buffer - result = subprocess.run(command, shell=True, capture_output=True, text=True) - output = result.stdout + result.stderr - - save_current_buffer_state() - new_idx = create_scratch_buffer() - GLOBALS["BUFFERS"][new_idx]["BUFFER"] = output.split("\n") - GLOBALS["BUFFERS"][new_idx]["COLUMN_INDEX"] = [len(l) for l in GLOBALS["BUFFERS"][new_idx]["BUFFER"]] - GLOBALS["BUFFERS"][new_idx]["NUMBER_OF_DIGITS"] = get_max_digit_number(len(GLOBALS["BUFFERS"][new_idx]["BUFFER"])) - load_buffer_state(new_idx) - except Exception as e: - pass - def get_max_digit_number(integer: int)->int: if integer < 10: return 1 @@ -280,15 +248,9 @@ def handle_base_events(char: chr)->bool: GLOBALS["COLUMN_INDEX"][GLOBALS["LINE_INDEX"]] += 4 GLOBALS["IS_FILE_SAVED"] = False - elif char == GLOBALS["CTRL_B_KEY"]: - handle_buffer_switch() - elif char == GLOBALS["CTRL_G_KEY"]: handle_go_to_main_buffer() - elif char == GLOBALS["CTRL_E_KEY"]: - handle_execute_buffer() - else: char_decoded = char.decode("utf-8","replace") if char_decoded.isprintable(): diff --git a/config.json b/config.json index c8486ec..cd92eb1 100644 --- a/config.json +++ b/config.json @@ -1,3 +1,3 @@ { - "code-color-scheme" : "zenburn" + "code-color-scheme" : "monokai" } \ No newline at end of file diff --git a/globals.py b/globals.py index 42a773c..c15f08c 100644 --- a/globals.py +++ b/globals.py @@ -7,11 +7,11 @@ GLOBALS = {} #globals -GLOBALS["CURRENT_BUFFER_INDEX"] = 0 -GLOBALS["BUFFERS"] = [] +GLOBALS["CURRENT_BUFFER_KEY"] = "main" +GLOBALS["BUFFERS"] = {} GLOBALS["PAPERCLIP"] = None -# Les clés suivantes seront synchronisées avec GLOBALS["BUFFERS"][GLOBALS["CURRENT_BUFFER_INDEX"]] +# Les clés suivantes seront synchronisées avec GLOBALS["BUFFERS"][GLOBALS["CURRENT_BUFFER_KEY"]] GLOBALS["FILENAME"] = None GLOBALS["BUFFER"]: List[str] = None #lines of the opened file GLOBALS["MODULE_BUFFER"]: List[str] = None # a display for modules @@ -59,7 +59,6 @@ GLOBALS["CTRL_V_KEY"] = b"\x16" GLOBALS["CTRL_B_KEY"] = b"\x02" # Switch/Create Buffer GLOBALS["CTRL_G_KEY"] = b"\x07" # Go to Main Buffer -GLOBALS["CTRL_E_KEY"] = b"\x05" # Execute Buffer Content # reading the configuration with open(CONFIG_PATH,"r") as config: diff --git a/led.py b/led.py index 0e89e8d..73eca3c 100644 --- a/led.py +++ b/led.py @@ -43,7 +43,7 @@ def openFile(filename: str,line_index: int = 0): "LEXER": GLOBALS["LEXER"], "TYPE": "FILE" }] - GLOBALS["CURRENT_BUFFER_INDEX"] = 0 + GLOBALS["CURRENT_BUFFER_KEY"] = "main" initBuffers() diff --git a/ui.py b/ui.py index e8c8156..5fc08fa 100644 --- a/ui.py +++ b/ui.py @@ -33,10 +33,6 @@ def render(): highlighted_buffer = highlight(GLOBALS["LINE_BUFFER_LEFT"] + GLOBALS["LINE_BUFFER_RIGHT"],lexer,Terminal256Formatter(style=CONFIG["code-color-scheme"]))[:-1] - # Indicateur de buffer - buffer_type = GLOBALS["BUFFERS"][GLOBALS["CURRENT_BUFFER_INDEX"]].get("TYPE", "FILE") - buffer_info = f'[{GLOBALS["CURRENT_BUFFER_INDEX"]+1}/{len(GLOBALS["BUFFERS"])}] ({buffer_type}) ' - #building the file display buffer inf = max(0,GLOBALS["LINE_INDEX"]-((lines_number-displayed_lines_number)//2)) sup = min(len(GLOBALS["BUFFER"]),GLOBALS["LINE_INDEX"]+((lines_number-displayed_lines_number)//2) + max(0,-GLOBALS["LINE_INDEX"] + ((lines_number-displayed_lines_number)//2)) - 1) @@ -65,7 +61,7 @@ def render(): file_highlighted_buffer = f'{top_file_buffer if len(top_file_buffer) > 0 else ""}\x1b[1;31m{GLOBALS["LINE_INDEX"]+1}{" " * (GLOBALS["NUMBER_OF_DIGITS"] - get_max_digit_number(GLOBALS["LINE_INDEX"]+1))} > \x1b[7;39m{GLOBALS["BUFFER"][GLOBALS["LINE_INDEX"]]}\x1b[0;0m{fill_line(len(GLOBALS["BUFFER"][GLOBALS["LINE_INDEX"]])+ 3 + GLOBALS["NUMBER_OF_DIGITS"],columns_number)}\n{bottom_file_buffer}' #actual rendering - header = f'\x1b[0;33m{GLOBALS["LINE_INDEX"]+1}\x1b[0;0m{" " * (GLOBALS["NUMBER_OF_DIGITS"] - current_digit_number)} {save_status_char} \x1b[1;36m{buffer_info}\x1b[0;0m{highlighted_buffer}' - padding = " " * (max(0, columns_number - (len(buffer_info) + 3 + GLOBALS["NUMBER_OF_DIGITS"] + len(GLOBALS["LINE_BUFFER_LEFT"] + GLOBALS["LINE_BUFFER_RIGHT"])))) + header = f'\x1b[0;33m{GLOBALS["LINE_INDEX"]+1}\x1b[0;0m{" " * (GLOBALS["NUMBER_OF_DIGITS"] - current_digit_number)} {save_status_char} {highlighted_buffer}' + padding = " " * (max(0, columns_number - (3 + GLOBALS["NUMBER_OF_DIGITS"] + len(GLOBALS["LINE_BUFFER_LEFT"] + GLOBALS["LINE_BUFFER_RIGHT"])))) print(f'\x1b[1;1f{header}{padding}\n{"—"*columns_number}\n{file_highlighted_buffer}{" "*(lines_number-displayed_lines_number)*columns_number}{cursor_coordinates}',end="",flush=True) \ No newline at end of file