環境: Ubuntu Studio 9.04 / Gimp 2.6.6 / Ruby 1.8.7 / Emacs 23.0.91.1
ダウンロード
ここからダウンロードして適当なところに置いてください。
http://github.com/sonota/script-fu-shell/blob/master/script-fu-shell.rb
sonota's script-fu-shell at master - GitHub
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: 記事のもくじ