Hoe u uw opdrachtprompt kunt aanpassen

De laatste tijd heb ik deze vraag veel gekregen: "hoe heb je je terminal kunnen laten lijken zoals hij is?" Als je mijn terminal hebt opgemerkt en benieuwd bent naar hoe ik het heb ingesteld, is dit de tutorial voor jou! Natuurlijk is wat u hier leert voldoende om u op weg te helpen bij het maken van uw eigen aangepaste opdrachtprompt!


Voordat we beginnen, wil ik iets heel duidelijk maken. Ik ben zeker een enthousiaste command line, maar ik ben helemaal geen commandoregel pro. Ik voel me thuis in een terminal, maar ik ben er ver weg van alles te weten. Dus hier is de deal: ik ga je laten zien hoe ik mijn terminal heb opgezet, maar dat betekent niet dat ik elke regel code die we zullen bekijken zal kunnen uitleggen. Er zijn enkele dingen hier zoals ze zijn, gewoon omdat dat is wat werkt ... en ik weet niet altijd waarom.

Met die disclaimer uit de weg, laten we eens kijken wat we aan het doen zijn.


Het eindproduct ontmoeten

Dit is hoe mijn opdrachtprompt eruit ziet:

Als je niet zeker weet wat je daar ziet, laat me dan uitleggen:

  • In het turkoois hebben we de naam van de computer; in mijn geval is dat zo moederschip. Dat wordt gevolgd door een dubbele punt.
  • Vervolgens hebben we de werkmap, in een geeloranje.
  • Als we in een git repository zijn, hebben we daarover wat info. Het belangrijkste hier is de naam van het filiaal (meester of tilt_in_post_class in de schermafbeelding). Ook als de werkmap schoon is, wordt die tekst groen weergegeven; anders wordt deze in het rood weergegeven.
  • Eindelijk hebben we een batterij-indicator. Als de tien driehoeken allemaal groen en ingevuld zijn, worden de dingen aangezet. Terwijl mijn batterij leeg raakt, worden de driehoeken leeg en worden ze uiteindelijk rood. Natuurlijk, als je niet op een laptop bent zoals ik, zal dit niet zo nuttig voor je zijn.

De omgeving gereed maken

Laten we nu een paar voorlopige stukjes bij elkaar voegen, voordat we daadwerkelijk wat shellscripts schrijven.

Ten eerste is er het kleurenschema. U herkent het mogelijk als het Solarized kleurenschema van Ethan Schoonover. Het is best verbazingwekkend, en ik heb het zowel op de terminal als in Vim gebruikt sinds ik het ontdekte. Als je het in de Terminal wilt gebruiken, moet je het thema installeren. De Terminal in Snow Leopard bood geen ondersteuning voor xterm-256color, dus je moet een aantal speciale aanwijzingen op de Solarized GitHub-pagina volgen om dat te laten werken als je nog steeds op dat besturingssysteem zit.

Als u bent doorgegaan naar Lion, kunt u de .terminal bestanden die u kunt vinden in de map xterm-256color. Zodra je die hebt geïnstalleerd (dubbelklik erop), zou je degene moeten kunnen selecteren die je wilt in de Terminal-voorkeuren. Vergeet niet om het als het standaardschema in te stellen.

Het volgende dat ik moet weten is dat ik de standaard bash-shell niet gebruik in mijn Terminal. In plaats daarvan ben ik overgeschakeld naar zsh, wat eigenlijk veel bash-compatibel is, maar heeft een paar leuke toevoegingen, zoals een betere tab-aanvulling. Ga als volgt te werk: open de Mac-systeemvoorkeuren en ga naar "Gebruikers en groepen". Ontgrendel het paneel door onderaan op de vergrendeling te klikken en uw wachtwoord in te voeren. Klik vervolgens met de rechtermuisknop op uw gebruiker in de lijst en kies 'Geavanceerde opties'. Schakel in het veld 'Aanmeldshell' uit / Bin / bash naar / Bin / zsh. Het is zo simpel.

fonts

