Статьи

Как настроить командную строку

В последнее время я часто получаю этот вопрос: «Как вы заставили свой терминал выглядеть так, как он?» Если вы заметили мой терминал и вам интересно, как я его настроил, это руководство для вас! Конечно, того, что вы изучите здесь, будет достаточно, чтобы вы начали создавать собственную командную строку!


Прежде чем мы начнем, я хочу кое-что прояснить. Я, конечно, энтузиаст командной строки, но я вовсе не профессионал командной строки. Я чувствую себя как дома в терминале, но я далек от того, чтобы знать все. Итак, вот в чем дело: я собираюсь показать вам, как я настроил свой терминал, но это не значит, что я буду в состоянии объяснить каждую отдельную строку кода, которую мы рассмотрим. Здесь есть некоторые вещи, которые являются такими, какие они есть, потому что это то, что работает… и я не всегда на 100% знаю, почему.

С этим отказом от ответственности, давайте посмотрим, что мы делаем.


Вот как выглядит моя командная строка:

Если вы не уверены, что смотрите, позвольте мне объяснить:

  • У бирюзы у нас есть имя компьютера; в моем случае это mothership . Затем следует двоеточие.
  • Далее у нас есть рабочий каталог, в желто-оранжевом.
  • Если мы находимся в git-репозитории, у нас есть некоторая информация об этом дальше. Главное здесь — это название ветки ( master или tilt_in_post_class на скриншоте). Кроме того, если рабочий каталог чистый, этот текст отображается зеленым цветом; в противном случае он отображается красным цветом.
  • Наконец, у нас есть индикатор батареи. Если все десять треугольников все зеленые и заполнены, все включено. Когда моя батарея разряжается, треугольники разряжаются и со временем становятся красными. Конечно, если вы не на ноутбуке, как я, это будет не так полезно для вас.

Давайте теперь соберем несколько предварительных частей, прежде чем на самом деле писать сценарии оболочки.

Во-первых, есть цветовая схема. Вы можете распознать его как Соляризованную цветовую схему Итана Шуновера Это довольно удивительно, и я использовал его на терминале и в Vim с тех пор, как обнаружил его. Если вы хотите использовать его в терминале, вам придется установить тему. Терминал в Snow Leopard не поддерживает xterm-256color, поэтому вам придется следовать некоторым специальным указаниям на странице Solarized GitHub, чтобы это работало, если вы все еще работаете в этой ОС.

Если вы перешли на Lion, вы можете просто установить файлы .terminal которые вы найдете в папке xterm-256color . После того, как вы их установили (просто дважды щелкните по ним), вы сможете выбрать тот, который вам нужен, в настройках терминала. Не забудьте установить его в качестве схемы по умолчанию.

Следующее, что нужно знать, это то, что я не использую оболочку bash по умолчанию в моем терминале. Вместо этого я переключился на zsh, который в основном совместим с bash, но имеет несколько приятных дополнений, таких как улучшенное завершение табуляции. Вот как это сделать: откройте системные настройки Mac и перейдите к «Пользователи и группы». Откройте панель, щелкнув замок внизу и введя свой пароль. Затем щелкните правой кнопкой мыши вашего пользователя в списке и выберите «Дополнительные параметры». В поле «Оболочка входа» переключитесь с /bin/bash на /bin/zsh . Это так просто.

Следующий шаг: получить правильный шрифт. Я использую Inconsolata в 15pt. Это бесплатный моноширинный шрифт, на который я люблю смотреть весь день. (Помимо использования его в терминале, я использую его в Vim и TextEdit.) Вы можете установить шрифт по умолчанию в настройках терминала, там, где вы выбираете цветовую схему.

Еще одна маленькая вещь — размер вашего окна: откройте «Настройки терминала»> «Настройки» и перейдите на вкладку «Окно»; на полпути вниз вы можете выбрать желаемое количество столбцов и строк; Я использую 130 столбцов на 30 строк.

