Py淡

Python, Python, Python! In the spirit of "import antigravity"

Sublime TextのミニマップみたいなGeanyプラグインOverviewをウィンドウズでビルドしてみた。

f:id:i-namekawa:20150716180047j:plain

 

f:id:i-namekawa:20150716180051p:plain

Sublime Textのミニマップはとてもかっこいい見た目だし、しかも使ってみると便利。Geanyから乗り換えようと何度か したことがあるけども、SublimeからOpenCVを使うとnamedWindowの挙動がたまに変なので結局戻ってきてしまった。

Sublimeもちゃんと設定すれば快適になるだろうけど、GeanyはPythonとの相性がよくなんの設定もなくいきなり使い始められる。パスが通っているPythonが使われるが、必要ならビルドコマンドをいじってPython27とPython34とか切り替えるのも非常にわかりやすい。

Geanyに「ミニマップさえあれば完璧なのに!」とダメ元でググってみたらなんとcodebrainz氏がひと月前の2015年3月にOverviewというGeanyプラグインをGitHubで公開していました。

メーリングリストでのアナウンスメントは3月12日ですね。GitHub上のスクリーンショットではLinuxっぽい画面ですが、GeanyはクロスプラットフォームGtkアプリだし、codebrainz氏の他のGitHubのプロジェクトはウィンドウズもサポートしているようなので自分でビルドしてみました。

私は、wafをつかったビルドシステムも初めてだったし、C/C++のプロジェクトのビルドはほとんど経験がなかったので不安でしたが、公式ウィキのBuild Geany on Windowsにある指示どうりにやったら初心者の私でも大体問題なくできました。

ただ、まったく問題がなかったわけでもないので覚書として記事にしておきます。

使い勝手ですが、かなり良いです。本家のSublimeに比べると多少もっさりした動作ですが、ミニマップをクリックしたままドラックする感じでするすると上下に移動すると速く快適です。これならデフォルトのスクロールバーもいらないかなと。Zoom設定を-100くらいにすると見栄えもSublimeっぽくなります。

ディペンデンシーのインストール

公式なプラグインを集めたgeany-pluginsというGitHubのプロジェクトにoverviewプラグインがすでに含まれているので、これをクローンしてビルとします。

手順としては、公式ウィキのBuild Geany on Windowsの通りにまずGeanyをビルドして、それからgeany-pluginsをビルドします。

まずはGeanyが依存するパッケージをインストールしていきます。

    Git
    Python
    Perl
    NSIS
    UnxUtils
    GTK+
    Gettext
    DocUtils

GitとPython27に関してはもうインストールしてあったものを使い回しました。Perlはなんで必要なのかと思いましたが、Strawberry Perlだとmingw-gccとか色々とついてくるらしく、Strawberry Perlのインストール後に自動でパスもbinに通ってこれがGeanyのビルドにも使われているようです。

その後、geany-pluginsが依存するパッケージをとってきます。zip形式ですが、c:\libsというフォルダをつくって、ここに解凍して順番とか気にせずどんどん上書きします。

geany-pluginsにはLuaプラグインも含まれていたりする関係でLua for Windowsもインストールします。

その後、書いてある通りウィンドウズの環境変数のPathを設定します。Perlに関してはすでにインストーラーがパスを 追加してました。

私の場合、pythonxyがC:\MinGW32-xyとかC:\Program Files (x86)\pythonxy\gettext\binにパスを追加していて、gettextが干渉してしまったのでpythonxy関係のもの(下記)は全部外しました。

C:\MinGW32-xy\bin;C:\Program Files (x86)\pythonxy\SciTE-3.3.2-3;C:\Program Files (x86)\pythonxy\console;C:\Program Files (x86)\pythonxy\swig;C:\Program Files (x86)\pythonxy\gettext\bin;

私の場合、git cloneコマンドにproxyが必要でしたが、

git config --global http.proxy http://myproxy:8080

としてから

git clone git://github.com/geany/geany

としたらだめでしたが、よく考えたらプロキシはhttpプロトコルに設定してるので、

git clone http://github.com/geany/geany.git

としてうまくいきました。

Geanyをビルドする

いよいよPythonベースのビルドシステムwafでのビルドです。geanyをクローンしたフォルダから

python waf configure

とするとあっさり成功。なんと。./configureとかにはいい思い出がないのでこれは感動。

python waf build

では上で書いたようにpythonxyからのgettextが使われてエラーになったのでパスを外したら成功。

python waf install

もあっさり成功。これでgit/Geany内にGeany-1.25というフォルダができた。これがいまビルドされたもの。

Geany-1.25というフォルダにはプラグインのビルドに必要なヘッダーとpkgconfigファイルがあるので、これをC:/libsにコピーする。ウィキにあるスクリプトLinux用っぽいのでVERSIONとDESTに手直しが必要でした。


git\geany\geany-1.25フォルダ内の

include\geanyにあるヘッダーファイル
bin\geany-0.dll
libにあるもろもろのdll
lib\pkgconfig\geany.pc

がコピーされているようです。

プラグインのビルド

これでプラグインのビルドの用意が整いました。

