YouCompleteMe - ArchWiki

# YouCompleteMe

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

- GitHub page
- Project homepage

Categories:

- Development
- Text editors