Помните индикатор уровня заряда батареи? Ну, для этого требуется небольшой скрипт от разработчика Стива Лоша ; просто скопируйте это в файл и сохраните как файл python; поскольку ~/bin находится в моем терминальном PATH , я сохранил файл в ~/bin/batcharge.py . Как он отмечает, этот сценарий будет работать только в Mac OS X, поэтому, если вы используете zsh в другой системе, вам придется пропустить эту часть.

И последнее, но, безусловно, не в последнюю очередь, есть о-о-зш. Согласно репозиторию Github , это всего лишь «несколько функций, помощников по автозаполнению и тому подобное, которые заставляют вас кричать« О, МОЯ ЗЕЛКА! »»

Зачем использовать это? Для меня я решил попробовать в какой-то момент, и я оставил его установленным. Если вы часто пользуетесь терминалом, поэкспериментируйте с oh-my-zsh, когда у вас есть время. Вы можете быть удивлены тем, что вы найдете. Установка oh-my-zsh довольно проста: просто следуйте инструкциям по установке в README ; они довольно просты.

Теперь у нас есть все необходимые детали на месте. Мы готовы приступить к созданию нашего пользовательского терминала.


Когда вы установили oh-my-zsh, он был установлен в ~/.oh-my-zsh . Поп это открыть. Вы увидите две папки для заметок: themes и templates . Внутри templates вы найдете файл с именем zshrc.zsh-template Это шаблон для вас ~/.zshrc file. Если вы ранее настраивали свой терминал, вы будете знать, что в файле .bashrc хранятся ваши настройки при использовании оболочки bash. .zshrc — это то же самое, за исключением оболочки zsh. Итак, откройте этот файл шаблона; вам не нужно знать, что именно происходит; в конце концов, в файле много комментариев, которые могут не иметь смысла. Здесь важно использовать одну вещь. Обратите внимание на строку, которая говорит это:

1
ZSH_THEME=»robbyrussell»

Это название темы, которую использует ваш терминал. Посмотрите в папке themes : вы увидите файл robbyrussel.zsh-theme . Мы собираемся создать собственную тему, чтобы вы могли заменить эту строку именем нашего нового файла. Я неспроста назвал мой «двойным концом», потому что он попал в обе стороны терминала.

В этом файле можно выполнить любые другие настройки, которые вы хотите внести в свою среду zsh. Если вы часто пользуетесь терминалом, посмотрите плагины oh-my-zsh (в папке plugins ): там много полезного.

Не забудьте скопировать в zshrc.zsh-template в свой домашний каталог и переименовать в .zshrc прежде чем вносить изменения. Теперь в папке themes создайте файл с темой, которую вы .zshrc файле .zshrc . Убедитесь, что вы .zsh-theme расширение .zsh-theme . Мы готовы создать нашу собственную тему.


Самая важная вещь в вашем файле темы — это переменная PROMPT . Это содержимое вашей командной строки. Чтобы получить представление об этом, просто начните с этого в вашем файле темы:

1
PROMPT=’myPrompt=>’

Откройте новое окно терминала, и вы должны увидеть это:

Хорошо, давай приступим к работе. Нам нужно написать несколько функций, но мы начнем с переменной PROMPT . Это может быть незаметно при взгляде на терминал, но на самом деле в моем запросе есть три строки. Первая — пустая строка, чтобы дать мне немного места для дыхания. Второй имеет всю информацию, а третий имеет стрелку. В третьей строке вы фактически вводите команду. Итак, вот наш старт:

1
2
3
PROMPT=’
 
$reset_color→ ‘

Да, вы можете легко создавать многострочные строки в сценариях оболочки. Но что $reset_color с $reset_color ? Это переменная, которую oh-my-zsh определяет для нас; сбрасывает цвет вывода. Это требует небольшого отвлечения, чтобы обсудить, как мы окрашиваем разные слова в приглашении. Видите ли, есть код — набор символов, который переключает следующий текст в цвет. Очевидно, есть код для каждого доступного цвета. Не волнуйтесь, есть другие переменные для других цветов; вам не нужно изучать коды. К тому времени, когда мы доберемся до третьей строки, мы хотим сбросить ее до цвета текста по умолчанию; Итак, мы используем переменную $reset_color .