git clone git://github.com/geany/geany-plugins

もしくは

git clone http://github.com/geany/geany-plugins.git

でクローンして、

geany-pluginsのフォルダへ行きます。ウィキではgeanyフォルダへ行けとありますが、間違いです。

python waf configure

すると

Checking for 'geany' >= 1.24             : not found
The configuration failed

というエラーでとまりました。

overviewプラグインのGitHubページには

If your Geany installation is in an usual place, you'll probably have to use the PKG_CONFIG_PATH environment variable so the build system finds the correct Geany build flags and paths.


とあり、PKG_CONFIG_PATH という環境変数を設定して、ターゲットのGeanyの場所がわかるようにしないといけないようです。

PKG_CONFIG_PATHの正しい値はなんなのかしばらく悩みましたが、ここを読む限りgeany.pcをコピーしたC:\libs\lib\pkgconfigにするのが正しいようです。

さらにgeany.pcの一行目は

prefix=geany-1.25

となっていますが、ここを

prefix=C:/git/geany/geany-1.25

などとちゃんとビルドされたgeanyがある場所に変更してやります。

wafでのビルド中に使われるpkg-configの実行ファイルは

C:\Python27\Lib\site-packages\gtk-2.0\runtime\bin>pkg-config.exe

のようなので、普通のcmdのプロンプト上で

set PKG_CONFIG_PATH=C:\libs\lib\pkgconfig

としてから

pkg-config geany --modversion

として正しいバージョンの1.25がでるのを確認し、再び

python waf configure

をするとこのエラーは解消し、configureができました。

python waf build

すると、今度はoverviewプラグインコンパイルエラーになりました。

..\overview\overview\overviewscintilla.c:270:28: error: 'CAIRO_ANTIALIAS_GOOD' u
ndeclared (first use in this function)
   cairo_set_antialias (cr, CAIRO_ANTIALIAS_GOOD);


どうやらCAIRO_ANTIALIAS_GOODという変数が未設定のようなので、

#define CAIRO_ANTIALIAS_GOOD             1

というラインをoverviewscintilla.cのソースのはじめの方に追加しました。値が1でいいのかどうか知りませんが、これでうまくコンパイルできました。

python waf install

の方もうまくいきました。

動作テスト

これでoverview.dllがビルドされているんですが、これをGeanyのリリース版の1.24に置いてみてもgeany-0.dllがないとエラーになります。

ちゃんとプラグインをビルドしたターゲットのGeanyバージョンでないと動かないようです。


ウィキには動作テストについてもインストラクションがあるので大体これに従って動作確認出来ました。

  • create directory: c:\git\geany_test
  • copy everything from c:\git\geany\geany-1.25 to c:\git\geany_test
  • copy bundled GTK runtine environment to c:\git\geany_test
  • copy everything from c:\git\geany-plugins\geany-plugins-1.25 to c:\git\geany_test
  • copy plugins dependencies from c:\git\geany-plugins\contrib to c:\git\geany_test

とあります。最初の2つは簡単ですが、3つ目は上の方でC:/libsにコピーしたGtkのライブラリなので

http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip

このzipを解凍して、c:\git\geany_testにコピーしました。
4つ目、c:\git\geany-plugins\geany-plugins-1.25は今自分でビルドしたgeany-pluginsですね。
最後のgeany-plugins\contribに関しては見つかりませんでしたので、無視しましたが大丈夫でした。

ここまで手作業でやれば、大丈夫でした。その下にある_geany_test.batというバッチファイルは同じことをするのだと思いますが、必要ありません。

バグ

動いたものの、いまのところコンフィグレーションのダイアログがまっさらで、ウィンドウズではうまく動かないようです。

f:id:i-namekawa:20150716180046j:plain


ダイアログが動かないので、設定にはプラグインの設定ファイルを直接編集することで可能ですが、Geanyの終了時にプラグインの設定ファイルが上書きされるので、Geanyを閉じて、Geany以外のエディタで編集します。設定ファイルのパスは

"C:\Users\UserName\AppData\Roaming\geany\plugins\overview\prefs.conf"

あたりのはずです。

内容は

[overview]
width=120
zoom=-80
show-tooltip=true
show-scrollbar=false
double-buffered=true
scroll-lines=6
overlay-enabled=true
overlay-inverted=false
visible=true
position=right
overlay-color=#ef440085cd28
overlay-alpha=0
overlay-outline-color=#ef440085cd28
overlay-outline-alpha=0

こんな感じで、ダイアログを開いた後ズームの設定がおかしくなるのでzoom=-100とかにするともとに戻ります。Zoom値はマイナスなので注意。

show-scrollbar=false
にすると縦のスクロールバーがなくなりsublimeっぽくなりますが、合ったほうが便利な気もします。スクロールバーの位置が右端だったらよかったのですが、今のところミニマップとエディターの間に来てしまうのが嫌で私は外しました。

今のところ1時間くらい平気ですが、残念ながら予期なくクラッシュすることがあるので本格的に使うのは止めにしました。Geanyはいま1.24ですが、1.25のリリースに含まれればいいですね。