Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

sune2
cyberagent
サイバーエージェントは「21世紀を代表する会社を創る」をビジョンに掲げ、インターネットテレビ局「AbemaTV」の運営や国内トップシェアを誇るインターネット広告事業を展開しています。インターネット産業の変化に合わせ新規事業を生み出しながら事業拡大を続けています。
http://www.cyberagent.co.jp/
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