Come personalizzare il tuo prompt dei comandi

Ultimamente ho ricevuto molte domande: "come hai fatto a far sembrare il tuo terminale come fa?" Se hai notato il mio terminale e sei curioso di come l'ho impostato, questo è il tutorial che fa per te! Naturalmente, ciò che si apprende qui sarà sufficiente per iniziare a creare il proprio prompt dei comandi personalizzato!


Prima di iniziare, voglio fare qualcosa di estremamente chiaro. Sono certamente un entusiasta della linea di comando, ma non sono affatto un professionista della linea di comando. Mi sento a casa in un terminale, ma sono ben lontano dal sapere tutto. Quindi, ecco l'accordo: ho intenzione di mostrarvi come ho configurato il mio terminale, ma questo non significa che sarò in grado di spiegare ogni singola riga di codice che vedremo. Ci sono alcune cose qui che sono così perché è quello che funziona ... e non so sempre al 100% perché.

Con quel disclaimer tolto di mezzo, vediamo cosa stiamo facendo.


Riunione del prodotto finito

Ecco come appare il prompt dei comandi:

Se non sei sicuro di cosa stai guardando lì, lasciami spiegare:

  • Nel turchese, abbiamo il nome del computer; nel mio caso, quello è nave madre. Questo è seguito da due punti.
  • Successivamente, abbiamo la directory di lavoro, in un giallo-arancio.
  • Se siamo in un repository git, abbiamo alcune informazioni su quello successivo. La cosa principale qui è il nome del ramo (maestro o tilt_in_post_class nello screenshot). Inoltre, se la directory di lavoro è pulita, quel testo appare in verde; altrimenti, appare in rosso.
  • Finalmente, abbiamo un indicatore della batteria. Se i dieci triangoli sono tutti verdi e compilati, le cose si accendono. Mentre la batteria si svuota, i triangoli si svuotano e alla fine diventano rossi. Certo, se non sei su un laptop come sono, questo non ti sarà più utile.

Preparare l'ambiente

Diamo ora un paio di pezzi preliminari insieme, prima di scrivere effettivamente alcuni script di shell.

Innanzitutto, c'è lo schema dei colori. Potresti riconoscerlo come la combinazione di colori Solarized di Ethan Schoonover. È piuttosto sorprendente, e l'ho usato sia sul terminale che su Vim da quando l'ho scoperto. Se vuoi usarlo nel terminale, dovrai installare il tema. Il Terminale di Snow Leopard non supportava xterm-256color, quindi dovrai seguire alcune indicazioni speciali nella pagina di GitHub Solarizzata per farlo funzionare se sei ancora su quel SO.

Se sei passato a Lion, puoi semplicemente installare il .terminale file che troverai nella cartella xterm-256color. Una volta installati (basta fare doppio clic su di essi), dovresti essere in grado di selezionare quello desiderato nelle preferenze di Terminale. Non dimenticare di impostarlo come schema predefinito.

La prossima cosa da sapere è che non sto usando la shell bash predefinita nel mio terminale. Invece, sono passato a zsh, che è fondamentalmente molto bash-compatibile, ma ha alcune aggiunte interessanti, come il completamento di schede migliori. Ecco come farlo: apri le preferenze di sistema Mac e vai su "Utenti e gruppi". Sblocca il riquadro facendo clic sul blocco nella parte inferiore e immettendo la password. Quindi, fai clic con il pulsante destro del mouse sull'utente nell'elenco e seleziona "Opzioni avanzate". Nel campo "Login Shell", passa da / Bin / bash a / Bin / zsh. È così semplice.

Caratteri

Passaggio successivo: ottieni il carattere corretto. Sto usando Inconsolata a 15pt. È un font monospace gratuito che amo guardare tutto il giorno. (Oltre a usarlo nel terminale, lo uso in Vim e TextEdit.) Puoi impostare il tuo carattere predefinito all'interno delle preferenze di Terminale, proprio dove scegli la combinazione di colori.

Un'altra piccola cosa è la dimensione della tua finestra: Apri Preferenze Terminali> Impostazioni e fai clic sulla scheda Finestra; a metà, puoi scegliere il numero di colonne e righe che vuoi; Io uso 130 colonne per 30 righe.

Batteria

