Cum să personalizați comanda dvs. de comandă

În ultimul timp, am primit această întrebare foarte mult: "Cum ai terminat terminalul să te uiți așa cum o face?" Dacă ați observat terminalul meu și sunteți curios despre modul în care l-am instalat, acesta este tutorialul pentru tine! Desigur, ceea ce înveți aici va fi suficient pentru a începe să creați propria comandă de comandă personalizată!


Înainte de a începe, vreau să fac ceva extrem de clar. Sunt cu siguranță un entuziast al liniei de comandă, dar nu sunt deloc o linie de comandă pro. Mă simt acasă într-un terminal, dar sunt departe de a ști totul. Deci, iată afacerea: vă voi arăta cum am instalat terminalul, dar asta nu înseamnă că voi putea explica fiecare linie de cod la care ne vom uita. Există câteva lucruri care sunt așa cum sunt, pentru că așa funcționează ... și nu știu întotdeauna 100% de ce.

Cu această avertizare în cale, să vedem ce facem.


Întâlnirea cu produsul finit

Iată cum arată comanda mea de comandă:

Dacă nu sunteți sigur ce vedeți acolo, permiteți-mi să vă explic:

  • În turcoaz, avem numele computerului; în cazul meu, asta e nava mamă. A urmat un colon.
  • Apoi, avem directorul de lucru, într-un galben-portocaliu.
  • Dacă suntem într-un depozit git, avem câteva informații despre asta. Principalul lucru aici este denumirea ramurii (maestru sau tilt_in_post_class în captura de ecran). De asemenea, dacă directorul de lucru este curat, textul apare verde; în caz contrar, apare în roșu.
  • În sfârșit, avem un indicator al bateriei. Dacă cele zece triunghiuri sunt verzi și pline, lucrurile sunt alimentate. Pe măsură ce bateria mea este golită, triunghiurile vor fi goale și eventual vor deveni roșii. Desigur, dacă nu sunteți pe un laptop ca mine, acest lucru nu va fi la fel de util pentru tine.

Obținerea mediului pregătit

Să luăm acum câteva piese preliminare împreună, înainte de a scrie de fapt niște scripturi de shell.

În primul rând, există schema de culori. S-ar putea să o recunoașteți ca schema de culori Solarized a lui Ethan Schoonover. Este uimitor și am folosit-o atât pe terminal, cât și pe Vim de când am descoperit-o. Dacă doriți să îl utilizați în Terminal, va trebui să instalați tema. Terminalul din Snow Leopard nu a acceptat culoarea xterm-256, deci va trebui să urmați câteva indicații speciale pe pagina GitHub Solarized pentru a obține acea operație dacă sunteți în continuare pe acel sistem de operare.

Dacă v-ați mutat la Lion, puteți instala doar .Terminal fișierele pe care le veți găsi în folderul xterm-256color. Odată ce le-ați instalat (doar faceți dublu clic pe ele), ar trebui să puteți selecta cea dorită în preferințele terminalului. Nu uitați să o setați ca schemă prestabilită.

Următorul lucru pe care trebuie să știți este că nu folosesc shell-ul bash implicit în Terminalul meu. În schimb, am trecut la zsh, care este de fapt mult compatibil cu bash, dar are câteva adăugiri plăcute, cum ar fi o finalizare mai bună a filelor. Iată cum se face: deschideți preferințele sistemului Mac și mergeți la "Utilizatori și grupuri". Deblocați panoul făcând clic pe blocarea din partea de jos și introducând parola. Apoi, faceți clic dreapta pe utilizatorul dvs. din listă și alegeți "Opțiuni avansate". În câmpul "Login Shell", treceți de la / Bin / bash la / Bin / zsh. Este atat de simplu.

Fonturi

Pasul următor: obțineți fontul potrivit. Folosesc Inconsolata la 15pt. Este un font gratuit monospace pe care îmi place să-l privesc toată ziua. (În afară de utilizarea în Terminal, îl folosesc în Vim și TextEdit.) Puteți să vă setați fontul implicit din preferințele Terminalului, chiar în locul în care alegeți schema de culori.

Un alt lucru mic este dimensiunea ferestrei dvs.: Deschideți Preferințe terminal> Setări și faceți clic pe fila Fereastră; în jos, puteți alege numărul de coloane și rânduri dorite; Eu folosesc 130 de coloane cu 30 de rânduri.

Baterie

Amintiți-vă indicatorul nivelului bateriei? Asta necesită un mic scenariu de la dezvoltatorul Steve Losh; copiați pur și simplu într-un fișier și salvați-l ca fișier python; de cand ~ / Bin este în terminalul meu CALE, Am salvat fișierul ~ / Bin / batcharge.py. După cum observă, acest script va funcționa numai pe Mac OS X, deci dacă rulați zsh pe un alt sistem, va trebui să părăsiți această parte.

