Code of Poem
Unknown programmer's programming note.

過ぎ去りしエディタを求めて

今回は言語とコーディングから少し離れて、テキストエディタについてゆるい感じで書いてみます。

Geanyをもうちょっと調べる

最初の方でも書いたんですが、このサイトの記事のためのコード書くのにはGeanyというIDEのようなテキストエディタを使ってきました。しばらく使ってみた感想としては思ったよりいけそうという感じです。いくつか不満点を挙げると、

こんなところです。不便に感じてはいたのですが、まあこんなもんだろうと、割り切って気にせず使っていました。Geanyのメニューにプラグインという項目があるのが目について、もしかしたらプラグイン入れればこういうのもできるのかもと思いちょっと調べてみました。

Geanyのプラグインをインストールする

手始めにaptでリストを出してみると色々出てきました。

apt list 'geany*'
一覧表示... 完了
geany-common/stable,now 1.33-1 all [インストール済み、自動]
geany-plugin-addons/stable 1.33+dfsg-1+b1 amd64
geany-plugin-autoclose/stable 1.33+dfsg-1+b1 amd64
geany-plugin-automark/stable 1.33+dfsg-1+b1 amd64
geany-plugin-codenav/stable 1.33+dfsg-1+b1 amd64
geany-plugin-commander/stable 1.33+dfsg-1+b1 amd64
geany-plugin-ctags/stable 1.33+dfsg-1+b1 amd64
geany-plugin-defineformat/stable 1.33+dfsg-1+b1 amd64
geany-plugin-doc/stable 1.33+dfsg-1+b1 amd64
geany-plugin-extrasel/stable 1.33+dfsg-1+b1 amd64
geany-plugin-gendoc/stable 1.33+dfsg-1+b1 amd64
geany-plugin-geniuspaste/stable 1.33+dfsg-1+b1 amd64
geany-plugin-git-changebar/stable 1.33+dfsg-1+b1 amd64
geany-plugin-gproject/stable 1.33+dfsg-1 all
geany-plugin-insertnum/stable 1.33+dfsg-1+b1 amd64
geany-plugin-keyrecord/stable 1.33+dfsg-1+b1 amd64
geany-plugin-latex/stable 1.33+dfsg-1+b1 amd64
geany-plugin-lineoperations/stable 1.33+dfsg-1+b1 amd64
geany-plugin-lipsum/stable 1.33+dfsg-1+b1 amd64
geany-plugin-lua/stable 1.33+dfsg-1+b1 amd64
geany-plugin-macro/stable 1.33+dfsg-1+b1 amd64
geany-plugin-miniscript/stable 1.33+dfsg-1+b1 amd64
geany-plugin-numberedbookmarks/stable 1.33+dfsg-1+b1 amd64
geany-plugin-overview/stable 1.33+dfsg-1+b1 amd64
geany-plugin-pairtaghighlighter/stable 1.33+dfsg-1+b1 amd64
geany-plugin-pg/stable 1.33+dfsg-1+b1 amd64
geany-plugin-pohelper/stable 1.33+dfsg-1+b1 amd64
geany-plugin-prettyprinter/stable 1.33+dfsg-1+b1 amd64
geany-plugin-prj/stable 1.33+dfsg-1+b1 amd64
geany-plugin-projectorganizer/stable 1.33+dfsg-1+b1 amd64
geany-plugin-sendmail/stable 1.33+dfsg-1+b1 amd64
geany-plugin-shiftcolumn/stable 1.33+dfsg-1+b1 amd64
geany-plugin-spellcheck/stable 1.33+dfsg-1+b1 amd64
geany-plugin-tableconvert/stable 1.33+dfsg-1+b1 amd64
geany-plugin-treebrowser/stable 1.33+dfsg-1+b1 amd64
geany-plugin-updatechecker/stable 1.33+dfsg-1+b1 amd64
geany-plugin-vc/stable 1.33+dfsg-1+b1 amd64
geany-plugin-workbench/stable 1.33+dfsg-1+b1 amd64
geany-plugin-xmlsnippets/stable 1.33+dfsg-1+b1 amd64
geany-plugins-common/stable 1.33+dfsg-1+b1 amd64
geany-plugins/stable 1.33+dfsg-1 all
geany/stable,now 1.33-1 amd64 [インストール済み]

