emacsにモダンなエディタに負けない補完機能を...（２）

どうも”おもり”です。
前回に引き続き、emacsの補完機能について書いて行きます。

#company
コーディング中の補完についてはcompanyを使用します。


私はMSYS2での開発構築をしているため、下記のコマンドを使用してcmakeをインストールしましょう。
MSYS2でのemacsの導入については私の以前の記事が参考になるかもしれません。

MSYS2でemacs生活開始
https://qiita.com/RIO18020/items/2ef7a4973384463d554e


```
pasman -S mingw-w64-x86_64-cmake
pacman -S mingw-w64-i686-cmake
```

#clanのインストール
```
pasman -S mingw-w64-x86_64-clang
pacman -S mingw-w64-i686-clang
```

#ironyのインストール
```M-X packge-install [RET] irony, M-X packge-install [RET] company-irony```によってironyをインストールしましょう。
ironyとはC/C++でコーディングするときに補完などを行うときに必要になります。インストール後にinit.elに下記を追加する。

```
(use-package irony
  :defer t
  :commands irony-mode
  :init
  (add-hook 'c-mode-hook 'irony-mode)
  (add-hook 'c++-mode-hook 'irony-mode)
  :config
  ;; C言語用にコンパイルオプションを設定する.
  (add-hook 'c-mode-hook
            '(lambda ()
               (setq irony-additional-clang-options '("-std=c11" "-Wall" "-Wextra"))))
  ;; C++言語用にコンパイルオプションを設定する.
  (add-hook 'c++-mode-hook
            '(lambda ()
               (setq irony-additional-clang-options '("-std=c++14" "-Wall" "-Wextra"))))
  (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
  ;; Windows環境でパフォーマンスを落とす要因を回避.
  (when (boundp 'w32-pipe-read-delay)
    (setq w32-pipe-read-delay 0))
  ;; バッファサイズ設定(default:4KB -> 64KB)
  (when (boundp 'w32-pipe-buffer-size)
    (setq irony-server-w32-pipe-buffer-size (* 64 1024)))
  )

(use-package company-irony
  :defer t
  :config
  ;; companyの補完のバックエンドにironyを使用する.
  (add-to-list 'company-backends '(company-irony-c-headers company-irony))
  )

```

その他、C++で書いていく時に入れておく＆設定しておくと便利な設定を下に書いておきます。

```
(require 'cc-mode)
;; c-modeやc++-modeなどcc-modeベースのモード共通の設定
(add-hook
 'c-mode-common-hook
 (lambda ()
   ;; k&rスタイルをベースにする
   (c-set-style "k&r")
   ;; スペースでインデントをする
   (setq indent-tabs-mode nil)
   ;; インデント幅を2にする
   (setq c-basic-offset 2)
   ;; 自動改行（auto-new-line）と
   ;; 連続する空白の一括削除（hungry-delete）を
   ;; 有効にする
   (c-toggle-auto-hungry-state 1)
   ;; CamelCaseの語でも単語単位に分解して編集する
   ;; GtkWindow         => Gtk Window
   ;; EmacsFrameClass   => Emacs Frame Class
   ;; NSGraphicsContext => NS Graphics Context
   (subword-mode 1)
   ))

(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))

;; undo-tree
(require 'undo-tree)
(global-undo-tree-mode)

;; flycheck
(require 'package)
(global-flycheck-mode)

(require 'google-c-style)
(defun cc-mode-init ()
  (google-set-c-style)
  (setq indent-tabs-mode t)
  (setq c-basic-offset 4)
  (c-set-offset 'case-label 0)
)
```
以上の設定から実現された補完の様子を、「emacsにモダンなエディタに負けない補完機能を...（１）」で記述した同じ内容を書きながら確認してみましょう。QtCreatorとの比較になります。
https://qiita.com/RIO18020/items/57abac4ededf9b426cf1

![qiita1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/668a9862-9b35-ee32-0487-2668dd226a95.gif)

includeの記述は補完されないのだが。。。

![qiita2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/a27eec7f-0b20-4d9b-3733-d8aafcdc3ea4.gif)

補完が出るのが少し遅いのと、Ctrl+Alt+iを入力しないと補完候補が出てこないのも不満である。
QtCreatorを越えることができてねー。。。

まだまだ修行が必要ですな。以下の書籍などから情報を調べながら育て上げていこうと思う。
良いものが見つかったら記事も更新して行きます。

- Emacsに関して購入した書籍リスト
  - Emacs実践入門　～思考を直感的にコード化し、開発を加速する
  - Emacsテクニックバイブル　～作業効率をカイゼンする200の技～
  - 入門 GNU Emacs

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/40c63621-cc66-9970-a2e4-598ae29b278d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/9948cd9f-2d87-44e6-4472-6133d41bea0e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/8ddc9c57-e683-9963-2456-721495eb9f38.png)