Ricorda l'indicatore del livello della batteria? Bene, questo richiede una piccola sceneggiatura da parte dello sviluppatore Steve Losh; semplicemente copialo in un file e salvalo come un file python; da ~ / Bin è nel mio terminale SENTIERO, Ho salvato il file in ~ / Bin / batcharge.py. Come nota, questo script funziona solo su Mac OS X, quindi se stai eseguendo zsh su un altro sistema, dovrai lasciare questa parte fuori.

zsh

Ultimo, ma certamente non meno importante, c'è oh-my-zsh. Secondo il repository Github, questo è solo "Una manciata di funzioni, auto-completatori e cose che ti fanno gridare 'OH MY ZSHELL!'"

Perché usarlo? Per me, ho deciso di provarlo a un certo punto e l'ho lasciato installato. Se usi molto il terminale, cerca un po 'oh-my-zsh quando hai un po' di tempo. Potresti essere sorpreso da ciò che troverai. Installare oh-my-zsh è abbastanza semplice: basta seguire le istruzioni di installazione nel README; sono piuttosto semplici.

Ora abbiamo tutte le parti necessarie sul posto. Siamo pronti per iniziare a creare il nostro terminale personalizzato.


Creare i file

Quando hai installato oh-my-zsh, è stato installato su ~ / .Oh-my-zsh. Pop che si apre. Vedrai due cartelle di note: temi e modelli. Dentro modelli, troverai un file chiamato zshrc.zsh-template Questo è un modello per te ~ / .Zshrc file. Se hai già personalizzato il tuo terminale, saprai che il .bashrc il file è dove le tue personalizzazioni sono memorizzate quando stai usando una shell bash. Il .zshrc è la stessa cosa, ad eccezione della shell zsh. Quindi apri quel file di modello; non devi sapere cosa sta succedendo esattamente; dopo tutto, ci sono molti commenti nel file che potrebbero non avere senso. Una cosa qui è importante da usare. Si noti la linea che dice questo:

ZSH_THEME = "robbyrussell"

Questo è il nome del tema che il tuo terminale sta usando. Guarda nel temi cartella: vedrai a robbyrussel.zsh-tema file. Quello che faremo è creare un tema proprio, in modo da poter sostituire quella stringa con il nome del nostro nuovo file. Ho chiamato in modo increativo il mio "doppio" perché è entrato da entrambi i lati del terminale.

Tutte le altre personalizzazioni che vuoi apportare al tuo ambiente zsh possono essere fatte in questo file. Se usi molto il terminale, controlla oh-my-zshI plugin (nel plugins cartella): un sacco di cose utili lì dentro.

Non dimenticare di copiare su zshrc.zsh-template alla tua directory home e rinominalo .zshrc prima di apportare le modifiche. Ora, nel temi cartella, crea un file con il nome del tema che hai impostato nel tuo .zshrc file. Assicurati di dargli il .zsh-tema estensione. Siamo pronti a costruire il nostro tema personalizzato.


Costruire il tema personalizzato

La cosa più importante nel file del tema è il RICHIESTA variabile. Il contenuto è il tuo prompt dei comandi. Per avere un'idea di questo, inizia con questo nel tuo file tema:

PROMPT = 'myPrompt =>'

Apri una nuova finestra di Terminale e dovresti vedere questo:

Va bene, mettiamoci al lavoro. Dovremo scrivere diverse funzioni, ma inizieremo con RICHIESTA variabile. Potrebbe non essere evidente quando si guarda il terminale, ma ci sono in realtà tre righe al mio prompt. Il primo è una linea vuota, solo per darmi un po 'di respiro. Il secondo ha tutte le informazioni e il terzo ha la freccia. Quella terza riga è dove effettivamente scrivi il comando. Quindi, ecco il nostro inizio:

PROMPT = '$ reset_color →'

Sì, è possibile eseguire stringhe multilinea facilmente con lo script di shell. Ma che succede $ reset_color? Questa è una variabile che oh-my-zsh definisce per noi; Reimposta il colore dell'output. Ciò richiede una breve diversione per discutere di come coloriamo parole diverse nel prompt. Vedete, c'è un codice, una serie di caratteri, che cambia il testo seguente in un colore. Ovviamente, c'è un codice per ogni colore disponibile. Non preoccuparti, ci sono altre variabili per gli altri colori; non devi imparare i codici. Nel momento in cui arriviamo alla terza riga, però, vogliamo ripristinarla sul colore predefinito del testo; quindi, usiamo il $ reset_color variabile.

Se sei curioso del carattere della freccia, è la freccia verso destra Unicode (U + 2192, →). È tutto.

