<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Максим Кузнецов: заметки с тегом инструкция</title>
<link>https://maxkuznetsov.ru/tags/instrukciya/</link>
<description>Простыми словами о веб-разработке</description>
<author>Максим Кузнецов</author>
<language>ru</language>
<generator>E2 (v3559; Aegea)</generator>

<itunes:owner>
<itunes:name>Максим Кузнецов</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Простыми словами о веб-разработке</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>[Инструкция] Как работать с Git</title>
<guid isPermaLink="false">49</guid>
<link>https://maxkuznetsov.ru/all/instrukciya-kak-rabotat-s-git/</link>
<pubDate>Tue, 15 Jul 2025 11:15:15 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/instrukciya-kak-rabotat-s-git/</comments>
<description>
&lt;p&gt;(Это инструкция, которую приходится копировать из проекта в проект, поэтому размещаю и в блоге.)&lt;/p&gt;
&lt;h2&gt;Gitflow&lt;/h2&gt;
&lt;p&gt;Идейно система работы с ветками берётся из Gitflow, но с упрощениями.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://maxkuznetsov.ru/pictures/gitflow.png" width="1043" height="371" alt="" /&gt;
&lt;/div&gt;
&lt;h2&gt;Общее&lt;/h2&gt;
&lt;p&gt;В нашем проекте ветка &lt;b&gt;develop&lt;/b&gt; — ветка, которая содержит стабильный результат, который можно зарелизить на прод.&lt;/p&gt;
&lt;p&gt;Следуя этому принципу, в рамках работы по спринту в ветку develop вливаются фичи/задачи:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;стабильного качества (по мнению разработчика (всегда) и менеджера (аппрув менеджера требуется, если этого требует конкретная задача);&lt;/li&gt;
&lt;li&gt;из спринта, который в работе (то есть те задачи, которые должны быть в ближайшем релизе).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Если ведется работа по фиче, которая не войдет в ближайший релиз, она не вливается в develop.  Тестирование такой задачи можно проводить, подключая ветку фичи на свободную дев площадку (не вливая ее в develop ветку).&lt;/p&gt;
&lt;h2&gt;Правила именования&lt;/h2&gt;
&lt;p&gt;Каждый коммит и пулл-реквест должны именоваться в следующем формате:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Sentry] EDS-1004: &lt;пояснение&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В квадратных скобках можно указать часть системы, которая затрагивается — это упростит поиск коммита, если что-то сломается. Списка частей системы нет, выбирайте на свой вкус. Из общих советов — это должно быть что-то широкое, чтобы был понятен контекст, но не слишком широкое, чтобы не терялся смысл.&lt;/p&gt;
&lt;p&gt;EDS-1004 — даёт понимание по какой задаче была изменена строка в кода (через git blame), а потом по задаче можно найти ПОЧЕМУ это было сделано.&lt;br /&gt;
Плюс почти все таск-трекеры позволяют сконнектиться с Gitlab/Github/etc, и тогда коммиты и ПРы будут показываться в таск-трекре. А в Gitlab/Github все упоминания задач будут отображаться ссылками на таск-трекер автоматически.&lt;/p&gt;
&lt;h2&gt;Работа с ветками&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Из ветки main (или аналогичных prod/master) создается ветка develop.&lt;/li&gt;
&lt;li&gt;На каждую фичу создаётся новая ветка вида feature/XXX-short-description от ветки develop. XXX — номер задачи из таск-трекера, &lt;short-description&gt; — краткое описание задачи на английском языке. Например: `feature/TASK-1777-change-forms-for-clients`.&lt;/li&gt;
&lt;li&gt;Когда фича готова (это значит, что разработчик считает, что фича выполнена корректно и протестирована локально) ветка фичи отправляется через Пулл-реквест в ветку develop. При создании Пулл-реквеста обязательно нужно выбрать галку «удалить ветку после мерджа», чтобы не разводить кладбище веток в git.&lt;/li&gt;
&lt;li&gt;Разработчик не забывает регулярно подтягивать ветку develop в свою ветку фичи в процессе разработки, чтобы уменьшить количество конфликтов при последующем MR в develop.&lt;/li&gt;
&lt;li&gt;Для релиза ветку develop мерджим в ветку main через MR в Gitlab/Githab/etc.&lt;/li&gt;
&lt;li&gt;Если в ветке prod обнаруживается критичный баг, то от main создается ветка hotfix/XXX-short-description.&lt;/li&gt;
&lt;li&gt;Как только исправление на ветке hotfix завершено, она мержится с ветками main, а затем с develop.&lt;/li&gt;
&lt;li&gt;После каждого мерджа тестируем в первую очередь новый функционал, потом все остальное.&lt;/li&gt;
&lt;li&gt;Если разработчик не успевает сделать свою задачу до релиза, то ветка фичи не мерджится в ветку develop.&lt;/li&gt;
&lt;li&gt;Если фича большая и не попадает в ближайший релиз, то разработку продолжаем в той же ветке под фичу, пока ее полностью не сделаем. Не забываем делать git pull, чтобы подтягивать все изменения c ветки develop. Это позволит подтягивать все изменения текущего спринта и разрешать конфликты как можно быстрее. Свою задачу можно протестировать на стейдже, залив её туда без мерджа.&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>[Инструкция] Как деплоить проект через Deployer</title>
<guid isPermaLink="false">48</guid>
<link>https://maxkuznetsov.ru/all/kak-deploit-proekt-cherez-deployer/</link>
<pubDate>Tue, 15 Jul 2025 10:54:36 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/kak-deploit-proekt-cherez-deployer/</comments>
<description>
&lt;p&gt;(Инструкция, которую приходится копировать из проекта в проект, поэтому пусть будет и в блоге.)&lt;/p&gt;
&lt;p&gt;Предполагается, что Deployer доступен уже в проекте, либо как файл `./dep`, либо как установленный composer пакет через `./vendor/bin/dep`. Он добавляется и хранится в гит-репозитории.&lt;/p&gt;
&lt;p&gt;Также важно настроить конфиги, указав хост в `./deploy.php`. Они также хранятся в репозитории.&lt;/p&gt;
&lt;h2&gt;Обычные / регулярные деплои&lt;/h2&gt;
&lt;p&gt;`./dep deploy &lt;host&gt;`, где в качестве &lt;host&gt; можно выбрать любой хост из deploy.php файла. В этом файле у хоста указана нужная ветка. Однако, делать это обычно не нужно, так как на проекте настрое Gitlab CI (см файл `.gitlab-ci.yaml`), который зарелизит код по коммиту.&lt;/p&gt;
&lt;h2&gt;Как сменить деплой-ветку для хоста&lt;/h2&gt;
&lt;p&gt;Предположим, вы хотите сменить на `dev` ветку с `develop` на `feature/TASK-82-history-mypractice`.&lt;/p&gt;
&lt;h3&gt;Простой и быстрый вариант для быстрых тестов&lt;/h3&gt;
&lt;p&gt;Вы можете это сделать, поменяв `→set(’branch’, ’feature/TASK-82-history-mypractice’)` в deploy.php для хоста `dev`, а потом запустить `./dep deploy dev`.&lt;/p&gt;
&lt;p&gt;Этот способ хорош, если хочется быстро показать ветку, и мы не ожидаем, что будет много фиксов, так как Gitlab CI всё ещё останется настроен на `develop` ветку. И поэтому:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;при коммите в `develop` ветку, Gitlab CI запустит `./dep deploy dev` и задеплоит `feature/TASK-82-history-mypractice` на `dev`. Но это неправильно, так как мы не хотим деплоить эту ветку на дев по коммиту в `develop`, мы хотим деплоить по коммиту в ветку `feature/TASK-82-history-mypractice`&lt;/li&gt;
&lt;li&gt;при коммите в `feature/TASK-82-history-mypractice` ветку CI ничего не сделает, так как в версии конфига `.gitlab-ci.yaml` из этой ветки нет никакого правила для ветки `feature/TASK-82-history-mypractice`.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Правильный вариант с обновлением Gitlab CI правил&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Переключиться в `develop` ветку, изменить branch в deploy.php для нужного хоста и в `.gitlab-ci.yaml` изменить параметр `only:` для этого же хоста.&lt;/li&gt;
&lt;li&gt;Закоммитить. CI теперь не запустит деплой на `dev`, так как мы поменяли ветку на `feature/TASK-82-history-mypractice`.&lt;/li&gt;
&lt;li&gt;Переключиться в ветку `feature/TASK-82-history-mypractice` в git и вмерджить в неё свежий `develop`. Вместе с develop придут изменения для `deploy.php` и `.gitlab-ci.yaml`. Поэтому если сразу закоммитить вмёрдженное, то Gitlab CI запустит деплой feature-ветки на `dev`.&lt;/li&gt;
&lt;li&gt;Важно! Перед мерджем ветки в `develop` нужно изменить `deploy.php` и `.gitlab-ci.yaml` и заменить feature-ветку в них обратно на `develop`. Потом смерджить и Gitlab CI, увидев этот коммит в develop, сразу продеплоит `develop` на `dev`.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Как переключить хост с feature1-ветки на другую feature-2 ветку:&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Переключиться в develop ветку и изменить в ней `deploy.php` и `.gitlab-ci.yaml`, указав feature2 вместо feature1 для нужного хоста.&lt;/li&gt;
&lt;li&gt;Вмерджить develop ветку сначала в feature1 ветку, потом в feature2 ветку.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Удобные команды&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;`./dep ssh &lt;host&gt;` — команда подключится к хосту по конфигу из deploy.php и сделает перейдёт в папку current релиза.&lt;/li&gt;
&lt;li&gt;`./dep run «&lt;command&gt;»` — запускает команду на удалённых серверах. После запуска она спросит на каких серверах запустить.&lt;/li&gt;
&lt;li&gt;`./dep &lt;task&gt; &lt;host&gt;` — запускает любую определённую в deploy.php `task(’&lt;name&gt;’, &lt;callback&gt;)` на нужно сервере.&lt;/li&gt;
&lt;li&gt;Можно указать «теги» для серверов и запускать всё выше написанное сразу пачками.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Первый деплой / создание окружения&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;`./dep deploy develop2` — первый раз закончится с ошибкой, но Deployer создаст структуру файлов по пути из deploy.php для develop2. Он создаст папки
&lt;ol start="1"&gt;
  &lt;li&gt;`/var/www/dev.project.name/releases` — тут будут располагаться папки с каждым новым релизом и копиться последние N штук.&lt;/li&gt;
  &lt;li&gt;`/var/www/dev.project.name/shared` — тут хранятся файлы, которые должны быть сохранены и перенесены между релизами. Например, логи, web/assets, storage, etc. Эти папки задаются в deploy.php как shared_folder и shared_files. Во время деплоя эти папки будут заменены на симлинки из shared папки.&lt;/li&gt;
  &lt;li&gt;`/var/www/dev.project.name/current` — симлинк на последний успешный релиз из папки releases.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;После создания структуры нужно перенести/создать файлы в shared:
