18
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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が補完候補を表示してくれるはず.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
18
Help us understand the problem. What are the problem?