YCMDは、コード完了およびセマンティックGOTOコマンド(およびその他)などの他のコード-Choulding UsecasesにAPIを提供するサーバーです。特定のフィルタイプについて、YCMDは診断エラーや警告も提供することもできます。
YCMDはもともとYouCompletemeのコードベースの一部でしたが、VIM以外の編集者で使用できるように、別のプロジェクトに分割されています。
クライアントを実装する場合は、APIドキュメントを確認してください。 YCMDと対話する方法を学ぶ良い方法は、 example_client.pyファイルを読み取り(および実行する)ことです。例フォルダーについては、サンプルクライアントの実行方法の詳細については、READMEを参照してください。
クライアントを作成した場合は、クライアントにリンクを追加するプルリクエストをお気軽に送信してください。
YCMDの開発を検討している場合は、テストを実行する手順を参照してください。
これはすべてUbuntu Linuxのためです。他のOSでYCMDを実行することの詳細は、YCMの指示に記載されています(VIM固有の部分を無視してください)。 YCMDはPython 3.8.0+で実行されることに注意してください。
まず、最小依存関係をインストールします。
sudo apt install build-essential cmake python3-dev
次に、必要な言語固有の依存関係をインストールします。
sudo apt install golang-go for go。sudo apt install npm 。sudo apt install mono-devel 。sudo apt install openjdk-8-jre for java。最初にリポジトリをクローンするときは、サブモジュールを更新する必要があります。
git submodule update --init --recursive
次に、 python3 build.py --allまたはpython3 build.py --helpによってリストされている特定の完了者のいずれかを実行します。これはあなたを動かすべきです。
YCMDの構築に関する詳細な指示については、YCMの指示を参照してください(VIM固有の部分を無視してください)。
nで終わります。x-ycm-hmac HTTPヘッダーにHMACを含める必要があります。 HMACは、起動時にサーバーに渡された共有秘密とリクエスト/応答本体から計算されます。ダイジェストアルゴリズムはSHA-256です。サーバーには、その応答にHMACも含まれます。応答を使用する前に確認する必要があります。それがどのように行われるかを確認するには、 example_client.py参照してください。YCMDにはいくつかの完了エンジンがあります。最も基本的なものは、完了要求で提供されているファイル内のすべての識別子を収集する識別子ベースの完了者であり、以前に提供された同じFiletypeの他のファイル、およびCTAGによって作成されたタグファイルです。このエンジンはセマンチックではありません。
YCMにはいくつかのセマンティックエンジンもあります。 C-Family言語のセマンティック完了を提供するClangdベースの完了者がいます。また、Pythonのセマンティック完了のためのJediベースの完了者、C#のOmnisharpベースの完了者、GOPLSベースの完了者(GOOPLSを使用して定義にジャンプするためにGOPLSを使用)、JavaScriptおよびTypescriptのTSServerベースの完了者、JDT.LSベースのサーバー、RLSベースの完了者用RUSTのRLSベースの完了者もあります。時間とともにさらに追加されます。
Filepath Completer(識別子完了者の一部)など、他の完了エンジンもあります。
サーバーは、どのような状況でどの完了エンジンが最適かを自動的に検出します。時々、それらのいくつかを一度に照会し、出力をマージし、結果を提示します。
セマンティックエンジンは、セマンティック「トリガー」がコードに挿入された後にのみトリガーされます。リクエストが受け取った場合、ユーザーのカーソルがstring foo; foo. C#ファイルでは、これによりセマンティックエンジンがトリガーしてfooのメンバーを調べます. C#のデフォルトのセマンティックトリガーです(トリガーは動的に変更できます)。テキストがstring foo; foo.zoo 、セマンティックの完了は引き起こされます(トリガーはユーザーが入力しているzoo背後にあります)、結果はzooクエリでフィルタリングされます。
force_semantic: trueを設定することで強制することもできますが、ユーザーがキーボードショートカットでセマンティック完了を明示的に要求した場合にのみこれを行う必要があります。それ以外の場合は、どのエンジンを使用するかを決定するためにYCMDまでのままにしてください。
セマンティック完了が利用可能な場合でも常に使用されていない理由は、セマンティックエンジンが遅くなる可能性があるため、ほとんどの場合、ユーザーは実際にセマンティック完了を必要としないためです。
コード完了には2つの主要なユースケースがあります。
最初のユースケースは最も一般的なケースであり、識別子完成エンジン(ところで、速く燃えている)で簡単に対処されています。 2つ目はセマンティック完了が必要です。
注意すべき重要なことは、完了フィルタリングは、入力が完了の文字列プレフィックスであることに基づいていないことです(ただし、それも機能します)。入力は、完了のサブシーケンスマッチである必要があります。これは、入力文字が入力に表示される順序で完了文字列に存在する必要があると言う派手な方法です。したがって、 abc xaybgcのサブシーケンスですが、 xbyxaxxcのサブシーケンスです。
サブシーケンスフィルターは、入力と一致しない完了を削除しますが、ソートシステムは少し関与します。実際には、「GUA」の入力を考えると、「getUserAccount」の完了は、リストの「fooguxa」の完了(どちらもサブセイセンス一致です)よりも高くランク付けされることを意味します。単語の境界文字はすべて首都のキャラクター、アンダースコアが先行するキャラクター、および完了文字列の最初の文字文字です。
サーバーがしばらくリクエストを受け取っていない場合( --idle_suicide_seconds ycmdフラグによって制御されます)、それ自体をシャットダウンします。これは、YCMDを開始したプロセスがYCMDに死ぬように命じることなく死ぬ場合、またはYCMDがハングした場合に役立ちます(これは非常にまれなはずです)。
YCMDのクライアントを実装している場合は、定期的にYCMDをpingsしているある種のキープアライブバックグラウンドスレッドがあることを確認してください(ハンドラーはそうしますが、 /healthyハンドラーに電話してください)。
また、 --idle_suicide_seconds=0通過することでこれをオフにすることもできますが、それは推奨されません。
起動中、YCMDはycm_coreライブラリをロードしようとし、失敗した場合は次の返品コードのいずれかで終了します。
ycm_coreライブラリがありません。ycm_coreライブラリのバージョンは時代遅れです。サーバーの起動時にYCMDに設定を提供できます。微調整できるdefault_settings.jsonファイルがあります。各オプションが何をするかについての説明については、YCMのユーザーガイドのオプションセクションを参照してください。変更された設定ファイルへのパスをycmdに渡し、 --options_file=/path/to/fileフラグを渡します。 hmac_secret設定を設定する必要があることに注意してください(base64で値をエンコード)。通過しているファイルには秘密のトークンが含まれているため、安全な方法で一時ファイルを作成していることを確認してください( mkstemp() Linux System Callは良いアイデアです。他のOSに同様のものを使用してください)。
起動した後、YCMDは、読み取った後に提供された設定ファイルを削除します。
設定ファイルは、ユーザーが構成した値に基づいて、エディターが生成する必要があるものです。また、ユーザーが特定のセマンティック完了者を構成するために提供するはずの追加ファイル( .ycm_extra_conf.py )もあります。詳細については、YCMのユーザーガイドの対応するセクションにもご覧ください。
.ycm_extra_conf.py仕様.ycm_extra_conf.pyモジュールは、次の機能を定義できます。
Settings( **kwargs )この関数により、ユーザーはプロジェクトごとまたはグローバルに言語完了者を構成できます。現在、LibclangベースのCompleterによって必要であり、他の完了者にはオプションが必要です。以下の引数は、 kwargs辞書から取得でき、すべての完了者に共通しています。
language :関数と呼ばれる完了者の識別子。その値は、Python CompleterのpythonとC-Family Completerのcfamilyです。この引数は、複数の完了者を一度に構成するのに役立ちます。例えば:
def Settings ( ** kwargs ):
language = kwargs [ 'language' ]
if language == 'cfamily' :
return {
# Settings for the libclang and clangd-based completer.
}
if language == 'python' :
return {
# Settings for the Python completer.
}
return {} filename :現在編集されているファイルの絶対パス。
client_data :クライアントアプリケーションから提供される追加データ。例については、youcompletemeドキュメントを参照してください。
返品値は、コンテンツが完了者に依存する辞書です。
LSPサーバーは、多くの場合、初期化要求を介してユーザー構成をサポートします。これらは通常、UIのオプションとして表示されます。 YCMDは、ユーザーがServer Initialiseメッセージに渡される設定の正確な辞書を指定できるようにすることにより、 .ycm_extra_conf.pyを使用してこれをサポートします。これらのオプションは、 lsキーの下のSettingsから返されます。 Python辞書はJSONに変換され、LSP Initialize RequestにVerbatimが含まれています。サーバーの一連のオプションを決定するには、サーバーのドキュメントまたはpackage.jsonファイルを参照してください。 config_sectionsオブジェクトは、キーが「セクション」であり、値はそれらのセクションに対応する設定(通常はlsオブジェクトにあります)である辞書です。これはさらに統一されており、それを機能させるために試行錯誤が必要です。オプションであり、 workspace/configurationサポートを明示的に有効にする場合にのみ便利です。
LSP構成の例:
def Settings ( ** kwargs ):
if kwargs [ 'language' ] == 'java' :
return { 'ls' : { 'java.rename.enabled' : False },
# `config_sections` is not used for java...
'config_sections' : { 'section0' : {} }さらに、YCMDは、ファイルタイプとコマンドラインを指定して、任意の言語サーバーを使用できます。ユーザーオプションlanguage_serverを使用して、LSPサーバーYCMDを通常は知りません。値は、次のことを含む辞書のリストです。
name :サーバーの名前を表す文字列cmdline :サーバーを実行するコマンドラインを表すリスト(オプション;ポートが指定されていない場合は必須)port :オプション。指定されている場合、このポートにはTCP接続が使用されます。 *に設定されている場合、未使用のLocallポートが選択され、 cmdlineで${port}として利用可能になります(以下の例を参照)。filetypes :サポートされているfiletypesのリスト。project_root_files :ycmdに、どのファイルがプロジェクトルートを示しているかを伝えます。capabilities' :YCMDのデフォルトのLSP機能をオーバーライドします。workspace/configurationサポートを有効にする場合は、LSPサーバーに関連する追加のconfの詳細を確認してください。additional_workspace_dirs :LSPサーバーの起動で開くべき静的に既知のワークスペースを指定します。triggerCharacters :LSPサーバーのトリガー文字をオーバーライドして、完了します。これは、サーバーがすべての文字やたとえば、白人文字の完了を不快に要求する場合に役立ちます。 {
"language_server" : [ {
"name" : " gopls " ,
"cmdline" : [ " /path/to/gopls " , " -rpc.trace " ],
"filetypes" : [ " go " ],
"project_root_files" : [ " go.mod " ],
"triggerCharacters" : [ " . " ]
} ]
}または、TCP接続を使用するには:
{
"language_server" : [ {
"name" : " godot " ,
"port" : " 6008 " ,
"filetypes" : [ " gdscript " ]
} ]
}または、未使用のローカルポートを使用するには、 portを*に設定し、 cmdlineで${port}を使用します。
{
"language_server" : [ {
"name" : " someserver " ,
"cmdline" : [ " /path/to/some/server " , " --port " , " ${port} " ],
"port" : " * " ,
"filetypes" : [ " somethign " ],
"project_root_files" : [ " somethingfile " ]
} ]
}このように完了者を接続すると、 kwargs[ 'language' ] nameキーの値、つまり上記の例ではgoplsに設定されます。
現在、 language_serverなしで多くのLSP完了者がサポートされています。
project_directoryを使用して、ルートディレクトリをオーバーライドすることもできます。
def Settings ( ** kwargs ):
return { 'project_directory' : 'src/' } # The path may be absolute as well.注:LSPベースの完了者が「組み込み」とサポートされている言語用に構成されている場合、組み込みサポートをオーバーライドします。
Settings関数は、LibclangとClangdベースの完了者によって呼び出され、現在のファイルをコンパイルするときに使用するコンパイラフラグを取得します。このファイルの絶対パスは、 kwargs辞書のfilenameキーの下でアクセスできます。
両方の完了者が期待する返品値は、次の項目を含む辞書です。
flags :( Libclangの場合は必須、Clangdのオプション)コンパイラフラグのリスト。
include_paths_relative_to_dir :(オプション)フラグのリストに含まれるパスが相対的なディレクトリ。デフォルトは、libclang completerのycmd作業ディレクトリと、clangd completer用の.ycm_extra_conf.pyのディレクトリになります。
do_cache :(オプション)この呼び出しの結果(つまり、フラグのリスト)をこのファイル名にキャッシュする必要があるかどうかを示すブール値。デフォルトはTrueです。不確かな場合、デフォルトはほとんど常に正しいです。
Libclangベースの完了者は、次の項目もサポートしています。
override_filename :(オプション)提供されたファイル名の翻訳ユニットとして解析するファイルの名前を示す文字列。このかなり高度な機能により、「Unity」スタイルのビルドを使用するプロジェクト、または他のファイルに含まれる他のファイルに依存するヘッダーファイルが可能になります。
flags_ready :(オプション)フラグを使用する必要があることを示すブール値。デフォルトはTrueです。不確かな場合、デフォルトはほとんど常に正しいです。
フラグのリストを単に返す最小限の例は次のとおりです。
def Settings ( ** kwargs ):
return {
'flags' : [ '-x' , 'c++' ]
}Formatサブコマンドの構成は、JavaサブサーバーとTypeScriptサブサーバー用の追加のCONFで指定できます。フォーマッタオプションは以下にあります。
これらのサーバーは、他のサーバーとは異なる方法で提供されるカスタムフォーマットオプションをサポートしています。この目的のために、 Settings関数はformatterプロパティを返すことができます。
フォーマッタ構成の例は次のとおりです。
def Settings ( ** kwargs ):
return {
'formatting_options' : {
'org.eclipse.jdt.core.formatter.lineSplit' : 30 ,
}
}Settings関数により、ユーザーは完了者が完了とコード理解を提供するために完了者が使用するPythonインタープリターとsys.path指定できます。追加の引数は渡されません。
完了者が期待する返品値は、次の項目を含む辞書です。
interpreter_path :(オプション)Pythonインタープリターへのパス。 ~パス内の環境変数が拡張されます。絶対的なパスではない場合、 PATHを通して検索されます。
sys_path :(オプション) sys.pathに加えられたパスのリスト。
使用例:
def Settings ( ** kwargs ):
return {
'interpreter_path' : '~/project/virtual_env/bin/python' ,
'sys_path' : [ '~/project/third_party/module' ]
}PythonSysPath( **kwargs )Pythonサポートのオプション。
この関数により、Python sys.pathをさらにカスタマイズできます。そのパラメーターは、Python CompleterのSettings関数によって返される可能性のあるアイテムです。
interpreter_path :pythonインタープリターへのパス。
sys_path : sys.pathからのPythonパスのリスト。
返品値は、Pythonパスの変更されたリストである必要があります。
例については、YCMDの.ycm_extra_conf.py参照してください。
グローバルなエクストラモジュールは、次の追加を使用して、 .ycm_extra_conf.pyモジュールと同じ関数を公開する必要があります。
YcmCorePreLoad()オプション。
この方法は、定義されている場合、C ++ Pythonプラグインをインポートする前にサーバーによって呼び出されます。通常、必要ではなく、その使用は上級ユーザーのみです。
Shutdown()オプション。
サーバーがきれいに終了する前に呼び出されます。通常、必要ではなく、その使用は上級ユーザーのみです。
YCMDのHTTP+JSONインターフェイスはSEMVERに続きます。 YCMDはYCMの一部として過去数年間で広範な使用を見てきましたが、APIの一部がYCMDを他の編集者と統合する可能性のある問題を発見すると、APIの一部がわずかに変化する可能性があるため、バージョン数は1.0未満です。言い換えれば、現在のAPIは意図せずVIM固有である可能性があります。私たちはそれを望んでいません。
YCMDの内部API(つまり、HTTP+JSON以外のもの)はSEMVERでカバーされておらず、その下でランダムに変更されることに注意してください。 Python/C ++/などのコードと直接対話しないでください!
HMAC AUTHがなければ、悪意のあるWebサイトがユーザーになりすます可能性があります。 Evil.comがブラウザでEvil.comにアクセスした場合、localhostでリスニングされるサーバーにリクエストを送信できることを忘れないでください。
これは単なる理論的懸念ではありません。 conceptof of concept of Remote Code Excution Exploitが作成され、localhostで実行されているycmdが作成されました。 HMAC AUTHを追加して、この攻撃ベクトルをブロックしました。
このプロジェクトは、貢献者行動規範でリリースされていることに注意してください。このプロジェクトに参加することにより、その条件を順守することに同意します。
プラグインについて質問がある場合、またはヘルプが必要な場合は、YCMD-USERSメーリングリストを使用してください。
著者のホームページはhttp://val.markovic.ioです。
このソフトウェアは、GPL V3ライセンスの下でライセンスされています。 ©2015-2019 YCMD貢献者