Vim/YouCompleteMe
YouCompleteMe (略して YCM) は Vim のコード補完エンジンです。以下の言語をサポートしています:
- C/C++/Objective-C/Objective-C++
- Python
- C#
- Go
- Rust
- JavaScript
- TypeScript
- omnicompletion システムで利用できる他の言語 (Java, Ruby, PHP など)
インストール
AUR から vim-youcompleteme-gitAUR パッケージをインストールしてください。YouCompleteMe を手動でインストールする方法は 上流の手順 を参照してください。
設定
C/C++
YCM は .ycm_extra_conf.py
という名前の python スクリプトを使って、補完や構文チェックに必要な、プロジェクト全体の設定をします。以下は基本的な設定を行う簡単なイントロダクションなので、高度なオプションなど詳しい説明は 上流のドキュメント を見て下さい。
Extra conf の構造
.ycm_extra_conf.py
のサンプルは こちら にあります。サンプルファイルのコピーをプロジェクトのフォルダに保存して、あなたのソースファイルに合わせて必要なカスタマイズを行なって下さい。最も重要な設定 (最低限必要な設定) は -x
と --std
オプションです。sintax チェッカーに、プロジェクトで使用する言語と 規格 をそれぞれ指定します。 -x
に設定できる値は c
か c++
で、--std
には --std=c89
, --std=c99
, --std=c11
, --std=c14
などと c++ のバージョンを設定するのが普通です。規格パラメータによって構文チェック時に表示される警告やエラーが確定します (例: //
による行コメントは C89 では利用できませんが、それ以降のバージョンの規格では問題ありません)。
こちらのリポジトリ から .ycm_extra_conf.py
を自動で生成するサードパーティスクリプトと vim プラグインを入手できます。
Extra 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
Java の補完をするには、プロジェクトファイルが必要で、Eclim ヘッドレスサーバーを動作させなくてはなりません。
- AUR から eclimAUR あるいは eclim-gitAUR[リンク切れ: パッケージが存在しません] をインストールしてください。
-
.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#
プロジェクトを作成する一番簡単な方法は monodevelop[リンク切れ: パッケージが存在しません] を使うことです。このセクションでは手動で C# プロジェクトを作成して、コマンドラインから xbuild
でビルドできるようにする方法を説明します。
まず solution ファイルを作成します。太字・斜体 の名前は適当に置き換えて下さい。
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>
PROJECT
ディレクトリに C# ファイルを配置してください。忘れずに、PROJECT/PROJECT.csproj
の一番下にファイルを手動で追加します。
これで、ディレクトリ内の C# ファイルで YouCompleteMe が使えるようになりプロジェクトをビルドすることができます。Vim の中からプロジェクトをコンパイルするには:
:!xbuild
トラブルシューティング
YouCompleteMe が補完文字列のリストを生成するのにはしばらく時間がかかることがあることを覚えておいて下さい。
以下のコマンドを使うことで診断することができます:
:messages
- 先のエラーや Vim からのメッセージを表示:YcmDiags
:YcmDebugInfo
E764: Option 'omnifunc' is not set
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
上記と同じ。
ターミナルの vim で Ctrl+space で補完が行われない
KDE Framework5/Qt5 の バグ で、Konsole5 では Ctrl+space
のキーの組み合わせは認識されません。一時的な回避策として、別のキーで YouCompleteMe の補完を行うようにできます。ycm_key_invoke_completion
変数の値を変更してください。例えば Ctrl-space
の代わりに Ctrl-b
を使うようにするには、以下を ~/.vimrc
設定ファイルに追加:
~/.vimrc
let g:ycm_key_invoke_completion = '<C-b>'