> For the complete documentation index, see [llms.txt](https://evgenii-afanasev.gitbook.io/ruby-course/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://evgenii-afanasev.gitbook.io/ruby-course/1_prepare/3_install_ide.md).

# Установка и настройка редактора кода

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

Для Ruby существуют 2 наиболее популярных редактора кода: [RubyMine](https://www.jetbrains.com/ruby/) и [Visual Studio Code](https://code.visualstudio.com/)

Так как RubyMine платный, а на данный момент из РФ возможность оплаты отсутствует, то в данном руководстве я покажу как установить Visual Studio Code.

## Установка

Для начала скачайте себе сам Visual Studio Code:

### MacOS

Для начала зайдите на официальный сайт загрузки редактора кода и выберете установку для Mac. После чего на ваш компьютер скачается `.zip` архив. Вам необходимо его разархивировать его просто дважды нажав на скаченный архив. После этого дважды нажмите на разархивированный ярлык Visual Studio Code. Система сама установит приложение и откроет редактор кода.

После чего откройте каталог проекта курса в редакторе с помощью `file -> open folder`.

### Linux

Для начала зайдите на официальный сайт и выберете для Linux подходящий вариант установки: если у вас Ubuntu или Mint или другой Debian подобный дистрибутив, то на странице загрузки выберете `.deb` установку. Если у вас как и у меня Oracle Linux, то необходимо выбрать `.rpm` установку. Далее просто выполните в консоли команды из руководства и в вашем меню приложений появится Visual Studio Code.

После чего запустите редактор кода и откройте каталог проекта курса в редакторе с помощью `file -> open folder`.

### Windows

Для начала скачайте себе установочный файл для Windows на официальном сайте загрузки редактора кода и установите. Никаких проблем возникнуть не должно по ходу установки. В процессе установки будут предложены дополнительные опции, например добавить редактор в контекстное меню, везде ставим галки. После чего запустите его и откройте каталог проекта курса с помощью `file -> open folder`.

Visual Studio Code имеет 2 режима работы: из под Windows и из под Linux. Первый режим работы нам не так сильно интересен, поэтому зажимаем клавиши `CTRL + Shift + P` и находим в появившейся строке команду `WSL: Reopen Folder in WSL` и выбираем ваш Linux дистрибутив. В дальнейшем ваш проект должен будет автоматически открываться в режиме WSL при повторном открытии редактора кода.

## Настройка

Прежде чем приступать к настройкам редактора, необходимо установить гемы. Что такое гем подробнее мы разберем чуть позже, но пока что имейте в виду, что гем - это программа, написанная на Ruby и программы из данного списка позволяют облегчить нам жить.

```bash
gem install solargraph # программа, которая будет отвечать за подсказки
gem install rubocop # программа, которая будет отвечать за форматирование и подсказки по улучшению внешнего вида кода
gem install rubocop-rails # программа, содержащая настройки линтинга и форматирования для Rails приложений
```

Теперь когда мы установили Visual Studio Code, то можно поставить необходимый плагины для разработки на Ruby. Откройте Visual Studio Code, перейдите во вкладку с расширениеями (`extensions`) и установите следующие расширения:

* `VSCode Ruby` от издателя Stafford Brunk. Данное расширение улучшает подсветку ключевых слов для Ruby в VSCode.
* `Ruby Solargraph` от издателя Castwide. Данное расширение добавляет нам следующие опции:
  * Autocomplete - при написании кода редактор будет предлагать нам дописать код за нас, показывая возможные сценарии использования. Также в меню подсказок мы сможешь увидеть описание тех или иных сценариев, что облегчит вам понимание ответа на вопрос: "А что это функция делает ?".
  * Linting - В Ruby сообществе за долгое время сформированы те или иные практики по написанию "чистого" кода. Вы сможетее увидеть описание почему так не стоит писать, а для более развернутого ответа можете скопировать название правила из подсказки и загуглить его.
  * Formatting - форматирование кода. При написании чистого кода не принято делать отступы какие вам вздумается. Форматирование будет приводить отступы к единому формату, удалять лишние строки и тд. , в общем, делать ваш код более красивым в написании.
  * Definition - Позволяет использовать навигацию по файлу (`Ctrl` + `Shift` + `O`)

Теперь необходимо настроить наш плагин `Ruby Solargraph`, перейдя в `File → Preferences → Settings`. Там находим в боковом меню `Extensions → Solargraph settings for Ruby` и выставляем следующие параметры:

* `completion - true` - Включаем Autocomplete.
* `definition - true` - Включаем Definition.
* `diagnostics - true` - Включаем Linting.
* `formatting - true` - Включаем Formatting.
* `autoformat - true` - Включаем автоматический Formatting.

На последок давай создадим в папке твоего курса (без перехода в папку с главой/модуля) файл `.rubocop.yml`. Это будут правила для форматирования и линтинга, которые упростят написание кода. Добавьте в файл следующее содержимое:

```yaml
# Наследуем конфигурацию для Rails приложения
require: rubocop-rails

# Включаем конфигурацию для Rails приложения
Rails:
  Enabled: true

Layout/EndOfLine:
  Enabled: False

# Задаем максимальную длину строки, после которой код считается грязным
Layout/LineLength:
  Max: 120

# Задаем максимальный размер метода в строках, после которого код будет считаться грязным
Metrics/MethodLength: 
  Max: 20

# Задаем максимальный размер класса в строках, после которого код будет считаться грязным
Metrics/ClassLength:
  Max: 1500

# При добавлении дефолтного значения не должно быть пробелов с обоих сторон знака =
Layout/SpaceAroundEqualsInParameterDefault:
  EnforcedStyle: no_space

# При создании строки выбираем предпочтение к одинарным ковычкам ('')
# Кроме случаев, когда необходима интерполяция строки 
Style/StringLiterals:
  EnforcedStyle: single_quotes

# Начиная с Ruby 2.0 мы можем объявлять массив символов с новым синтаксисом
# Вместо [:foo, :bar, :baz], можно писать %i[foo bar baz]
# Включаем приоритет для нового синтаксиса 
Style/SymbolArray:
  Enabled: true

# форматирование хэша в виде таблицы
Layout/HashAlignment:
  EnforcedHashRocketStyle: table
  EnforcedColonStyle: table

# Не дает нам возможности смешивать стрелочный синтаксис хэша и через двоеточие
Style/HashSyntax:
  EnforcedStyle: ruby19_no_mixed_keys

# Убираем ругань на методы has_key? и has_value?
Style/PreferredHashMethods:
  Enabled: false

# Делаем строковое форматирование только с помощью знака %
Style/FormatString:
  EnforcedStyle: percent

Style/CollectionMethods:
  Enabled: true
  PreferredMethods:
    # В сообществе принято использовать inject вместо reduce
    reduce: "inject"


# Разрешаем писать условия без скобок
Style/ParenthesesAroundCondition:
  AllowSafeAssignment: false
  
# Разрешаем писать приравнивание условия к значению без скобок
Lint/AssignmentInCondition:
  AllowSafeAssignment: false

# Отключаем проверку передачи обязательного сообщения в ошибку
Style/RaiseArgs:
  Enabled: false

# Данное правило мешает писать вызовы методов в формате цепочки, отключаем
Layout/MultilineOperationIndentation:
  Enabled: false

# fail - alias для raise. Лучше избегать использование псеводнимов для чистоты кода
Style/SignalException:
  EnforcedStyle: only_raise

# Убираем обязательную обработку ошибок
Lint/SuppressedException:
  Enabled: false

Layout/SpaceInsideBlockBraces:
  # Убираем пробелы по бокам при объявлении однострочого блока
  SpaceBeforeBlockParameters: false

# Убираем лишние пробелы при объявлении хэш таблицы
Layout/SpaceInsideHashLiteralBraces:
  EnforcedStyle: no_space

# Разрешаем писать блок в формате { ... } для нескольких строк
Style/BlockDelimiters:
  Enabled: false

# Зарещаем вызывать методы у многострочного блока без присваивания переменной
Style/MethodCalledOnDoEndBlock:
  Enabled: true

# Отключаем принудительное изменение имен переменных в однобуквенные
Style/SingleLineBlockParams:
  Enabled: false

# Отключаем необходимость придумывать новые имена переменных, 
# если снаружи уже объявлена переменная с таким же названием
# чтобы не изобретать дурацкие названия "лишь бы работало"
Lint/ShadowingOuterLocalVariable:
  Enabled: false

# Отключаем обязательное документирование всех классов
Style/Documentation:
  Enabled: false 

# Отключаем проверку на обяхательное нзавание аргумента other, 
# если метод называется в виде арифметического оператора
Naming/BinaryOperatorParameterName:
  Enabled: false 

# Отключаем конфиг по дебагу из-за бесполезности
Lint/Debugger:
  Enabled: false

# Отключаем проверки на скобки при объявлении метода
Style/MethodDefParentheses:
  Enabled: false

# Отключаем необходимость каждый раз добавлять коммент про frozen строки
Style/FrozenStringLiteralComment:
  Enabled: false
```

Готово. Настройка окружения завершена. Многие пункты могут показаться непонятными, но со временем понимания будет больше. Сейчас главное, чтобы все установилось и работало.

#### Дополнительный материал:

* [Rubocop](https://rubocop.org/)
* [Настройки Ruby плагина](https://github.com/rubyide/vscode-ruby/blob/main/docs/legacy.md)
* [Language Server Protocol](https://habr.com/ru/company/piter/blog/667882/)
