Najlepsza odpowiedź
Nie mogę uwierzyć, że nikt jeszcze nie powiedział o Vimie. Vim!
Po przejściu przez początkową krzywą uczenia się jest to niesamowite narzędzie do automatyzacji przyziemnych zadań programistycznych. Podam przykład, którego użyłem dzisiaj wcześniej.
Tworzyłem klasę czytnika XML (odziedziczoną z podstawowej klasy XML) dla składnika naszej bazy kodu. Plik .xml wyglądał mniej więcej tak.
...
Problem było (ze względu na istniejącą architekturę), że wszystkie te wartości pól musiały być prywatnymi elementami składowymi Some\_XML\_Class w kodzie. Co oznaczało, że mam zamiar wykonać dużo bezsensownej pracy, przekształcając field-one na std :: string m\_field\_one , dla każdego z tych pól.
W tym miejscu pojawia się Vim. Zamiast zabijać 20 minut, robiąc to na własnej skórze. Wkleiłem powyższą sekcję kodu i nagrałem makro.
^xistd::string m\_
Ta seria poleceń vim wykonuje następujące czynności. Przechodzi do pierwszego znaku wiersza i usuwa go („ zostaje usunięty). Wchodzi w tryb wstawiania i dodaje „ std :: string m\_” do . Następnie znajduje pierwsze wystąpienie „-” i zastępuje je „\_”. Następnie przeskakuje na koniec słowa field\_N , przechodzi do trybu dołączania, dodaje średnik i przesuwa kursor o jeden w prawo. Mamy więc teraz
std::string m\_field\_one;value="value1" />
Ale to nie koniec. Następnie przechodzimy do trybu poleceń, usuwamy resztę linii i przeskakujemy do następnej. Mamy więc:
std::string m\_field\_one;
Zwróć uwagę, że pierwsza linia jest doskonale sformatowana, a kursor znajduje się obecnie w drugiej linii.
Następna część, jeśli pojawia się magia. Przed uruchomieniem tego polecenia zaczęliśmy rejestrować makro rejestrujące „a” . Używając polecenia q , a następnie a . W ten sposób kompletne polecenie jest następujące (gdzie ostatnie q jest używane do wskazania zakończenia makra).
qa^xistd::string m\_
Teraz, jeśli dobrze, wywołaj to makro poleceniem Vima:
@a
Ponownie uruchamia makro i automatycznie formatuje następną linię:
std::string m\_field\_one;
std::string m\_field\_two;
Ale czekaj, nadal mamy N-2 linii o podobnej strukturze! Załóżmy, że w tym przypadku N jest równe 100. Żaden problem. Po prostu wpisujemy polecenie:
98@a
To uruchamia powyższe makro jeszcze 98 razy, automatycznie formatując pozostałą część kodu !! Mamy teraz:
std::string m\_field\_one;
std::string m\_field\_two;
std::string m\_field\_three;
...
std::string m\_field\_ninetynine
std::string m\_field\_onehundered;
Niesamowite .
* PS: Na początku te polecenia mogą wydawać się obce i przerażające, ale kiedy spędzisz trochę czasu z Vimem jako głównym edytorem, stają się one drugą naturą. Zapisanie przykładowego makra zajęło mi 10 sekund i zaoszczędziło ogromną ilość czasu.
* PPS: Wiem, że przykładowy kod jest dość głupi, ale użyłem go tylko do zilustrowania pewnej kwestii. Jednak w prawdziwym świecie napotkasz podobne przypadki.
Odpowiedź
Dziękuję za pytanie.
Przyjechałem tu początkowo, aby ostrzec przed takim celem, opierając się wyłącznie na na tytule … W zasadzie dzisiaj napisałbyś edytor tekstu, ponieważ:
- Masz bardzo specyficzną potrzebę (ale w tym przypadku lepiej zacząć od istniejącej bazy niż przechodzenie od zera, chyba że masz bardzo nowatorskie pomysły);
- LUB uważasz to za interesujące ćwiczenie z programowania; co jest rzeczywiście Twoim celem.
Ponieważ, szczerze mówiąc, jeśli nie możesz znaleźć swojego wymarzonego edytora wśród setek, jeśli nie tysięcy istniejących, jesteś bardzo wybredny!; -)
Kusiło mnie również, aby powiedzieć, że pisanie edytora tekstu od zera może być nieco zniechęcające dla początkującego; powiedzmy, że jest to zadanie na poziomie średnio zaawansowanym: trochę trudne dla absolutnie początkującego, wykonalne raz zdobędziesz trochę doświadczenia.
To powiedziawszy, napisałem własny edytor tekstu, kiedy byłem jeszcze początkującym: świeżo po studiach, napisany tylko trochę w C, bez prawdziwego projektu. Ale byłem na PC z SCO Unix, mając tylko vi jako edytor. I nie podoba mi się to ze względu na dwa tryby (nawigacja vs. edycja), co zawsze mnie dezorientuje (zaczynam pisać, widzę mój tekst dopiero po pierwszym i …).
Właśnie zacząłem kodować mój edytor w C, używając Curses jako interfejsu, tworząc własne struktury danych (prawdopodobnie nieefektywne, ale mieliśmy wtedy do czynienia z małymi plikami) itp.
Dobrze się bawiłem, wiele się nauczyłem, a kiedy inni użytkownicy również zaczęli go używać, odkryłem, że zawsze robią nieoczekiwane rzeczy, takie jak mieszanie tabulatorów i spacji … 🙂
Ponownie, jeśli jesteś całkowitym początkującym, powinieneś zacząć od mniejszych projektów, aby poznać podstawy języka (pętle, tablice itp.), O strukturach danych, jak czytać i zapisywać pliki tekstowe itp.
Trudno jest doradzić jeden język … W przypadku projektu opartego na JVM użyłbym Cejlonu, być może z JavaFX lub SWT. W przypadku projektu „bliskiego metalowi” użyłbym Rusta (istnieje projekt początkowy dotyczący pisania edytora tekstu w Rust, wydaje się obiecujący), podczas gdy inni radziliby używać C ++ (co może być przytłaczające dla początkującego!). Dla łatwiejszego języka, być może Lua byłby dobrym rozwiązaniem (inni radziliby używać Pythona, ale nie mam z tym doświadczenia). A może JavaScript, z Node.js i platformą Electron, popularną opcją … (Atom, Visual Studio Code i Brackets zostały napisane z tym. Ale to „ledwie” od zera, ponieważ używają istniejących edytorów kodu JS. )
Ogólna rada: najpierw zaprojektuj swoją strukturę danych (dwuczęściowa strategia używana w projekcie Scintilla jest dobra; liny używane w projekcie Rust są nieco bardziej / zbyt zaawansowane), jak manipulujesz danymi: jak dodać lub usunąć znak, linię, zaznaczenie itp.
Następnie pomyśl o interfejsie użytkownika. Najlepiej rozdzielić te dwa elementy (obsługa danych i wyświetlanie danych). W ten sposób pewnego dnia możesz zmienić cel UI (z Swing na JavaFX, z GTK + na Qt, cokolwiek) z niewielkimi lub żadnymi zmianami w podstawowej logice. Dobre dla przenośności.