Comment personnaliser votre terminal

Dernièrement, je me suis souvent posé cette question: «Comment avez-vous fait en sorte que votre terminal ressemble de cette façon?» Si vous avez remarqué mon terminal et êtes curieux de savoir comment je l'ai configuré, voici le tutoriel pour vous. ! Bien entendu, ce que vous apprendrez ici sera suffisant pour vous permettre de créer votre propre invite de commande personnalisée, ainsi que!


Screencast exclusif



Tutoriel écrit

Avant de commencer, je veux faire quelque chose d'extrêmement clair. Je suis certainement un passionné de ligne de commande, mais je ne suis pas du tout un pro de la ligne de commande. Je me sens chez moi dans un terminal, mais je suis loin de tout savoir. Voici donc le problème: je vais vous montrer comment j'ai installé mon terminal, mais cela ne signifie pas que je serai en mesure d'expliquer chaque ligne de code que nous allons examiner. Certaines choses ici sont comme elles sont juste parce que c'est ce qui fonctionne… et je ne sais pas toujours à 100% pourquoi.

Avec cette limitation de responsabilité, voyons ce que nous faisons.


Répondre au produit fini

Voici à quoi ressemble mon invite de commande:


Si vous n'êtes pas sûr de ce que vous regardez là-bas, laissez-moi vous expliquer:

  • Dans la turquoise, nous avons le nom de l'ordinateur; dans mon cas, c'est vaisseau mère. C'est suivi d'un colon.
  • Ensuite, nous avons le répertoire de travail, dans un jaune-orange.
  • Si nous sommes dans un dépôt git, nous avons quelques informations à ce sujet. La chose principale ici est le nom de la branche (maîtriser ou tilt_in_post_class dans la capture d'écran). De plus, si le répertoire de travail est propre, ce texte apparaît en vert; sinon, il apparaît en rouge.
  • Enfin, nous avons un indicateur de batterie. Si les dix triangles sont tous verts et remplis, les choses sont mises sous tension. Lorsque ma batterie se vide, les triangles se vident et finissent par virer au rouge. Bien sûr, si vous n'êtes pas sur un ordinateur portable comme moi, cela ne vous sera pas aussi utile.

Préparer l'environnement

Assemblons maintenant quelques pièces préliminaires avant d'écrire des scripts shell.

Premièrement, il y a la palette de couleurs. Vous le reconnaîtrez peut-être comme un jeu de couleurs Solarized d'Ethan Schoonover. C'est assez étonnant et je l'utilise aussi bien sur le terminal que dans Vim depuis que je l'ai découvert. Si vous voulez l'utiliser dans le terminal, vous devrez installer le thème. Le terminal dans Snow Leopard ne supportait pas xterm-256color, vous devrez donc suivre certaines instructions spéciales sur la page Solarized GitHub pour que cela fonctionne si vous êtes toujours sur ce système d'exploitation..

Si vous avez migré vers Lion, vous pouvez simplement installer le .Terminal les fichiers que vous trouverez dans le dossier xterm-256color. Une fois ceux-ci installés (il suffit de double-cliquer dessus), vous devriez pouvoir sélectionner celui que vous voulez dans les préférences du terminal. N'oubliez pas de le définir comme schéma par défaut.


La prochaine chose à savoir est que je n’utilise pas le shell bash par défaut dans mon terminal. Au lieu de cela, je suis passé à zsh, qui est fondamentalement bien compatible avec bash, mais comporte quelques ajouts intéressants, comme un meilleur remplissage des onglets. Voici comment procéder: ouvrez les préférences système Mac et accédez à «Utilisateurs et groupes». Déverrouillez le volet en cliquant sur le verrou situé en bas et en entrant votre mot de passe. Cliquez ensuite avec le bouton droit de la souris sur votre utilisateur dans la liste et choisissez «Options avancées». Dans le champ «Login Shell», passez de / bin / bash à / bin / zsh. C'est si simple.

Les polices

Prochaine étape: obtenir la bonne police. J'utilise Inconsolata à 15 pt. C'est une police monospace gratuite que j'adore regarder toute la journée. (En plus de l’utiliser dans le terminal, je l’utilise dans Vim et TextEdit.) Vous pouvez définir votre police par défaut à partir des préférences du terminal, là où vous choisissez le jeu de couleurs..

Une autre petite chose est la taille de votre fenêtre: ouvrez Préférences de terminal> Paramètres et cliquez sur l'onglet Fenêtre; à mi-chemin, vous pouvez choisir le nombre de colonnes et de lignes que vous souhaitez; J'utilise 130 colonnes sur 30 lignes.

Batterie

Rappelez-vous l'indicateur de niveau de batterie? Eh bien, cela nécessite un petit script du développeur Steve Losh; copiez-le simplement dans un fichier et enregistrez-le en tant que fichier python; puisque ~ / bin est dans mon terminal CHEMIN, J'ai sauvegardé le fichier dans ~ / bin / batcharge.py. Comme il le note, ce script ne fonctionnera que sur Mac OS X. Par conséquent, si vous utilisez zsh sur un autre système, vous devrez laisser cette partie de côté..

Zsh

Dernier point, mais non le moindre, il y a oh-my-zsh. Selon le rapport Github, il s’agit simplement d’une poignée de fonctions, d’aides à la saisie automatique et de choses qui vous font crier "OH MY ZSHELL!"

Pourquoi l'utiliser? Pour moi, j'ai décidé d'essayer à un moment donné et je l'ai laissé installé. Si vous utilisez beaucoup le terminal, fouillez un peu oh-my-zsh quand vous en avez le temps. Vous pourriez être surpris de ce que vous trouverez. Installer oh-my-zsh est assez simple: il suffit de suivre les instructions de configuration du fichier README; ils sont assez simples.

Nous avons maintenant toutes les pièces nécessaires en place. Nous sommes prêts à commencer à créer notre terminal personnalisé.


Création des fichiers

Lorsque vous avez installé oh-my-zsh, il a été installé pour ~ / .oh-my-zsh. Pop qui ouvre. Vous verrez deux dossiers de note: des thèmes et des modèles. À l'intérieur des modèles, vous trouverez un fichier appelé zshrc.zsh-template Ceci est un modèle pour vous ~ / .zshrc fichier. Si vous avez personnalisé votre terminal auparavant, vous saurez que le .bashrc Le fichier est l'endroit où vos personnalisations sont stockées lorsque vous utilisez un shell bash. le .zshrc est-ce la même chose, sauf pour le shell zsh. Alors ouvrez ce fichier modèle; vous n'avez pas besoin de savoir ce qui se passe exactement; Après tout, il y a beaucoup de commentaires dans le fichier qui pourraient ne pas avoir de sens. Une chose ici est importante à utiliser. Remarquez la ligne qui dit ceci:

ZSH_THEME = "robbyrussell"

C'est le nom du thème utilisé par votre terminal. Regarde dans le des thèmes dossier: vous verrez un robbyrussel.zsh-theme fichier. Ce que nous allons faire, c'est créer notre propre thème afin que vous puissiez remplacer cette chaîne par le nom de notre nouveau fichier. J'ai surnommé le mien 'doubleend' sans aucune crédibilité parce qu'il se trouve des deux côtés du terminal.

Toute autre personnalisation que vous souhaitez apporter à votre environnement zsh peut être effectuée dans ce fichier. Si vous utilisez beaucoup le terminal, consultez oh-mon-zshLes plugins de (dans le plugins dossier): une tonne de choses utiles là-bas.

N'oubliez pas de copier vers zshrc.zsh-template dans votre répertoire personnel et renommez-le en .zshrc avant de faire vos changements. Maintenant, dans le des thèmes dossier, créez un fichier avec le nom du thème que vous avez défini dans votre .zshrc fichier. Assurez-vous de lui donner le .thème zsh extension. Nous sommes prêts à construire notre thème personnalisé.


Construire le thème personnalisé

La chose la plus importante dans votre fichier de thème est le RAPIDE variable. Son contenu est votre invite de commande. Pour en avoir une idée, commencez simplement par ceci dans votre fichier de thème:

PROMPT = 'monPrompt =>'

Ouvrez une nouvelle fenêtre de terminal et vous devriez voir ceci:


Très bien, mettons-nous au travail. Nous allons devoir écrire plusieurs fonctions, mais nous allons commencer par le RAPIDE variable. Ce n'est peut-être pas visible lorsque vous regardez le terminal, mais il y a en fait trois lignes à mon invite. Le premier est une ligne blanche, juste pour me donner une marge de manœuvre. Le second a toutes les informations et le troisième a la flèche. Cette troisième ligne est l'endroit où vous tapez réellement la commande. Alors, voici notre début:

PROMPT = '$ reset_color →'

Oui, vous pouvez créer facilement des chaînes multilignes dans les scripts shell. Mais quoi de neuf avec $ reset_color? C'est une variable que oh-my-zsh définit pour nous; il réinitialise la couleur de la sortie. Cela nécessite une brève déviation pour expliquer comment nous colorons différents mots dans l’invite. Vous voyez, il y a un code - une série de caractères - qui modifie le texte suivant en une couleur. De toute évidence, il y a un code pour chaque couleur disponible. Ne vous inquiétez pas, il existe d'autres variables pour les autres couleurs; vous n'avez pas à apprendre les codes. Au moment où nous arrivons à la troisième ligne, nous souhaitons toutefois rétablir la couleur de texte par défaut. oui, nous utilisons le $ reset_color variable.

Si vous êtes curieux de connaître le caractère de flèche, c'est la flèche de droite Unicode (U + 2192, →). C'est tout.

Alors, maintenant, notre invite ressemble à ceci:


Vous cherchez svelte. Ajoutons maintenant le nom de l'ordinateur et le répertoire de travail. Ceci est tout pour cette deuxième ligne de notre RAPIDE variable.

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

Nous commençons par définir la couleur du texte sur cyan; il semble que nous obtenions ce code couleur à partir d'un tableau associatif ou d'un hachage; alors que je ne l'utilise pas, il y a un $ bg hash qui change la couleur d'arrière-plan au lieu de la couleur de premier plan (texte).

Après avoir défini la couleur, nous avons % m cela sort le nom de l'ordinateur. Après les deux points et l'espace, nous basculons la couleur du texte en jaune. Ensuite, nous utilisons le signe dollar et les parenthèses pour ajouter le résultat de la fonction get_pwd. Cela va sortir notre répertoire de travail actuel, nous un peu de torsion. Si je suis dans le répertoire personnel, je ne veux pas voir / Utilisateurs / andrew, Je veux voir ~ au lieu. Alors, voici cette fonction:

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

La fonction shell est assez simple si vous avez déjà écrit JavaScript; syntaxe identique. Je ne suis pas sûr de l'origine de cette syntaxe de recherche-remplacement, mais cela ressemble assez à la syntaxe Vim de recherche-remplacement: Si PWD inclut le texte $ HOME (une variable système pour votre répertoire personnel), remplacez-le par ~.

Maintenant, voici ce qui se passe:


Bien! Maintenant vient la partie la plus délicate. Vous voyez, je veux aligner à droite les informations de git et l'indicateur de batterie. Puisqu'il n'y a aucun moyen de bien aligner à droite, nous devons compter le nombre de caractères de texte que nous voulons, soustraire cela de la largeur de la fenêtre et ajouter cet espacement. C'est assez bidirectionnel, et le code est assez confus, mais c'est tout ce que j'ai pu trouver qui fonctionne réellement.

Prêt? Nous insérons l'espacement avec une fonction que j'appelle get_spacing. Alors ajoutez $ (get_spacing) à la fin de notre deuxième ligne, il ressemble maintenant à ceci:

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

Maintenant, cette fonction. Bien sûr, voici la coquille:

fonction put_spacing () 

Il y a quatre parties à l'intérieur. Voici le premier.

git local = $ (git_prompt_info) if [$ # git! = 0]; then ((git = $ # git - 10)) sinon git = 0 fi

Nous commençons par obtenir le résultat de la git_prompt_info fonction et stockage dans une variable locale, git. Ensuite, si la longueur de cette chaîne n'est pas 0, nous réinitialisons git donc c'est maintenant la longueur de la chaîne moins 10. Sinon, nous réinitialisons git à 0. Cela ne semble pas avoir de sens, jusqu'à ce que vous réalisiez ce que nous essayons de faire ici. Nous voulons savoir combien de «slots» de caractères prennent les informations git. La partie délicate est que nous réutilisons la variable git: d'abord, il contient la chaîne, puis le nombre représentant le nombre de caractères de notre information git est longue. Si git est zéro caractères, nous définissons git à 0; si ce n'est pas le cas (c'est-à-dire que nous sommes dans un référentiel git), nous définissons git moins le nombre de caractères dans la chaîne, car le nombre de caractères de la chaîne inclut les codes de couleur, qui ne sont pas réellement visibles, ils ne prennent donc pas de largeur. Les doubles parens? Oh, ils sont utilisés pour faire des maths.

Nous faisons la même chose pour la sortie de la batterie:

bat local = $ (batterie_charge) if [$ # bat! = 0]; then ((bat = $ # bat - 18)) sinon bat = 0 fi

Dans la troisième partie, nous déterminons combien d’espace nous aurons besoin:

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

Un peu plus de maths: on commence par COLONNES, qui est le nombre de caractères du terminal est large. Nous soustrayons toutes les valeurs appropriées (le 3 est pour deux espaces et un deux-points), et nous nous retrouvons avec le fait que nous avons besoin largeur de term nombre d'espaces entre les parties gauche et droite de l'invite.

Maintenant, créons une chaîne qui est largeur de term nombre d'espaces longs:

local pour i dans 1… $ termwidth; do spacing = "$ spacing" terminé echo $ spacing

Une simple boucle for-in nous permet de créer la chaîne; alors, on le rend.

Vous ne pouvez pas vraiment dire que les espaces blancs ont été ajoutés, alors j'ai ajouté du texte factice pour que vous puissiez voir que c'est ce qui a été ajouté.


Ensuite, les informations sur Git. Nous ajoutons $ (git_prompt_info) jusqu'à la fin de la ligne de commande 2; comme vous le savez, c'est un appel de fonction.

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

Notez que nous ne changeons pas la couleur avant de charger les informations Git: la fonction s’occupera de cela, car cela dépend de l’état du référentiel..

Et voici la fonction:

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

La première ligne vérifie simplement si nous sommes dans un référentiel Git. Si nous ne sommes pas nous revenir. Si nous sommes, la ligne suivante échos la bonne information. Remarquez deux choses ici: premièrement, nous utilisons deux variables: $ ZSH_THEME_GIT_PROMPT_PREFIX et $ ZSH_THEME_GIT_PROMPT_SUFFIX. Je vais vous montrer comment ils sont définis en une seconde. L'autre chose est deux autres fonctions qui sont appelées. Ceux-ci sont fournis par oh-my-zsh. le current_branch La fonction retourne simplement la branche courante. le parse_git_dirty est plus intéressant, cependant. Si la branche actuelle est sale (a des modifications non validées), la fonction affichera le $ ZSH_THEME_GIT_PROMPT_DIRTY; sinon il va sortir $ ZSH_THEME_GIT_PROMPT_CLEAN.

J'ai ces quatre variables définies comme suit:

ZSH_THEME_GIT_PROMPT_PREFIX = "[git:" ZSH_THEME_GIT_PROMPT_SUFFIX = "] $ réinitialiser couleur" ZSH_THEME_GIT_PROMPT_DIRTY = "$ fg [rouge] +" ZSH_TME_GIT

Sur la base de ces variables, un référentiel sur une branche maître vierge sera généré. [git: master] en vert; une branche maître sale produira +[git: master].

Et enfin, nous appelons le charge de la batterie une fonction:

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

Ici se trouve le charge de la batterie une fonction:

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

Si le fichier existe, nous l'exécutons et renvoyons la sortie. Notez que nous utilisons les backticks autour de l'exécution du fichier (ce ne sont pas des guillemets simples): cela nous permet d'exécuter une chaîne de code comme si elle se trouvait dans le terminal. Si le fichier n'existe pas, nous renvoyons simplement une chaîne vide.

Et avec ça, nous avons fini! Voici ce que nous terminons avec:



Conclusion

Eh bien, c'est ce que mon terminal ressemble. J'ai lancé le projet oh-my-zsh sur GitHub et ajouté ce thème afin que vous puissiez le trouver ici. Si vous êtes intéressé à voir mes autres fichiers dot, je les ai aussi sur GitHub.

Cependant, je n'ai pas encore terminé la configuration de ma ligne de commande. Bien que je n’aie apporté aucune modification depuis un moment, je songe à inclure le nom de l’utilisateur actuel (car j’utilise ce même thème sur mon serveur), ainsi que des informations RVM. De plus, je ne sais pas pourquoi j'ai le mot git dedans là; J'imagine que j'avais à l'origine une configuration qui fonctionnait avec plusieurs systèmes de contrôle de version… Quoi qu'il en soit, le but de tout cela est que c'est quelque chose que vous allez continuellement peaufiner. Lorsque j'apporte des modifications, je suis sûr de les transmettre à GitHub afin que vous puissiez les voir..

Laissez-moi vous laisser avec plusieurs liens que vous trouverez utiles pour pirater la ligne de commande:

  • 7 Conseils simples et utiles en ligne de commande | Nettuts+
  • 10 commandes de terminal qui boosteront votre productivité | Nettuts+
  • Comment personnaliser votre invite de commande | Nettuts+
  • Accélérez votre flux de travail dans le terminal | Nettuts + Premium
  • Steve Losh: Mon invite extravagante de Zsh
  • Message de blog Peepcode: Ma ligne de commande
  • Peepcode: Rencontre avec la ligne de commande (12 $)
  • Peepcode: Ligne de commande avancée (12 $)
  • Zsh Prompt de Phil
  • Bash Prompt HOWTO
  • Page wiki Oh-my-zsh themes (Vous pouvez vous référer à ces images lorsque vous regardez les thèmes dans des thèmes dossier; vous obtiendrez quelques conseils utiles de cette façon.)
  • Bien entendu, une recherche sur le Web sur des termes tels que «bash if statement» ou «bash for loop» donnera des résultats utiles si vous ne faites qu'apprendre. Rappelez-vous, puisque zsh est à peu près entièrement compatible avec bash, tous les extraits de script bash que vous utilisez doivent fonctionner dans une invite de commande zsh..

S'amuser!