Quindi, ora il nostro prompt è simile a questo:

Sguardo snello. Aggiungiamo ora il nome del computer e la directory di lavoro. Questo è tutto per quella seconda linea del nostro RICHIESTA variabile.

$ fg [cyan]% m: $ fg [giallo] $ (get_pwd)

Iniziamo impostando il colore del testo su ciano; sembra che stiamo ottenendo quel codice colore da un array o da un hash associativo; mentre io non lo uso, c'è un $ bg hash che cambia il colore di sfondo invece del colore di primo piano (testo).

Dopo aver impostato il colore, abbiamo % m questo produce il nome del computer. Dopo i due punti e lo spazio, cambiamo il colore del testo in giallo. Successivamente, utilizziamo il simbolo del dollaro e il paren per aggiungere l'output della funzione get_pwd. Questo produrrà la nostra attuale directory di lavoro, siamo un po 'una svolta. Se sono nella home directory, non voglio vedere / Users / andrew, voglio vedere ~ anziché. Quindi, ecco quella funzione:

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

La shell di funzione è piuttosto semplice se hai scritto JavaScript in precedenza; sintassi identica. Non sono sicuro della provenienza della sintassi search-and-replace, ma sembra molto simile alla sintassi search-and-replace di Vim: PWD include il testo $ HOME (una variabile di sistema per la tua home directory), sostituiscila con ~.

Ora, ecco cosa è giù:

Buono! Ora viene la parte difficile. Vede, voglio allineare a destra le informazioni git e l'indicatore della batteria. Dato che non c'è modo di allineare correttamente, dobbiamo contare il numero di caratteri del testo che vogliamo, sottrarre quello dalla larghezza della finestra e aggiungere tale spaziatura. È piuttosto hacky e il codice è piuttosto disordinato, ma è tutto quello che sono riuscito a scoprire che funziona davvero.

Pronto? Inseriamo la spaziatura con una funzione che chiamo get_spacing. Quindi aggiungi $ (Get_spacing) alla fine della nostra seconda riga, quindi ora sembra così:

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

Ora, quella funzione. Certo, ecco la shell:

function put_spacing () 

Ci sono quattro parti all'interno. Ecco il primo.

