Prosty edytor tekstu stworzony w Qt, ułatwiający wstawianie znaczników STC używanych na platformie Cpp0x.pl.
Edytor ten został zaprojektowany, aby uprościć pracę z językiem znaczników STC na potrzeby tworzenia treści dla cpp0x.pl. Oferuje prosty interfejs oparty na Qt z polem tekstowym i przyciskami do wstawiania znaczników STC oraz dedykowane funkcje zwiększające produktywność.
Jak ktoś chce tego używać na potrzeby pisania na stronę Cpp0x.pl (do czego zachęcam):
- Kolorowanie składni: Podświetlanie znaczników STC dla lepszej czytelności.
- Kolorowanie składni C++ w ramach znaczników
[cpp]...[/cpp]. Jest to zaimplementowane przy wykorzystaniu QCodeEditor (autorstwa Megaxela, bazując na forku ArsMasiuk).
- Kolorowanie składni C++ w ramach znaczników
- Weryfikacja zamknięcia znaczników: Sprawdza, czy wszystkie znaczniki STC są poprawnie zamknięte.
- Transformacja tekstu: Zmiana zaznaczonego tekstu na małe litery, wielkie litery, camelCase na snake_case lub odwrotnie.
- Podgląd kontekstu dokumentu:
- Wykrywa znaczniki (np.
[h1]Nagłówek[/h1]), ich numery linii oraz zawartość (np. „Nagłówek”). - Umożliwia przejście do określonych pozycji w dokumencie na podstawie kontekstu.
- Filtrowanie wybranych znaczników (np. tylko
[h1]). - Śledzenie pozycji kursora w kontekście dokumentu w czasie rzeczywistym.
- Wykrywa znaczniki (np.
- Podgląd obrazów: Najedź myszą na
[img src="ścieżka/do/obrazu.png"], aby zobaczyć podgląd obrazu (wymaga prawidłowej ścieżki).- Podgląd również obrazków z internetu
- Usuwanie znaczników: Kliknij prawym przyciskiem wewnątrz znaczników (np.
[b]Pogrubiony tekst[/b]), aby usunąć znaczniki, pozostawiając tylko treść (np.Pogrubiony tekst). - Formatowanie kodu C++: Kliknij prawym przyciskiem wewnątrz
[cpp]...[/cpp], aby sformatować kod za pomocąclang-format(wymaga zainstalowanegoclang-format).- Jeśli obok pliku tekstowego znajduje się plik z ustawieniami formatowania ".clang-format" to zostanie on użyty, w przeciwny wypadku domyślne użyte zostanie "LLVM".
- Kompilacja kodu C++: Kliknij prawym przyciskiem wewnątrz
[cpp]...[/cpp], aby skompilować kod za pomocąg++(wymaga zainstalowanegog++). - Usuwanie komentarzy C++: Kliknij prawym przyciskiem wewnątrz
[cpp]...[/cpp], aby usunąć wszystkie komentarze z kodu C++ (wykorzystuje bibliotekę StripCppComments). Dodatkowo funkcja czyści nadmiarowe puste linie, pozostawiając maksymalnie dwie puste linie obok siebie. - Czyszczenie pustych linii: Kliknij prawym przyciskiem wewnątrz dowolnego tekstu, aby usunąć nadmiarowe puste linie, pozostawiając maksymalnie dwie puste linie obok siebie. Przydatne do porządkowania tekstu po usunięciu komentarzy lub ogólnego czyszczenia formatowania.
- Statystyki pliku: Wyświetla statystyki specyficzne dla STC, np. użycie znaczników, obok standardowych metryk edytora.
- Nawigacja okruszkowa: Dynamicznie aktualizowany pasek adresu pokazujący bieżącą pozycję w strukturze dokumentu STC, z możliwością kliknięcia.
- Śledzenie zmian: Śledzi zmienione linie za pomocą biblioteki pydifflib-cpp.
- Listowanie kodów w pliku: Oddzielny widget, który śledzi na bieżąco pozycje kodów
[cpp]i innych. - Dedykowane przeciągnij i upuść: Do aplikacji można przeciągać pliki i zostaną odpowiednio obsłużone:
- Ścieżka do plików graficznych zostanie otoczona tagami
[img src="ścieżka/do/przeciagnietego/obrazu.png"] - Zawartość plików tekstowych o rozszerzeniach wskazujących na C/C++ zostanie wstawione i otoczona tagami
[cpp]...[/cpp] - Zawartość pozostałych plików tekstowych zostanie wstawiona i otoczona tagami
[code]...[/code]
- Ścieżka do plików graficznych zostanie otoczona tagami
- Podgląd strony w czasie rzeczywistym: Jest możliwe użycie w programie backendu konwertującego kod ze znacznikami STC na kod HTML.
- Dostępne są również statystyki: ile danych wysłano i pobrano, widoczne po najechaniu myszką na obszar renderujący
- Śledzenie TODO w dokumencie: W podglądzie dokumentu widać komentarze
TODO:wraz z tekstem na prawo od tego, są one klikalne i wtedy przechodzą do danej pozycji. - Klikalne linki: wewnątrz tagów z linkiem
[a href="..."]lub[a href="..." name="..."]możemy przytrzymać CTRL + lewy przycisk myszy i nam się otworzy dany link - Wklejane linki wklejane w odpowiedni sposób: jak wklejamy przez CTRL+V, a w schowku jest link to otacza linka tagami linka
[a href="link"]- Po chwili zostanie pobrana z linka i dodana jako kolejny atrybut nazwa strony, czyli zamiast
[a href="link"]będzie[a href="link" name="Nazwa strony dla linka"] - Jeśli jest zaznaczony tekst to "podlinkowuje go" przez otoczenie:
[a href="link" name="Zaznaczony wcześniej tekst"] - Jeśli wklejamy linka wewnątrz tagu
[img src=""]to jest wklejany jako zwykły tekst.
- Po chwili zostanie pobrana z linka i dodana jako kolejny atrybut nazwa strony, czyli zamiast
- Wklejalne tabelki: gdy w schowku jest tabelka to jest ona otaczana odpowiednimi tagami
[csv]...[/csv]a komórki są rozdzielane średnikami.- Jeśli wklejony tekst zawiera tagi, to odpowiednie komórki są otaczane przez
[run], a typ tabelki się zmienia na[csv ext]
- Jeśli wklejony tekst zawiera tagi, to odpowiednie komórki są otaczane przez
- Wklejanie rich-text: jak wkleimy tekst ze strony lub np. programu Office to HTML jest zamieniany na znaczniki STC (częściowo), m.in. linki, pogrubienia itp.
- Dodawanie/usuwanie atrybutów dla tagów z menu kontekstowego: Gdy klikniemy prawym przyciskiem myszy na tagu, które ma możliwe różne atrybuty, to pojawia się możliwość wyklikania opcjonalnych atrybutów do dodania/usunięcia.
- Przyciski do dodawania tagów STC (inteligentne przyciski): Obok tekstu są różne przyciski wspierające prawie wszystkie tagi STC. Kliknięcie przycisku powoduje albo wstawienie tagu w pozycji kursora tekstu, albo otoczenie zaznaczonego tekstu tagami.
- Przycisk
a hrefdostosowuje się do zaznaczonego tekstu, jak go nie ma to po prostu wstawia pusty tag, ale jak coś jest zaznaczone to próbuje wykryć tam link i odpowiednio otoczyć tagiem dopasowując zarówno linka jak i nazwę linka - Przycisk
imgdostosowuje się do zaznaczonego tekstu, jak go nie ma to po prostu wstawia pusty tag, ale jak coś jest zaznaczone to próbuje wykryć ścieżkę do pliku graficznego i odpowiednio otoczyć tagiem dopasowując zarówno źródło obrazka jak i opis - Niektóre tagi mają inteligentne zaznaczenie np. jak mamy zaznaczony link i tekst, a chcemy otoczyć przez
[a href=...]to link wstawi w miejsce odnośnika a resztę tekstu jako nazwę linka. - Podobnie jest z zaznaczeniem tekstu zawierającego ścieżkę do obrazka, a chcemy otoczyć przez
[img src...]to wtedy nazwa obrazka stanowi jego adres, a reszta zaznaczonego tekstu jego opis. - Gdy mamy zaznaczony tekst, który jest już otagowany i wywołujemy ponowne tagowanie tego tekstu tymi samymi tagami to jeśli jest zaznaczony tekst z tagami lub wewnatrz tagów to zostaną te tagi usunięte.
- Przycisk
- Sprawdzanie literówek (ang. spellcheck): teksty jest sprawdzany ze słownikiem (biblioteka nuspell), oraz są podkreślane nieistniejące wyrazy w języku polskim. Oczywiście w ramach tagów STC tekst jest pomijany (chyba, że atrybuty wymagające sprawdzenia, np. opis obrazka).
- Menu kontekstowe z podpowiedziamy poprawiającymi literówki.
- Inteligentne menu kontekstowe dla tagów: Po kliknięciu w tekście prawym przyciskiem myszy na tagu pojawiają się pewne specyficzne, dla danego tagu funkcjonalności:
- Po kliknięciu w ramach
[a href=...]pojawiają się akcje do obsługi linka
- Po kliknięciu w ramach
- Wizualny edytor tabel STC: Po kliknięciu PPM na
[csv...]pojawia się opcja edycji tabeli. Dzięki temu pojawia się wizualne okno, w którym możemy edytować tabelę.- Jest również możliwość drag&drop między komórkami powodująca ich zamianę
Edytor też nadaje sie do innych celów - do ogólnej edycji dokumentu, oto wybrane funkcjonalności, których brakuje mi w zwykłych edytorach:
- Operacje na plikach: Wczytywanie, zapisywanie i przeładowanie pliku. Również zmiana nazwy otwartego pliku.
- Ostatnio otwarte pliki: Zapamiętuje ostatnio używan\e pliki wraz z ostatnią pozycją w pliku dla szybkiego dostępu.
- Zapamiętana jest również data ostatniego otwarcia pliku w edytorze.
- Wykrywanie zmian zewnętrznych: Powiadamia o modyfikacjach pliku z zewnątrz.
- Inteligentne menu kontekstowe dla tekstu, m.in.:
- Numerowanie linii: Dodawanie numeracji do zaznaczonych linii przez menu kontekstowe (funkcja z menu kontekstowego). Również usuwanie numerów z linii.
- Poprawa numeracji dokumentu (gdy pewnych liczb brakuje, lub są zdublowane).
- Dodawania punktów do każdej linii zaznaczonego tekstu:
- Sortowanie zaznaczonych linijek: z pominięciem wielkości znaków
- Łączenie linii: Łączenie wielu zaznaczonych linii w jedną, oddzieloną spacjami (funkcja z menu kontekstowego).
- Konwersje między wielkością znaków zaznaczonego tekstu: na małe, na duże, CamelCase <-> snake_case
- Numerowanie linii: Dodawanie numeracji do zaznaczonych linii przez menu kontekstowe (funkcja z menu kontekstowego). Również usuwanie numerów z linii.
- Kopiowanie ścieżki pliku: Kopiowanie nazwy pliku lub pełnej ścieżki do schowka.
- Kontrola wcięć:
Tabprzesuwa zaznaczony tekst w prawo,Shift+Tabw lewo. - Lista skrótów: Dostępna z menu aplikacji.
- Wyszukiwanie tekstu:
- Wyszukiwanie z opcjami uwzględniania wielkości liter i dopasowania całych słów.
- Wyświetlanie liczby wystąpień:
- Z uwzględnieniem wielkości liter.
- Bez uwzględniania wielkości liter.
- Z uwzględnieniem wielkości liter, tylko całe słowa.
- Bez uwzględniania wielkości liter, tylko całe słowa.
- ENTER i SHIFT+ENTER odpowiednio przesuwają do kolejnego/poprzedniego wystąpienia z tabeli
- Strzałki dół/góra dzialają jak powyższe, ale nie przeskakują z focusem do edytora tekstu
- Wyszukiwania podświetlają wszystkie wystąpienia w tekście
- Skalowanie czcionki: Powiększanie/pomniejszanie czcionki za pomocą
Ctrl++iCtrl+-lubCtrl+MOUSE_SCROLL. - Pasek stanu: Pokazuje nazwę otwartego pliku, ale też liczbę niezapisanych zmienionych linii, czas ostatniej edycji i zapisu (tylko przy niezapisanych zmianach).
- Oznaczenie aktualnej linii: Śledzenie aktualnej pozycji kursora klawiatury w ramach linijki
- Szczegółowy wykaz niezapisanych zmian: Gdy mamy niezapisane zmiany i próbujemy wyjść z programu to poza spytaniem użytkownika czy na pewno chce wyjść bez zapisania zmian pojawia się od razu diff w formie tabeli pokazujący różnice w odpowiadających sobie liniach.
- Możliwść przywrócenia zmian względem danej linii z dysku.
- Zmiany mają również pokazane różnicę w numerach poszczególnych znaków, wtedy możemy lepiej odróżnić znaki, które "na oko" są takie same.
- Ukrywalne widgety: wszystko poza edytorem tekstu można ukryć, dzięki temu pewne funkcje są wyłączone i edytowanie działa szybciej.
- Obsługa różnych kodowań pliku tekstowego: Nie tylko UTF-8. Jest to dzięki bibliotece uchardet.
- Stoper pracy: stoper, który odpala się po uruchomieniu edytora i liczy zarówno czas kiedy edytor jest włączony, jak i czas pracy w edytorze (wykrywa naciśnięcia klawiszy, gdy ich długo nie ma to się zatrzymuje)
Możesz pobrać najnowszą skompilowaną wersję STC_editor, z ostatniego poprawnie zakończonego procesu budowania przez GitHub Actions (wymagane konto na Github - tak oni wymyślili):
👉 ⬇️ Pobierz wersję skompilowaną w formacie AppImage (działa na systemie Linux) 👉 ⬇️ Pobierz wersję skompilowaną na Windowsa
Po przejściu pod powyższy link:
- Kliknij na najnowsze zakończone zadanie (workflow).
- Przewiń stronę na dół.
- Pobierz artefakt o nazwie
STC_editor-x86_64.AppImagelubSTC_editor-win64.zip
📦 ⬇️ Pobierz najnowszą wersję release
Aktualnie brak opublikowanych wydań (release). Gdy się pojawią — będą dostępne tutaj.
- Kurs STC wbudowany w program
- Menu kontekstowe HELP
- Wyszukiwanie wielu słów w tej samej linii niezależnie od kolejności.
- Wyszukaj i zamień:
Ctrl+Rz możliwością wyłączenia poszczególnych wykrytych pozycji. - Zamiana warunkowa -np. zamień jeśli już nie jest. Np. jak chcę zamienić
coutnastd::coutto zamieni tylko jeśli nie jest tostd::cout - Integracja analizatora składni C++ (np. flex).
- Podświetlanie składni Pythona za pomocą QCXXHighlighter (licencja MIT).
- Obsługa różnych kolorowań składni (różne typy plików, bazujące na QCodeEditor).
- Wyświetlanie statystyk zmian w czasie rzeczywistym (liczba linii, znaków, rozmiar pliku, linia i kolumna).
- Historia wprowadzanych zmian (
Ctrl+Z). - Szybsze wyjście z aplikacji - po prostu wyjście, bez przywracania stanu niewymagającego zapisu
- Integracja dokumentacji cppreference (jak w
cppmanlub QtCreator). - FindWidget - aby aktualizował pozycje w tekście na bieżąco przy dodawaniu/usuwaniu linii.
- Szukanie tylko w kodzie
- Może AI mi podzieli CodeEditor aby nie był GodObject
- Ctrl + V gdy mamy obrazek w schowku - wtedy powinno zaproponować umieszczenie obrazka w odpowiednim katalogu
- Tłumaczenia aplikacji na wiele języków: QLinguist
- Rozważyć użycie tej samej biblioteki do porównywania zarówno linii jak i znaków np. https://github.com/google/diff-match-patch
- Podpięcie sztucznej inteligencji np. Ollama
- Przy CTRL + SCROLL wyświetlanie informacji o rozmiarze czcionki (jak QtCreator)
- Kreator tabel dla znaczników STC.
- PreviewWidget: Śledzenie pozycji między pozycją w dokumencie źródłowym a podglądem HTML
- Historia zmian w linii
- Precompiled headers dla CodeEditor.h i moduły
- IWYU podpiąć pod CMake'a
- Zwijanie nagłówków i kodu (jak funkcje w środowiskach programistycznych)
- Automatyczne backupy treści
- W danej linii da się wpisać dane np.:
QTextBlockUserDatai potemblock.setUserData(data);- może da się to wykorzystać w optymalizacji - Optymalizacja wydajności edytora przy szybkim pisaniu.
- Podgląd terminala np. przez https://github.com/lxqt/qtermwidget - tylko czy mi to nie zrobi GPLa?
- Zastąpienie listy kontekstu widżetem drzewiastym.
- W linijce gradient ostatnio używanych linii z numerami ile temu
- Ukrycie tagów, nie licząc otaczających (rich text editor)
- Możliwość wyłączenia poszczególnych aspektów kolorowania składni.
- Następna/poprzednia zmiana: przycisk pozwalający skakać po zmianach w dokumencie
- Sensowne funkcjonalności z innych podobnych edytorów np. Scribe-Text-Editor
- Podgląd strony internetowej po najechaniu myszką
- Wsparcie dla MD na bazie: https://github.com/Qt-Widgets/notes
- Inne widgety np. https://github.com/Qt-Widgets/SlidingStackedWidget-1 z listy: https://github.com/Qt-Widgets/ lub https://qwt.sourceforge.io/index.html
- Skanowanie dokumentu w osobnym wątku dla lepszej wydajności.
- Nagrywanie i odtwarzanie makr.
- Obsługa wtyczek, być może z użyciem Lua.
- Zamiana prefiksów adresów URL dla obrazów na serwerze.
- Dyktowanie tekstu (biblioteka Whisper)
- Skróty
Alt+LewoiAlt+Prawodo nawigacji wstecz/dalej po pozycjach w kodzie. - Otwieranie wielu plików jednocześnie.
- Widok sąsiadujący do porównywania plików.
- Eksport bloków kodu do osobnych plików.
- Konsolidacja obrazów do jednego katalogu z aktualizacją ścieżek w znacznikach STC.
- Przy porównywaniu difa niezapisanych zmian z zawartością pliku (linijka w linijkę): możliwość zapisania na dysk poszczególnych linii.
- Gdy zewnętrzne zmiany w pliku to powinno też pokazać diffa.
- Gdy wyświetlamy diffa, ale linie są długie to pojawia się scrolling area, a nie powinna.
- Rezultat komendy w edytorze.
- Sprawdzania:
- Sprawdzanie, czy znaczniki
[run]znajdują się wewnątrz[pkt]. - Weryfikacja, czy wszystkie znaczniki są zamknięte (np. po opuszczeniu linijki sprawdzamy czy są tam zmiany, jak tak, to czy jest tam nowy tag)
- Weryfikacja odpowiednich atrybutów w tagach (czy w cudzysłowiu, czy tylko dozwole atrubytu)
- Weryfikacja czy wprowadzono tylko legalne tagi STC
- Sprawdzenie czy link istnieje
- Dodać check: czy nie zamykam nieotwartego tagu?
- Sprawdzenie czy Run nie jest poza csv lub pkt
- Sprawdzanie, czy znaczniki
- Blokowanie pliku, który się edytuje.
- A może do szukania błędów (niezamkniętych tagów) zaprzędz analizator składniowy: https://www.antlr.org/ ?
- Dopasowanie rozmiaru numeracji linii do wielkości czcionki.
- MiniBug: funkcjonalność zmiany wielkości czcionki zakłóca nowe tagi. Jak powiększymy czcionkę i potem dodamy coś np. H1, to on będzie miał czcionkę nawet mniejszą niż reszta, mimo iż to nagłówek
- Zmiana wielkości czcionki powinna też wpłynąć na czcionkę w ramach numeracji linii
- Usuwanie całych linii z pliku nie zmienia tytułu okna: jak dodajemy linie lub coś zmieniamy to w tytule okna pokazuje ile linii zmieniono, jednakże gdy liniesąusuwaneto nie pokazuje. Trzeba by zmienić sposób wykrywania zmian przez bibliotekę, a następnie zmienić generowany tytuł.
Zapraszam do współpracy! Propozycje zmian i pull requesty są mile widziane, aby uczynić ten edytor jeszcze bardziej użytecznym.
Bardzo proszę o dokładne informacje jakie to bugi, czyli:
- W jakiej sytuacji (Sekwencja kroków)
- Kod STC, który to spowodował
- Jakie jest oczekiwane zachowanie wg Ciebie?
Narzędzie to okazało się bardzo pomocne przy tworzeniu artykułów na Cpp0x.pl, np. porównującym python i C++. Ułatwia wstawianie znaczników STC i debugowanie niezamkniętych znaczników.
- pydifflib-cpp - Do śledzenia zmian w liniach. Licencja: BSD 3-Clause.
- diff-match-patch-cpp-stl - Do różnic na poziomie znaków w obrębie linii. Licencja: Apache 2.0.
- uchardet - Do wykrywania kodowania plików (nie tylko UTF-8). Licencja: Mozilla Public License.
- nuspell - Do sprawdzania pisowni, wykorzystuje słowniki Hunspell.
- StripCppComments - Do usuwania komentarzy z kodu C++. Licencja: MIT.
- ArsMasiuk/QCodeEditor (będący forkiem Megaxela/QCodeEditor) - edytor tekstowy w Qt, który ma kolorowanie składni dla C++, Python i innych. Licencja MIT.
Aplikacja wykorzystuje słowniki Hunspell (pl_PL.aff, pl_PL.dic) udostępnione w ramach projektu LibreOffice.
Słowniki te są objęte licencją Mozilla Public License v2.0 (MPL-2.0).
Oryginalne źródła pobrane z repozytoriów libreoffice
Autorzy i szczegóły licencji znajdują się w plikach:
Edytor jest prostym narzędziem i nie został gruntownie przetestowany pod kątem niezawodności. Używaj go na własne ryzyko, ponieważ może nie zachować ważnych treści. Jak dotąd jednak nie zawiódł autora.