Volgende stap: haal het juiste lettertype. Ik gebruik Inconsolata op 15pt. Het is een gratis monospace-lettertype waar ik de hele dag naar staar kijk. (Naast het gebruik ervan in de Terminal, gebruik ik het in Vim en Teksteditor.) U kunt uw standaardlettertype instellen vanuit de Terminal-voorkeuren, precies daar waar u het kleurenschema kiest.

Een ander kleinigheidje is de grootte van uw venster: Open Terminal-voorkeuren> Instellingen en klik op het tabblad Venster; halverwege, kunt u het aantal gewenste kolommen en rijen kiezen; Ik gebruik 130 kolommen per 30 rijen.

Accu

Denk aan de batterijniveau-indicator? Welnu, dat vereist een klein script van ontwikkelaar Steve Losh; kopieer dat eenvoudig naar een bestand en sla het op als een python-bestand; sinds ~ / Bin zit in mijn terminal PAD, Ik heb het bestand opgeslagen ~ / Bin / batcharge.py. Zoals hij opmerkt, zal dit script alleen werken op Mac OS X, dus als je zsh op een ander systeem gebruikt, moet je dit gedeelte weglaten.

zsh

Als laatste, maar zeker niet de minste, is er oh-my-zsh. Volgens de Github repo is dit slechts "Een handvol functies, auto-complete helpers en dingen die je doen schreeuwen 'OH MY ZSHELL!'"

Waarom zou je het gebruiken? Voor mij besloot ik het op een gegeven moment uit te proberen en ik liet het geïnstalleerd. Als je de terminal veel gebruikt, raak dan een beetje rond in oh-my-zsh als je wat tijd hebt. Je zult misschien verbaasd zijn over wat je zult vinden. Het installeren van oh-my-zsh is vrij eenvoudig: volg gewoon de installatie-instructies in de README; ze zijn redelijk eenvoudig.

Nu hebben we alle benodigde onderdelen op zijn plaats. We zijn klaar om daadwerkelijk te beginnen met het maken van onze aangepaste terminal.


De bestanden maken

Toen je oh-my-zsh installeerde, werd het geïnstalleerd op ~ / .Oh-my-zsh. Doe dat open. Je ziet twee notitiemappen: thema's en templates. Binnen templates, je zult een bestand vinden met de naam zshrc.zsh-template Dit is een sjabloon voor jou ~ / .Zshrc het dossier. Als u uw terminal eerder heeft aangepast, weet u dat het .bashrc bestand is waar uw aanpassingen worden opgeslagen wanneer u een bash-shell gebruikt. De .zshrc is dat hetzelfde, behalve de shell van zsh. Dus open dat sjabloonbestand; je hoeft niet te weten wat er precies aan de hand is; er zijn tenslotte veel opmerkingen in het bestand die misschien niet logisch zijn. Eén ding is hier belangrijk om te gebruiken. Let op de regel die dit zegt:

ZSH_THEME = "robbyrussell"

Dat is de naam van het thema dat uw terminal gebruikt. Kijk in de thema's map: u ziet a robbyrussel.zsh-theme het dossier. Wat we gaan doen is een eigen thema maken, zodat je die string kunt vervangen door de naam van ons nieuwe bestand. Ik heb mijn 'doubleend' uncreatively genoemd omdat het aan beide kanten van de terminal is binnengedrongen.

Alle andere aanpassingen die u in uw zsh-omgeving wilt aanbrengen, kunnen in dit bestand worden gedaan. Als je de terminal veel gebruikt, ga je naar oh-my-zshplugins (in de plugins map): een hoop nuttige dingen daar.

Vergeet niet te kopiëren naar zshrc.zsh-template in je thuismap en hernoem het naar .zshrc voordat u uw wijzigingen aanbrengt. Nu, in de thema's map, maak een bestand aan met de themanaam die u in uw map hebt ingesteld .zshrc het dossier. Zorg ervoor dat je het geeft .zsh-theme uitbreiding. We zijn klaar om ons eigen thema op te bouwen.


Het aangepaste thema bouwen

