てきとーメモ。
環境: Ubuntu Studio 8.04 / Gimp 2.4.5 / Emacs 23.0.60.1
そのままでは動かなかったので、 以下の箇所を修正。
;; 修正前
(gimp-send-string
"(define (int--emacs-tostring item)
(cond ((number? item) (number->string item 10))
((string? item) (print-to-string item (string-append (substring item 0)
\" \" )))
((null? item) \"()\")
((eq? t item) \"t\")
((pair? item)
(string-append \"(\"
(unbreakupstr
(map int--emacs-tostring item) \" \") \")\"))
(TRUE item)))")
;; 修正後
(gimp-send-string
"(define (int--emacs-tostring item)
(cond
((number? item) (number->string item 10))
((string? item) item)
((null? item) \"()\")
((eq? #t item) \"#t\")
((pair? item)
(string-append
\"(\"
(unbreakupstr
(map int--emacs-tostring item) \" \")
\")\"))
(TRUE item)))")
「とりあえず動く」ようにしただけなので、 もっといいやり方があるはず……。
あとは send-last-sexp、send-definition があるだけでも違うので以下を適当に追加:
;; この2つの関数は cmuscheme から。ほぼそのまま。
(defun gimp-send-last-sexp ()
"Send the previous sexp to the Script-Fu process."
(interactive)
(gimp-send-region (save-excursion (backward-sexp) (point)) (point)))
(defun gimp-send-definition ()
"Send the current definition to the Script-Fu process."
(interactive)
(save-excursion
(end-of-defun)
(let ((end (point)))
(beginning-of-defun)
(gimp-send-region (point) end))))
...
;; キーバインド
(define-key gimp-mode-map "\C-c\C-r" 'gimp-send-region)
(define-key gimp-mode-map "\C-c\C-e" 'gimp-send-definition)
(define-key gimp-mode-map "\C-x\C-e" 'gimp-send-last-sexp)
使ってみる。
Gimp 側で Script-Fuサーバを開始させた後、
M-x gimp-shell で対話的に操作できる gimp-shell バッファが開く。
「You>」で始まるのがユーザの入力、
「Gimp>」で始まるのが Gimp の出力。
Gimp> Success Gimp> (EMACS-CALL gimp-set-cache-functions (1213 (gimp-context-get-foreground gimp-drawable-is-gray gimp-path-get-current gimp-vectors-set-linked gimp-context-set-default-colors gimp-parasite-attach gimp-clone-default gimp-drawable-fill gimp-image-parasite-attach plug-in-name2layer (略。大量に出る) gimp-layer-set-preserve-trans gimp-temp-PDB-name gimp-palette-set-background gimp-palette-set-foreground gimp-patterns-set-pattern gimp-convert-indexed gimp-layer-set-visible gimp-gradients-set-gradient))) Gimp> Script-fu is running ... You> 123 Gimp> 123 You> "foo" Gimp> foo You> nil Gimp> () You> () Gimp> () You> '(1 . 2) Gimp> Error: car: argument 1 must be: pair You> '(1 2) Gimp> (1 2) You> TRUE Gimp> 1
ドット対の場合がおかしい。
Gimp の関数も使ってみる:
You> (define img (car (gimp-image-new 200 100 0))) Gimp> Success You> img Gimp> 6 You> (gimp-display-new img) ;;=> 新しい画像ウィンドウが開く Gimp> (7) You>
M-p で履歴を上(古い方)に、 M-n で下(新しい方)に辿れる。
gimp-shell を動かしたままで 別のバッファ(たとえば scratch)に移動して M-x gimp-mode で gimp-mode にする。
バッファに適当な Script-Fuスクリプトを書き、
リージョンを設定して
M-x gimp-send-region
すると、選択した部分を実行した結果が gimp-shell バッファに出力される。