Visual Studio Code (VSCode) este unul dintre cele mai bune IDE-uri pentru cei interesați de programare competitivă. Este intuitiv, customizabil, extensibil, stabil, rapid, primește update-uri frecvent, are syntax highlighting bun și vine cu teme elegante, atât light cât și dark. Este exact opusul lui CodeBlocks, pe care dacă încă îl folosiți, vă recomand să-l înlocuiți cu VSCode cât mai repede.
Dacă e să trecem cu vederea design-ul oribil al CodeBlocks, acesta are în continuare o problemă foarte mare, și anume faptul că se crash-uiește când vrea. Eu am pățit-o de multe ori, în special când încercam să deschid un fișier de intrare foarte mare. Este extrem de enervant să ți se șteargă o sursă întreagă din cauza unui crash idiot. Costin Oncescu chiar a ratat aurul la IOI din cauza asta…
Așadar, în acest articol vă voi arăta cum se configurează Visual Studio Code pentru C++ (atât pe Windows cât și pe Mac), iar apoi voi vorbi un pic despre code snippet-uri și shortcut-uri.
Configurare pentru C++
Mai întâi trebuie să descărcați VSCode de aici. Când veți deschide VSCode pentru prima dată veți fi întâmpinați cu ceva de genul:
Interfața este foarte simplă, așa că n-am prea multe de spus despre ea, mai ales că vom face aproape totul din taste.
Pentru a crea un nou fișier, tastați Ctrl+N (⌘N), salvați-l (Ctrl+S, ⌘S) cu extensia .cpp
și gata! Dacă aveți nevoie și de alte fișiere, de exemplu .in
și .out
, nu aveți decât să le salvați în același director, în mod similar. Spre deosebire de CodeBlocks, VSCode nu creează proiecte întregi, cu multe directoare și fișiere ciudate, ca .layout
și .depend
. Fișierele deschise apar sus, exact ca într-un browser:
Pentru a putea lucra în C++, trebuie să instalăm câteva extensii specifice: C/C++, C/C++ Intellisense și Code Runner. Acestea pot fi căutate prin Search Extensions in Marketplace, din meniul corespunzător celui de-al cincilea buton din stânga (cel cu patru pătrățele):
După ce am instalat cele trei extensii, trebuie să configurăm comanda pentru compilarea fișierelor C++. Pentru a face asta, trebuie să edităm fișierul settings.json
, care, după cum îi zice și numele, stochează setările principale ale IDE-ului în format JSON, care cred este destul de ușor de deslușit, chiar dacă nu vă este familiar. Cel mai simplu mod de a deschide fișierul settings.json
este să intrați în Command Palette (Ctrl+Shift+P, ⇧⌘P) și să tastați Open Settings (JSON). Acum vă îndemn să copiați direct fișierul meu de setări, care conține calea către compilator, și niște chestii de bază, cum ar fi faptul că oblig VSCode să ruleze codul în terminal.
Pentru Windows
{
"window.zoomLevel": 0,
"editor.fontSize": 20,
"editor.fontFamily": "Consolas, 'Courier New', monospace",
"terminal.integrated.rendererType": "dom",
"editor.suggestSelection": "first",
"code-runner.runInTerminal": true,
"code-runner.executorMap": {
"cpp": "cd $dir ; if ($?) { g++ -std=c++14 -Wall -Wextra $fileName -o $fileNameWithoutExt } ; if ($?) { .\\$fileNameWithoutExt}"
},
"C_Cpp.default.includePath": [
"C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32",
"C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/mingw32"
],
"workbench.startupEditor": "none",
"editor.renderWhitespace": "none"
}
Pentru Mac
{
"window.zoomLevel": 0,
"editor.fontSize": 20,
"editor.fontFamily": "Consolas, 'Courier New', monospace",
"terminal.integrated.fontFamily": "Consolas, 'Courier New', monospace",
"terminal.integrated.fontSize": 20,
"workbench.colorCustomizations": {
"terminal.foreground": "#00c54c",
},
"code-runner.runInTerminal": true,
"code-runner.executorMap": {
"cpp": "cd $dir && g++ -std=c++14 -Wall -Wextra $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
},
"C_Cpp.default.includePath": [
"/usr/local/include/"
],
"C_Cpp.default.compilerPath": "/usr/bin/clang",
"terminal.integrated.rendererType": "dom",
"terminal.integrated.shell.osx": "/bin/bash",
"editor.suggestSelection": "first",
"workbench.startupEditor": "none",
"editor.renderWhitespace": "none"
}
Calea către compilator
Setarea "C_Cpp.default.includePath"
conține calea către compilator. Pentru Windows, vom folosi compilatorul MinGW, care, dacă încă aveți CodeBlocks instalat, probabil se alfă în C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32
. Dacă nu, îl puteți descărca de aici. Pentru Mac, compilatorul folosit este Clang, și se află în /usr/bin/clang
. Trebuie să aveți instalată aplicația Xcode în prealabil.
Acum ar trebui să aveți totul pregătit pentru a putea rula surse C++. Pentru a testa compilatorul, creați un fișier nou .cpp
, scrieți un program de genul Hello World, salvați, și folosiți comanda Ctrl+Alt+N (⌃⌥N).
<bits/stdc++.h>
Cea mai mare problemă pe care am avut-o când am configurat VSCode a fost faptul că nu mă lăsa să folosesc biblioteca <bits/stdc++.h>
, și mi-a luat ceva să găsesc o soluție. Problema apare pentru că <bits/stdc++.h>
nu e un header standard C++, și într-un fel VSCode nu-l recunoaște dacă nu trimiți linker-ul direct la adresa directorului în care se află bits
. Prin urmare, la "C_Cpp.default.includePath"
trebuie adăugată adresa următoare: C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/mingw32
. (Dacă ați copiat conținutul settings.json
de mai sus, nu mai trebuie să faceți nimic.)
Pentru Mac e puțin mai complicat, pentru că Clang nu conține deloc fișierul stdc++.h
, așa că trebuie să-l descărcați de aici și să-l copiați într-un director bits
, pe care-l creați la adresa /usr/local/include/
, care trebuie inclusă la rândul ei în "C_Cpp.default.includePath"
. Acum ar trebui să puteți compila surse care includ biblioteca <bits/stdc++.h>
!
Code Snippets
Un code snippet este o secvență de cod care apare la sugestii atunci când tastezi începutul ei. Practic este un template care te ajută să tastezi mai repede secvențe repetitive de cod. Extensia C++ Intellisense vine cu niște snippet-uri default, ca cel de mai jos pentru for
:
Un snippet pentru for
pare inutil… și chiar e. Dar partea interesantă este că ne putem defini propriile noastre snippet-uri, iar asta e foarte util pentru cei care folosesc template-uri pentru programare competitivă, ca cel de aici.
Pentru a crea un snippet, mergeți la Settings > User Snippets > cpp.json
. Aici veți găsi fișierul JSON cu snippet-urile definite de utilizator, care conține într-un comentariu o descriere mai detaliată a modului lor de funcționare. Eu am două snippet-uri, unul pentru probleme cu input/output din consolă (CodeForces
) și unul pentru probleme cu fișiere (InfoArena
). Când creez un fișier nou pur și simplu scriu CodeForces
sau InfoArena
, dau enter și fișierul se completează automat cu template-ul corespunzător. Iar în cazul InfoArena
, e de ajuns să scriu numele fișierului o singură dată, pentru că se tastează automat și la fin
și la fout
Iată definițiile celor două snippet-uri în JSON:
"CodeForces": {
"prefix": "CodeForces",
"body": [
"#include <bits/stdc++.h>",
"using namespace std;",
"",
"int main() {",
" ios_base::sync_with_stdio(false);",
" cin.tie(nullptr);",
"",
" $0",
" return 0;",
"}",
""
],
"description": "CodeForces Snippet"
},
"InfoArena": {
"prefix": "InfoArena",
"body": [
"#include <bits/stdc++.h>",
"using namespace std;",
"",
"ifstream fin(\"$1.in\");",
"ofstream fout(\"$1.out\");",
"",
"int main() {",
" $0",
"",
" fout.close();",
" return 0;",
"}",
""
],
"description": "InfoArena Snippet"
}
De fiecare dată când am terminat de completat un câmp din snippet, apăsăm tab și trecem la următorul. $i
, cu i
nenul, arată poziția cursorului după al i-1
-lea tab, iar $0
reprezintă poziția finală a cursorului. Dar cred că GIF-ul de mai sus explică cel mai bine procesul.
Shortcut-uri
VSCode are o grămadă de shortcut-uri utile. Aveți două PDF-uri cu acestea aici (Windows) și aici (Mac). Țin să menționez totuși trei shortcut-uri mai importante:
Ctrl+/ (⌘/): Comentează sau de-comentează secvența selectată de cod. Foarte util atunci când faci debugging, pentru că nu mai trebuie să stai să încadrezi manual codul între /*
și */
.
Alt+i (⌃i): Te duce la al i
-lea tab deschis, cu 1 ≤ i ≤ 9
. Foarte util pentru a naviga mai eficient printre fișiere.
Ctrl+K+T (⌘KT): Deschide un meniu cu temele disponibile. Eu de obicei folosesc Dark+, dar când este prea multă lumină în încăpere apelez și la Solarized Light.
Sfârșit! Sper că ați reușit să configurați Visual Studio Code și că o să vă placă Dacă aveți vreo întrebare legată de VSCode, o puteți adresa într-un comentariu mai jos.
Update 27 noiembrie 2020
Am două ponturi pentru utilizatorii de Mac, care să vă ajute să rezolvați niște probleme apărute la ultimele două versiuni de macOS.
Începând cu macOS Catalina, de fiecare dată când compilați un program în VSCode, veți fi anunțați în consolă că noul shell implicit s-a schimbat din bash în zsh:
The default interactive shell is now zsh.
To update your account to use zsh, please run chsh -s /bin/zsh.
Pentru a ascunde pe viitor acest warning, adăugați următoarea linie în fișierul .bash_profile
, aflat în folder-ul cu numele vostru de utilizator. Dacă acest fișier nu există, îl puteți crea manual. Înainte de a-l căuta în Finder, tastați ⌘⇧., pentru a putea vedea fișierele ascunse (cele al căror nume începe cu .
).
export BASH_SILENCE_DEPRECATION_WARNING=1
A doua problemă, ceva mai importantă, este că, începând cu macOS Big Sur, consola din VSCode a devenit cam laggy, încărcându-se destul de greu. Pentru a rezolva asta, tastați următoarea comandă în terminal:
codesign --remove-signature /Applications/Visual\ Studio\ Code.app/Contents/Frameworks/Code\ Helper\ \(Renderer\).app
Când îi dau debug la cod cu F5 apare:
Iar când îi dau run la cod acesta merge doar că trebuie să scriu eu manual
./main
. Știi vreo soluție ca să facă asta automat?Și dacă dau build and run apare:
Cred că ceva nu e okay, nu apare deloc ca în tutorialul de mai sus, deși am urmat toți pașii.
Salut, am și eu o întrebare. Nu pot să compilez codul cu F5 sau cu Ctrl+Shift+B, ci doar cu Ctrl+Alt+N, și de fiecare dată când fac asta trebuie să scriu
./main
ca să meargă. Ai vreo idee ce aș putea face? Mulțumesc.Salut. Arată dubios erorile alea, mai ales partea cu Permission denied. Nu știu ce să zic, dar cred că poți rezolva faza cu
./main
adăugând la comanda"cpp"
din"code-runner.executorMap"
string-ul"\n./main"
. Astfel,./main
va fi tastat automat.Ajută-mă te rog!
Am senzația că ai copiat greșit comanda aia. În loc de
cd ?)
ar trebui să aicd $dir ; if ($?)
.Am o întrebare legată de compilarea în consolă. Și ție ți se compilează relativ greu, adică se deschide consola destul de greu și dacă ai vreo idee. Mulțumesc!
Hmm, n-aș zice că mi se compilează greu. În medie durează 1-3 secunde, iar consola se deschide repede.