Cel mai bun răspuns
Nu pot să cred că nimeni nu a spus încă Vim. Vim!
Odată ce treci de curba de învățare inițială, este un instrument uimitor pentru automatizarea sarcinilor de programare banale. Vă dau un exemplu pe care l-am folosit mai devreme astăzi.
Am creat o clasă de cititor XML (moștenită dintr-o clasă XML de bază) pentru o componentă a bazei noastre de cod. .Xml arăta cam așa.
...
Problema a fost (datorită arhitecturii existente) că toate aceste valori ale câmpului trebuiau să fie membre de date private ale Some\_XML\_Class din cod. Ceea ce însemna că eram pe punctul de a face o mulțime de lucruri fără sens convertind field-one în std :: string m\_field\_one , pentru fiecare dintre aceste câmpuri.
Aici intervine Vim. În loc să omoare 20 de minute făcând asta în mod greu. Am lipit secțiunea de cod de mai sus și am înregistrat o macro.
^xistd::string m\_
Această serie de comenzi vim face următoarele. Merge la primul caracter al liniei și îl șterge („ se șterge). Intră în modul de inserare și pregătește std :: string m\_ la câmp . Apoi găsește prima apariție a „-” și o înlocuiește cu „\_”. Apoi sare la sfârșitul cuvântului field\_N , intră în modul de adăugare și adaugă un punct și virgulă și deplasează cursorul la dreapta. Așa că acum avem
std::string m\_field\_one;value="value1" />
Dar nu am terminat. Apoi intrăm în modul de comandă și ștergem restul liniei și saltăm în jos la următorul. Așa că avem:
std::string m\_field\_one;
Rețineți că prima linie este perfect formatată, iar cursorul este în prezent pe linia a doua.
Această parte următoare, dacă apare magia. Înainte de a executa comanda, am început să înregistrăm o macro pentru a înregistra „a” . Folosind comanda q urmată de a . Efectuând astfel comanda completă după cum urmează (unde q final este utilizat pentru a indica terminarea macro-ului).
qa^xistd::string m\_
Acum, dacă sună bine acea macro utilizând comanda Vim:
@a
Reanualizează macro-ul și formatează automat următoarea linie:
std::string m\_field\_one;
std::string m\_field\_two;
Dar așteptați, avem încă linii N-2 cu structură similară! Să presupunem că în acest caz N a fost egal cu 100. Nicio problemă. Tastăm pur și simplu comanda:
98@a
Aceasta rulează macro-ul de mai sus de 98 de ori, formatând automat restul codului dvs. !! Acum avem:
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;
Stupendous .
* PS: La început, aceste comenzi vă pot părea străine și înfricoșătoare, dar odată ce ați petrecut ceva timp cu Vim ca editor principal, acestea devin a doua natură. Macro-ul de exemplu mi-a luat 10 secunde să scriu și am economisit o cantitate uriașă de timp.
* PPS: Știu că exemplul de cod este destul de prost, dar l-am folosit doar pentru a ilustra un punct. Cu toate acestea, în lumea reală veți întâlni cazuri similare.
Răspundeți
Vă mulțumim că ați întrebat.
Am venit aici inițial pentru a avertiza împotriva unui astfel de obiectiv, numai pe baza pe titlu … Practic, astăzi ați scrie un editor de text pentru că:
- Aveți o nevoie foarte specifică (dar în acest caz, mai bine începeți de la o bază existentă, mai degrabă decât mergând de la zero, cu excepția cazului în care aveți idei foarte noi);
- SAU credeți că este un exercițiu interesant de programare; care este într-adevăr scopul tău.
Pentru că, sincer, dacă nu poți găsi editorul de vise în sute, dacă nu chiar în mii de dintre cele existente, ești foarte pretențios!; -)
De asemenea, am fost tentat să spun că scrierea unui editor de text de la zero poate fi un pic descurajant pentru un începător; să spunem că este o sarcină de nivel intermediar: un pic greu pentru un începător absolut, realizabilă o dată ai ceva experiență.
Acestea fiind spuse, mi-am scris propriul editor de text în timp ce eram încă începător: proaspăt ieșit din universitate, codificat doar puțin în C, fără un proiect real. Dar eram pe un computer cu SCO Unix având doar vi ca editor. Și nu-mi place din cauza celor două moduri (navigare vs. ediție) care mă încurcă întotdeauna (începând să scriu, văzându-mi textul numai după primul i …).
Așa că tocmai am început să-mi codez editorul în C, folosind Curses ca interfață, făcându-mi propriile structuri de date (probabil ineficiente, dar ne-am ocupat de fișiere mici în acel moment) etc.
M-am distrat mult, am învățat multe și, când alți utilizatori au început să-l folosească, am aflat că fac întotdeauna lucruri neașteptate, cum ar fi amestecarea de file și spații … 🙂
Din nou, dacă sunteți un începător total, ar trebui să începeți cu proiecte mai mici, pentru a afla despre bazele limbajului (bucle, tablouri etc.), despre structurile de date, cum să citiți și să scrieți fișiere text etc.
Este greu de sfătuit pentru un singur limbaj … Pentru un proiect bazat pe JVM, aș folosi Ceylon, poate cu JavaFX sau SWT. Pentru un proiect „apropiat de metal”, aș folosi Rust (există un proiect de început despre scrierea unui editor de text în Rust, pare promițător), în timp ce alții ar sfătui să folosească C ++ (ceea ce ar putea fi copleșitor pentru un începător!). Pentru un limbaj mai ușor, poate că Lua ar fi o potrivire bună (altele ar sfătui să folosiți Python, dar nu am experiență cu el). Sau poate JavaScript, cu Node.js și platforma Electron, o opțiune de tendință … (Atom, Visual Studio Code și Brackets au fost scrise cu asta. Dar asta „abia” este de la zero „deoarece folosesc editori de cod JS existenți. )
Sfat general: mai întâi proiectați-vă structura de date (strategia din două părți utilizată de proiectul Scintilla este bună; frânghiile, așa cum sunt folosite de proiectul Rust, sunt puțin mai / prea avansate), cum manipulați date: cum să adăugați sau să eliminați un caracter, o linie, o selecție etc.
Apoi gândiți-vă la interfața de utilizare. În mod ideal, separați-le pe cele două (gestionarea datelor și afișarea datelor). Astfel, într-o zi puteți schimba ținta UI (de la Swing la JavaFX, de la GTK + la Qt, orice) fără modificări mici sau nicio logică de bază. Bun pentru portabilitate.