オリジナル版はemacs-clang-complete-async
https://github.com/Golevka/emacs-clang-complete-async
上記をforkして独自拡張したもの。
libclang を利用してC/C++コード補完と宣言/定義へのジャンプを行います。
基本機能はemacs-clang-complete-asyncと同じです。
※実装方法は変更されているものがあります。
- C/C++/Objective-Cコード補完
- flymakeによるシンタックスチェック
- 宣言/定義へのジャンプ&リターン
GTAGSのlibclang版
事前にタグファイルを生成する必要がなくオンザフライでジャンプ可能
オリジナル版は非実装
- clang-serverをEmacs1つにつき1プロセスに変更
オリジナルは1バッファにつき1プロセス。
clang-serverはプロセス内でソースコードバッファ毎にセッションを作成してCFLAGS等を保持します。 - テンプレートパラメーター展開をサポート
補完後の引数展開時にテンプレートパラメーター展開が可能 - マニュアル操作による補完をサポート
任意位置での補完が可能 - libclang CXTranslationUnit Flagsをサポート
lispから設定可能 - libclang CXCodeComplete Flagsをサポート
lispから設定可能 - マルチバイトサポート
オリジナルはマルチバイトサポートが完全ではなかったので修正 - デバッグロガーサポート
デバッグ用途で使用
clang-serverに送信するメッセージとデータをプールして確認可能 - その他
微細な追加or変更
オリジナル版は非実装
主にWindows Platform サポート
- CMake によるプロジェクト生成
Visual Studio用プロジェクトと Linux用Makefileを生成可能 - Microsoft Visual Studio プラットフォームサポート
clang-server と libclang.dll(clang3.5.0 RELEASE/FINAL) を
Microsoft Visual Studio 2013 でビルド - x86_64 Machine Architecture + Windows Platform サポート
Visual Studio用コードを補完する場合は必須。(_WIN64 ビルドサポートのため)
clang-serverとlibclang.dllは64bit版。
x86_32はclang3.5から未サポートにしました。
Visual Studioでビルドされているのでコンパイラ定義済みマクロも
Visual Studioのマシンアーキテクチャタイプに準拠したものになっています。
※mingwによるビルドだとVisual Studio定義済みマクロ等が定義されなかったり干渉したりする。
clang-serverはC++で記述(オリジナルはC)
セルフビルドによるインストールはclang-serverのマニュアルを参考にしてください。
Visual Studio 2013がインストールされていない環境では
Visual C++ 再頒布可能パッケージが必要になります。
以下のページからvcredist_x64.exeを取得しインストールしてください。
http://www.microsoft.com/download/details.aspx?id=40784
https://github.com/yaruopooner/ac-clang/releases
上記からclang-server-X.X.X.zipをダウンロードしてac-clangに解凍してください。
ac-clang/clang-server/binary/clang-server-x86_64.exe
ac-clang/clang-server/library/x86_64/release/libclang.dll
上記2ファイルをパスの通っている場所へコピーします。
※たとえば /usr/local/bin など
- 64bit version
clang-server-x86_64.exe
libclang.dll 32bit version
clang3.5から未サポートにしました。
clang-server-x86_32.exe
libclang.dll
libclangはLLVMオフィシャルのバイナリと異なります。
オフィシャルのlibclangはLLVMファイルシステム内で使用されるmmapがファイルをロックしてしまう問題があります。
ここで配布しているlibclangはオフィシャルソースコードにパッチを当てて問題を解決したバイナリです。
またLLVMセルフビルド時も上記の問題を解決するパッチを適用します。
Emacsで標準組み込み済みorインストールが必要なパッケージ
- flymake(built-in)
- auto-complete
- yasnippet
(require 'ac-clang)
(ac-clang-initialize)
以上で完了です。
(ac-clang-initialize) を呼び出すと clang-server-x86_64 が常駐します。
32bit 版を使用する場合は (ac-clang-initialize) 実行前に以下の設定が必要です。
(require 'ac-clang)
(ac-clang-server-type 'x86_32)
(ac-clang-initialize)
以下の方法で clang-server のフラグを変更します
(setq ac-clang-clang-translation-unit-flags FLAG-STRING)
(setq ac-clang-clang-complete-at-flags FLAG-STRING)
(ac-clang-initialize)
初期化関数実行より前に変数にセットされている必要があります。
clang-server起動後の変更は後述の (ac-clang-update-clang-parameters) を利用します。
ac-clangをアクティブ化する前にCFLAGSをセットしておく必要があります。
(setq ac-clang-cflags CFLAGS)
でセットします。
補完を行うには clang-server で該当バッファのセッションを作成する必要があります。
ac-clang-cflags に CFLAGS がセットされた状態で
(ac-clang-activate)
を実行します。
これにより clang-server にバッファに関連付けされたセッションが作成されます。
-
アクティブ化の遅延
バッファが変更されるまでアクティブ化を遅延させることができます。(ac-clang-activate)
の変わりに
(ac-clang-activate-after-modify)
を使います。
c-mode-common-hook などで実行する場合はこれを使うとよいでしょう。
clang-server で作成されたセッションを破棄します。
(ac-clang-deactivate)
以下の方法で clang-server のフラグを変更します
(setq ac-clang-clang-translation-unit-flags FLAG-STRING)
(setq ac-clang-clang-complete-at-flags FLAG-STRING)
(ac-clang-update-clang-parameters)
この関数を実行する前に作成されたセッションのフラグは変更されません。
関数実行後に作成されるセッションのフラグは新しくセットしたものが利用されます。
セッション作成後にCFLAGSの更新があった場合はセッションのCFLAGSを更新する必要があります。
(setq ac-clang-cflags CFLAGS)
(ac-clang-update-cflags)
と実行することにより、セッションのCFLAGSが更新されます。
※以下の方法でも同じ効果になりますが、 (ac-clang-update-cflags) を実行するほうがコストは安いです。
(ac-clang-deactivate)
(ac-clang-activate)
以下の設定を行うと
clang-serverに送信した内容が "clang-log" というバッファに出力されます。
(setq ac-clang-debug-log-buffer-p t)
ロガーバッファサイズに制限をかけます。
バッファが指定サイズ以上になるとクリアされます。
(setq ac-clang-debug-log-buffer-size (* 1024 1000))
クリアせず無制限にする場合は以下のように設定します。
(setq ac-clang-debug-log-buffer-size nil)
クラスやインスタンスオブジェクトの直後に以下のキー入力が行われると補完が実行されます。
.
->
::
自動補完を無効化する場合は以下のように設定します。
(setq ac-clang-async-do-autocompletion-automatically nil)
以下のキー入力が行われると補完が実行されます。
<tab>
キー入力を行うポジションは前述の自動補完と同様の .
->
::
以外にも、
メソッドやメンバの入力途中でも補完可能です。
struct Foo
{
int m_property0;
int m_property1;
void method( int in )
{
}
};
Foo foo;
Foo* foo0 = &foo;
foo.
-----
^ ここで手動補完を実行
foo->
------
^ ここで手動補完を実行
Foo::
------
^ ここで手動補完を実行
foo.m_pro
----------
^ ここで手動補完を実行
また、 Objective-C/C++ のメソッドを補完する場合は手動補完のみ可能です。
id obj = [[NSString alloc] init];
[obj
------
^ ここで手動補完を実行
手動補完を無効化または他のキーを使用する場合は以下のように設定します。
;; disable
(setq ac-clang-async-autocomplete-manualtrigger-key nil)
;; other key
(setq ac-clang-async-autocomplete-manualtrigger-key "M-:")
アクティブ化されたバッファ上でジャンプしたいワード上にカーソルをポイントして以下を実行すると、
クラス/メソッド/関数/enumなどが定義/宣言されているソースファイルへジャンプすることが出来ます。
(ac-clang-jump-smart)
"M-." にバインドされています。
リターン操作は以下で可能です。
(ac-clang-jump-back)
"M-," にバインドされています。
ジャンプ履歴はスタックされており、連続ジャンプ・連続リターンが可能です。
※アクティブ化されていないバッファ上でジャンプ操作を実行した場合
該当バッファは自動的にアクティブ化されジャンプを行います。
(ac-clang-jump-smart)
定義優先でジャンプしますが定義が見つからない場合は宣言へジャンプします。(ac-clang-jump-declaration)
宣言へジャンプします。(ac-clang-jump-definition)
定義へジャンプします。
クラス変数・クラスメソッドは全てpublicアクセス指定子扱いで補完対象としてリストアップされる。
関数とクラスメソッドに関してのみ制限があります。
struct/class/typedef/template/enum/class variable/global variableなどは問題ありません。
libclang は現在編集中のバッファと、それらからincludeされるヘッダファイルからジャンプ先を決定している。
このため、関数定義やクラスメソッド定義がincludeされるヘッダファイルに記述されている場合はジャンプ可能だが、
c/cppファイルに記述されている場合はlibclangがc/cppファイルを収集する術が無いのでジャンプできない。
※ ac-clang-jump-smart は定義優先でジャンプしますが定義が見つからない場合は宣言へジャンプします。
定義ジャンプを重視する場合はGTAGSなどと併用をお勧めします。
なし