LoginSignup
23
17

More than 5 years have passed since last update.

company-ironyを使ってemacsでC/C++の補完

Last updated at Posted at 2015-07-11

company-modeの紹介記事はこちら

概要

irony-modeは,clangを使ってC/C++を書くときに色々と賢いことをしてくれるマイナーモード.
company-ironyは,company-modeでironyの補完を使うためのbackend.
emacsのバージョンは24.4以降推奨.

スクリーンキャスト

インストール

MELPAからインストール可能.

M-x package-install RET irony RET
M-x package-install RET company-irony RET

設定

(require 'irony)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'objc-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
(add-to-list 'company-backends 'company-irony) ; backend追加

irony-cdb-autosetup-compile-optionsは,compile_commands.jsonからコンパイルオプションを取得するためのもの.
自分は,常に適用するコンパイルオプションを設定したかったので,以下のようにした.

(setq irony-lang-compile-option-alist
      '((c++-mode . ("c++" "-std=c++11" "-lstdc++" "-lm"))
        (c-mode . ("c"))
        (objc-mode . '("objective-c"))))
(defun irony--lang-compile-option ()
  (irony--awhen (cdr-safe (assq major-mode irony-lang-compile-option-alist))
    (append '("-x") it)))

irony-lang-compile-option-alistで言語ごとのコンパイルオプションをリスト形式で設定する.
この形式にするため,irony--lang-compile-optionも変更する必要があった.
もっといい方法があれば教えて下さい.

また,yasnipetをインストールして

(yas-global-mode)

とすれば上のスクリーンキャストのように引数をいい具合に展開してくれる.

(2015/08/02追記)
コンパイルオプションの設定に対して @KazuSoap さんからコメントを頂きました。
以下のような設定が良いとのことです。情報ありがとうございます。
詳しくはコメントを参照ください。

;; 連想リストの中身を文字列のリストに変更せず、変数そのままの構造を利用。
;; 複数のコンパイルオプションはスペースで区切る
(setq irony-lang-compile-option-alist
      (quote ((c++-mode . "c++ -std=c++11 -lstdc++")
              (c-mode . "c")
              (objc-mode . "objective-c"))))
;; アドバイスによって関数を再定義。
;; split-string によって文字列をスペース区切りでリストに変換
;; (24.4以降 新アドバイス使用)
(defun ad-irony--lang-compile-option ()
  (defvar irony-lang-compile-option-alist)
  (let ((it (cdr-safe (assq major-mode irony-lang-compile-option-alist))))
    (when it (append '("-x") (split-string it "\s")))))
(advice-add 'irony--lang-compile-option :override #'ad-irony--lang-compile-option)
;; (24.3以前 旧アドバイス使用)
(defadvice irony--lang-compile-option (around ad-irony--lang-compile-option activate)
  (defvar irony-lang-compile-option-alist)
  (let ((it (cdr-safe (assq major-mode irony-lang-compile-option-alist))))
    (when it (append '("-x") (split-string it "\s")))))

使い方

初回実行時のみ,

M-x irony-install-server RET

でirony-serverをインストールする.
irony-serverがインストールされる場所はirony-server-install-prefixで指定できる.
あとは適当にprefixを打てばcompanyが補完候補を表示してくれるはず.

23
17
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
17