Vim/YouCompleteMe

提供: ArchWiki
2017年6月12日 (月) 22:21時点におけるKusakata (トーク | 投稿記録)による版 (→‎Java: 同期)
ナビゲーションに移動 検索に移動

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 に設定できる値は cc++ で、--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 ヘッドレスサーバーを動作させなくてはなりません。

  1. AUR から eclimAUR あるいは eclim-gitAUR をインストールしてください。
  2. .vimrc に以下を記述:
    ~/.vimrc
    let g:EclimCompletionMethod = 'omnifunc'
  3. 別のターミナルで eclimd スクリプトを実行:
    $ /usr/lib/eclipse/plugins/org.eclim_$pkgver/bin/eclimd
  4. Java ファイルと同じディレクトリに .project という名前のファイルを作成:
    .project
    <projectDescription>
        <name>PROJECTNAME</name>
    </projectDescription>
    
  5. Vim で Java ファイルを開いて以下を実行:
    :ProjectCreate . -n java

プロジェクトをコンパイルするには:

:ProjectBuild

プロジェクトを実行するには:

:Java

現在のファイルのみを実行するには:

:Java %

利用可能なコマンドのリストは こちら にあります。

C#

ノート: 空の .sln ファイルをカレントディレクトリや親ディレクトリに作成するだけで C# の補完は"機能"します。このセクションでは完全な 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>'

参照