YouCompleteMe

Tango-view-fullscreen.png

Tango-view-fullscreen.png

This article or section needs expansion.

Reason: Explain how .ycm_extra_conf.py works (for C/C++) (Discuss)

YouCompleteMe is a code-completion engine for Vim. It supports the following languages:

  • C/C++
  • Python
  • Java
  • Ruby
  • C#

Installation

Install vim-youcompleteme-git package from AUR. For an alternative manual way of installing YouCompleteMe see upstream instructions.

Configuration

Java

For Java completion, a project file should be present and Eclim headless server must be running.

  1. Install eclim or eclim-git from AUR.
  2. Put this in your .vimrc:
    ~/.vimrc
    let g:EclimCompletionMethod = 'omnifunc'
  3. Start eclimd script in a separate terminal:
    $ /usr/share/eclipse/eclimd
  4. Create a file named .project in the same directory as your Java files:
    .project
    <projectDescription>
        <name>PROJECTNAME</name>
    </projectDescription>
    
  5. Open your Java file in Vim and run:
    :ProjectCreate . -n java

To compile the project:

:ProjectBuild

To run the project:

:Java

To run only current file:

:Java %

C#

Note: For C# completion to "just work" simply create an empty .sln file in current or parent directory. The rest of this section explains how to manually create a full working C# project.

The easiest way to create a project is to use monodevelop. The rest of this section explains how to manually create a C# project which can also be built from command line with xbuild.

First create a solution file. Replace bold-italic names appropriately.

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

Then create a directory named PROJECT and in it a file named 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>

Place your C# files in PROJECT directory and don't forget to manually add them at the bottom of PROJECT/PROJECT.csproj.

Now YouCompleteMe should work for C# files in that directory and you can build the project. To compile the project from inside Vim:

:!xbuild

Troubleshooting

Remember that it might take some time for YouCompleteMe to generate a list of completion strings.

The following commands are available for diagnostics:

  • :messages - show previous errors or messages from Vim
  • :YcmDiags
  • :YcmDebugInfo

E764: Option 'omnifunc' is not set

If this happens for Java files, you forgot to put this in your .vimrc:

~/.vimrc
let g:EclimCompletionMethod = 'omnifunc'

No completion in Java files

Make sure eclimd daemon is running:

$ ps -ax|grep eclimd

and that you have first generated project files.

URLError: <urlopen error [Errno 111] Connection refused>

This error appears when you do not have a .sln file in current or parent directory.

RuntimeError: Error starting OmniSharp server: no solutionfile found

Same as above.

See also