跳转至内容

Vim/YouCompleteMe

来自 ArchWiki
< Vim

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 值可以设置为 cc++,而 --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

注意 要让 C# 补全“正常工作”,只需在当前目录或父目录中创建一个空的 .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

与上面相同。

参见