zsh

În cele din urmă, dar cu siguranță nu în ultimul rând, există oh-my-zsh. Potrivit replicii Github, aceasta este doar "O mână de funcții, ajutoare auto-complete, și chestii care te fac să strigi" Oh My ZSHELL! ""

De ce să o folosiți? Pentru mine, am decis să încerc la un moment dat și l-am lăsat instalat. Dacă folosiți terminalul foarte mult, împingeți puțin oh-my-zsh când aveți ceva timp. S-ar putea să vă surprindeți ce veți găsi. Instalarea oh-my-zsh este destul de simplă: trebuie doar să urmați instrucțiunile de instalare din README; sunt destul de drepți.

Acum avem toate părțile necesare. Suntem gata să începem să creăm terminalul personalizat.


Crearea fișierelor

Când ați instalat oh-my-zsh, a fost instalat la ~ / .Oh-my-zsh. Popul care se deschide. Veți vedea două dosare de note: tematică și template-uri. Interior template-uri, veți găsi un fișier numit zshrc.zsh-șablon Acesta este un șablon pentru dvs. ~ / .Zshrc fişier. Dacă v-ați personalizat terminalul înainte, veți ști că .bashrc fișierul este în cazul în care personalizările dvs. sunt stocate atunci când utilizați un shell bash. .zshrc este același lucru, cu excepția shell-ului zsh. Deci, deschideți dosarul șablonului; nu trebuie să știți exact ce se întâmplă; la urma urmei, există multe comentarii în dosar care ar putea să nu aibă sens. Un lucru aici este important de folosit. Observați linia care spune:

ZSH_THEME = "robbyrussell"

Acesta este numele temei pe care terminalul dvs. o folosește. Uită-te în tematică dosar: veți vedea o robbyrussel.zsh-temă fişier. Ceea ce vom face este să creați o temă proprie, astfel încât să puteți înlocui șirul cu numele fișierului nostru nou. Am creat uncreativ "dublu" pentru că a intrat pe ambele părți ale terminalului.

Orice alte personalizări pe care doriți să le faceți în mediul dvs. zsh pot fi făcute în acest fișier. Dacă folosiți mult terminalul, verificați-l oh-my-zsh(în Plugin-uri dosar): o cantitate de lucruri utile acolo.

Nu uitați să copiați zshrc.zsh-șablon la directorul dvs. de acasă și redenumi-l la .zshrc înainte de a face modificările. Acum, în tematică folder, creați un fișier cu numele temei pe care l-ați setat .zshrc fişier. Asigurați-vă că o dați .zsh-temă extensie. Suntem gata să construim tema personalizată.


Construirea temei personalizate

Cel mai important lucru din fișierul temei dvs. este PROMPT variabil. Conținutul este promptul de comandă. Pentru a obține ideea acestui lucru, începeți cu acest lucru în fișierul tematic:

PROMPT = 'myPrompt =>'

Deschideți o nouă fereastră Terminal și ar trebui să vedeți acest lucru:

În regulă, să mergem la treabă. Va trebui să scriem mai multe funcții, dar vom începe cu PROMPT variabil. S-ar putea să nu fie vizibil când privim terminalul, dar sunt de fapt trei linii la promptitudinea mea. Prima este o linie goală, doar pentru a-mi da o cameră de respirație. Al doilea are toate informațiile, iar al treilea are săgeata. Această a treia linie este locul în care introduceți de fapt comanda. Deci, iată-ne începutul:

PROMPT = '$ reset_color →'

Da, puteți face șiruri de mai multe linii care să fie ușor de scris în shell. Dar ce sa întâmplat $ reset_color? Aceasta este o variabilă pe care oh-my-zsh o definește pentru noi; reseta culoarea ieșirii. Acest lucru necesită o scurtă deviere pentru a discuta despre modul în care culorăm diferite cuvinte în prompt. Vedeți, există un cod - o serie de caractere - care comută următorul text într-o culoare. Evident, există un cod pentru fiecare culoare disponibilă. Nu vă faceți griji, există alte variabile pentru celelalte culori; nu trebuie să înveți codurile. În timp ce ajungem la a treia linie, totuși, dorim să-l resetăm la culoarea textului implicit; deci, folosim $ reset_color variabil.

Dacă sunteți interesat de caracterul săgeții, este săgeata spre dreapta (Unicode) (U + 2192, →). Asta e tot.

Deci, acum promptul nostru arată în felul următor:

Privind pietricele. Să adăugăm acum numele computerului și directorul de lucru. Asta e tot pentru a doua linie a noastră PROMPT variabil.

$ fg [ciană]% m: $ fg [galben] $ (get_pwd)

