Vim/YouCompleteMe
YouCompleteMe (简称 YCM) 是一个用于 Vim 的代码补全引擎。它支持以下语言:
- C/C++/Objective-C/Objective-C++
- Python
- C#
- Go
- Rust
- Java
- JavaScript
- TypeScript
- 通过 omnicompletion 系统支持其他语言 (Ruby, PHP 等)
安装
安装 vim-youcompleteme-gitAUR 包。关于手动安装 YouCompleteMe 的替代方法,请参阅 上游说明。
配置
C/C++
YCM 使用一个名为 .ycm_extra_conf.py 的 Python 脚本来设置项目范围内的配置,以提供补全和语法检查。以下是基本配置的简要介绍,有关详细信息和高级选项,请参阅 上游文档。
或者,在项目的根目录提供一个 compile_commands.json 文件。
额外配置结构
可以在 [1] 中找到一个 .ycm_extra_conf.py 的示例。您应该将此文件的副本保存在您的项目文件夹中,并使用适合您源文件的设置对其进行自定义。
最重要的设置 (通常足以满足最小配置) 是 -x 和 --std 选项,它们分别告诉语法检查器项目使用的语言和遵循的 标准。-x 值可以设置为 c 或 c++,而 --std 的常见值有 --std=c89, --std=c99, --std=c11, --std=c14 以及它们各自的 c++ 版本。标准参数将决定语法检查中的警告和错误 (例如,用 // 注释掉的一行在 C89 中将被标记为不允许,但在后续标准版本中则允许)。
一个用于自动生成 .ycm_extra_conf.py 的第三方脚本和 vim 插件可在 此仓库 中找到。
额外配置位置
程序在启动时,会在当前源文件目录及其父文件夹中搜索 .ycm_extra_conf.py 文件。如果找不到该文件,YCM 功能将不可用。可以通过将以下内容添加到 ~/.vimrc 来设置一个全局文件 (当找不到本地额外配置文件时作为回退使用)。
~/.vimrc
let g:ycm_global_ycm_extra_conf = '/path/to/the/file'
由于额外配置文件是 Python 脚本,当找到文件时,出于安全原因会询问确认后再加载。可以通过将以下内容添加到 ~/.vimrc 来禁用此行为。
~/.vimrc
let g:ycm_confirm_extra_conf = 0
为了更安全一些,当确认启用时,可以通过为 ycm_extra_conf_globlist 变量分配模式列表来设置额外配置文件的黑名单/白名单。匹配一个模式的文件,如果模式以 ! 开头则被列入黑名单,否则被列入白名单;如果文件不匹配任何模式,则会询问确认。规则的优先级由顺序决定,并应用第一个匹配项。有一些通配符规则可用:
- * 匹配所有内容
- ? 匹配任何单个字符
- [seq] 匹配 seq 中的任何字符
- [!seq] 匹配不在 seq 中的任何字符
例如,使用以下设置:
~/.vimrc
let g:ycm_extra_conf_globlist = ['~/dev/*','!~/*']
~/dev 中的任何文件都将被列入白名单,~/ 中的任何文件都将被列入黑名单,并且由于顺序优先级,~/ 中的任何文件 (除了 ~/dev 文件夹) 都将被列入黑名单。
Java
YCM 对 jdt.ls 进行了集成支持,可以通过向 install.py 脚本传递 --java-completer 来安装。
C#
在开始处理 C# 项目之前,请确保您的系统上安装了 mono-msbuild,因为它是 YouCompleteMe 使用的 C# 补全引擎 Omnisharp-Roslyn 的必需依赖项。有关更多信息,请参阅 Omnisharp-Roslyn 的 README 和以下 Github issue。
.sln 文件即可。本节的其余部分将解释如何手动创建 C# 项目,该项目也可以使用 xbuild 从命令行构建。首先创建一个解决方案文件
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: 选项 'omnifunc' 未设置
如果这发生在 Java 文件上,您忘记将此添加到您的 .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
与上面相同。