På senare tid har jag fått den här frågan mycket: "Hur fick du din terminal för att se hur den gör?" Om du har märkt min terminal och är nyfiken på hur jag ställer upp det här är handledningen för dig! Naturligtvis, det du lär dig här kommer att räcka för att komma igång med att skapa din egen anpassade kommandotolp!
Innan vi börjar, vill jag göra något extremt tydligt. Jag är verkligen en kommandorentusiast, men jag är inte alls en kommandoradsproff. Jag känner mig hemma i en terminal, men jag är långt ifrån att veta allt. Så här är affären: Jag ska visa dig hur jag har satt upp min terminal, men det betyder inte att jag kan förklara varje kodlinje vi ska titta på. Det finns några saker här, så är det bara för att det är det som fungerar ... och jag vet inte alltid 100% varför.
Med den ansvarsfriskrivningen ur vägen, låt oss se vad vi gör.
Så här ser min kommandoprompt ut:
Om du inte är säker på vad du tittar på där, låt mig förklara:
moderskepp
. Det följs av ett kolon.bemästra
eller tilt_in_post_class
i skärmdumpen). Om arbetsboken är ren visas också texten i grön; annars visas den i rött.Låt oss nu få några preliminära bitar tillsammans, innan du faktiskt skriver några skalskript.
För det första finns det färgschema. Du kanske känner igen det som Ethan Schoonover Solarized färgschema. Det är ganska fantastiskt, och jag har använt det på både terminalen och i Vim ända sedan jag upptäckte det. Om du vill använda den i Terminal måste du installera temat. Terminalen i Snow Leopard stödde inte xterm-256color, så du måste följa några speciella anvisningar på sidan Solarized GitHub för att få det att fungera om du fortfarande är på det operativsystemet.
Om du har flyttat till Lion kan du bara installera .terminal
filer som du hittar i mappen xterm-256color. När du har installerat dem (dubbelklicka bara på dem) borde du kunna välja den du vill ha i Terminal-inställningarna. Glöm inte att ställa in det som standardschema.
Nästa sak att veta är att jag inte använder standard bash-skalet i min terminal. Istället har jag bytt till zsh, vilket i grunden är mycket bash-kompatibel, men har några fina tillägg, som bättre flikavslutning. Så här gör du det: Öppna Mac-systeminställningarna och gå till "Användare och grupper." Lås upp panelen genom att klicka på låset längst ner och ange ditt lösenord. Högerklicka sedan på din användare i listan och välj "Avancerade alternativ." I fältet "Inloggningsskal" byt du från / Bin / bash
till / Bin / zsh
. Det är så enkelt.
Nästa steg: få rätt typsnitt. Jag använder Inconsolata vid 15pt. Det är ett gratis monospace-teckensnitt som jag älskar att stirra hela dagen. (Förutom att använda den i terminalen använder jag den i Vim och TextEdit.) Du kan ställa in din standard typsnitt från Terminal-inställningarna, där du väljer färgschema.
En annan liten sak är storleken på ditt fönster: Öppna Terminalinställningar> Inställningar och klicka på fliken Fönster; halvvägs kan du välja antal kolumner och rader du vill ha; Jag använder 130 kolumner med 30 rader.
Kom ihåg batterinivåindikatorn? Tja, det kräver ett litet skript från utvecklaren Steve Losh; Kopiera det enkelt till en fil och spara det som en pythonfil eftersom ~ / Bin
är i min terminal VÄG
, Jag har sparat filen till ~ / Bin / batcharge.py
. Som han noterar, fungerar det här skriptet bara på Mac OS X, så om du kör zsh på ett annat system måste du lämna den här delen.
Sist men absolut inte minst är det oh-my-zsh. Enligt Github repo är detta bara "En handfull funktioner, auto-complete helpers och saker som gör att du ropar" OH MY ZSHELL! ""
Varför använda det? För mig bestämde jag mig för att prova på en gång och jag har lämnat den installerad. Om du använder terminalen mycket, poke runt oh-my-zsh för lite när du har lite tid. Du kan bli förvånad över vad du hittar. Installera oh-my-zsh är ganska enkelt: följ bara installationsanvisningarna i README; de är ganska rakt framåt.
Nu har vi alla nödvändiga delar på plats. Vi är redo att faktiskt börja skapa vår anpassade terminal.
När du installerade oh-my-zsh, installerades den till ~ /, Oh-my-zsh
. Pop som öppnas. Du får se två mappar med anteckning: teman
och mallar
. Inuti mallar
, Du hittar en fil som heter zshrc.zsh-mall
Detta är en mall för dig ~ / .Zshrc
fil. Om du har anpassat din terminal förut vet du att .bashrc
filen är där dina anpassningar lagras när du använder ett bash-skal. De .zshrc
är samma sak, förutom zsh-skalet. Så öppna den mallfilen; du behöver inte veta vad som händer trots allt finns det många kommentarer i filen som inte kan ge mening. En sak här är viktig att använda. Lägg märke till raden som säger detta:
ZSH_THEME = "robbyrussell"
Det är namnet på det tema som din terminal använder. Titta i teman
mapp: du får se en robbyrussel.zsh-theme
fil. Vad vi ska göra är att skapa ett eget tema så att du kan ersätta den här strängen med namnet på vår nya fil. Jag har uncreatively kallat min "doubleend", eftersom den kom in på båda sidor av terminalen.
Alla andra anpassningar du vill göra till din zsh-miljö kan göras i den här filen. Om du använder terminalen mycket, kolla in oh-my-zsh
plugins (i plugin-program
mapp): ett antal användbara saker där inne.
Glöm inte att kopiera till zshrc.zsh-mall
till din hemkatalog och byta namn på den till .zshrc
innan du gör dina ändringar. Nu, i teman
mapp, skapa en fil med det temanamn du har angett i din .zshrc
fil. Se till att du ger den den .zsh-theme
förlängning. Vi är redo att bygga vårt anpassade tema.
Det viktigaste i din temafil är PROMPT
variabel. Det är innehållet är din ledningsprompt. För att få tanken på detta, börja bara med detta i din temafil:
PROMPT = 'myPrompt =>'
Öppna ett nytt Terminalfönster och du bör se detta:
Okej, låt oss komma till jobbet. Vi måste skriva flera funktioner, men vi börjar med PROMPT
variabel. Det kanske inte är märkbart när man tittar på terminalen, men det finns faktiskt tre rader till min prompten. Den första är en tom linje, bara för att ge mig ett andetag. Den andra har all information, och den tredje har pilen. Den tredje raden är där du faktiskt skriver kommandot. Så här är vår start:
PROMPT = '$ reset_color →'
Ja, du kan göra multilinska strängar som enkelt i skalskript. Men vad händer med $ reset_color
? Det är en variabel som oh-my-zsh definierar för oss; det återställer färgen på utgången. Detta kräver en kort avledning för att diskutera hur vi färgar olika ord i prompten. Du ser, det finns en kod-en serie tecken-som byter följande text till en färg. Självfallet finns det en kod för varje tillgänglig färg. Oroa dig inte, det finns andra variabler för de andra färgerna; du behöver inte lära sig koderna. När vi kommer till den tredje raden vill vi återställa det till standardtextfärgen; så använder vi $ reset_color
variabel.
Om du är nyfiken på pilteckenet är det Unicode högerpilen (U + 2192, →). Det är allt.
Så nu ser vår snabba ut så här:
Ser svelte. Låt oss nu lägga till datorns namn och arbetsregister. Detta är allt för den andra raden av vår PROMPT
variabel.
$ fg [cyan]% m: $ fg [gul] $ (get_pwd)
Vi börjar med att ställa in textfärgen till cyan; Det verkar som om vi får den färgkoden från en associativ array eller hash; medan jag inte använder den finns det en $ bg
hash som ändrar bakgrundsfärgen i stället för förgrundsfärgen (text).
Efter att ha satt färgen har vi % m
Detta matar ut datorns namn. Efter kolon och utrymme byter vi textfärgen till gult. Därefter använder vi dollartecken och paren för att lägga till funktionens utgång get_pwd
. Detta kommer att mata ut vår nuvarande arbetsdokument, vi är lite vridna. Om jag är i hemkatalogen, vill jag inte se / Användare / andrew
, jag vill se ~
istället. Så här är den funktionen:
funktion get_pwd () echo "$ PWD / $ HOME / ~"
Funktionsskalet är ganska enkelt om du har skrivit JavaScript innan; identisk syntax. Jag är inte säker på var den sök- och ersättningssyntaxen har sitt ursprung, men det ser ganska ut som Vim-sök- och ersättningssyntaxen: Om PWD
innehåller texten $ HOME
(en systemvariabel för din hemkatalog), byt ut den med ~
.
Nu är här vad som är nere:
Bra! Nu kommer den knepiga delen. Du ser, jag vill justera git-informationen och batterilampan på rätt sätt. Eftersom det inte finns något sätt att faktiskt rättjustera, måste vi räkna antalet tecken på text vi vill ha, subtrahera det från fönstrets bredd och lägg till det mellanrummet. Det är ganska tråkigt, och koden är ganska rörigt, men det är allt jag har kunnat hitta som faktiskt fungerar.
Redo? Vi sätter in avståndet med en funktion som jag ringer get_spacing
. Så lägg till $ (Get_spacing)
till slutet av vår andra rad, så det ser nu ut så här:
$ fg [cyan]% m: $ fg [gul] $ (get_pwd) $ (put_spacing)
Nu fungerar det. Självklart är här skalet:
funktion put_spacing ()
Det finns fyra delar inuti. Här är den första.
lokal git = $ (git_prompt_info) om [$ # git! = 0]; då ((git = $ # git - 10)) annars git = 0 fi
Vi börjar med att få utmatningen från git_prompt_info
funktionen och lagra den i en lokal variabel, git
. Därefter återställs om längden på den strängen inte är 0 git
så det är nu strängens längd minus 10. Annars återställs vi git
till 0. Det verkar inte vara så mycket meningsfullt tills du inser vad vi försöker göra här. Vi vill ta reda på hur många tecken "slots" gitinformationen tar upp. Den knepiga delen är att vi återanvändar variabeln git
: först håller strängen, då den innehåller numret som representerar antalet tecken vår git-info är lång. Om git
är noll tecken långt, vi ställer in git
till 0; om det inte är (vilket innebär att vi är i ett gitförvar), ställer vi in git
till antalet tecken i strängen, minus 10. Detta beror på att strängkaraktären innehåller färgkoderna, som inte är synliga, så de tar inte upp bredd. Dubbelparenterna? Åh, de är vana vid matematik.
Vi gör samma sak för batteriet:
Lokal fladdermus = $ (Battery_charge) om [$ # bat! = 0]; då ((bat = $ # bat - 18)) annars bat = 0 fi
I den tredje delen räknar vi ut hur mycket utrymmen vi behöver:
lokal termvidd (termwidth = $ COLUMNS - 3 - $ # HOST - $ # $ (get_pwd) - $ bat - $ git))
Lite mer matematik: vi börjar med KOLUMNER
, vilket är antalet tecken som terminalen är bred. Vi subtraherar alla lämpliga värden (3 är för två mellanslag och ett kolon), och vi slutar med det faktum att vi behöver termwidth
Antal mellanslag mellan vänster och höger del av prompten.
Nu, låt oss skapa en sträng som är termwidth
antal platser långt:
lokal för jag i 1 ... $ termbredd; gör mellanslag = "$ spacing" gjort echo $ -avstånd
En enkel in-loop gör att vi kan skapa strängen; då returnerar vi det.
Du kan inte riktigt säga att whitespace har lagts till, så jag har lagt till lite dummy text så att du kan se att den har lagts till.
Nästa upp, Git info. Vi lägger till $ (Git_prompt_info)
till slutet av snabb linje 2; som du vet, det är ett funktionssamtal.
$ fg [cyan]% m: $ fg [gul] $ (get_pwd) $ (put_spacing) $ (git_prompt_info)
Observera att vi inte ändrar färgen innan du laddar Git-info: funktionen tar hand om det eftersom det beror på förvarets status.
Och här är funktionen:
funktion git_prompt_info () ref = $ (git symbolic-ref HEAD 2> / dev / null) || returnera eko "$ (parse_git_dirty) $ ZSH_THEME_GIT_PROMPT_PREFIX $ (current_branch) $ ZSH_THEME_GIT_PROMPT_SUFFIX"
Den första raden kontrollerar bara för att se om vi är i ett Git-arkiv. Om vi inte är vi lämna tillbaka
. Om vi är, nästa rad eko
s ut rätt information. Lägg märke till två saker här: För det första använder vi två variabler: $ ZSH_THEME_GIT_PROMPT_PREFIX
och $ ZSH_THEME_GIT_PROMPT_SUFFIX
. Jag ska visa dig hur dessa definieras på en sekund. Det andra är två andra funktioner som kallas. Dessa tillhandahålls av oh-my-zsh. De current_branch
funktion returnerar bara den aktuella filialen. De parse_git_dirty
är dock mer intressant. Om den aktuella filialen är smutsig (har obestämda ändringar), kommer funktionen att mata ut $ ZSH_THEME_GIT_PROMPT_DIRTY
; annars kommer det att matas ut $ ZSH_THEME_GIT_PROMPT_CLEAN
.
Jag har dessa fyra variabler definierad som så:
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ön]"
Baserat på dessa variabler kommer en repo på en ren huvudgren att producera [Git: master]
i grönt; en smutsig huvudgren kommer att producera +[Git: master]
.
Och äntligen kallar vi batteriladdning
fungera:
$ fg [cyan]% m: $ fg [gul] $ (get_pwd) $ (put_spacing) $ (git_prompt_info) $ (battery_charge)
Här är batteriladdning
fungera:
funktion battery_charge () om [-e ~ / bin / batcharge.py] sedan echo 'python ~ / bin / batcharge.py' annars echo "; fi
Om filen finns, kör vi den filen och eko utmatningen. Observera att vi använder backticksna runt körningen av filen (det är inte enkla citat): det här låter oss utföra en sträng kod som om den var i terminalen. Om filen inte finns, echoar vi bara en tom sträng.
Och med det är vi färdiga! Här är vad vi slutar med:
Jo så ser min terminal ut. Jag har gafflat oh-my-zsh-projektet på GitHub och lagt till det här temat, så att du kan hitta den där. Om du är intresserad av att se mina andra dotfiles, har jag dem också på GitHub.
Men jag är inte klar med min kommandoradsinstallation än. Medan jag inte har gjort några ändringar på ett tag tänker jag på att inkludera den nuvarande användarens namn (eftersom jag använder samma tema på min server), och även några RVM-info. Jag är också inte säker på varför jag har ordet git
där inne; Jag antar att jag ursprungligen hade en inställning som fungerade med flera versionsstyrningssystem. Hur som helst är poängen med allt detta att du alltid kommer att tweaking. När jag gör ändringar kommer jag säkert att trycka dem på GitHub så att du kan se dem där.
Låt mig lämna dig med flera länkar som du finner användbara vid hacking runt på kommandoraden:
teman
mapp; du hämtar några användbara tips på det sättet.)Ha så kul!