Het belangrijkste in uw themabestand is het PROMPT variabel. De inhoud is uw opdrachtprompt. Om hier een idee van te krijgen, begint u gewoon met dit in uw themabestand:

PROMPT = 'myPrompt =>'

Open een nieuw Terminal-venster en u zou dit moeten zien:

Oké, laten we aan de slag gaan. We zullen verschillende functies moeten schrijven, maar we zullen beginnen met de PROMPT variabel. Het is misschien niet merkbaar als je naar de terminal kijkt, maar er zijn eigenlijk drie regels voor mijn prompt. De eerste is een lege regel, gewoon om me wat ademruimte te geven. De tweede heeft alle informatie en de derde heeft de pijl. Op die derde regel typ je eigenlijk het commando. Dus, hier is onze start:

PROMPT = '$ reset_color →'

Ja, je kunt multiline-reeksen maken die eenvoudig in shell-scripting zijn. Maar wat is er aan de hand $ reset_color? Dat is een variabele die oh-my-zsh voor ons definieert; het reset de kleur van de uitvoer. Dit vereist een korte omleiding om te bespreken hoe we verschillende woorden in de prompt kleuren. U ziet dat er een code is, een reeks tekens, die de volgende tekst in een kleur verandert. Vanzelfsprekend is er een code voor elke beschikbare kleur. Maak je geen zorgen, er zijn andere variabelen voor de andere kleuren; je hoeft de codes niet te leren. Tegen de tijd dat we echter bij de derde regel komen, willen we dat terugzetten naar de standaardtekstkleur; dus gebruiken we de $ reset_color veranderlijk.

Als je nieuwsgierig bent naar het pijlteken, is dit de pijl naar rechts van Unicode (U + 2192, →). Dat is alles.

Dus nu ziet onze prompt er zo uit:

Svelte kijken. Laten we nu de computernaam en werkmap toevoegen. Dit is alles voor die tweede regel van onze PROMPT veranderlijk.

$ fg [cyaan]% m: $ fg [geel] $ (get_pwd)

We beginnen met het instellen van de tekstkleur op cyaan; het lijkt erop dat we die kleurcode krijgen van een associatieve array of hash; terwijl ik het niet gebruik, is er een $ bg hash waarmee de achtergrondkleur wordt gewijzigd in plaats van de voorgrondkleur (tekst).

Na het instellen van de kleur hebben we % m dit geeft de naam van de computer weer. Na de dubbele punt en spatie schakelen we de tekstkleur om naar geel. Vervolgens gebruiken we het dollarteken en parens om de uitvoer van de functie toe te voegen get_pwd. Dit zal onze huidige werkdirectory uitvoeren, we hebben een beetje een draai. Als ik in de homedirectory ben, wil ik het niet zien / Users / Andrew, ik wil zien ~ in plaats daarvan. Dus, hier is die functie:

functie get_pwd () echo "$ PWD / $ HOME / ~"

De functieschaal is vrij eenvoudig als je eerder JavaScript hebt geschreven; identieke syntaxis. Ik weet niet zeker waar de syntaxis van zoeken en vervangen afkomstig is, maar die lijkt erg op de syntaxis van Vim search-and-replace: PWD bevat de tekst $ HOME (een systeemvariabele voor je thuismap), vervang deze door ~.

Dit is het volgende:

Goed! Nu komt het lastige gedeelte. Zie je, ik wil de git-informatie en de batterij-indicator juist uitlijnen. Aangezien er geen manier is om daadwerkelijk rechts uit te lijnen, moeten we het aantal tekens van de gewenste tekst tellen, dat van de breedte van het venster aftrekken en die afstand toevoegen. Het is behoorlijk hacky, en de code is behoorlijk rommelig, maar het is alles wat ik heb kunnen vinden dat echt werkt.

Klaar? We voegen de tussenruimte in met een functie die ik bel get_spacing. Dus voeg toe $ (Get_spacing) tot het einde van onze tweede regel, dus het ziet er nu als volgt uit:

