Vim/YouCompleteMe
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
值可以设置为 c
或 c++
,而 --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 中找到。
.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
与上述相同。