Vim (Русский)/YouCompleteMe (Русский)
YouCompleteMe (сокращённо YCM) — это плагин для автодополнения в Vim (Русский). YCM поддерживает следующие языки программирования:
- C/C++/Objective-C/Objective-C++
- Python
- C#
- Go
- Rust
- Java
- JavaScript
- TypeScript
- Другие языки (Ruby, PHP и т.д.) посредством использования omnicompletion.
Установка
Установите пакет vim-youcompleteme-gitAUR из AUR (Русский). Для ручной установки Вы можете воспользоваться официальной инструкцией.
В качестве альтернативы, можно поместить файл compile_commands.json
в корневую директорию проекта.
Настройка
C/C++
YCM использует скрипт .ycm_extra_conf.py
для установки параметров проекта, необходимых для автодополнения и проверки синтаксиса. Ниже приводится краткое описание основной конфигурации. Подробности и расширенные параметры смотрите в официальной документации.
Структура файла конфигурации
Пример файла .ycm_extra_conf.py
может быть найден в [1]. Вы должны сохранить копию этого файла в папке проекта и настроить его в соответствие своим потребностям.
Наиболее важными параметрами (в минимальной конфигурации) являются опции -x
и --std
, которые соответственно указывают язык, используемый в проекте, и следуемый стандарт. -x
может быть установлен для C
и C++
, а общими значениями для --std
являются --std=c89
, --std=c99
, --std=c11
, --std=c14
и их соответствующие версии в C++. Стандартный параметр определяет предупреждения и ошибки при синтаксической проверке (например, строка, закомментированная с помощью //
будет отмечена как неразрешенная в C89, но не в следующих версиях стандарта.
Сторонний скрипт и vim-плагин для автоматического создания .ycm_extra_conf.py
доступен в данном репозитории.
Расположение файла конфигурации
YCM выполняет поиск файла .ycm_extra_conf.py
в каталоге исходного файла и в его родительских директориях. Если файл конфигурации не найден, то функции YCM не будут доступны. Глобальный файл настроек, используемый, когда локальный файл не был найден, может быть выбран путём добавления в ~/.vimrc
следующих строк:
~/.vimrc
let g:ycm_global_ycm_extra_conf = '/путь/до/файла'
Так как .ycm_extra_conf.py
является python-скриптом, то в целях безопасности каждый раз будет запрашиваться разрешение на его выполнение. Такое поведение можно отключить, добавив следующие строки в ~/.vimrc
:
~/.vimrc
let g:ycm_confirm_extra_conf = 0
Для более безопасного решения, при включённом подтверждении можно определить белый/чёрный список с помощью шаблонов, назначаемых в переменной ycm_extra_conf_globlist
. Файл попадает в чёрный список, если соответствует шаблону, начинающемуся с !
. Если файл соответствует шаблону не начинающемуся с восклицательного знака, то он попадает в белый список. Запрос на подтверждение выполнения файла конфигурации возникает если файл не соответствует ни одному из шаблонов. Правила (шаблоны) сопоставляются в порядке очереди и применяется первое совпадение. Возможно использование следующих масок в шаблонах:
- * — любые символы
- ? — любой один символ
- [последовательность] — любой символ в последовательности
- [!последовательность] — любой символ не входящий в последовательность
Пример:
~/.vimrc
let g:ycm_extra_conf_globlist = ['~/dev/*','!~/*']
Любой файл в каталоге ~/dev
попадает в белый список, любой файл в каталоге ~/
попадает в чёрный список. И, согласно очереди приоритетности шаблонов, любой файл в каталоге ~/
, кроме каталога ~/dev
, попадёт в чёрный список.
Java
У YCM есть встроенная поддержка сервера jdt.ls, который можно установить с помощью опции --java-completer
при запуске install.py
.
Java (альтернативный вариант)
Для автодополнения Java должен присутствовать файл проекта и активен headless-сервер Eclim.
- Установите eclimAUR из AUR (Русский).
-
Добавьте следующие строки в ваш
~/.vimrc
:~/.vimrc
let g:EclimCompletionMethod = 'omnifunc'
-
Запустите скрипт
eclimd
в отдельном терминале:$ /usr/lib/eclipse/plugins/org.eclim_$pkgver/bin/eclimd
-
Создайте файл
.project
в той же директории, где находятся Ваши Java-файлы и добавьте в этот файл следующее содержимое:.project
<projectDescription> <name>PROJECTNAME</name> </projectDescription>
-
Откройте Ваш Java-файл в Vim и выполните:
:ProjectCreate . -n java
Для компиляции проекта выполните:
:ProjectBuild
Для запуска проекта выполните:
:Java
Чтобы запустить только текущий файл, выполните:
:Java %
Список доступных команд можно найти здесь.
C#
Перед началом работы с проектом на C# убедитесь, что в системе установлен пакет mono-msbuild, так как он является обязательной зависимостью Omnisharp Roslyn — движка автодополнения для C#, используемого YouCompleteMe. Более подробная информация доступна в README репозитория Omnisharp Roslyn и в данном issue на GitHub.
.sln
в текущем или родительском каталоге. Далее описывается, как вручную создать полноценный рабочий проект C#.Самый простой способ создать проект — установить monodevelop-stableAUR[ссылка недействительна: package not found]. В остальной части раздела объясняется, как вручную создать проект C#, который также может быть создан из командной строки с помощью xbuild
.
Сперва создайте файл .sln
. Части кода, выделенные полужирным курсивом, замените на свои названия.
SOLUTION.sln
Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{00000000-0000-0000-0000-000000000000}") = "PROJECT", "PROJECT\PROJECT.csproj", "{11111111-1111-1111-1111-111111111111}" EndProject EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {11111111-1111-1111-1111-111111111111}.Debug|x86.ActiveCfg = Debug|x86 {11111111-1111-1111-1111-111111111111}.Debug|x86.Build.0 = Debug|x86 {11111111-1111-1111-1111-111111111111}.Release|x86.ActiveCfg = Release|x86 {11111111-1111-1111-1111-111111111111}.Release|x86.Build.0 = Release|x86 EndGlobalSection EndGlobal
Затем создайте директорию PROJECT
и там создайте файл с названием PROJECT.csproj
:
PROJECT/PROJECT.csproj
<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">x86</Platform> <ProductVersion>10.0.0</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{11111111-1111-1111-1111-111111111111}</ProjectGuid> <OutputType>Exe</OutputType> <RootNamespace>PROJECT</RootNamespace> <AssemblyName>PROJECT</AssemblyName> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> <OutputPath>bin\Debug</OutputPath> <DefineConstants>DEBUG;</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <ConsolePause>false</ConsolePause> <PlatformTarget>x86</PlatformTarget> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> <DebugType>full</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release</OutputPath> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <ConsolePause>false</ConsolePause> <PlatformTarget>x86</PlatformTarget> </PropertyGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <ItemGroup> <Compile Include="HelloWorld.cs" /> <Compile Include="CSharpFile1.cs" /> <Compile Include="CSharpFile2.cs" /> </ItemGroup> </Project>
Поместите свои C#-файлы в директорию PROJECT
и не забудьте вручную добавить их в конец файла PROJECT/PROJECT.csproj
.
Теперь YouCompleteMe должен работать для файлов C# в этом каталоге и вы можете собирать проект. Чтобы скомпилировать проект из Vim, выполните следующую команду:
:!xbuild
Решение проблем
Помните, что для создания списка завершения строк YouCompleteMe может потребоваться некоторое время.
Для диагностики доступны следующие команды:
-
:messages
— показывает предыдущие сообщения об ошибках в Vim :YcmDiags
:YcmDebugInfo
E764: Option 'omnifunc' is not set
Если это происходит, то Вы забыли поместить следующие строки в ~/.vimrc
:
~/.vimrc
let g:EclimCompletionMethod = 'omnifunc'
Нет автодополнения в Java-файлах
Убедитесь, что служба eclimd
запущена:
$ ps -ax|grep eclimd
и что у Вас есть файлы проекта.
URLError: <urlopen error [Errno 111] Connection refused>
Эта ошибка появляется, когда у Вас нет файла .sln
в текущей или родительской директориях.
RuntimeError: Error starting OmniSharp server: no solutionfile found
Аналогично.