minisoba blog

プログラミングと株式投資

EmacsユーザーがSublimeTextを使ってみた (C++設定編)

前回の基本設定編に引き続き、SublimeTextの話題です。

SublimeTextは、基本テキストエディタなので、IDE(Integrated Development Environmentの略)機能では、ちょっと見劣り感があります。というより、目的とするところが違うため一概には比較できないのですが... しかしながら、LSP-clangd(以下詳述)経由で言語サーバーと連携させることにより、IDE並みの開発ツールに変貌するのです。

今回は、SublimeText 4でのC++開発環境の構築方法を紹介したいと思います。 SublimeText歴が1ヶ月と短いので見落としているところ、もしくはもっと良い方法があるかもしれないのでそのときはコメントを頂けるとありがたいです。

ちなみに、SublimeTextの特に気に入っているところ:

などです。

※ ここでは、Linux(Ubuntu 22.04LTS)環境を想定していますので、macOSWindows上での動作確認はしていません。

インストール済パッケージ一覧
おまけ
必須ソフトのインストール

以下のパッケージをインストールします。

$ sudo apt-get update
$ sudo apt install clang clang-format
$ sudo apt install gcc-multilib g++-multilib

※ ちなみに、私の環境ではgcc-11の開発版がインストールされていたのですが直近のclangdでは標準ライブラリがうまく認識されませんでした。gcc/g++-multilibをインストールしたら、バージョン12が追加されうまく動作しました。

maron@minisoba:~$ ls -alrt  /usr/include/x86_64-linux-gnu/c++
total 20
drwxr-xr-x 16 root root 4096 Mar  7 06:35 ..
drwxr-xr-x  6 root root 4096 Apr  8 00:52 11
drwxr-xr-x  5 root root 4096 Apr 10 10:30 .
drwxr-xr-x  4 root root 4096 Apr 10 10:30 12

参考: https://stackoverflow.com/questions/74785927/clangd-doesnt-recognize-standard-headers

clangdとは


https://clangd.llvm.org

clangd understands your C++ code and adds smart features to your editor: code completion, compile errors, go-to-definition and more. clangd is based on the Clang C++ compiler, and is part of the LLVM project.

clangdは、LLVMプロジェクトで開発されたC++コンパイラをベースしたC++コードを動的に解析することを可能にする言語サーバー(Language Server)です。言語サーバープロトコル(以下、LSP)を介してエディタと通信することで、様々なIDE機能を提供することができます。LSPは、デファクトな標準規格なので、多くのエディタ向けにプラグインが開発されています。

  • コード補完機能
  • 動的コンパイルによるエラーチェック
  • コンパイルエラー検出時の回避方法の表示
  • コードナビゲーション
  • シンボル検索

など

図1. 動的コンパイルによるエラーチェック

図2. マウスカーソル上のシンボル情報の表示

clangdの機能詳細についてはここ(英語版)を参照してください。

LSP-clangdの設定方法

clangdをSublimeTextと連携させるためにはちょっとした準備が必要です。

Step 1: エディターのプラグインのインストール

言語サーバープラグイン(以下、LSP)とLSP-clangdのプラグインをパッケージコントロールからインストールします。

Step 2: Clangdの設定

まず、clangdにコード解析をするための基本情報を教えてあげる必要があります。やり方としては、CMakeベースのプロジェクトの場合cmakeファイルからcompile_commands.jsonを自動生成する方法と、予めコンパイラフラッグを定義したcompile_flags.txtを参照する方法があります。

compile_commands.json

# -DCMAKE_EXPORT_COMPILE_COMMANDS=1を追加する
$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..

私の場合は、個人用リポジトリが1つしかないのでcompile_flags.txtをプロジェクトのルートディレクトリにおいています。

gist.github.com ダウンロード

Step 3: LSP/LSP-clangdの設定

clagndの設定が完了したら、最後にSublimeTextの設定です。先述したとおり、LSP-clangdプラグインをインストールすることでSublimeTextをパワフルなIDEに変貌させることができます。 最近のJavaベースのGUI依存IDEよりも、テキスト(コード)編集に特化したSublimeTextに開発補助ツールを連携させるスタイルが、ちょうどいい距離感(なんのこっちゃ)があって非常に満足しています。

能書きはさておき、LSP-clangdプラグインの設定は以下のとおりです。LSP-clangdの設定は、パッケージレベルとプロジェクトレベルで設定することができます。

パッケージレベル(グローバル設定)では、 Preferences > Package Settings > LSP > Servers > LSP-clangd

プロジェクトレベルでは、プロジェクトファイルに直接書き込みます。

gist.github.com ダウンロード

自前でIDE機能を実装するよりも、コンパイラをベースにした独立した解析ツール(コンパイラに勝るコード解析ツールはない訳で)を実装し、標準プロトコルを介してエディタ機能を拡張させる方法はものすごくいいデザインだと思っています。以前でしたら、高度なIDE機能を使いたいがために重たいJavaベースの開発環境一択だったのが、LSPと接続することによりプログラマの好きなエディタでIDEなみのツールを手にすることできるのはとてもありがたいですね。

Tabnine - AIベースコード補完ツール

www.tabnine.com

巷では、ChatGPTが話題になっていますが、プログラミングの分野でもAIベースの開発補助ツールが散見されるようになりました。有名どころとして、GitHubのCopilotとTabnineがあります。Copilotは、GPT-3モデルをベースにしており、よりコンテクストベースなコードが生成できるのに対し、TabnineはGPT-2モデルをベースに学習させておりAIベースのコード補完ツールみたいです。こちらは、YouTubeから拝借したもので、CopilotはSublimeTextのプラグインはオフィシャルで提供されていないので、Tabnineを利用しています。

以下は、コード補完の例ですが、Tabnineが推奨するコードにはTabnineと右端に明記されています。ちなみに、既にあるコードをコメントしてどのようなコードが推奨されるか試したものです。コード補完としては、タイプする量がだいぶ減ったので今のところは満足しています。折を見て、AI開発ツールについても調べて見たいと思います。

参照: eremeev.ca