emacsにモダンなエディタに負けない補完機能を...(2)


どうも”おもり”です。
前回に引き続き、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にモダンなエディタに負けない補完機能を...(1)」で記述した同じ内容を書きながら確認してみましょう。QtCreatorとの比較になります。
https://qiita.com/RIO18020/items/57abac4ededf9b426cf1

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

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

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

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