Începem prin setarea culorii textului la cyan; se pare că obținem acel cod de culoare dintr-o matrice asociativă sau hash; în timp ce eu nu o folosesc, e a $ bg hash care modifică culoarea de fundal în locul culorii în prim-plan (text).

Dupa setarea culorii, avem % m aceasta afișează numele computerului. După colon și spațiu, schimbăm culoarea textului în galben. Apoi, vom folosi semnul dolar și parens pentru a adăuga ieșirea funcției get_pwd. Acest lucru va scoate din directorul nostru de lucru curent, am un pic de răsucire. Dacă sunt în directorul de acasă, nu vreau să văd / Utilizatori / andrew, vreau sa vad ~ in schimb. Deci, iată funcția:

funcția get_pwd () echo "$ PWD / $ HOME / ~"

Funcția shell este destul de simplă dacă ați scris JavaScript înainte; aceeași sintaxă. Nu sunt sigur unde originase sintaxa căutării și înlocuirii, dar pare destul de similară cu sintaxa Vim search-and-replace: Dacă PWD include textul $ HOME (o variabilă de sistem pentru directorul de acasă), înlocuiți-o cu ~.

Acum, iată ce e jos:

Bun! Acum vine partea complicată. Vedeți, vreau să aliniez corect informațiile despre git și indicatorul de baterie. Deoarece nu există nici o modalitate de a alinia corect, trebuie să numărăm numărul de caractere de text pe care le dorim, să scădem din lățimea ferestrei și să adăugăm spațiile respective. Este destul de nebun, iar codul este destul de murdar, dar tot ce am putut găsi este că funcționează.

Gata? Introducem spațierea cu o funcție pe care o sun get_spacing. Adăugați $ (Get_spacing) până la sfârșitul celei de-a doua linii, așa că acum arată astfel:

$ fg [cyan]% m: $ fg [galben] $ (get_pwd) $ (put_spacing)

Acum, acea funcție. Desigur, iată coaja:

funcția put_spacing () 

În interior sunt patru părți. Iată primul.