Если вас интересует символ стрелки, это стрелка вправо в Юникоде (U + 2192, & rarr;). Это все.

Итак, теперь наша подсказка выглядит так:

Глядя стройная. Давайте теперь добавим имя компьютера и рабочий каталог. Это все для второй строки нашей переменной PROMPT .

1
$fg[cyan]%m: $fg[yellow]$(get_pwd)

Мы начинаем с установки цвета текста на голубой; кажется, что мы получаем этот цветовой код из ассоциативного массива или хэша; хотя я не использую его, есть хеш $bg который меняет цвет фона вместо цвета переднего плана (текста).

После установки цвета у нас есть %m выводит имя компьютера. После двоеточия и пробела мы переключаем цвет текста на желтый. Далее мы используем знак доллара и парены, чтобы добавить выходные данные функции get_pwd . Это выведет наш текущий рабочий каталог, мы немного искажаем. Если я нахожусь в домашнем каталоге, я не хочу видеть /Users/andrew , я хочу видеть ~ вместо этого. Итак, вот эта функция:

1
2
3
function get_pwd() {
  echo «${PWD/$HOME/~}»
}

Оболочка функции довольно проста, если вы уже писали JavaScript; идентичный синтаксис. Я не уверен, откуда взялся этот синтаксис поиска и замены, но он очень похож на синтаксис поиска и замены Vim: если PWD содержит текст $HOME (системная переменная для вашего домашнего каталога), замените его на ~

Теперь вот что внизу:

Хорошо! Теперь самое сложное. Видите ли, я хочу выровнять информацию о мерзавце и индикаторе батареи. Поскольку нет способа на самом деле выровнять по правому краю, мы должны посчитать количество символов текста, которое мы хотим, вычесть это из ширины окна и добавить это расстояние. Это довольно забавно, и код довольно грязный, но это все, что я смог найти, что на самом деле работает.

Готов? Мы вставляем интервал с помощью функции, которую я вызываю get_spacing . Так что добавьте $(get_spacing) в конец нашей второй строки, чтобы теперь это выглядело так:

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

Теперь эта функция. Конечно, вот оболочка:

1
2
3
function put_spacing() {
 
}

Внутри четыре части. Вот первый.