git locale = $ (git_prompt_info) se [$ # git! = 0]; poi ((git = $ # git - 10)) else git = 0 fi

Iniziamo prendendo l'output dal git_prompt_info funzione e memorizzarlo in una variabile locale, idiota. Successivamente, se la lunghezza di quella stringa non è 0, resettiamo idiota quindi ora è la lunghezza della stringa meno 10. Altrimenti, resettiamo idiota a 0. Questo non sembra avere molto senso, finché non ti rendi conto di cosa stiamo cercando di fare qui. Vogliamo scoprire quante "slot" di caratteri occupano le informazioni git. La parte difficile è che stiamo riutilizzando la variabile idiota: prima tiene la stringa, quindi contiene il numero che rappresenta il numero di caratteri che le nostre informazioni git sono lunghe. Se idiota è zero caratteri lunghi, abbiamo impostato idiota a 0; se non lo è (il che significa che siamo in un repository git), abbiamo impostato idiota al numero di caratteri nella stringa, meno 10. Questo perché il numero di caratteri della stringa include i codici colore, che non sono effettivamente visibili, quindi non occupano la larghezza. Il doppio parens? Oh, sono abituati a fare matematica.

Facciamo la stessa cosa per l'uscita della batteria:

bat locale = $ (battery_charge) se [$ # bat! = 0]; poi ((bat = $ # bat - 18)) else bat = 0 fi

Nella terza parte, scopriamo quanti spazi avremo bisogno:

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

Un po 'più di matematica: iniziamo con COLONNE, che è il numero di caratteri che il Terminale è largo. Sottraiamo tutti i valori appropriati (il 3 è per due spazi e un colon), e finiamo con il fatto che abbiamo bisogno termwidth numero di spazi tra le parti sinistra e destra del prompt.

Ora, creiamo una stringa che sia termwidth numero di spazi lunghi:

locale per i in 1 ... $ termwidth; spaziatura = "$ spaziatura" fatta echo $ spaziatura

Un semplice ciclo for-in ci consente di creare la stringa; quindi, lo restituiamo.

Non puoi davvero dire che lo spazio bianco è stato aggiunto, quindi ho aggiunto un testo fittizio in modo che tu possa vedere che è stato aggiunto.

Avanti, le informazioni Git. Noi aggiungiamo $ (Git_prompt_info) alla fine della riga di prompt 2; come sai, questa è una chiamata di funzione.

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

Si noti che non cambiamo il colore prima di caricare le informazioni Git: la funzione si prenderà cura di questo, perché dipende dallo stato del repository.

Ed ecco la funzione:

funzione 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"

La prima riga controlla solo se ci troviamo in un repository Git. Se non siamo noi ritorno. Se lo siamo, la prossima linea ecos le informazioni giuste. Notate due cose qui: in primo luogo, stiamo usando due variabili: $ ZSH_THEME_GIT_PROMPT_PREFIX e $ ZSH_THEME_GIT_PROMPT_SUFFIX. Ti mostrerò come sono definiti in un secondo. L'altra cosa sono le altre due funzioni che vengono chiamate. Questi sono forniti da oh-my-zsh. Il current_branch la funzione restituisce solo il ramo corrente. Il parse_git_dirty è più interessante, però. Se il ramo corrente è sporco (ha modifiche non applicate), la funzione produrrà il file $ ZSH_THEME_GIT_PROMPT_DIRTY; altrimenti uscirà $ ZSH_THEME_GIT_PROMPT_CLEAN.

Ho queste quattro variabili definite in questo modo:

ZSH_THEME_GIT_PROMPT_PREFIX = "[git:" ZSH_THEME_GIT_PROMPT_SUFFIX = "] $ reset_color" ZSH_THEME_GIT_PROMPT_DIRTY = "$ fg [rosso] +" ZSH_THEME_GIT_PROMPT_CLEAN = "$ fg [verde]"

Sulla base di queste variabili, verrà prodotto un repository su un ramo master pulito [Git: master] in verde; uscirà un ramo master sporco +[Git: master].

E infine, chiamiamo il carica batterie funzione:

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

Ecco il carica batterie funzione:

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

Se il file esiste, eseguiamo quel file ed echo l'output. Si noti che utilizziamo i backtick attorno all'esecuzione del file (quelli non sono virgolette singole): ciò ci consente di eseguire una stringa di codice come se fosse nel terminale. Se il file non esiste, facciamo solo eco a una stringa vuota.

E con quello, abbiamo finito! Ecco cosa finiamo con:


Conclusione

Bene, è come appare il mio terminale. Ho biforcato il progetto oh-my-zsh su GitHub e ho aggiunto questo tema, quindi puoi trovarlo lì. Se sei interessato a vedere i miei altri dotfile, li ho anche su GitHub.

Tuttavia, non ho ancora finito con la mia configurazione da riga di comando. Mentre non ho apportato alcuna modifica in un istante, sto pensando di includere il nome dell'utente corrente (perché utilizzo lo stesso tema sul mio server) e anche alcune informazioni RVM. Inoltre, non sono sicuro del perché ho la parola idiota lì dentro; Immagino che in origine avessi un setup che funzionava con più sistemi di controllo delle versioni ... Comunque, il punto di tutto questo è che questo è qualcosa che verrà continuamente modificato. Quando apporto le modifiche, cercherò di inviarle a GitHub, quindi potrai vederle lì.

Lascia che ti lasci con diversi link che troverai utili nell'hacking in giro sulla riga di comando:

  • 7 Suggerimenti per la riga di comando semplici e utili | Nettuts+
  • 10 comandi di terminale che miglioreranno la tua produttività | Nettuts+
  • Come personalizzare il tuo prompt dei comandi | Nettuts+
  • Accelerare il flusso di lavoro nel terminale | Nets + Premium
  • Steve Losh: My Extravagant Zsh Prompt
  • Post del blog Peepcode: il mio prompt della riga di comando
  • Peepcode: Meet the Command Line ($ 12)
  • Peepcode: Advanced Command Line ($ 12)
  • Phil's Zsh Prompt
  • Bash Prompt HOWTO
  • Pagina wiki di temi Oh-my-zsh (puoi fare riferimento a queste immagini quando guardi i temi in temi cartella; raccoglierai alcuni consigli utili in questo modo.)
  • Ovviamente, una ricerca sul web di termini come "bash if statement" o "bash for loop" mostrerà risultati utili se stai semplicemente imparando. Ricorda, dal momento che zsh è praticamente compatibile con bash, qualsiasi frammento di script di bash che usi dovrebbe trovare lavoro in un prompt di zsh.

Divertiti!