Vim/YouCompleteMe

出自 ArchWiki
< Vim

YouCompleteMe (缩写为 YCM) 是一个为 Vim 设计的代码补全引擎。它支持以下语言

  • C/C++/Objective-C/Objective-C++
  • Python
  • C#
  • Go
  • Rust
  • Java
  • JavaScript
  • TypeScript
  • 其他语言(Ruby、PHP 等),通过使用 omnicompletion 系统

安装

安装 vim-youcompleteme-gitAUR 包。有关手动安装 YouCompleteMe 的替代方法,请参阅上游说明

配置

C/C++

YCM 使用名为 .ycm_extra_conf.py 的 python 脚本来设置项目范围的设置,这些设置是提供补全和语法检查所必需的。以下是基本配置的简要介绍,有关详细信息和高级选项,请参阅上游文档

或者,在项目根目录中提供 compile_commands.json

额外的 conf 结构

示例 .ycm_extra_conf.py 可以在 [1] 中找到。您应该将此文件的副本保存在您的项目文件夹中,并使用适合您的源文件的设置对其进行自定义。

最重要的设置(通常足以进行最小配置)是 -x--std 选项,它们分别告诉语法检查器项目中使用的语言和遵循的标准-x 值可以设置为 cc++,而 --std 的常用值是 --std=c89--std=c99--std=c11--std=c14 及其各自的 c++ 版本。标准参数将决定语法检查中的警告和错误(例如,用 // 注释的行在 C89 中将被标记为不允许,但在后续版本的标准中则不会)。

用于自动生成 .ycm_extra_conf.py 的第三方脚本和 vim 插件可在 此仓库 中找到。

额外的 conf 位置

程序在启动时在当前源文件目录及其父文件夹中搜索 .ycm_extra_conf.py 文件。如果未找到该文件,则 YCM 功能不可用。可以通过将以下内容添加到 ~/.vimrc 来设置全局文件(在未找到本地 extra conf 文件时用作后备)

~/.vimrc
let g:ycm_global_ycm_extra_conf = '/path/to/the/file'

由于 extra conf 文件是 python 脚本,因此当找到文件时,出于安全原因,在加载之前会要求确认。可以通过将以下内容添加到 ~/.vimrc 来禁用此行为

~/.vimrc
let g:ycm_confirm_extra_conf = 0

对于不太安全的解决方案,当启用确认时,可以设置 extra conf 文件黑名单/白名单,方法是将模式列表分配给 ycm_extra_conf_globlist 变量。如果模式以 ! 开头,则匹配一个模式的文件将被列入黑名单,否则将被列入白名单,如果文件与任何模式都不匹配,则会要求确认。规则优先级由顺序决定,并且应用第一个匹配项。一些 glob 模式规则可用

  • * 匹配所有内容
  • ? 匹配任何单个字符
  • [seq] 匹配 seq 中的任何字符
  • [!seq] 匹配不在 seq 中的任何字符

例如,使用以下设置

~/.vimrc
let g:ycm_extra_conf_globlist = ['~/dev/*','!~/*']

~/dev 中的任何文件都将列入白名单,~/ 中的任何文件都将列入黑名单,并且由于顺序优先级,~/ 中除 ~/dev 文件夹之外的任何文件都将列入黑名单。

Java

YCM 集成了对 jdt.ls 的支持,可以通过将 --java-completer 传递给 install.py 脚本来安装它。

Java - 替代方案

对于 Java 补全,应该存在项目文件,并且 Eclim 无头服务器必须正在运行。

安装 eclimAUR,然后编辑您的 .vimrc 如下所示

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

在单独的终端中启动 eclimd 脚本

$ /usr/lib/eclipse/plugins/org.eclim_$pkgver/bin/eclimd

在 Java 文件所在的同一目录中创建一个名为 .project 的文件

.project
<projectDescription>
    <name>PROJECTNAME</name>
</projectDescription>

在 Vim 中打开您的 Java 文件并运行

:ProjectCreate . -n java

编译项目

:ProjectBuild

运行项目

:Java

仅运行当前文件

:Java %

可在此处找到可用命令的列表。

C#

在开始使用 C# 项目之前,请确保您的系统上安装了 mono-msbuild,因为它是 Omnisharp-Roslyn 的必需依赖项,Omnisharp-Roslyn 是 YouCompleteMe 使用的 C# 补全引擎。 更多信息可以在 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: Option 'omnifunc' is not set

如果 Java 文件发生这种情况,您忘记将此内容放入您的 .vimrc

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

No completion in Java files

确保 eclimd 守护程序正在运行

$ ps -ax|grep eclimd

并且您首先生成了项目文件。

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

当您在当前目录或父目录中没有 .sln 文件时,会出现此错误。

RuntimeError: Error starting OmniSharp server: no solutionfile found

与上述相同。

参见