I det siste har jeg fått dette spørsmålet mye: "Hvordan fikk du terminalen din til å se på måten den gjør?" Hvis du har lagt merke til min terminal og er nysgjerrig på hvordan jeg setter det opp, er dette veiledningen for deg! Selvfølgelig vil det du lærer her være nok til å komme i gang med å skape din egen tilpassede ledetekst!
Før vi kommer i gang, vil jeg gjøre noe ekstremt klart. Jeg er absolutt en kommandolinje-entusiast, men jeg er ikke i det hele tatt en kommandolinje pro. Jeg føler meg hjemme i en terminal, men jeg er langt fra å vite alt. Så her er avtalen: Jeg skal vise deg hvordan jeg har satt opp terminalen min, men det betyr ikke at jeg vil kunne forklare hver eneste linje med kode vi vil se på. Det er noen ting her som er slik de bare er fordi det er det som fungerer ... og jeg vet ikke alltid 100% hvorfor.
Med den ansvarsfraskrivelsen ute av veien, la oss se hva vi gjør.
Her ser min kommandoprompt ut:
Hvis du ikke er sikker på hva du ser på det, la meg forklare:
moder
. Det følger en kolon.herre
eller tilt_in_post_class
i skjermbildet). Også, hvis arbeidskatalogen er ren, vises teksten i grønt; Ellers vises det i rødt.La oss nå få noen foreløpige stykker sammen, før du faktisk skriver noen shell-skript.
Først er det fargeskjemaet. Du kan kanskje kjenne igjen det som Ethan Schoonover's Solarized fargevalg. Det er ganske utrolig, og jeg har brukt det på både terminalen og i Vim helt siden jeg oppdaget det. Hvis du vil bruke den i Terminal, må du installere temaet. Terminal i Snow Leopard støttet ikke xterm-256color, så du må følge noen spesielle retninger på Solarized GitHub-siden for å få det til å fungere hvis du fortsatt er på det operativsystemet.
Hvis du har flyttet til Lion, kan du bare installere .terminal
filer du finner i xterm-256color-mappen. Når du har installert dem (bare dobbeltklikk dem), bør du kunne velge den du vil ha i Terminal-innstillingene. Ikke glem å sette det som standardskjema.
Den neste tingen å vite er at jeg ikke bruker standard bash-skallet i Terminal. I stedet har jeg byttet til zsh, som i utgangspunktet er mye bash-kompatibel, men har noen fine tillegg, som bedre tabulasjon. Slik gjør du det: Åpne Mac-systeminnstillingene og gå til "Brukere og grupper." Lås opp ruten ved å klikke på låsen nederst og skrive inn passordet ditt. Deretter høyreklikker du på brukeren din i listen og velger "Avanserte alternativer." I "Innloggingsskall" -feltet, bytt fra / Bin / bash
til / Bin / zsh
. Det er så enkelt.
Neste trinn: få den riktige skrifttypen. Jeg bruker Inconsolata på 15pt. Det er en gratis monospace skrifttype som jeg elsker å stirre hele dagen lang. (I tillegg til å bruke den i Terminal, bruker jeg den i Vim og TextEdit.) Du kan angi standard skrift fra terminalen, hvor du velger fargeskjemaet.
En annen liten ting er størrelsen på vinduet ditt: Åpne Terminalpreferanser> Innstillinger og klikk på fanen Vindu; delvis ned, kan du velge antall kolonner og rader du vil ha; Jeg bruker 130 kolonner med 30 rader.
Husk batterinivåindikatoren? Vel, det krever et lite skript fra utvikler Steve Losh; bare kopier det til en fil og lagre det som en python-fil; siden ~ / Bin
er i min terminal STI
, Jeg har lagret filen til ~ / Bin / batcharge.py
. Som han noterer, vil dette skriptet bare fungere på Mac OS X, så hvis du kjører zsh på et annet system, må du forlate denne delen.
Sist, men absolutt ikke minst, det er oh-my-zsh. Ifølge Github repo er dette bare "En håndfull funksjoner, automatiske hjelpere og ting som gjør at du roper" OH MY ZSHELL! ""
Hvorfor bruke det? For meg bestemte jeg meg for å prøve den på et tidspunkt, og jeg har forlatt den installert. Hvis du bruker terminalen mye, poke rundt oh-my-zsh for litt når du har litt tid. Du kan bli overrasket over hva du finner. Installere oh-my-zsh er ganske enkelt: følg bare oppsettinstruksjonene i README; de er ganske rett frem.
Nå har vi alle nødvendige deler på plass. Vi er klare til å faktisk begynne å lage vår tilpassede terminal.
Når du installerte oh-my-zsh, ble den installert til ~ / Oh-my-zsh
. Pop som åpnes. Du får se to mapper med notat: temaer
og maler
. Innsiden maler
, Du finner en fil som heter zshrc.zsh-mal
Dette er en mal for deg ~ / .Zshrc
fil. Hvis du har tilpasset terminalen din før, vet du at .bashrc
Filen er hvor tilpassingene dine lagres når du bruker et bash-skall. De .zshrc
er det samme, med unntak av zsh-skallet. Så åpne opp den malfilen; du trenger ikke å vite hva som skjer akkurat Tross alt er det mange kommentarer i filen som kanskje ikke gir mening. En ting her er viktig å bruke. Legg merke til linjen som sier dette:
ZSH_THEME = "robbyrussell"
Det er navnet på det temaet terminalen bruker. Se i temaer
mappe: du vil se en robbyrussel.zsh-tema
fil. Det vi skal gjøre er å lage et eget tema, så du kan erstatte den aktuelle strengen med navnet på vår nye fil. Jeg har uncreatively kalt min "doubleend" fordi den har kommet inn på begge sider av terminalen.
Eventuelle andre tilpasninger du vil lage i ditt zsh-miljø kan gjøres i denne filen. Hvis du bruker terminalen mye, sjekk ut oh-my-zsh
plugins (i plugins
mappe): massevis av nyttige ting der inne.
Ikke glem å kopiere til zshrc.zsh-mal
til din hjemmekatalog og endre navn på den til .zshrc
før du gjør endringene dine. Nå, i temaer
mappe, opprett en fil med temaet du angir i din .zshrc
fil. Pass på at du gir den den .zsh-tema
forlengelse. Vi er klare til å bygge vårt tilpassede tema.
Det viktigste i temafilen er PROMPT
variabel. Det er innhold som er ledeteksten din. For å få ideen om dette, bare start med dette i temafilen din:
MELDING = 'myPrompt =>'
Åpne et nytt Terminal-vindu, og du bør se dette:
OK, la oss komme på jobb. Vi må skrive flere funksjoner, men vi starter med PROMPT
variabel. Det kan ikke være merkbart når man ser på terminalen, men det er faktisk tre linjer til min ledelse. Den første er en tom linje, bare for å gi meg et pusterom. Den andre har all informasjon, og den tredje har pilen. Den tredje linjen er der du faktisk skriver kommandoen. Så, her er vår start:
PROMPT = '$ reset_color →'
Ja, du kan gjøre multiline strenger som lett i shell scripting. Men hva skjer med $ reset_color
? Det er en variabel som oh-my-zsh definerer for oss; det nullstiller fargen på utgangen. Dette krever en kort avledning for å diskutere hvordan vi farger forskjellige ord i spørringen. Du ser, det er en kode-en serie tegn - som bytter følgende tekst til en farge. Tydeligvis er det en kode for hver tilgjengelig farge. Ikke bekymre deg, det er andre variabler for de andre fargene; du trenger ikke å lære kodene. Da vi kommer til den tredje linjen, ønsker vi å tilbakestille det til standard tekstfargen; så bruker vi $ reset_color
variabel.
Hvis du er nysgjerrig på pilkarakteren, er den Unicode-høyden pilen (U + 2192, →). Det er alt.
Så, vår prompten ser nå ut som denne:
Ser svelte. La oss nå legge til datamaskinnavnet og arbeidskatalogen. Dette er alt for den andre linjen av vår PROMPT
variabel.
$ fg [cyan]% m: $ fg [gul] $ (get_pwd)
Vi starter med å sette tekstfargen til cyan; det ser ut til at vi får den fargekoden fra en assosiativ array eller hash; mens jeg ikke bruker det, er det en $ bg
hash som endrer bakgrunnsfargen i stedet for forgrunnsfargen (tekst).
Etter å ha satt fargen, har vi % m
Dette gir ut navnet på datamaskinen. Etter kolon og mellomrom bytter vi tekstfargen til gul. Deretter bruker vi dollartegnet og parens å legge til utgangen av funksjonen get_pwd
. Dette vil utgjøre vår nåværende arbeidskatalog, vi er litt vri. Hvis jeg er i hjemmekatalogen, vil jeg ikke se / Users / andrew
, jeg vil se ~
i stedet. Så, her er den funksjonen:
funksjon get_pwd () echo "$ PWD / $ HOME / ~"
Funksjonsskallet er ganske greit hvis du har skrevet JavaScript før; identisk syntaks. Jeg er ikke sikker på hvor den søke- og erstatte syntaksen oppsto, men det ser ganske ut som Vim-søke- og erstattingssyntaxen: Hvis PWD
inkluderer teksten $ HOME
(en systemvariabel for hjemmekatalogen din), erstatt den med ~
.
Nå er det hva som er nede:
Flink! Nå kommer den vanskelige delen. Du ser, jeg vil rette opp git-informasjonen og batteriindikatoren. Siden det ikke er mulig å justere riktig, må vi telle antall tegn i teksten vi ønsker, trekke det fra bredden av vinduet og legge til avstanden. Det er ganske hacky, og koden er ganske rotete, men det er alt jeg har kunnet finne som faktisk fungerer.
Klar? Vi setter inn avstanden med en funksjon som jeg ringer get_spacing
. Så legg til $ (Get_spacing)
til slutten av vår andre linje, så det ser nå ut som dette:
$ fg [cyan]% m: $ fg [gul] $ (get_pwd) $ (put_spacing)
Nå fungerer det. Selvfølgelig, her er skallet:
funksjon put_spacing ()
Det er fire deler inni. Her er den første.
lokal git = $ (git_prompt_info) hvis [$ # git! = 0]; da ((git = $ # git - 10)) ellers git = 0 fi
Vi starter med å få produksjonen fra git_prompt_info
funksjon og lagre den i en lokal variabel, git
. Neste, hvis lengden på den strengen ikke er 0, tilbakestilles vi git
så det er nå lengden på strengen minus 10. Ellers tilbakestilles vi git
til 0. Dette ser ikke ut til å gi mye mening, før du skjønner hva vi prøver å gjøre her. Vi ønsker å finne ut hvor mange tegn "slots" git-informasjonen tar opp. Den vanskelige delen er at vi gjenbruker variabelen git
: først holder den strengen, så holder den tallet som representerer antall tegn som vår git-info er lang. Hvis git
er null tegn langt, satt vi git
til 0; Hvis det ikke er (som betyr at vi er i et git-repository), setter vi git
til antall tegn i strengen, minus 10. Dette skyldes at strengkaraktertallet inneholder fargekodene, som egentlig ikke er synlige, slik at de ikke tar opp bredden. De dobbelte parene? Åh, de er vant til matematikk.
Vi gjør det samme for batteriproduksjonen:
Lokal flagg = $ (Battery_charge) hvis [$ # bat! = 0]; da ((bat = $ # bat - 18)) annet bat = 0 fi
I tredje del finner vi ut hvor mange mellomrom vi trenger:
lokal termwidth ((termwidth = $ COLUMNS - 3 - $ # HOST - $ # $ (get_pwd) - $ bat - $ git))
Litt mer matte: Vi starter med COLUMNS
, som er antall tegn terminalen er bred. Vi trekker alle passende verdier (3 er for to mellomrom og et kolon), og vi ender opp med det faktum at vi trenger termwidth
antall mellomrom mellom venstre og høyre del av spørringen.
La oss nå lage en streng som er termwidth
antall mellomrom lang:
lokal for jeg i 1 ... $ termwidth; gjør avstand = "$ mellomrom" gjort ekko $ avstand
En enkel for-in-sløyfe tillater oss å lage strengen; så returnerer vi det.
Du kan egentlig ikke fortelle at whitespace er lagt til, så jeg har lagt til litt dummy tekst slik at du kan se det er det blitt lagt til.
Neste opp, Git info. Vi legger til $ (Git_prompt_info)
til slutten av ledig linje 2; Som du vet, det er et funksjonsanrop.
$ fg [cyan]% m: $ fg [gul] $ (get_pwd) $ (put_spacing) $ (git_prompt_info)
Legg merke til at vi ikke endrer fargen før du laster inn Git-info: funksjonen vil ta vare på det, fordi det avhenger av lagringsstatusen.
Og her er funksjonen:
funksjon git_prompt_info () ref = $ (git symbolisk-ref HEAD 2> / dev / null) || returnere ekko "$ (parse_git_dirty) $ ZSH_THEME_GIT_PROMPT_PREFIX $ (current_branch) $ ZSH_THEME_GIT_PROMPT_SUFFIX"
Den første linjen sjekker bare for å se om vi er i et Git-lager. Hvis vi ikke er vi komme tilbake
. Hvis vi er, den neste linjen ekko
s ut riktig informasjon. Legg merke til to ting her: Først bruker vi to variabler: $ ZSH_THEME_GIT_PROMPT_PREFIX
og $ ZSH_THEME_GIT_PROMPT_SUFFIX
. Jeg skal vise deg hvordan disse defineres i et sekund. Den andre tingen er to andre funksjoner som kalles. Disse er gitt av oh-my-zsh. De current_branch
funksjonen returnerer bare gjeldende gren. De parse_git_dirty
er mer interessant, skjønt. Hvis den nåværende grenen er skitten (har ubegrensede endringer), vil funksjonen sende ut $ ZSH_THEME_GIT_PROMPT_DIRTY
; ellers vil den sende ut $ ZSH_THEME_GIT_PROMPT_CLEAN
.
Jeg har disse fire variablene definert som:
ZSH_THEME_GIT_PROMPT_PREFIX = "[git:" ZSH_THEME_GIT_PROMPT_SUFFIX = "] $ reset_color" ZSH_THEME_GIT_PROMPT_DIRTY = "$ fg [rød] +" ZSH_THEME_GIT_PROMPT_CLEAN = "$ fg [grønn]"
Basert på disse variablene vil en repo på en ren mastergrad utgjøre [Git: master]
i grønt; en skitten hovedgren vil utgjøre +[Git: master]
.
Og til slutt, vi kaller batterilading
funksjon:
$ fg [cyan]% m: $ fg [gul] $ (get_pwd) $ (put_spacing) $ (git_prompt_info) $ (battery_charge)
Her er batterilading
funksjon:
funksjon battery_charge () hvis [-e ~ / bin / batcharge.py] så ekko 'python ~ / bin / batcharge.py' annet ekko '; fi
Hvis filen eksisterer, kjører vi den filen og ekko utdataene. Legg merke til at vi bruker backticks rundt kjøringen av filen (de er ikke enkle anførselstegn): dette gjør at vi kan utføre en streng kode som om den var i terminalen. Hvis filen ikke eksisterer, ekko vi bare en tom streng.
Og med det er vi ferdige! Her er det vi slutter med:
Vel, det er hva min terminal ser ut som. Jeg har forkjørt oh-my-zsh-prosjektet på GitHub og lagt til dette temaet, slik at du kan finne det der. Hvis du er interessert i å se mine andre dotfiles, har jeg dem også på GitHub.
Jeg er imidlertid ikke ferdig med kommandolinjens oppsett ennå. Selv om jeg ikke har gjort noen endringer på en stund, tenker jeg på å inkludere den nåværende brukerens navn (fordi jeg bruker det samme temaet på min server), og også noen RVM-info. Også, jeg er ikke sikker på hvorfor jeg har ordet git
der inne; Jeg antar at jeg opprinnelig hadde et oppsett som fungerte med flere versjonskontrollsystemer ... Uansett, poenget med alt dette er at dette er noe du kontinuerlig vil tilpasse. Når jeg gjør endringer, vil jeg være sikker på å skyve dem til GitHub, slik at du kan se dem der.
La meg forlate deg med flere koblinger som du finner nyttig i hacking rundt på kommandolinjen:
temaer
mappe; du henter noen nyttige tips på den måten.)Ha det gøy!