はむ吉(のんびり)の練習ノート

主にプログラミングについて、思いついたことや、試してみたこと、学んだことを、覚え書きを兼ねてまとめます。

Windows Subsystem for Linux において Emacs を用いた C/C++ の開発環境を整える:auto-completeを用いた自動補完

この記事では,Windows 10 上で C/C++ の開発環境を整える方法についてまとめます.エディタとしては Emacs を使用します.コンパイラをはじめとする各種ツールを導入したうえで,Emacs へ Auto-Complete をはじめとする各種パッケージを導入し,C/C++ の自動補完が可能な状態にします.

はじめに

Windows 10 では Windows Subsystem for Linux (WSL, 旧称 Bash on Ubuntu on Windows)が利用可能になりました.これを用いて,仮想 PC やデュアルブートを利用せずに,Windows 10 があらかじめ導入された PC で手軽に Linux 環境を試すことができるようになりました.以下に,WSL 上の EmacsC/C++ の自動補完を行えるようにすることを目標とし,設定を行った記録を残します.

前提条件

以下の操作を行った環境は次の通りです.なお,この記事では WSL 自体の導入方法については割愛します.また,Bash の扱いや基本的な Linux コマンドの使用法についても省略します.

X11 および日本語入力を使用するための設定

普段の開発スタイルや,開発したいアプリケーションの種類にもよりますが,あらかじめ X Window System(別称 X11)や日本語入力ができるように設定しておくと便利なことがあります.具体的な手順はここでは省略しますが,おおむね以下の記事に従い作業を行い,これらの設定を行いました.

qiita.com

その結果,以下のように xeyes, xclock のような,X11 を使用するアプリケーションを正常に動作させることができるようになりました.もちろん Emacs も含まれています.

f:id:hamukichi_nbr:20180217185806p:plain
Windows Subsystem for Linux 環境(ディストリビューションUbuntu)上で,X Window System (X11) を利用するアプリケーションが動作している様子.Xmingを使用.

開発ツールを導入する

このような環境で,C/C++の開発に必要なツールや,エディタを WSL 環境に導入しました.具体的には,以下のものを導入しました.Ubuntu では apt-get を利用して,容易にこの操作を行うことができました.

Emacs へパッケージを導入する

準備:MELPA を利用可能にする

今回導入するものを含め,Emacs 用の主要なパッケージは Milkypostman’s Emacs Lisp Package Archive (略称:MELPA)にて管理されています.Emacs で MELPA を利用するように設定することで,パッケージの導入が容易になります.私は
MELPA に従い,以下の内容を ~/.emacs に加えて Emacs を再起動しました.これで,Emacs で MELPA を利用できるようにしました.なお,すでに Customize などにより ~/.emacs に何らかの記述がなされていることがあります.その場合には,その記述を手動で変更せず,その記述以降に以下の記述を行うことをお勧めします.

(require 'package)
(let* ((no-ssl (and (memq system-type '(windows-nt ms-dos))
                    (not (gnutls-available-p))))
       (proto (if no-ssl "http" "https")))
  (add-to-list 'package-archives (cons "melpa" (concat proto "://melpa.org/packages/")) t)
  (when (< emacs-major-version 24)
    (add-to-list 'package-archives '("gnu" . (concat proto "://elpa.gnu.org/packages/")))))
(package-initialize)

その後,package-install reports "no match" - Emacs Stack Exchange に従い,以下の操作を Emacs 上のミニバッファで行うことによりパッケージの一覧を更新しました *1

M-x package-refresh-contents

Auto-Complete の導入と設定

Auto-Complete は,その名の通り, Emacs におけるコードの自動補完を支援するためのパッケージです.主に上記ページの指示に従い,以下のようにこれをインストールし,設定しました.

まずは,MELPA から同パッケージを取得し,導入しました.これは Emacs 上で以下のコマンドを入力して行いました *2

M-x package-install RET auto-complete

auto-complete-clang-async および clang-complete の導入

Auto-Complete だけでも一応の補完はできるものの,標準関数の補完などは働きません.そこで,標記のパッケージを導入しました.Emacs 用のパッケージ auto-complete-clang-async がコマンド clang-complete と連携することにより,補完機能がより便利になるというものです.なお,以下の手順は GitHub - Golevka/emacs-clang-complete-async: An emacs plugin to complete C and C++ code using libclang および emacsのauto-complete-clang-asyncパッケージの使い方 - Narrow Escape を参考にしたものです.

まずは,clang-completeを導入しました.シェル上で適当なディレクトリに移動し,以下の操作によりビルドとインストールを行いました.

sudo apt-get install -y clang llvm-dev libclang-dev
git clone https://github.com/Golevka/emacs-clang-complete-async
cd emacs-clang-complete-async
make
cp clang-complete ~/.emacs.d/

その次に,auto-complete-clang-async を導入しました.先ほどと同様に, Emacs 上で以下のコマンドを入力しました.

M-x package-install RET auto-complete-clang-async

そして,~/.emacs に以下の記述を加えました.

(require 'auto-complete-clang-async)

(defun ac-cc-mode-setup ()
  (setq ac-clang-complete-executable "~/.emacs.d/clang-complete")
  (setq ac-sources '(ac-source-clang-async))
  (ac-clang-launch-completion-process)
)

(defun my-ac-config ()
  (add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
  (global-auto-complete-mode t))

(my-ac-config)

これで,標準関数まで自動補完が有効になりました.

おわりに

ただ EmacsC/C++ソースコードを記述する際の自動補完を強化しただけですか,思いのほか時間と労力がかかってしまいました.もう少し Emacs の扱いに慣れ,基本的な仕組みを理解しなければならないと痛感しました.何か参考書などで体系的に勉強すべきかもしれません.

*1:M-x は,たとえば Alt キーを押し,それを離さずに続けて X キーを押し,その後両方を離すことに対応する.

*2:RET はエンターキー(リターンキー)の押下を意味する.