Vim (Русский)/YouCompleteMe (Русский)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Состояние перевода: На этой странице представлен перевод статьи Vim/YouCompleteMe. Дата последней синхронизации: 27 декабря 2019. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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.

  1. Установите eclimAUR из AUR (Русский).
  2. Добавьте следующие строки в ваш ~/.vimrc:
    ~/.vimrc
    let g:EclimCompletionMethod = 'omnifunc'
  3. Запустите скрипт eclimd в отдельном терминале:
    $ /usr/lib/eclipse/plugins/org.eclim_$pkgver/bin/eclimd
  4. Создайте файл .project в той же директории, где находятся Ваши Java-файлы и добавьте в этот файл следующее содержимое:
    .project
    <projectDescription>
        <name>PROJECTNAME</name>
    </projectDescription>
    
  5. Откройте Ваш Java-файл в Vim и выполните:
    :ProjectCreate . -n java

Для компиляции проекта выполните:

:ProjectBuild

Для запуска проекта выполните:

:Java

Чтобы запустить только текущий файл, выполните:

:Java %

Список доступных команд можно найти здесь.

C#

Перед началом работы с проектом на C# убедитесь, что в системе установлен пакет mono-msbuild, так как он является обязательной зависимостью Omnisharp Roslyn — движка автодополнения для C#, используемого YouCompleteMe. Более подробная информация доступна в README репозитория Omnisharp Roslyn и в данном issue на GitHub.

Примечание: Для автодополнения C# "из коробки", достаточно создать пустой файл .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

Аналогично.

Смотрите также