&lt;ol start="1"&gt;
  &lt;li&gt;`./shared/.env`&lt;/li&gt;
  &lt;li&gt;`./shared/web/XXXXXXX` — можно посмотреть, какие папки создадутся на сервере, либо какие папки указаны в shared_folder в deploy.php (с учётом тех, что указаны во фреймворк-специфичном recipe, подключённом в deploy.php).&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Повторить деплой `./dep deploy develop2`&lt;/li&gt;
&lt;li&gt;Также нужно залить данные в БД / импортнуть из sql дампа по параметрам из `.env`.&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>Как добавить новый сервис в systemd/systemctl и запускать его при старте  Ubuntu</title>
<guid isPermaLink="false">44</guid>
<link>https://maxkuznetsov.ru/all/ubuntu-systemd-systemctl-on-startup/</link>
<pubDate>Wed, 10 May 2023 17:35:55 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/ubuntu-systemd-systemctl-on-startup/</comments>
<description>
&lt;h3&gt;Задача&lt;/h3&gt;
&lt;p&gt;Есть docker-compose файл, поднимающий Zabbix. Есть небольшая обёртка в виде Makefile, которая позволяет запускать и останавливать docker-compose. Нужно добавить запуск этой команды при старте/рестарте системы.&lt;/p&gt;
&lt;h3&gt;Дано&lt;/h3&gt;
&lt;p&gt;Всё лежит в `/var/www/zabbix-server/`.&lt;br /&gt;
Содержание файла Makefile:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;...
docker-up:
        docker-compose up -d