$ fg [cyaan]% m: $ fg [geel] $ (get_pwd) $ (put_spacing)

Nu, die functie. Natuurlijk is hier de shell:

functie put_spacing () 

Er zitten vier onderdelen in. Dit is de eerste.

lokale git = $ (git_prompt_info) als [$ # git! = 0]; then ((git = $ # git - 10)) else git = 0 fi

We beginnen met het ophalen van de uitvoer van de git_prompt_info functie en het opslaan in een lokale variabele, git. Als de lengte van die reeks niet 0 is, worden we opnieuw ingesteld git dus dat is nu de lengte van de string min 10. Anders worden we gereset git tot 0. Dit lijkt niet veel zin te hebben, totdat je je realiseert wat we hier proberen te doen. We willen weten hoeveel karakter "slots" de git-informatie in beslag neemt. Het lastige is dat we de variabele hergebruiken git: eerst houdt het de string vast, dan bevat het het getal dat het aantal karakters vertegenwoordigt, onze git info is lang. Als git is nul tekens lang, hebben we ingesteld git tot 0; als dat niet het geval is (wat betekent dat we in een git-repository zitten), dan zetten we die in git naar het aantal tekens in de tekenreeks, minus 10. Dit komt omdat het tekenreeksteken de kleurcodes bevat, die niet echt zichtbaar zijn, dus ze nemen geen breedte in beslag. De dubbele parens? Oh, ze zijn gewend om wiskunde te doen.

We doen precies hetzelfde voor de batterij-output:

lokale bat = $ (battery_charge) als [$ # bat! = 0]; then ((bat = $ # bat - 18)) else bat = 0 fi

In het derde deel zoeken we uit hoeveel spaties we nodig hebben:

lokale termwidth ((termwidth = $ COLUMNS - 3 - $ # HOST - $ # $ (get_pwd) - $ bat - $ git))

Een beetje meer wiskunde: we beginnen met COLUMNS, wat het aantal tekens is dat de Terminal breed is. We trekken alle geschikte waarden af ​​(de 3 is voor twee spaties en een dubbele punt) en we eindigen met het feit dat we dat nodig hebben termwidth aantal spaties tussen de linker- en rechterdelen van de prompt.

Laten we nu een string maken die dat is termwidth aantal plaatsen lang:

lokaal voor i in 1 ... $ termwidth; do spacing = "$ spacing" done echo $ spacing

Een eenvoudige inlooplus stelt ons in staat om de string te maken; dan keren we terug.

Je kunt niet echt zien dat de witruimte is toegevoegd, dus ik heb wat dummy tekst toegevoegd, zodat je kunt zien dat het is toegevoegd.

Vervolgens de Git-info. We voegen toe $ (Git_prompt_info) aan het einde van promptregel 2; zoals je weet, dat is een functieaanroep.

$ fg [cyaan]% m: $ fg [geel] $ (get_pwd) $ (put_spacing) $ (git_prompt_info)

Merk op dat we de kleur niet veranderen voordat de Git-info wordt geladen: de functie zorgt ervoor, omdat dit afhangt van de repository-status.

En hier is de functie:

functie git_prompt_info () ref = $ (git symbolic-ref HEAD 2> / dev / null) || return echo "$ (parse_git_dirty) $ ZSH_THEME_GIT_PROMPT_PREFIX $ (current_branch) $ ZSH_THEME_GIT_PROMPT_SUFFIX"

De eerste regel controleert gewoon of we in een Git-repository zitten. Als we dat niet zijn terugkeer. Als we dat zijn, de volgende regel echois de juiste info. Let hier op twee dingen: ten eerste gebruiken we twee variabelen: $ ZSH_THEME_GIT_PROMPT_PREFIX en $ ZSH_THEME_GIT_PROMPT_SUFFIX. Ik zal je laten zien hoe deze in een seconde worden gedefinieerd. Het andere ding is twee andere functies die worden genoemd. Deze worden geleverd door oh-my-zsh. De current_branch function retourneert gewoon de huidige tak. De parse_git_dirty is echter interessanter. Als de huidige vertakking vuil is (heeft niet-gecommiteerde wijzigingen), geeft de functie de $ ZSH_THEME_GIT_PROMPT_DIRTY; anders wordt het uitgevoerd $ ZSH_THEME_GIT_PROMPT_CLEAN.

Ik heb deze vier variabelen als volgt gedefinieerd:

ZSH_THEME_GIT_PROMPT_PREFIX = "[git:" ZSH_THEME_GIT_PROMPT_SUFFIX = "] $ reset_color" ZSH_THEME_GIT_PROMPT_DIRTY = "$ fg [red] +" ZSH_THEME_GIT_PROMPT_CLEAN = "$ fg [groen]"

Op basis van deze variabelen wordt een repo op een schone hoofdtak uitgevoerd [Git: meester] in het groen; een vuile hoofdtak wordt uitgevoerd +[Git: meester].

En ten slotte noemen we het battery_charge functie:

$ fg [cyaan]% m: $ fg [geel] $ (get_pwd) $ (put_spacing) $ (git_prompt_info) $ (battery_charge)

Hier is de battery_charge functie:

function battery_charge () als [-e ~ / bin / batcharge.py] dan echo 'python ~ / bin / batcharge.py' else echo '; fi

Als het bestand bestaat, voeren we dat bestand uit en herhalen we de uitvoer. Merk op dat we de backticks gebruiken rond de werking van het bestand (dit zijn geen enkele aanhalingstekens): hiermee kunnen we een reeks code uitvoeren alsof deze in de terminal was. Als het bestand niet bestaat, echoën we gewoon een lege string.

En daarmee zijn we klaar! Dit is wat we eindigen met:


Conclusie

Wel, dat is hoe mijn terminal eruit ziet. Ik heb het oh-my-zsh project gevat op GitHub en dit thema toegevoegd, zodat je het daar kunt vinden. Als je mijn andere dotfiles wilt zien, heb ik ze ook op GitHub.

Ik ben echter nog niet klaar met de configuratie van mijn opdrachtregel. Hoewel ik in een tijdje geen wijzigingen heb aangebracht, denk ik erover om de naam van de huidige gebruiker op te nemen (omdat ik ditzelfde thema op mijn server gebruik), en ook enkele RVM-info. Ik weet ook niet waarom ik het woord heb git daarin; Ik denk dat ik oorspronkelijk een setup had die werkte met meerdere versiecontrolesystemen ... Hoe dan ook, het punt van dit alles is dat dit iets is dat je voortdurend aan het veranderen bent. Wanneer ik wijzigingen aanbreng, zal ik ze zeker naar GitHub pushen, zodat je ze daar kunt zien.

Ik laat je achter met verschillende links die je handig vindt bij het hacken op de opdrachtregel:

  • 7 eenvoudige en bruikbare opdrachtregeltips | Nettuts+
  • 10 Terminal-opdrachten die uw productiviteit zullen verhogen | Nettuts+
  • Hoe je opdrachtprompt aan te passen | Nettuts+
  • Versnel uw workflow in de terminal | Nettuts + Premium
  • Steve Losh: My Extravagant Zsh Prompt
  • Peepcode Blogpost: Mijn opdrachtregelprompt
  • Peepcode: maak kennis met de commandoregel ($ 12)
  • Peepcode: geavanceerde commandoregel ($ 12)
  • Phil's Zsh Prompt
  • Bash Prompt HOWTO
  • Oh-my-zsh thema wiki-pagina (U kunt naar deze afbeeldingen verwijzen als u kijkt naar de thema's in de thema's map; Op die manier ontvang je een aantal nuttige tips.)
  • Natuurlijk, een zoekopdracht op het web naar termen zoals "bash if-statement" of "bash for loop" zal nuttige resultaten opleveren als je alleen maar aan het leren bent. Onthoud, aangezien zsh vrijwel volledig compatibel is met bash, moeten alle bash-scriptfragmenten die je gebruikt in een zsh-prompt gevonden worden.

Veel plezier!