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

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

ずっとEmacsを使ってきたのですが、C++Pythonの開発にしか使わないし、最近どうも重いと感じていたので以前購入したSublimeText 4を自分仕様にカスタマイズしてみました。基本、今まで使ってきたEmacsの設定をできる限り再現することを目標にしています。

以下、C++Python開発に利用しているパッケージ一覧です。

インストール済みパッケージ一覧
おまけ

(2023年4月現在)

SublimeTextキー設定

基本的に、Emacs Pro Eseentialsのキー設定を継承していますが、一部自分仕様に変更しています。(以下随時更新)

コマンド関連
機能ショートカットキー
shift+ctrl+pSublimeTextのコマンドパレットを表示する
ctrl+0サイドバーをフォーカスする
ctrl+x ctrl+c現在のファイルを保存して終了する
ctrl+x gコマンドのキャンセル
ファイル関連
ctrl+x ctrl+s現在のファイルを保存する
ctrl+x ctrl+m全てのファイルを保存する
ctrl+x ctrl+wSublimeTextの新規ファイル保存ダイアログを表示する
移動関連
ctrl+n次の行へ進む
ctrl+p前の行へ戻る
ctrl+f1文字進む
ctrl+b1文字戻る
meta+f1語進む
meta+b1語戻る
ctrl+v1画面分進む
meta+v1画面分戻る
esc+<ファイル先頭に移動する
esc+>ファイル末尾に移動する
ctrl+a行頭へ移動する
ctrl+e行末へ移動する
ctrl+u次に入力するコマンドを4回実行する (universal argument)
meta+0 ... meta+9次に入力するコマンドを数字の回数だけ実行する (numeric argument)
meta+-次に入力するコマンドを逆に実行する (negative numeric argument)
ウインドウ関連
ctrl+x 5 2新しいウインドウを表示する
ctrl+x 5 0現在のウインドウを閉じる
ctrl+x 1現在のウインドウ以外の全てのウインドウを閉じる
ctrl+x 2ウインドウを上下に2分割する
ctrl+x 3ウインドウを左右に2分割する
meta+shft+2 ... 5ウインドウを分割する(2-4: N列、5: 2行2列)
ctrl+x d現在のパネルを閉じる
ctrl+x o左のパネルに移動する
ctrl+x n左のパネルに移動する
ctrl+x p右のパネルに移動する
ctrl+x k現在のタブを閉じる
ctrl+fn+pgup左のタブへ移動する
ctrl+fn+pgdn右のタブへ移動する
ctrl+shift+1 ... NパネルをグルーブNに移動する (ウインドウがN分割されている場合)
ctrl+x ctrl+bSublimeTextのタブ選択パレットを表示する
ctrl+x }現在のパネルを広げる
(universal, numeric, and negative argumentと併用可)
ctrl+x {現在のパネルを狭める
(universal, numeric, and negative argumentと併用可)
ctrl+x P現在のタブを固定する
ctrl+x K現在のタブ以外の使用されていないN個パネルを閉じる
(universal, numeric, and negative argumentと併用可)
ctrl+x ctrl+fSublimeTextのタブ選択パレットを表示する
検索関連
ctrl+s前方検索を開始する
ctrl+r後方検索を開始する
ctrl+u ctrl+s正規表現の前方検索を開始する
ctrl+u ctrl-r正規表現の後方検索を開始する
ctrl+s ctrl+s最近検索した文字列を前方検索する
ctrl+r ctrl+r最近検索した文字列を後方検索する
meta+rSublimeTextの検索置換(Find-Replace)パレットを表示する
編集関連
ctrl+x h現在のバッファを全選択する
meta+c単語の最初の文字を大文字にする
meta+u単語を大文字にする
meta+l単語を小文字にする
ctrl+x ctrl+u選択された領域を大文字にする
ctrl+x ctrl+l選択された領域を小文字にする
ctrl+/Undo
ctrl+x uUndo
ctrl+shift+/Redo
ctrl+k行末まで削除する (削除した行はキルリングに蓄積)
ctrl+d右文字を削除する
backspace左文字を削除する
meta+d前方の単語を削除する (削除した単語はキルリングに蓄積)
(universal, numeric, and negative argumentと併用可)
meta+backspace後方の単語を削除する (削除した単語はキルリングに蓄積)
(universal, numeric, and negative argumentと併用可)
ctrl+meta+kS式単位(S-Expression)を削除する (削除した部分はキルリングに蓄積)
(universal, numeric, and negative argumentと併用可)
ctrl+space範囲の開始位置をマークする
ctrl+x ctrl+x現在位置とマーク位置を入れ替える
ctrl+space ctrl+space範囲の開始位置をマークして有効にする
ctrl+yマークから現在位置までの範囲をキルリング(貼り付け用のバッファ)にコピーする
ctrl+shift-aカーソルのある文字を選択する
マクロ関連
ctrl+x (マクロの記録を開始する
ctrl+x )マクロの記録を終了する
ctrl+x e記録したマクロを実行する
コード編集関連
alt+hインラインヘルプ表示 (C++/Python)
ctrl+c <インデント
ctrl+c >アンインデント
その他
ctrl+meta+hスペルヒントのオン/オフ
Default(Linux).sublime-keymapファイル

gist.github.com

ダウンロード

Ubuntuキー設定
コマンド関連
機能ショートカットキー
metaメニューを表示する
ctrl+meta+left/right仮想ウインドウを移動する
meta+f10アプリケーションウインドウに最大化にする
f11アプリケーションウインドウをフルスクリーンにする

DellノートブックPC上のLinuxで発生するファンのノイズ問題

以前、Dell Precision 5530ノートブックPCにUbuntu 20.04を新規インストールした際、ファンのノイズ問題が発生しました。GPUやCPUの状態に関わらず、常時ファンはフル稼働状態になってしまう問題、今回22.04へのアップグレードで再発してしまいましたので、解決方法を紹介します。

Step 1: i8kutilパッケージがインストールされているか確認
$ sudo dpkg-query -l | grep i8kutils
ii  i8kutils                                      1.43+nmu1                                   amd64        Fan control for Dell laptops

manpages.ubuntu.com

Step 2: dell-bios-fan-controlをビルド
$ git clone git@github.com:TomFreudenberg/dell-bios-fan-control.git
$ cd dell-bios-fan-control
$ make

github.com

Step 3: ファンのBIOSコントールを解除
$ ./dell-bios-fan-control 0
BIOS CONTROL DISABLED
Step 4: i8kctlによってファンの速度を設定
$ i8kctl fan 1 1
2 2
$

ファン速度の設定値は以下の通り、左右違った値を設定できます。

設定内容
0 オフ
1 低速
2 高速
- 変更無し

Emacs日本語入力をMozcに変更する

デフォルトの日本語入力システムからMozcに変更する方法を紹介します。

Step 1: emacs-mozc-binパッケージのインストール

$ sudo apt-get install emacs-mozc emacs-mozc-bin
Step 2: Emacsパッケージのインストール

M-X package-list-packagesを起動後、mozcパッケージをインストールし、以下の記述をEmacs設定ファイルに加えます。

(add-to-list 'load-path "/usr/share/emacs/site-lisp/emacs-mozc")
(require 'mozc)
(setq default-input-method "japanese-mozc")
(prefer-coding-system 'utf-8) 

こんな感じになります👏

Ubuntu 22.04LTSにCUDAをインストールする

株価分析に機械学習を応用したかったのでCUDAのインストールを試みたのですが、いきなり失敗、再起動したら黒画面でフリーズ!調べてみると、UbuntuでCUDAの設定トラブルが結構出てきたので、クリーンインストールすることにしました。

Step 1: BIOSチェック
  • Secure Bootがオフになっているか確認
Step 2: リカバリモードで再起動 (新規インストールでは不要)
  • GRUBコンソールを起動
  • 「Advanced options for Ubuntu」を選択し、"e" (エディット)キーを押す
  • linuxの最後に、"rw init=/bin/bash"を記述
  • Control-Xキーを押して、シングルユーザーモードで起動
Step 3: NVIDIAライブラリを削除
$ sudo apt-get remove --purge '^nvidia-.*'
$ sudo apt-get remove --purge '^libnvidia-.*'
$ sudo apt-get remove --purge '^cuda-.*'
Step 4: 再起動
Step 5: NVIDIA GPUドライバの確認
$ sudo ubuntu-drivers devices
[sudo] password for maron: 
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001CBAsv00001028sd0000087Dbc03sc02i00
vendor   : NVIDIA Corporation
model    : GP107GLM [Quadro P2000 Mobile]
driver   : nvidia-driver-510 - distro non-free recommended
driver   : nvidia-driver-390 - distro non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-418-server - distro non-free
driver   : nvidia-driver-510-server - distro non-free
driver   : nvidia-driver-450-server - distro non-free
driver   : nvidia-driver-470 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin
Step 6: NVIDIA GPUドライバをインストール
$ sudo apt install --no-install-recommends nvidia-driver-510
$ sudo apt install nvidia-prime
$ sudo apt install nvidia-cuda-toolkit
Step 7: 再起動
Step 8: インストールの確認

ブートが成功したら、GPUの業態確認
(失敗した場合は、Step 2に戻ってリカバリモードで再起動後、NVIDIAライブラリを削除)

$ prime-select query
nvidia
$ nvidia-smi
Sun Jun  5 15:27:56 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.73.05    Driver Version: 510.73.05    CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Quadro P2000        Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   68C    P0    N/A /  N/A |    765MiB /  4096MiB |      6%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      3826      G   /usr/lib/xorg/Xorg                500MiB |
|    0   N/A  N/A      4633      G   ...ome-remote-desktop-daemon        1MiB |
|    0   N/A  N/A      4684      G   /usr/bin/gnome-shell              118MiB |
+-----------------------------------------------------------------------------+

最後に、NVIDIA GPU、CUDAトラブルで検索すると色々なケースが出てくるので一概にこれという解決方法はないようです。カーネルモジュールとかドライバとか結構OS低レベルでハマることが多いので、Linuxにあまり興味がない人はWindowsもしくはMac上で環境構築したほうが無難かもしれません。

ちなみに、本ブログで紹介する自作システムは、特別な注意書きがない限りクロスプラットフォームで動作します。