Code source.
https://github.com/HackTechDev/NoteEditor
NoteEditor
Éditeur de texte à onglets. Deux implémentations équivalentes cohabitent dans ce dépôt et partagent le même format de données (~/.noteeditor) :
Python/— Python + PyQt6Cpp/— C++ + Qt6
Fonctionnalités
-
Session persistante : à la fermeture, tous les onglets (contenu, fichier associé, état modifié, onglet actif) sont sauvegardés automatiquement dans
~/.noteeditoret restaurés tels quels au prochain lancement, ainsi que la taille de la fenêtre et la position du séparateur du panneau latéral -
Chaque onglet est archivé dans
~/.noteeditordès sa création, et à nouveau en continu pendant la frappe (1,5s après la dernière touche), à sa fermeture (croix ou Ctrl+W, sans confirmation même en cas de modifications non enregistrées) et à la fermeture de l'appli -
Corbeille : la suppression d'un brouillon est réversible (bouton « Corbeille... » ou menu Fichier), avec restauration ou suppression définitive
-
Historique des versions (10 dernières) : chaque enregistrement archive le contenu précédent du fichier, consultable et restaurable depuis le menu contextuel d'un onglet (clic droit)
-
Onglets multiples (fermables, réordonnables), onglet actif bien visible
-
Bouton + pour créer un nouvel onglet, collé juste après le dernier onglet (style Gedit) ; se déplace automatiquement à côté des flèches de défilement quand les onglets débordent de la largeur disponible
-
Numéros de ligne avec surlignage de la ligne courante
-
Barre d'outils avec icônes Nouveau, Ouvrir, Enregistrer, Enregistrer sous, Rechercher et retour à la ligne automatique (ce dernier activable/désactivable, actif par défaut, s'applique à tous les onglets)
-
Coloration syntaxique automatique selon l'extension : Python (
.py), JSON (.json), Markdown (.md) -
Recherche / remplacement (
Ctrl+F/Ctrl+H) : suivant, précédent, remplacer, tout remplacer -
Nouveaux onglets nommés par date/heure (
aammjj_hhmmssmm) -
Ctrl+Ssur un onglet sans fichier associé l'enregistre directement dans~/.noteeditor/docs/(sous son nom par défaut), sans ouvrir de boîte de dialogue ;Ctrl+Shift+S(Enregistrer sous) permet de choisir un autre emplacement -
Panneau « Brouillons » à gauche : liste tous les onglets archivés dans
~/.noteeditor(ouverts marqués « (ouvert) »), avec recherche, tri (date/nom) et l'entrée de l'onglet actif surlignée ; double-clic pour rouvrir ou basculer dessus, clic droit pour la même palette d'actions que le menu contextuel des onglets (fermer / fermer les autres / fermer à droite / fermer tout, dupliquer, historique des versions), renommer (onglets sans fichier) ou mettre à la corbeille -
Menu contextuel sur les onglets (clic droit) : fermer / fermer les autres / fermer à droite / fermer tout, dupliquer, renommer, historique des versions
-
Glisser-déposer un fichier dans la fenêtre pour l'ouvrir dans un nouvel onglet
-
Détection de modification externe : si le fichier ouvert change sur le disque (autre programme), l'appli propose de recharger
-
Barre de statut : position ligne/colonne, nombre de mots/caractères et encodage (UTF-8) de l'onglet actif
-
Menu Aide → À propos
Installation et lancement
Python
cd Python
pip install -r requirements.txt
python3 main.py
C++
Nécessite qt6-base-dev (fournit les en-têtes et Qt6Config.cmake) en plus d'un compilateur C++17 et de CMake.
cd Cpp
cmake -B build
cmake --build build -j"$(nproc)"
./build/NoteEditor
Raccourcis clavier
| Action | Raccourci |
|---|---|
| Nouvel onglet | Ctrl+N |
| Ouvrir | Ctrl+O |
| Enregistrer | Ctrl+S |
| Enregistrer sous | Ctrl+Shift+S |
| Fermer l'onglet | Ctrl+W |
| Quitter | Ctrl+Q |
| Rechercher | Ctrl+F |
| Rechercher / Remplacer | Ctrl+H |
| Suivant | F3 |
Structure du projet
| Fichier | Rôle |
|---|---|
Python/main.py / Cpp/MainWindow.* |
Fenêtre principale, gestion des onglets, menus, ouverture/enregistrement |
Python/editor_widget.py / Cpp/Editor.* |
Widget d'édition (gouttière de numéros de ligne, ligne courante) |
Python/highlighters.py / Cpp/Highlighters.* |
Coloration syntaxique (Python, JSON, Markdown) |
Python/find_replace.py / Cpp/FindReplaceDialog.* |
Boîte de dialogue de recherche / remplacement |
Python/session.py / Cpp/Session.* |
Sauvegarde et restauration de la session dans ~/.noteeditor |
Python/drafts_browser.py / Cpp/DraftsBrowser.* |
Panneau latéral listant les brouillons (ouverts et fermés) |
Python/trash_dialog.py / Cpp/TrashDialog.* |
Boîte de dialogue de la corbeille (restaurer / supprimer définitivement) |
Python/version_history_dialog.py / Cpp/VersionHistoryDialog.* |
Historique des versions d'un onglet |
Les deux implémentations lisent/écrivent exactement le même format dans ~/.noteeditor : on peut lancer l'une puis l'autre indifféremment sur la même machine, elles se partagent les onglets ouverts et les brouillons.
Session (~/.noteeditor)
~/.noteeditor/session.json: liste des onglets actuellement ouverts (fichier associé, nom par défaut, état modifié, onglet actif)~/.noteeditor/index.json: métadonnées de tous les brouillons jamais sauvegardés (pour l'affichage dans le panneau « Brouillons »)~/.noteeditor/drafts/: contenu de chaque onglet, conservé même après la fermeture de son onglet~/.noteeditor/docs/: fichiers réels créés parCtrl+Sdepuis un onglet sans titre~/.noteeditor/trash/ettrash_index.json: brouillons mis à la corbeille (suppression réversible)~/.noteeditor/versions/<id>/: les 10 dernières versions d'un fichier avant chaque écrasement par un enregistrement~/.noteeditor/window.json: taille de la fenêtre et position du séparateur du panneau latéral, restaurées au lancement suivant
Cette copie de secours n'écrase jamais le fichier d'origine sur le disque : seul un Enregistrer explicite (Ctrl+S) modifie le fichier réel (que ce soit dans ~/.noteeditor/docs/ pour un onglet sans titre, ou à l'emplacement d'origine pour un fichier ouvert ailleurs). Les brouillons ne sont supprimés que manuellement, depuis le panneau latéral (et ne le sont alors que déplacés vers la corbeille).
Capture d'écran.
