Emacs で DxLib を使ったWindowプログラムをコンパイルする
最近はWindowsでDxLibを用いたWindowsプログラミングもやっている。
コンパイルにはbccを用いている。
VC++があまり好きではないという理由からだ。
(というか、もはやMicrosoftが好きではないのだが)
なので、開発環境にはBcc Developerを使用している。
しかし、当然それはEmacsではない。
XkeyEmacsでカーソルキーに移動は容易になったが、
しかし
- auto-completeを始めとした補完
- yasnippetを始めとしたテンプレート挿入
等、どうにも我慢できなくなったので、それならEmacsで開きながらコンパイルして実行できれば、とりあえずいいのではないかと考えた。
結論から言うと、以下のようなコマンドでコンパイル出来る。
(defun bcc32() (interactive) (let* ( (files-name (read-string "function's files: " "main")) (output-dir (read-string "output-dir: " "debug")) (command-string (format "bcc32 -W -3 -O1 -w- -AT -pc -H- -k -b -v -y -n%s -IC:\\borland\\directx\\DxLib_BCC\\bcc %s" output-dir files-name)) ) (message "%s\n%s" command-string (shell-command-to-string command-string)) ))
前提条件として、同一ディレクトリ内にあり、そのいずれかを現在バッファに開いている状態のとき、このコマンドを呼ぶ。
→ -IオプションはDxLib.hのあるディレクトリを指定する。
Windowsでいうとろの"\"は"\\"で表現するので注意。
Bccに追加すべきファイルとか書いてあるものを参考にする。
これを実行すると、まず、コンパイルするためのファイル名を聞きに来る。
例えば、main.cpp と function.cpp がある場合、この2つを指定する。
例:
main function
関数の実装が書かれていないファイルは、指定する必要はない。
また、output-dirはアウトプットするディレクトリで、この関数では新規作成しないので、自分で作っておく必要がある。
ファイル名の一番はじめに書いた方の名前で、.exeが作られるはずなので、これを実行すると、windowプログラミングが実行される。
尚、このコマンドではDLLやコマンドプロンプトの実行ファイルは作れない。
これを足がかりにすれば、もっと快適に出来るはずだ。
Windowsでも、快適なフォントを使う
Windowsでも、Emacs23を使っている。
ゲームをつくるときや、吉里吉里やTJSでプログラミングするときも、やはりEmacs23を使いたい。
しかし、いかんせん、WindowsとEmacsではかなり勝手が違う。
そこで可能な限り、WindowsとMacでのEmacsを同じにしてみたい。
まずは、フォントだ。
Macでは、Menloというフォントを使っている。
これが非常に快適で、美しい。
そこで、Windowsでもこのフォントを使いたかった。
が、どうやらかなり似たもので、簡単にインストールできるものがあった。
Bitstream Vera Sans Monoである。
これが非常に、よく似ている。そこで、以下をelispに入れてみた
(custom-set-faces '(default ((t (:inherit nil :stipple nil :background "black" :foreground "white" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 120 :width normal :foundry "outline" :family "Bitstream Vera Sans Mono")))))
これで、非常に快適なプログラミングができるようになった。
※これでフォントを変えると、幅と高さが見た目上変わるので、再調節が必要です。
■
php-modeで、メソッドを折りたたむものを、前回やりました。
その上、クラスのメンバで大きな配列を抱えている場合があります。
この配列も折りたたみたいです。
さらに、普通にadd-hookしたのにファイルを開いた瞬間にhideしてくれていないようで、
(何かがコンフリクトしてる?)
C-c C-f でhs-minor-modeを開始して同時に折りたたみ、その後toggleするように作り直しました。
そのコードが以下です。
対応emacs:23.3~
;; hs-hide-function (on php) (define-key php-mode-map (kbd "C-c C-o") 'hs-toggle-hiding) (defvar my-hs-state-hide nil) (defun hs-toggle() (interactive) (hs-toggle-mode) (if my-hs-state-hide (progn (hs-show-all) (setq my-hs-state-hide nil)) (progn (hs-hide-array)(hs-hide-function)(setq my-hs-state-hide t) ))) (defun hs-toggle-mode() (if (not hs-minor-mode) (hs-minor-mode))) (defun hs-hide-function() (interactive) (save-excursion (beginning-of-buffer) (while (re-search-forward "function.*?(.*?)" nil t) (if (search-forward "{" nil t ) (hs-hide-block))))) (defun hs-hide-array() (interactive) (save-excursion (beginning-of-buffer) (while (re-search-forward "array(" nil t) (hs-hide-block)))) (define-key php-mode-map (kbd "C-c C-f") 'hs-toggle)
php-mode で、全ての関数を折りたたむ
php-modeを使っていて、js2-modeの様に、メソッドや関数群を全て一気に折りたたみたい時がある。
今時折りたたみはよくある機能だ。
ちなみにjs2-modeでは、
C-c C-f
で全体の折りたたみをtoggleする。
さらに、
C-c C-o
で個別の折りたたみをtoggleする。
使ってみるとこれは超絶便利で、全体が簡単に俯瞰出来るので、非常に見通しが良くなる。
php-modeでも同じことをやりたいのは普通のことだ。
さて、これを可能にするのがhideshow.elだ。
ちなみに、emacs 23.3には標準的に内蔵されていて、
(hs-minor-mode)
をphp-modeのhookの中にでも書いておけば、すぐに使える。
しかし初期キーバインドは相当癖があるため、js2-modeに習うといいだろう。
js2-modeのように、ブロックをtoggleするのは、
hs-toggle-hiding
である。
しかし、hs-minor-mode時に、hs-hide-allすると、どうやらクラスを折りたたんでしまう。
それだけならまだしも、クラスを展開すると、クラスの中のメソッドは折りたたんでいない。
正直クラスは折りたたんで欲しくなく、全てのメソッドを折りたたんでほしい。
ので、自分で作ることにした。
自分の様な特殊な要望にしか答えられないelisp断片だけれども、備忘録のため、載せてみる。
;; hs-toggle-function (defvar my-hs-state-hide nil) (defun hs-toggle-function() "toggle all functions for php or c" (interactive) (if my-hs-state-hide (progn (hs-show-all) (setq my-hs-state-hide nil)) (hs-hide-function)) ) (defun hs-hide-function() (interactive) (setq my-hs-state-hide t) (save-excursion (beginning-of-buffer) (while (re-search-forward "function.*?(.*?)" nil t) (if (search-forward "{" nil t ) (hs-hide-block))))) (define-key php-mode-map (kbd "C-c C-f") 'hs-toggle-function)
これで、"C-c C-f"で、全体的にメソッド、関数部分がtoggleする。
個別のtoggleは、"C-c C-o"に割り当てたhs-toggle-hidingで行う。
たった一行書くだけで、Menloフォントでプログラミング
Mac OS 10.6で新しく導入されたフォント、Menloが綺麗だ。
ある一定周期ごとに色々設定を見直す癖があり、今回フォントを見なおしてみた。
emacsでMenloフォントを使うには、
dot.emacsに以下の一行を記述するだけで、Menloフォントになる。
(custom-set-faces '(default ((t (:height: 120 :background: "black" :foreground: "white" :weight normal :width: normal :slant normal :family "Menlo")))))
ちなみに、白背景を使っているかたは、:backgroundと:foregroundをひっくり返して欲しい。
その他、モードラインをもっと美しくするために、以下のように書いた。
(custom-set-faces '(mode-line ((t (:foreground "skyblue" :background "#222222" :box (:line-width 1 :color nil :style released-button))))))
さらに、選択領域がビビッドな青すぎるので、優しい色にしてみた。
(custom-set-faces '(region ((t (:foreground "black" :background "skyblue" )))))
このような少しの変更だけで、どんどん美しいエディタになるのは、emacsならではだ。
WindowsでMacする。
Macのキーボードバインドは、非常に明快です。
スペースキーの左で日本語、右で英語に変換できます。
このキーバインドに一旦慣れてしまうと、もはやWindowではストレスが溜まって仕方ありません。
少なくとも、この問題が解決しないと、Windowsでまともに作業できないのです。
様々なキーバインド変更プログラムを試しましたが、
そもそも完全にこの動作を再現するするキーがWindowsにないのです。
入れ替える等の問題ではないわけです。
この問題は、以下のページで解決しました。
http://hitaaki.blog47.fc2.com/blog-entry-20.html
このおかげで、非常に快適に、MaxOSXに近い環境を手に入れることができました!
[追記]
と思ったら、爆弾があったので、追記。
この拡張、Mac風ホットキーというのがあるのですが、これが有効になっていると、
C-g が
これは致命的w
C-gにこのようなキーバインドをするなんて、この作者は絶対にEmacsを使っていない。
これはMac風ホットキーをOFFにすれば、回避出来ます。
しかし、EmacsでC-gが効かなくなったときの絶望感は異常でした。