После того, как последние несколько дней я рвал на себе волосы, пытаясь настроить Neovim для работы с Unity, это показалось руководством, которое может быть полезным для других. Среди устаревших плагинов, неупомянутых зависимостей, пропущенных шагов и многого другого я столкнулся с целым рядом проблем, связанных с чтением множества потоков StackOverflow, обсуждений Reddit и проблем GitHub, чтобы все работало гладко, поэтому, если возможно, я хотел бы помочь другим. избежать той же боли, через которую я прошел здесь.

Прежде чем мы начнем, хочу предупредить, что, как и во всем, что связано с Vim, вероятно, есть 5 различных способов что-то сделать, и шаги, которые я выбрал для описания ниже, не обязательно являются «лучшим способом» заставить редактор работать с Unity, а скорее метод, на который я решился после многих часов устранения неполадок. Кроме того, если вы столкнетесь с этим руководством через несколько месяцев или лет после его первоначальной публикации на Medium, я бы посоветовал просмотреть и проверить, все ли плагины, которые я описываю ниже, все еще работают, поскольку я наткнулся на ряд нефункциональных в настоящее время расширений Vim. в процессе установки и пришлось искать альтернативные решения. И, наконец, я рекомендую иметь где-нибудь под рукой файл Unity C#, чтобы вы могли убедиться, что все работает правильно во время установки. Итак, без лишних слов, начнем.

Для начала вам, вероятно, понадобится функция, подобная Intellisense, для кода C#, поэтому вам нужно скачать OmniSharp-vim. Это подключаемый модуль Vim, который использует сервер .NET OmniSharp-Roslyn в качестве бэкенда для обеспечения завершения кода, документации, проверки ошибок и многого другого для файлов C#. Используя Vim-plug, мы можем добавить его в наш~/.config/nvim/init.vim файл с помощью следующей строки кода.

Plug 'OmniSharp/omnisharp-vim'

Далее, поскольку Unity полагается на старую .NET Framework вместо новой dotnet,, вам нужно указать OmniSharp использовать Mono, поэтому добавьте эту строку в конфигурацию vim.

let g:OmniSharp_server_use_mono = 1

Теперь вам нужно установить либо curl, либо wget, поэтому загрузите один из двух, используя sudo dnf install curl или sudo dnf install wget, если это необходимо, а затем вы сможете открыть сценарий C# с помощью vim и получить приглашение установить OmniSharp-Roslyn. сервер. Введите y и дождитесь установки.

Примечание. Если у вас возникли проблемы с установкой, например, установка занимает вечность, или вы пришли сюда во время устранения неполадок и не могли понять, почему запуск :OmniSharpInstall работал только для того, чтобы после перезапуска редактора вам было предложено установить снова, убедитесь, что в вашем файле init.vim есть опция mono, как я описал ранее, и убедитесь, что у вас нет let g:OmniSharp_server_use_net6 = 1 в init.vim, так как это вызовет проблемы при попытке работать над проектами Unity.

Теперь, как вы, наверное, догадались по строке, которую мы добавили ранее, вам нужно будет установить Mono. Но прежде чем вы это сделаете, есть дополнительный шаг, если вы используете Fedora Linux, поскольку на момент написания Red Hat не упаковывала msbuild с моно, как все остальные. Если у вас уже установлен Mono, вам нужно сначала удалить его с помощью sudo dnf remove mono-complete, а затем обязательно удалить все оставшиеся пакеты с помощью sudo dnf list installed | grep mono. Затем, как указал пользователь в этой проблеме GitHub, вам придется запускать следующие строки кода по одной за раз.

sudo su
rpm --import "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"

Если на этом этапе все работает, вы сможете получить предложения кода OmniSharp, набрав Ctrl + x Ctrl + o в режиме вставки.

Далее, чтобы получить предупреждение о коде и распознавание ошибок, нужно добавить Ale. Это асинхронный механизм анализа, который будет работать в фоновом режиме и предупреждать вас о проблемах, когда OmniSharp отправляет ему информацию. Чтобы добавить его в нашу конфигурацию neovim с помощью Vim-plug, введите следующую строку кода в init.vim.

Plug 'dense-analysis/ale'

Одного этого должно быть достаточно, чтобы Ale начал работать в связке с OmniSharp, но по умолчанию он, скорее всего, попытается запустить каждый линтер, доступный в вашей системе, что может вызвать другие проблемы, такие как «UnityEngine не существует». Чтобы этого не произошло, скажите Ale запускать OmniSharp только для файлов C# с этой строкой кода в файле init.vim.

let g:ale_linters = { 'cs': ['OmniSharp'] }

Большой! Предполагая, что все прошло хорошо, этого должно быть достаточно, чтобы получить предупреждения о коде, такие как Unnecessary using directive или ; expected. Однако, если вы похожи на меня и хотите использовать OmniSharp внутри другого плагина автозавершения кода, у вас есть немного больше настроек.

В этом разделе я расскажу о том, как заставить OmniSharp работать с Coc, хостом расширения NodeJS, который добавляет автозавершение кода, подобное VSCode, и другие функции для целого ряда языков программирования. Теперь, если вы планируете использовать YouCompleteMe, NCM2 или другой плагин здесь, вам, возможно, придется найти разные шаги, чтобы заставить их работать в унисон, или, возможно, вы сможете полностью пропустить эту часть. Я собираюсь поговорить о Coc, потому что я уже использую его для ряда других языков, таких как LaTeX, и заставить их работать вместе было немного сложно.

Теперь, когда вы смотрите в Интернете или в документации Coc, первым предложением, скорее всего, будет Coc-OmniSharp, что изначально звучит как идеальное решение Just Works, пока вы не поймете, что оно не поддерживается, и разработчик рекомендует переключиться на вместо этого csharp-ls. Однако, если вы, как и я, по какой-то причине уже используете Coc и не хотите снова устанавливать другой механизм lsp, хорошая новость заключается в том, что OmniSharp-vim (который мы уже установили) действительно предоставляет источники завершения для Coc, но плохая новость в том, что он не дает вам