git local = $ (git_prompt_info) dacă [$ # git! = 0]; apoi ((git = $ # git - 10)) altceva git = 0 fi

Începem prin a obține ieșirea din git_prompt_info funcția și stocarea acesteia într-o variabilă locală, git. În continuare, dacă lungimea șirului nu este 0, vom reseta git astfel că este acum lungimea șirului minus 10. În caz contrar, resetăm git la 0. Aceasta nu pare să aibă prea mult sens până când nu-ți dai seama ce încercăm să facem aici. Vrem să aflăm cât de multe "sloturi" de caractere sunt preluate de informațiile despre git. Partea dificilă este că reutilizăm variabila git: mai intai pastreaza sirul, apoi pastreaza numarul reprezentand numarul de caractere pe care datele noastre git sunt lungi. Dacă git este de zero caractere lungime, am stabilit git la 0; dacă nu este (adică suntem într-un depozit git), am stabilit git la numărul de caractere din șir, minus 10. Acest lucru se datorează faptului că numărul de caractere de șir conține codurile de culoare, care nu sunt de fapt vizibile, astfel încât acestea să nu preia lățimea. Parentalele duble? Sunt folosite pentru a face matematica.

Facem același lucru pentru ieșirea bateriei:

bat locale = $ (încărcare baterie) dacă [$ # bat! = 0]; apoi ((bat = $ # bat - 18) altceva bat = 0 fi

În a treia parte, ne dăm seama cât de multe spații vom avea nevoie:

lățime de timp locală ((lățime de timp = $ COLUMNS - 3 - $ # HOST - $ # $ (get_pwd) - $ bat - $ git

Un pic mai mult matematica: începem cu asta COLOANE, care este numărul de caractere Terminalul este larg. Se scade toate valorile corespunzătoare (3 este pentru două spații și un colon) și ajungem la faptul că avem nevoie de termwidth numărul de spații între părțile din stânga și din dreapta ale promptului.

Acum, să creăm un șir care este termwidth numărul de spații lungi:

local pentru mine în 1 ... $ longwidth; distanța între spațiere = "$ spacing" făcut ecou $ spacing

O simplă in-loop ne permite să creăm șirul; apoi, o vom returna.

Nu puteți spune cu adevărat că spațiul alb a fost adăugat, așa că am adăugat un text inactiv pentru a vedea că a fost adăugat.

Înainte, informația Git. Adaugam $ (Git_prompt_info) până la sfârșitul liniei de prompt 2; după cum știți, este un apel pentru funcții.

$ fg [ciană]% m: $ fg [galben] $ (get_pwd) $ (put_spacing) $ (git_prompt_info)

Observați că nu schimbăm culoarea înainte de a încărca informațiile Git: funcția va avea grijă de asta, deoarece depinde de starea depozitului.

Și iată funcția:

funcția git_prompt_info () ref = $ (git simbolic-ref HEAD 2> / dev / null) || retur ecou "$ (parse_git_dirty) $ ZSH_THEME_GIT_PROMPT_PREFIX $ (actual_branch) $ ZSH_THEME_GIT_PROMPT_SUFFIX"

Prima linie doar verifică dacă ne aflăm într-un depozit Git. Dacă nu suntem noi întoarcere. Dacă suntem, următoarea linie ecousă afli informațiile corecte. Observați aici două lucruri: în primul rând, folosim două variabile: $ ZSH_THEME_GIT_PROMPT_PREFIX și $ ZSH_THEME_GIT_PROMPT_SUFFIX. Vă voi arăta cum sunt definite acestea într-o secundă. Celălalt lucru sunt alte două funcții care sunt numite. Acestea sunt furnizate de oh-my-zsh. current_branch funcția returnează ramura curentă. parse_git_dirty este mai interesant. Dacă ramura curentă este murdară (are modificări neangajate), funcția va afișa $ ZSH_THEME_GIT_PROMPT_DIRTY; în caz contrar va ieși $ ZSH_THEME_GIT_PROMPT_CLEAN.

Am aceste patru variabile definite astfel:

ZSH_THEME_GIT_PROMPT_PREFIX = "[git:" ZSH_THEME_GIT_PROMPT_SUFFIX = "] $ reset_color" ZSH_THEME_GIT_PROMPT_DIRTY = "$ fg [roșu] +" ZSH_THEME_GIT_PROMPT_CLEAN = "$ fg [verde]"

Pe baza acestor variabile, se va emite un repo pe o ramură curată master [Git: maestru] în verde; o ramură murdară master va ieși +[Git: maestru].

În cele din urmă, numim încărcare baterie funcţie:

$ fg [cyan]% m: $ fg [galben] $ (get_pwd) $ (put_spacing) $ (git_prompt_info)

Iată-l încărcare baterie funcţie:

funcția battery_charge () if [-e ~ / bin / batcharge.py] apoi echo 'python ~ / bin / batcharge.py' else echo "; fi

Dacă fișierul există, rulați fișierul respectiv și ecou ieșirea. Observați că folosim backtick-urile în jurul rularea fișierului (acestea nu sunt citate simple): acest lucru ne permite să executăm un șir de cod ca și cum ar fi fost în terminal. Dacă fișierul nu există, vom redă un șir gol.

Și cu asta, am terminat! Iată ce se încheie cu:


Concluzie

Așa arată terminalul meu. Am injectat proiectul oh-my-zsh pe GitHub și am adăugat această temă, ca să o găsiți acolo. Dacă sunteți interesat să vedeți celelalte dotfile mele, le-am luat și pe GitHub.

Cu toate acestea, nu am terminat încă cu configurarea liniei de comandă. În timp ce nu am făcut nicio modificare într-un timp, m-am gândit să includ numele actual al utilizatorului (pentru că folosesc aceeași temă pe serverul meu) și, de asemenea, unele informații RVM. De asemenea, nu sunt sigur de ce am cuvântul git acolo; Cred că inițial am avut o configurație care a funcționat cu mai multe sisteme de control al versiunilor ... Oricum, punctul de vedere al tuturor acestor lucruri este că acest lucru este ceva ce veți continua să vă ajuți. Când fac modificări, voi fi sigur că îi veți împinge la GitHub, astfel încât veți putea să le vedeți acolo.

Permiteți-mi să vă las cu mai multe link-uri pe care le veți găsi utile în hacking pe linia de comandă:

  • 7 sfaturi simple și utile de linie de comandă Nettuts+
  • 10 Comenzi terminale care vă vor crește productivitatea Nettuts+
  • Cum de a personaliza comanda dvs. de comandă Nettuts+
  • Accelerați fluxul de lucru în terminal | Nettuts + Premium
  • Steve Losh: Promovarea mea extravagantă Zsh
  • Peepcode Blog Post: Promptul meu de linie de comandă
  • Peepcode: Faceți cunoștință cu linia de comandă ($ 12)
  • Peepcode: linia de comandă avansată ($ 12)
  • Phil lui Zsh Prompt
  • Bash Prompt HOWTO
  • Pagina de wiki a temelor Oh-my-zsh (Poți să te referi la aceste imagini când te uiți la temele din tematică pliant; veți primi câteva sfaturi utile în acest fel.)
  • Desigur, o căutare pe web a unor termeni precum "declarația bash if" sau "bash for loop" va aduce rezultate utile dacă învățați doar. Amintiți-vă, din moment ce zsh este aproape pe deplin compatibil cu bash, orice fragment de script de bash pe care îl utilizați ar trebui să găsească un loc de lucru într-un prompt zsh.

A se distra!

Cod