Emacs で Script-Fu を書いて実行させる / script-fu-shell.rb
環境: Ubuntu Studio 9.04 / Gimp 2.6.6 / Ruby 1.8.7 / Emacs 23.0.91.1
ダウンロード
ここから script-fu-shell.rb をダウンロードして適当なところに置いてください。
http://github.com/sonota/script-fu-shell/blob/master/script-fu-shell.rb
script-fu-shell.rb を単体で動かしてみる
Gimp を起動し、メニューから
[フィルタ > Script-Fu > サーバスタート]
(Gimp のバージョンによってメニュー位置が違います)
「サーバスタート」をクリックしてサーバを開始させます。
端末で
$ ruby script-fu-shell.rb
と実行するとプロンプトが表示され、
Gimp本体の Script-Fu コンソールを使うのと同じ要領で S式を書くと
対話的に実行されます。
たとえばプロンプトに続けて
(gimp-display-new (car (gimp-image-new 640 480 0)))
と入力しエンターキーを押すと、Gimp側で新規画像が表示されます。
Emacs から使う
手軽に試してみる
Emacs には最初から cmuscheme という Scheme用の便利なライブラリが付属しており、 これをそのまま利用することができます。
まず手軽に試してみたいという場合は
scratch バッファで
(setq scheme-program-name "~/test/script-fu-shell.rb")
などと書いて C-xC-e で評価し「Scheme インタプリタとして script-fu-shell.rb を使う」ように設定します。
次に M-x run-scheme すると、Script-Fu用のバッファが開きプロンプトが表示されます。 適当に S式を入力して試してみてください。
プロンプトの位置にカーソルを置いて M-p, M-n で履歴を前後に辿れます。
さらに便利に使う
.emacs に次を追加して保存。
(setq scheme-program-name "###/@@@/script-fu-shell.rb") ;; パスを書き換えてください。 (autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t) (autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t) ;; シェルを別ウィンドウで開く (defun scheme-other-window () "Run scheme on other window" (interactive) (switch-to-buffer-other-window (get-buffer-create "*scheme*")) (run-scheme scheme-program-name)) ;; キーバインド (define-key global-map "\C-cS" 'scheme-other-window)
新たに Emacs を起動し、 M-x scheme-mode で scheme-mode にし、
その状態で C-cS(scheme-other-window)で次の画面のような状態になります。
上がスクリプトを書くウィンドウ、下が Script-Fu シェル。
たとえば上のバッファで (+ 1 (* 2 3)) と書き、
最後の括弧の次にカーソルを移動させて C-x C-e(scheme-send-last-sexp)すると
(+ 1 (* 2 3)) という S式がシェルに送られ、
評価した結果が表示されます。
キーバインドなど
cmuscheme をそのまま利用しているだけなので、キーバインドなどは同じものが使えます。
まずはリージョンをシェルに送る scheme-send-region(C-cC-r)や
カーソル位置のトップレベルの S式を送る scheme-send-definition(C-cC-e)、
カーソル以後の S式にリージョン設定する mark-sexp(C-M-SPC)
あたりを使ってみると良いと思います。
参考: Karetta|Gaucheプログラミング(立読み版)|EmacsからGaucheを使う
scheme-other-window を実行した後元のウィンドウに戻って欲しいのと、 C-cS が押し辛いので私は次のようにしています。
(defun scheme-other-window () "Run scheme on other window" (interactive) (let ((win (selected-window))) (switch-to-buffer-other-window (get-buffer-create "*scheme*")) (run-scheme scheme-program-name) (select-window win) )) (define-key global-map "\C-c\C-s" 'scheme-other-window)
その他
今のところ次のような不具合があります。。。
- ドット対を評価するとエラーになる。
- tracing の結果がうまく表示されない。
Script-Fu ではありませんが、Emacs で Scheme を書くのって実際どんな感じなの? というのが垣間見れる動画があったので貼っときます。
Gaucheでライフゲームを作ってみた‐ニコニコ動画(ββ)
Gimp: 記事のもくじ
- 2009/10/18
- | tag: Gimp Ruby
- | trackback: 0
- | comment: 0
-
|