geany-pluginsというが全てのパッケージを含めたもののようです。あまり重くしたくないけど、どれを入れればいいかわからないのでとりあえず入れてみることにしました。

sudo apt install geany-plugins

インストールして起動してみたところ重くなった感じはしないです。プラグインの管理のメニューに使えるプラグインがたくさん追加されました。ホームページもありました。

ctagsのプラグイン

なんか良さそうなのないかなと眺めていると、GeanyCtagsというのが目に止まりました。ctagsの名前は知っていましたが使ったことなかったです。良い機会なのでここで試してみます。

とりあえずプラグインマネージャでGeanyCtagsを有効にします。

GeanyCtags Plugin Manager

プロジェクト→プロパティ→ファイルパターン のところに*.cpp *.hpp *.h(スペース区切り)を追加します。

GeanyCtags Project Properties

プロジェクト→Generate tags を選択します。…するとエラーになりました。

find -L . -not -path '*/\.*' \( -name "*.cpp" -o -name "*.hpp" -o -name "*.h" \) | ctags --totals --fields=fKsSt --extra=-fq --c-kinds=+p --sort=foldcase --excmd=number -L - -f /home/userx/projects/geany/BlocksSDL.tags (in directory: /home/userx/projects/geany/BricksSDL/)
ctags: unrecognized option '--totals'
	     Try 'ctags --help' for a complete list of options.

どうもソースからインストールしたEmacs 27.1に含まれるctagsが --totals というオプションをサポートしていないためにエラーになるようです。

ctags --version
ctags (GNU Emacs 27.1)
Copyright (C) 2020 Free Software Foundation, Inc.
This program is distributed under the terms in ETAGS.README
which ctags
/usr/local/bin/ctags

/usr/bin/ctagsというパスにもctagsが存在しました。

/usr/bin/ctags --version
Exuberant Ctags 5.9~svn20110310, Copyright (C) 1996-2009 Darren Hiebert
  Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
  Optional compiled features: +wildcards, +regex

エラーメッセージに含まれるコマンドのctagsのところを /usr/bin/ctags に置き換えてターミナルから直接実行してみます。毎回やるのは面倒すぎますがとりあえず一度試してみたいのでやってみます。

cd /home/userx/projects/geany/BricksSDL
find -L . -not -path '*/\.*' \( -name "*.cpp" -o -name "*.hpp" -o -name "*.h" \) | /usr/bin/ctags --totals --fields=fKsSt --extra=-fq --c-kinds=+p --sort=foldcase --excmd=number -L - -f /home/userx/projects/geany/BlocksSDL.tags
43 files, 2972 lines (73 kB) scanned in 0.0 seconds (17444 kB/s)
414 tags added to tag file
414 tags sorted in 0.00 seconds

すると /home/userx/projects/geany/BlocksSDL.tags というタグファイルが作成されました。今気づいたのですがプロジェクト名が間違ってました。BlocksではなくBricksです。

エディタでシンボルにマウスカーソルを合わせて右クリックするとメニューに二つ追加されていました。

どちらか選択するとメッセージウィンドウにタグの出現箇所が表示されます。

メッセージのところをクリックするとその場所にジャンプできます。…それだけです。

認識するのはプロジェクト内に含まれるソースの範囲のみで、標準ライブラリの関数やSDLの型や関数までジャンプすることは出来ませんでした。タグ生成方法を工夫すればできるかと思いますが、GeanyCtagsの生成するタグではできませんでした。

Emacsではrtagsを使っていました。rtagsに比べるとすごく物足りないです。ないよりはいいかなと思える程度です。

この作業やってて気づいたことなのですが、GeanyCtagsを入れなくても最初から「タグ定義に移動 Ctrl+T」というメニューが存在していました。さらにCtrl押しながらシンボルをクリックするとジャンプできるようにもなっていました。こちらは使いやすいです。「使用箇所を検索 Shift+Ctrl+E」と「文書内で使用箇所を検索 Shift+Ctrl+D」も使いやすいです。もっと早く気づけばよかった!

