fc2ブログ

>> 古い記事: Script-Fu メモ
<< 新しい記事: Linux で freedb(freedbtest.dyndns.org) に日本語データを送信する

Emacs で Script-Fu を書いて実行させる / script-fu-shell.rb

環境: 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 の結果がうまく表示されない。
追記 20100913: 両方とも直しました。

Script-Fu ではありませんが、Emacs で Scheme を書くのって実際どんな感じなの? というのが垣間見れる動画があったので貼っときます。

Gaucheでライフゲームを作ってみた‐ニコニコ動画(ββ)


Gimp: 記事のもくじ

>> 古い記事: Script-Fu メモ
<< 新しい記事: Linux で freedb(freedbtest.dyndns.org) に日本語データを送信する
** ホームに戻る

コメント

コメントの投稿

管理者にだけ表示を許可する

|