docker-down:
        docker-compose stop&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Решение&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Создать новый файл `vim /etc/systemd/system/zabbix.service`.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[Unit]
Description=Run Zabbix Docker Containers on Startup

[Service]
RemainAfterExit=True
Restart=always
RestartSec=1
WorkingDirectory=/var/www/zabbix-server
ExecStart=/usr/bin/make docker-up
ExecStop=/usr/bin/make docker-down

[Install]
WantedBy=default.target&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;chmod 644 /etc/systemd/system/zabbix.service&lt;/li&gt;
&lt;li&gt;systemctl enable zabbix.service&lt;/li&gt;
&lt;li&gt;systemctl start zabbix.service&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>Как прокачать Vim за 1 минуту</title>
<guid isPermaLink="false">35</guid>
<link>https://maxkuznetsov.ru/all/vim-1minute-boost/</link>
<pubDate>Thu, 28 May 2020 19:02:48 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/vim-1minute-boost/</comments>
<description>
&lt;p&gt;Можно долго спорить о лучших IDE и редакторах для разработки кода, но если вы работаете в консоли или подключаетесь к серверу по SSH, то удобнее vim ничего нет. Он установлен по умолчанию на большинстве хостингов, так что имеет смысл его изучить и полюбить.&lt;/p&gt;
&lt;p&gt;Настройка vim происходит в файле ~/.vimrc. Его может не быть, это нормально, тогда нужно создать.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Открываем ~/.vimrc&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$ vim ~/.vimrc&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;Добавляем в файл следующее содержимое и сохраняем (команда «:wq»):&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;set ttyfast
set showmode
set showcmd
set title
set hidden
set ffs=unix,dos,mac

