This shows you the differences between two versions of the page.
systems:uso:laboratoare:laborator-03 [2012/09/17 12:23] 127.0.0.1 external edit |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laborator 03 - Editare ====== | ||
- | ===== Descriere ===== | ||
- | * nano | ||
- | |||
- | * basic vim usage: deschidere fișier, modificare fișier, salvare, ieșire din editor | ||
- | * advanced vim usage: cut/copy/paste, dw, d3t, etc, identare de cod | ||
- | * expert vim usage: tab-uri, registre | ||
- | |||
- | Referințe din urmă: | ||
- | * fisiere și directoare în Linux (lab 02) | ||
- | * cp, rm (lab 02) | ||
- | * man (lab 02) | ||
- | |||
- | ===== Materiale ajutătoare ===== | ||
- | |||
- | |||
- | ===== Tutorial ===== | ||
- | |||
- | ==== 1. apt-get fără dependențe ==== | ||
- | |||
- | Multe din programele pe care le vom folosi nu vin preinstalate. Pe Windows trebuia să rulați un executabil pentru a instala un program. | ||
- | |||
- | Pe sistemele Ubuntu, pachetele se instalează utilizând {{{apt-get}}}. De exemplu, pentru a instala {{{tree}}} trebuie să rulăm comanda: | ||
- | |||
- | <screen> | ||
- | apt-get install tree | ||
- | </screen> | ||
- | |||
- | Nu puteți instala pachetul, trebuie să fiți {{{root}}} (de ce?) | ||
- | |||
- | <screen> | ||
- | sudo apt-get install tree | ||
- | </screen> | ||
- | |||
- | Vi se vor afișa operațiile care se vor executa și efectele asupra spațiului pe disk și apoi veți fi întrebați dacă vreți să continuați. Dintre cele 2 litere, {{{y}}} și {{{n}}} una este majusculă, semnificând __opțiunea implicită__: dacă nu introduceți nimic și apăsați doar pe Enter, se va considera respectiva opțiune. | ||
- | |||
- | Verificați că s-a instalat {{{tree}}}: | ||
- | |||
- | <screen> | ||
- | tree | ||
- | </screen> | ||
- | |||
- | ==== 2. apt-get cu dependențe ==== | ||
- | |||
- | Există cazuri în care un pachet depinde de alt pachet. | ||
- | |||
- | Pentru instalarea unui pachet trebuiesc instalate toate dependențele acestuia. | ||
- | |||
- | Din fericire, {{{apt-get}}} știe să instaleze dependențele lipsă. Testați instalând {{{ack-grep}}}. | ||
- | |||
- | Observați că se vor instala mai multe pachete decât ați dorit voi. | ||
- | |||
- | Folosind {{{man}}}, identificați ce face {{{ack-grep}}}. | ||
- | |||
- | ==== 3. Package locations ==== | ||
- | |||
- | Vă întrebați poate //de unde se descarcă pachetele?// Vizualizați conținutul fișierului {{{/etc/apt/sources.list}}}. | ||
- | |||
- | O linie specifică o posibilă sursă de pachete. Formatul este următorul: | ||
- | |||
- | <screen> | ||
- | deb url version type tags | ||
- | deb-src url version type tags | ||
- | </screen> | ||
- | |||
- | unde {{{type}}} reprezintă versiunea sistemului Ubuntu folosită (numele de cod al versiunii, de exemplu {{{natty}}} pentru 11.04 Natty Narwhall) | ||
- | |||
- | Puteți modifica oricând acest fișier. De exemplu, în cazul în care locația repository-urilor este prea departe, pentru o instalare mai rapidă se recomandă să modificați toate URL-urile. | ||
- | |||
- | Schimbați URL-urile din {{{ro....}}} în {{{en...}}} (amintiți-vă cum făceați replace pe tot fișierul din laboratorul de Vim) | ||
- | ==== 4. yum ==== | ||
- | |||
- | Porniți mașina virtuală {{{fedora}}}. Sistemul de operare folosit este __Fedora__. Utilizatorul este {{{root}}} cu parola {{{fedora}}}. | ||
- | |||
- | Distribuțiile Fedora folosesc alt package manager: {{{yum}}}. | ||
- | |||
- | Instalarea unui pachet utilizând {{{yum}}} se face astfel: | ||
- | |||
- | <screen> | ||
- | yum install pachet | ||
- | </screen> | ||
- | |||
- | Instalați pachetul {{{ack}}} (echivalentul {{{ack-grep}}} de pe Ubuntu) | ||
- | |||
- | ==== 5. zypper ==== | ||
- | |||
- | Porniți mașina virtuală {{{suse}}}. Sistemul de operare folosit este __Open Suse__. | ||
- | |||
- | Sistemele Open Suse folosesc alt package manager: {{{zypper}}}. În plus, dacă nu știți în ce pachet se află o comandă, puteți folosi {{{cnf}}} ({{{command-not-found}}}): | ||
- | |||
- | <screen> | ||
- | cnf tree | ||
- | </screen> | ||
- | |||
- | Innstalarea unui pachet utilizând {{{zypper}}} se face astfel: | ||
- | |||
- | <screen> | ||
- | zypper in pachet | ||
- | </screen> | ||
- | |||
- | Instalați pachetul corespunzător comenzii {{{git}}}. | ||
- | |||
- | ===== Exercitii ===== | ||
- | ==== 1. Tabs ==== | ||
- | |||
- | Uneori trebuie să edităm mai multe fișiere simultan. Desigur, putem deschide mai multe terminale sau mai multe taburi în același terminal dar nu vom putea copia text dintr-un fișier în celalt (încercați). | ||
- | |||
- | Putem folosi taburi în ''vim'' utilizând '':tabnew'' (deci în modul __Comandă__). | ||
- | |||
- | Nagivarea între taburi se face cu ''gt'' și ''gT''. | ||
- | |||
- | <note info> | ||
- | ''g'' este pentru orice fel de navigare. ''t'' și ''T'' sunt pentru taburi. | ||
- | </note> | ||
- | |||
- | Deschideți 3 taburi în aceeași instanță de ''vim'', scrieți text în primul și copiați-l în al treilea. | ||
- | |||
- | ==== 2. Split screen ==== | ||
- | |||
- | Taburile sunt utile dar nu ne permit să vizualizăm simultan conținutul a mai multe fișiere. Pentru aceasta, folosim split views: | ||
- | |||
- | ^ comandă ^ efect ^ | ||
- | | '':sp'' | split orizontal | | ||
- | | '':vsp'' | split vertical | | ||
- | |||
- | Comenzile din tabel sunt prescurtări pentru '':split'' și '':vsplit''. | ||
- | |||
- | Navigarea între view-uri se face cu Ctrl+w și apoi Ctrl + litera asociată direcției de deplasare (h, j, k, l) | ||
- | |||
- | Deschideți 4 view-uri împărțind ecranul în 4 zone egale. Introduceți text într-o zonă și copiați-l în toate celelalte zone. | ||
- | |||
- | ==== 3. Cod sursă ==== | ||
- | |||
- | ''Vim'' poate fi folosit pentru editarea codului sursă. Descărcați și dezarhivați [[http://elf.cs.pub.ro/uso/store/uso-lab3-grf.zip | arhiva ]] ce conține un mic proiect ce folosește OpenGL. Scopul acestui exercițiu este să compilați acest proiect utilizând o singură sesiune de ''vim''. | ||
- | |||
- | Sunt necesare cunoștințe minime de C, nu și de compilare. | ||
- | |||
- | Vedeți ce reprezintă '':make'', '':cnext'', '':cprev'' și '':copen'' în ''vim'' și folosiți-le pentru a compila și corecta sursa având deschis fișierul ''fps.cpp'' în ''vim''. | ||
- | |||
- | Hint: folosiți '':h'' ('':help'' pentru a obține indicații) | ||
- | |||
- | <solution> | ||
- | <screen> | ||
- | $ vim fps.cpp | ||
- | :make | ||
- | ENTER | ||
- | dd (se sterge redefiniția lui EPS) | ||
- | :make clean | ||
- | :make | ||
- | </screen> | ||
- | </solution> | ||
- | |||
- | ==== 4. Rulare comenzi externe ==== | ||
- | |||
- | După ce am compilat executabilul vom dori să-l și rulăm. Putem părăsi ''vim'' pentru asta dar putem să-l rulăm și din interiorul vim. | ||
- | |||
- | Pentru aceasta, vom folosi modul __Comandă__ dar vom prefixa comanda cu ''!''. Pentru a rula executabilul va trebui să dăm comanda ''./fps''. | ||
- | |||
- | Rulați executabilul. | ||
- | |||
- | <solution> | ||
- | :!./fps | ||
- | </solution> | ||
- | |||
- | ==== 5. Navigare prin cod sursă ==== | ||
- | |||
- | Pentru a permite navigarea ușoară prin codul sursă, ''vim'' interacționează ușor cu unelte precum ''ctags'' și ''cscope''. În exercițiul curent vom folosi ''ctags'', încercați să vă jucați voi cu ''cscope''. | ||
- | |||
- | Ieșiți din ''vim'' dacă n-ați făcut deja asta și rulați | ||
- | |||
- | <screen> | ||
- | ctags * | ||
- | </screen> | ||
- | |||
- | Se construiește un fișier nou în care se găsesc informații despre fiecare identificator din sursele din directorul curent. Deschideți fișierul ''fps.cpp'' | ||
- | |||
- | <screen> | ||
- | vim fps.cpp | ||
- | </screen> | ||
- | |||
- | Căutați funcția ''main'' (hint: ''/''). | ||
- | |||
- | Căutați apelul funcției ''init'' din cadrul funcției ''main''. Pentru a sări la definiția funcției __când ne aflăm pe apelul ei__ tastăm Ctrl + ]. | ||
- | |||
- | Navigați până la definiția clasei ''Keyboard'' (găsiți o instanță a ''Keyboard'' în ''init'' sau folosiți căutare cu ''/''). | ||
- | |||
- | Pentru a ne întoarce folosim Ctrl + T. Întoarceți-vă în funcția ''main''. | ||
- | |||
- | Căutați definiția clasei ''Universe'' din funcția ''update'' (pe care o găsiți apelată în ''main''). | ||
- | |||
- | ==== 6. Indentarea codului sursă ==== | ||
- | |||
- | Pentru a avea un cod lizibil este recomandat să indentați instrucțiunile în cadrul funcțiilor și al blocurilor. Pentru a nu fi nevoiți să faceți asta manual, ''vim'' vine cu 2 opțiuni: | ||
- | |||
- | * ''autoindent'' | ||
- | * ''cindent'' | ||
- | |||
- | Vedeți ce fac fiecare din ele și activați-le. | ||
- | |||
- | |||
- | ==== 7. Salvare opțiuni vim. vimrc ==== | ||
- | |||
- | Pentru a nu fi nevoiți să introduceți aceleași setări de fiecare dată când trebuie să porniți ''vim'' este bine să le salvăm într-un fișier numit ''.vimrc''. | ||
- | |||
- | Sintaxa fișierului este puțin ciudată. Momentan, vom introduce opțiuni simple, pentru lucruri mai complicate va trebui să consultați documentația ''vim''. | ||
- | |||
- | Vrem să setăm opțiunea ''textwidth'' la 79. În acest fel, ''vim'' va începe automat o linie nouă dacă depășim coloana 79. | ||
- | |||
- | Deschideți fișierul ''.vimrc'' din home-ul vostru și introduceți linia următoare: | ||
- | |||
- | <screen> | ||
- | set textwidth=79 | ||
- | </screen> | ||
- | |||
- | Salvați și ieșiți. Deschideți o instanță de ''vim''. Putem testa opțiunea introducând o linie foarte lungă și așteptând să vedem dacă ni se limitează linia la 79 de caractere. | ||
- | |||
- | Sau, putem să afișăm valoarea opțiunii. Folosiți (''tw'' e prescurarea de la ''textwidth''): | ||
- | |||
- | <screen> | ||
- | :set tw? | ||
- | </screen> | ||
- | |||
- | <note tip> | ||
- | Pentru a afișa valoarea curentă a unei opțiuni în loc de a o activa se folosește un ''?'' după aceasta. | ||
- | </note> | ||
- | |||
- | Introduceți următoarele opțiuni în ''.vimrc'': | ||
- | |||
- | * ''cindent'' | ||
- | * ''autoindent'' | ||
- | * ''smartindent'' | ||
- | * ''incsearch'' | ||
- | * ''autowrite'' | ||
- | * ''hls'' | ||
- | * ''syntax on'' | ||
- | |||
- | **Atenție!!** ''syntax on'' nu este o opțiune în sine, nu se setează cu ''set''!. Introduceți-o așa cum apare. | ||
- | |||
- | Aflați ce face fiecare din opțiunile introduse în ''.vimrc''. | ||
- | |||
- | <note tip> | ||
- | Puteți folosi fișierul ''.vimrc'' și acasă, conține setări minimale pentru un lucru eficient cu ''vim''. | ||
- | </note> | ||
- | |||
- | <note important> | ||
- | Pe internet există multe ''.vimrc'' publicate de utilizatorii ''vim''. Recomandarea noastră este să vă inspirați din ele și să preluați ce pare interesant și util pentru voi. | ||
- | |||
- | Puteți folosi de exemplu: | ||
- | * https://github.com/ddvlad/cfg/blob/master/_vimrc | ||
- | * http://swarm.cs.pub.ro/~mihai/.vimrc | ||
- | </note> | ||
- | |||
- | ==== 8. Spellcheck ==== | ||
- | |||
- | Puteți folosi ''vim'' și pentru a scrie text. În acest caz, o facilitate utilă este cea de spellcheck. | ||
- | |||
- | Există programe precum ''aspell'' dar ''vim'' vine integrat cu un modul de spell checking. | ||
- | |||
- | Pentru a-l activa, trebuie să setați opțiunea ''spell''. Se vor colora imediat cuvintele greșite. Pentru a obține o listă de sugestii de corectare folosiți ''z=''. | ||
- | |||
- | Activați facilitatea de spellcheck și corectați fișierul ''users''. | ||
- | |||
- | ==== 1. Registre ==== | ||
- | |||
- | După cum ați observat, ștergerea unei porțiuni de text va face ca următoarea comandă de tip paste să lipească textul șters. Dacă dorim să avem mai multe bucăți de text salvate pentru a fi lipite ulterior trebuie să folosim registre. | ||
- | |||
- | Pentru a salva într-un registru prefixăm comanda de ștergere cu ''"'' și numele registrului. Pentru a-l folosi, procedăm similar. | ||
- | |||
- | Efectuați task-urile din ''2_lines''. Folosiți cât mai puține taste. | ||
- | |||
- | |||
- | ==== 2. diffs ==== | ||
- | |||
- | Pentru a vedea diferențele între două fișierele putem folosi ''diff''. Pentru a crește productivitatea, ''vim'' vine cu ''vimdiff'' (shortcut pentru ''vim -d''). | ||
- | |||
- | Folosiți ''vimdiff'' pentru a vedea diferențele între fișierele ''file1'' și ''file2''. | ||
- | |||
- | <note tip> | ||
- | Modul de diff are multe opțiuni utile. Consultați-le în timpul liber (folosiți cu încredere '':h vimdiff''). | ||
- | </note> | ||
- | |||
- | ==== 3. Macro-uri ==== | ||
- | |||
- | Uneori este nevoie să repetăm aceeași secvență de acțiuni pentru mai multe linii. Pentru aceasta s-au creat macro-urile. | ||
- | |||
- | Pentru a porni înregistrarea unui macro se folosește ''q'' urmat de litera registrului în care trebuie salvat macro-ul. | ||
- | |||
- | Când se dorește terminarea macro-ului se folosește tasta ''q''. | ||
- | |||
- | Pentru repetare, se folosește ''@'' urmat de litera registrului în care a fost salvat. | ||
- | |||
- | Folosiți macro-uri pentru a insera '', 3'' înainte de ultima paranteză închisă de pe toate liniile din fișierul ''one_more_arg.c'' | ||
- | |||
- | Exista și o altă modalitate? | ||
- | |||
- | |||
- | FIXME |