GeanyCtagsのプラグインとしては何も設定が出来ず、使用するctagsのパスを変更することが出来ません。なので今の環境ではGeanyのメニューからタグを生成できないです。何とかしたいです。

まあ、Geany組み込みのタグジャンプの機能の存在を知っただけでも収穫があったので悪い気はしないです。

追記:プラグインのソースの、ctagsを呼び出してる部分にパスを/usr/bin/ctagsと書き換えることで無理やり解決しました。具体的にはgeany-plugins-1.37/geanyctags/src/geanyctags.cの237行目を以下のように変更しました。

cmd = g_strconcat(find_string,
-      " | ctags --totals --fields=fKsSt --extra=-fq --c-kinds=+p --sort=foldcase --excmd=number -L - -f '",
+      " | /usr/bin/ctags --totals --fields=fKsSt --extra=-fq --c-kinds=+p --sort=foldcase --excmd=number -L - -f '",
      tag_filename, "'", NULL);

この修正をしてmakeしてインストールしたら、メニューからタグを生成できるようになり一応は使えるようになりました。

デバッガを使う

プラグインのサイトをよく見るとDebuggerというプラグインもありました!しかし、Debian 10 Busterのリポジトリには含まれていないみたいで、aptでインストールすることが出来ません。すごく使ってみたいのでソースからインストールすることにします。

デバッガのプラグイン単体では配布されていないようなので、このページのリンクからすべてのプラグインのソースをダウンロードします。2021年2月8日時点での最新版のバージョンは1.37となっていました。githubのリポジトリからも取ってこれるのでこちらでもいいかもしれません。今回は1.37のソースをダウンロードしてきました。

適当な場所に展開します。

tar xzfv geany-plugins-1.37.tar.gz
cd geany-plugins-1.37

とりあえず何も考えず ./configure と叩いてみると、intltoolのバージョンが古すぎるとエラーになりました。intltoolというパッケージはインストールされていなかったので入れます。

sudo apt install intltool

もう一度 ./configure を叩くと、configure: error: Plugin Debugger depends on utilslib VTE support which is not available となりました。libvteというパッケージが必要なようです。

sudo apt install libvte-2.91-dev

再度 ./configure を叩くと、今度はパスしました。ビルドしたいのはdebuggerだけなのですが、まずutilsというのが必要になるようなのでそちらを先にmakeしてからdebuggerをmakeします。面倒だったら全部makeしてもいいかもしれないです。

cd utils
make
cd ../debugger
make

エラーがなければ出来たプラグインのファイルをGeanyのプラグインディレクトリにコピーします。

cp src/.libs/debugger.so ~/.config/geany/plugins/

これでGeanyのプラグインマネージャにDebuggerというプラグインが選択できるようになっていて、有効にすると画面下のペインにDebugというタブが現れます。

前回作ったブロック崩しで試しにデバッグしてみます。

ちょっとだけ設定の変更が必要です。

Geany Debugger Build Settings

デバッグを開始するにはデバッグウィンドウに実行ファイルのパスを入力するか選択して、右端にあるよく分からないアイコンをクリックします。ちょっと面倒です。

Geany Debugger Debug

ブロックが消えるところにブレークポイントを仕掛けました。うまくいけばブロックが消えるタイミングで停止します。

Geany Debugger Break

変数の中身もバッチリ見えてます!vectorの要素の中までは見えないみたいですが…OKです!

まだ全然使い込んでないので使い勝手の程や安定性は分からないです。ですがデバッガがあることを知っただけで俄然やる気が出てきました。デバッグウィンドウ右側に並んでいるアイコンが全部一緒でどれがどれかわからないくらい全然許せます。

一応アイコンもちゃんとインストールしておきます。

cd geany-plugins-1.37/debugger/img
sudo make install

こうすると /usr/local/share/geany-plugins/debugger にアイコンの画像ファイルがコピーされます。これで無事デバッグウィンドウのボタンのアイコンも表示されるようになりました。