&amp;quot; Показывать нумерацию строк
set number

&amp;quot; Чтобы не было проблем с swp-файлами, которые создаются во время редактирования
set nobackup
set nowritebackup
set nowb
set noswapfile

&amp;quot; Глубина истории
set undolevels=1000

syntax on
&amp;quot; Цветовая схема
set t_Co=256

&amp;quot; monokai не идёт по умолчанию, но мы его установим чуть позже
colorscheme monokai

&amp;quot; Рисовать вертикальную линию для отображения границы в 120 символов — строки длинее хуже читаются
set colorcolumn=120
highlight ColorColumn ctermbg=238 guibg=#232728

&amp;quot; Настройка табов
set expandtab
set tabstop=4
set shiftwidth=4

&amp;quot; Отображать скрытые символы, табы и висящие пробелы
set list
set listchars=tab:→\ ,trail:·,nbsp:·&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Я использую тёмную тему monokai. Её нет среди тем по умолчанию, но установить её несложно:&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="remark"&gt;&lt;b style="font-family: monospace;"&gt;ls —l /usr/share/vim/vim*/colors&lt;/b&gt; покажет все предустановленные в системе темы&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$ mkdir -p ~/.vim/colors
$ curl -o ~/.vim/colors/monokai.vim https://raw.githubusercontent.com/sickill/vim-monokai/master/colors/monokai.vim&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Имя этого файла с темой нужно указать в ~/.vimrc в строке&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;colorscheme &amp;lt;monokai&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
</item>