1
2
3
4
5
6
local git=$(git_prompt_info)
if [ ${#git} != 0 ];
    ((git=${#git} — 10))
else
    git=0
fi

Мы начнем с получения результата от функции git_prompt_info и сохранения его в локальной переменной git . Далее, если длина этой строки не равна 0, мы сбрасываем git так, чтобы теперь длина строки была минус 10. В противном случае мы сбрасываем git на 0. Это, кажется, не имеет большого смысла, пока вы не поймете, что мы Пытаешься сделать здесь. Мы хотим выяснить, сколько символов «слотов» занимает информация git. Сложность в том, что мы повторно используем переменную git : сначала она содержит строку, затем она содержит число, представляющее количество символов, которые у нашей информации git длинные. Если длина git равна нулю, мы устанавливаем git в 0; если это не так (то есть мы находимся в репозитории git), мы устанавливаем в git количество символов в строке минус 10. Это происходит потому, что в число символов строки входят цветовые коды, которые на самом деле не видны, поэтому они не занимают ширину. Двойные парены? О, они используются для математики.

Мы делаем то же самое для батареи:

1
2
3
4
5
6
local bat=$(battery_charge)
if [ ${#bat} != 0 ];
    ((bat = ${#bat} — 18))
else
    bat=0
fi

В третьей части мы выясним, сколько места нам понадобится:

1
2
local termwidth
(( termwidth = ${COLUMNS} — 3 — ${#HOST} — ${#$(get_pwd)} — ${bat} — ${git} ))

Немного больше математики: мы начинаем с COLUMNS , который представляет собой количество символов, которые Терминал широкий. Мы вычитаем все подходящие значения (3 — для двух пробелов и двоеточия), и мы получаем тот факт, что нам нужно количество пробелов в промежутках между левой и правой частями приглашения.

Теперь давайте создадим строку, которая будет termwidth количество пробелов длиной:

1
2
3
4
5
local spacing=»»
for i in {1..$termwidth};
    spacing=»${spacing} «
done
echo $spacing

Простой цикл for-in позволяет нам создать строку; тогда мы вернем его.

Вы не можете сказать, что пробел был добавлен, поэтому я добавил несколько фиктивных текстов, чтобы вы могли видеть, что они были добавлены.

Далее информация о Git. Мы добавляем $(git_prompt_info) в конец строки подсказки 2; как вы знаете, это вызов функции.

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

Обратите внимание, что мы не меняем цвет перед загрузкой информации Git: об этом позаботится функция, потому что это зависит от состояния хранилища.

А вот и функция:

1
2
3
4
function git_prompt_info() {
  ref=$(git symbolic-ref HEAD 2> /dev/null) ||
  echo «$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_PREFIX$(current_branch)$ZSH_THEME_GIT_PROMPT_SUFFIX»
}

Первая строка просто проверяет, есть ли мы в Git-репозитории. Если мы не return . Если это так, следующая строка отображает правильную информацию. Обратите внимание на две вещи: во-первых, мы используем две переменные: $ZSH_THEME_GIT_PROMPT_PREFIX и $ZSH_THEME_GIT_PROMPT_SUFFIX . Я покажу вам, как они определены в секунду. Другая вещь — это две другие функции, которые вызываются. Они предоставляются oh-my-zsh. Функция current_branch просто возвращает текущую ветку. parse_git_dirty более интересен. Если текущая ветка грязная (имеет незафиксированные изменения), функция выведет $ZSH_THEME_GIT_PROMPT_DIRTY ; в противном случае он выдаст $ZSH_THEME_GIT_PROMPT_CLEAN .

У меня есть эти четыре переменные, определенные так:

1
2
3
4
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[green]»

На основании этих переменных репозиторий на чистой ветке master выдаст [git:master] зеленым цветом; грязная ветка master выдаст +[git:master] .

И, наконец, мы вызываем функцию battery_charge :

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

Вот функция battery_charge :

1
2
3
4
5
6
7
8
function battery_charge() {
    if [ -e ~/bin/batcharge.py ]
    then
        echo `python ~/bin/batcharge.py`
    else
        echo »;
    fi
}

Если файл существует, мы запускаем этот файл и выводим вывод. Обратите внимание, что мы используем обратные метки при запуске файла (это не одинарные кавычки): это позволяет нам выполнять строку кода, как если бы она была в терминале. Если файл не существует, мы просто выводим пустую строку.

И с этим мы закончили! Вот чем мы заканчиваем:


Ну, вот так выглядит мой терминал. Я раздвоил проект oh-my-zsh на GitHub и добавил эту тему, чтобы вы могли найти его там . Если вам интересно посмотреть мои другие точечные файлы, у меня они тоже есть на GitHub .

Тем не менее, я еще не закончил настройку командной строки. Пока я не вносил никаких изменений, я думаю включить имя текущего пользователя (потому что я использую эту же тему на моем сервере), а также некоторую информацию о RVM. Кроме того, я не уверен, почему у меня есть слово git там; Я предполагаю, что у меня изначально была установка, которая работала с несколькими системами контроля версий … В любом случае, смысл всего этого в том, что это то, что вы будете постоянно дорабатывать. Когда я внесу изменения, я обязательно отправлю их на GitHub, чтобы вы могли их там увидеть.

Позвольте мне оставить вам несколько ссылок, которые вы найдете полезными при взломе командной строки:

Веселиться!