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

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

Для 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/)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://evgenii-afanasev.gitbook.io/ruby-course/1_prepare/3_install_ide.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