<item>
<title>Как улучшить терминал в Mac OS X: iTerm2, omyzsh, zsh</title>
<guid isPermaLink="false">13</guid>
<link>https://maxkuznetsov.ru/all/console-iterm2-omyzsh/</link>
<pubDate>Mon, 23 Mar 2020 03:23:25 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/console-iterm2-omyzsh/</comments>
<description>
&lt;p&gt;Отличная статья про апгрейд встроенного Terminal&lt;br /&gt;
&lt;a href="https://medium.com/@Clovis_app/configuration-of-a-beautiful-efficient-terminal-and-prompt-on-osx-in-7-minutes-827c29391961"&gt;https://medium.com/@Clovis_app/configuration-of-a-beautiful-efficient-terminal-and-prompt-on-osx-in-7-minutes-827c29391961&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Краткий план действий&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Ставим iTerm2 на замену Terminal. Они нормально сосуществуют и можно будет откатиться, если не понравится.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;brew cask install iterm2&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;Ставим &lt;a href="https://raw.githubusercontent.com/Clovis-team/clovis-open-code-extracts/master/utils/Clovis-iTerm2-Color-Scheme.itermcolors"&gt;цветовую cхему&lt;/a&gt; для iTerm2 (сохраняйте именно как .itermcolors) — это набор цветов и ничего больше. На данном этапе терминал всё ещё будет выглядеть уныло.&lt;/li&gt;
&lt;li&gt;Качаем шрифт с поддержкой дополнительных символов-иконок: &lt;a href="https://github.com/powerline/fonts/blob/master/Meslo%20Slashed/Meslo%20LG%20M%20Regular%20for%20Powerline.ttf"&gt;обычный&lt;/a&gt; или &lt;a href="https://github.com/powerline/fonts/blob/master/Meslo%20Slashed/Meslo%20LG%20M%20Bold%20for%20Powerline.ttf"&gt;жирный&lt;/a&gt; (он контрастнее) — и устанавливаем в систему. Иначе увидим не иконки, а пустые квадратики.&lt;br /&gt;
Меняем размер шрифта на 12-14pt или какой удобнее.&lt;/li&gt;
&lt;li&gt;Через консоль iTerm’a устанавливаем Zsh (вместо стандартного Bash) и Oh my Zsh — само ядро командной строки и оболочку с форматированием вокруг неё.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;# Возможно, zsh у вас уже есть по умолчанию. Чтобы проверить, нужно ввести : 
which zsh
# Если вернёт путь, значит есть. Если нет, то ставим:
brew install zsh zsh-completions
# Устанавливаем Oh my Zsh
sh -c &amp;quot;$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="5"&gt;
&lt;li&gt;Важно: теперь основной конфигурационный файл консоли — ~/.zshrc, а не ~/.bashrc или ~/.bash_profile.&lt;/li&gt;
&lt;li&gt;Скачиваем в дефолтную директорию тему — самую маковку, которая добавит красоты в терминал&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
# Редактируем ~/.zshrc и меняем конфиг
ZSH_THEME=&amp;quot;powerlevel9k/powerlevel9k&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="7"&gt;
&lt;li&gt;Перезагружаем iTerm и вуаля.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Улучшение вида и поведения терминала&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Вид самой строки&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir rbenv vcs)
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs history time)
POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='red' # Будет менять цвет, если есть обновления в гит-репозитории&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;Я не стал делать перенос строки (POWERLEVEL9K_PROMPT_ON_NEWLINE=true), так как у меня терминал всегда на всю ширину экрана и места хватает.&lt;/li&gt;
&lt;li&gt;Обязательно: iTerm → Preferences → Profiles → Keys → Load Preset… → Natural Text Editing, чтобы работала навигация через Option + стрелки и прочее.&lt;/li&gt;
&lt;li&gt;Можно добавить автодополнение команд на основе истории&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
vim ~/.zshrc
# Внутри файла добавляем через пробел название плагина
plugins=(… zsh-autosuggestions)&lt;/code&gt;&lt;/pre&gt;&lt;ol start="5"&gt;
&lt;li&gt;Включаем автозагрузку ssh-ключей при старте терминала:&lt;br /&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/ssh-agent"&gt;https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/ssh-agent&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;vim ~/.zshrc
# Внутри файла добавляем через пробел название плагина
plugins=(… ssh-agent)
# Сразу ниже включаем ssh-agent и указываем ключи через пробел — у меня их два
zstyle :omz:plugins:ssh-agent agent-forwarding on
zstyle :omz:plugins:ssh-agent identities id_rsa id_rsa2
# Эта строка у вас уже будет, главное команды выше поместить до этой строки с source
source $ZSH/oh-my-zsh.sh&lt;/code&gt;&lt;/pre&gt;&lt;ol start="6"&gt;
&lt;li&gt;Перезагружаем iTerm. Уже всё готово!&lt;/li&gt;
&lt;li&gt;Опционально: после всех правок IDE, которые содержат встроенный терминал, могут выглядеть слегка кривовато. Нужно им помочь с определением шрифта. Например, в VS Code в настройках меняем параметры:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;quot;terminal.integrated.fontFamily&amp;quot;: &amp;quot;Meslo LG M for Powerline&amp;quot;
&amp;quot;terminal.integrated.fontSize&amp;quot;: 12&lt;/code&gt;&lt;/pre&gt;</description>
</item>


</channel>
</rss>