Emacs で DxLib を使ったWindowプログラムをコンパイルする


最近はWindowsでDxLibを用いたWindowsプログラミングもやっている。

コンパイルにはbccを用いている。
VC++があまり好きではないという理由からだ。
(というか、もはやMicrosoftが好きではないのだが)

なので、開発環境にはBcc Developerを使用している。

しかし、当然それはEmacsではない。

XkeyEmacsでカーソルキーに移動は容易になったが、
しかし

  • auto-completeを始めとした補完
  • yasnippetを始めとしたテンプレート挿入

等、どうにも我慢できなくなったので、それならEmacsで開きながらコンパイルして実行できれば、とりあえずいいのではないかと考えた。

そこで、コマンドラインbccを使ってコンパイルしてみる。

結論から言うと、以下のようなコマンドでコンパイル出来る。

(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を使いたい。

しかし、いかんせん、WindowsEmacsではかなり勝手が違う。

そこで可能な限り、WindowsMacでの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")))))

これで、非常に快適なプログラミングができるようになった。

※これでフォントを変えると、幅と高さが見た目上変わるので、再調節が必要です。

anythingはまさに、プログラマが楽をするための必須なツールだ。
しかし、少々やりすぎな部分もある。

例えば、最新のanythingをinstallすると、

iswitchb

を始めとするあらゆる標準コマンドが乗っ取られる。

これは少々いただけない。

特にiswitchbは気に入っていたので、もとに戻すことにした。

(require 'anything-startup)
(anything-read-string-mode)

(anything-read-string-mode)で、通常のminibuffer入力時にanythingが余計なことをしなくなる。

これで快適だ。

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 がになってしまいます。

これは致命的

C-gにこのようなキーバインドをするなんて、この作者は絶対にEmacsを使っていない。
これはMac風ホットキーをOFFにすれば、回避出来ます。

しかし、EmacsでC-gが効かなくなったときの絶望感は異常でした。