Emacsで関数とかforとかの補完をする定番といえばYASnippetですが,自作関数のスニペットは自分で作らないといけないのがすこし面倒です.
そこで今日は自作含めてあらゆる関数をyasnippetで入力できるようになる神プラグイン,auto-complete-clang を紹介します.
1.インストール
インストールは package.el を使えば簡単で,
M-x list-packages
して,auto-complete-clang を探し, I でマークして X 押せば勝手にインストールされますあともし yasnippet と auto-complete も入れてなかったら同じように入れてください.
2.コンパイル済みヘッダの用意
次にコンパイル済みのヘッダファイルを作るのですが,その前に,ご自身がヘッダ置き場にしてるところに自分が使ってるヘッダへのインクルード文を全部書いたヘッダファイルを作って下さい.
たとえば筆者の場合は ~/Documents/_Include/ をヘッダ置き場にしていて,そこに heddaa.h と名付けた以下のファイルを作りました.
次にこれを以下のコマンドでコンパイルします.
Warningが出るかもしれませんがErrorが出てなければ多分大丈夫だと思います.Error出たら消えるまでよしなに対処して下さい.
// heddaa.h #include<stdio.h> #include<stdlib.h> #include<time.h> #include<float.h> #include<math.h> #include<complex.h> #include<string.h> #include<limits.h> #include<fftw3.h> #include"dSFMT.h" #include"define.h" #include"code.h" #include"universal.h" #include"trellis.h" #include"ofdm.h"
clang -cc1 -emit-pch -x c-header ./heddaa.h -o heddaa.pch
あと c++ の場合は "clang++" "c++-header" ".hpp" など変更すれば同様にできます.
これで ~/Documents/_Include/ に headdaa.pch というファイルができました.
3.Emacsの設定
以上が終わったら Emacs の設定ファイルに設定を書きます,
;;; auto-complete ;;; (require 'auto-complete) (require 'auto-complete-config) (require 'auto-complete-clang) (defun my-ac-cc-mode-setup () (setq ac-clang-prefix-header "~/Documents/_Include/heddaa.pch") (setq ac-clang-flags '("-w" "-ferror-limit" "1")) (setq ac-sources (append '(ac-source-clang ac-source-yasnippet) ac-sources))) (defun my-ac-config () (define-key ac-complete-mode-map "\C-n" 'ac-next) (define-key ac-complete-mode-map "\C-p" 'ac-previous) (add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup) (add-hook 'auto-complete-mode-hook 'ac-common-setup) (global-auto-complete-mode t)) (my-ac-config) ;;; yasnippet ;;; (require 'yasnippet) (yas-global-mode 1)
~/Documents/_Include/heddaa.pch のところがさっき作ったファイルへのパスです.ac-source-clang と ac-source-yasnippet のところは c-mode で auto-comp される辞書リストで,他にも追加したい場合はここにかけばできます.
以上で設定終わりであとはEmacs再起動して適当にCのファイルを開き自分の関数を入力すれば yasnippet で引数を入力できるようになります.
ちなみに,上の設定だとよくある関数(printfとか)はyasnippetにもともと入ってるスニペットとダブって同じ候補が2つ出てうざいのでとくにこだわりなければ関数のスニペットを全部削除するといいかもしれません.
私はもっさり感があったので、auto-complete-clang-asyncに乗り換えました。
返信削除と思ったけどauto-complete-clang使ってました。
返信削除