clang-formatのプラグイン

そんなプラグインがあるなら最初から含まれているはずだろうし、きっとないんだろうなとあまり期待せずにぐぐってみたらなんと作っておられた方がいらっしゃいました。githubで公開されています

インストール手順は書かれてないけどスムーズにいきました。

git clone https://github.com/codebrainz/code-format.git
cd code-format/
./autogen.sh 
./configure
make
cp .libs/codeformat.so ~/.config/geany/plugins/

以上でエラーがでなければ、GeanyのプラグインマネージャにCode Formatterというプラグインが選択できるようになっているので有効にします。

ちゃんと必要な設定はできるようになっていて、保存時に自動でフォーマットするオプションとか選択範囲のみをフォーマットするオプションとか、フォーマットのスタイルを選択する設定とかあります。普段からclang-formatを使っている人なら迷うことなく使い始めることが出来ると思います。

Geany Code Format Settings

試しに走らせてみて感動しました・・・作者様に感謝です!

コード補完の強化

メニューに ツール→タグファイルを読み込む というのがあるのですが、選択するとファイルオープンのダイアログが表示されて、ファイルの種類が*.*.tagsとなっていてctagsで生成したファイルではなさそうで、これは一体何なのか気になっていました。どうもグローバルタグファイル(global tags files)というものらしく、こちらで配布されているのを読み込むと良いようです。とりあえずsdl-2.c.tagsとlibstdc__.cpp.tagsの2つを読み込んでみました。すると、SDL_CreateWindowとかが候補に出てきて、選択すると関数のパラメータなどがポップアップで表示されるようになりました。コールチップというようです。Shift+Ctrl+Spaceで表示されます。

メニューから手動で読み込んでも再起動するとクリアされてしまうようです。起動時に自動で読み込ませるには ~/.config/geany/tags ディレクトリの中に置いておけば良いようです。マニュアルに詳しく書かれています。

タグファイルを読み込んでも補完の使い勝手はいまいちな感じがします。例えば、std::に続けてCtrl+Spaceを押しても何も出てきません。std::findまで打つと、find_last_ofとかstringの関数が候補に現れたりします。もうちょっと何とかしてみたいです。

エディタの色

メニューの 表示→色の設定 からエディタのハイライトの色とかを変更できます。最初は2つしか入ってないです。

ぐぐったらGeanyのテーマが集められたページがありました。

使い方は簡単で、ダウンロードしたファイルを ~/.config/geany/colorschemes ディレクトリ以下に置くだけです。

ダークテーマもたくさんあるのですが、エディタ部分にしか反映されず、UIのサイドバーなどは白いままなので使いづらいです。とりあえず明るい色のテーマだけ全部インストールしておきました。気分によっていろいろ変えれて楽しいです。ダークテーマが使えないのが残念です。

フォント

この記事を書く前まではHackというフォントを使ってました。あまり不満はなかったのですがそこら中でHackを使っているのでちょっと違った雰囲気を出したく別のフォントを探してみました。

Source Code Proというのが目に止まり、インストールしてみました。ここに貼られていたスクリプトを実行するだけでした。日本語フォントは含まれていませんが、今のシステム設定だとフォールバックの日本語フォントVL ゴシックがうまく補ってくれて違和感なく表示されてます。ただ、半角文字と全角文字の幅の比率は1:2にならないので、それを前提にすると表示が乱れます。そのへんは割り切って使ってます。

Source Han Code JPというフォントもインストールしてみました。インストールは面倒でした。こちらは日本語フォントも含まれています。半角文字と全角文字の比率が2:3になるという変わったフォントです。英数文字はSource Code Proと非常に似通ってます。VSCodeやAtomではいい感じになるのですがGeanyだと日本語入力中やや未確定文字が崩れるのでSource Code Proを使うことにしました。

今後の予定

今まで短いプログラムしか書いてなかったので何も考えずにGeanyを素のまま使っていました。そろそろ乗り換え時期かなと思ってもいたのですが調べてみると色々あって楽しくなってきました。まだしばらくはGeanyを使い続けることになりそうです。