fc2ブログ

>> 古い記事: Script-Fu: 任意のタイミングで自動で連番ファイル名を決定して保存
<< 新しい記事: Script-Fu メモ

gimp-shell.el / gimp-mode を使ってみた

てきとーメモ。

gimp-shell.el

環境: 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 バッファに出力される。


20091014 追記: gimp-schell.el をいじるより cmuscheme とかをいじって Script-Fu に対応させた方が……などと考えましたが、 バージョンによって Script-Fu の仕様がいろいろ変わっていてくじけました……。

>> 古い記事: Script-Fu: 任意のタイミングで自動で連番ファイル名を決定して保存
<< 新しい記事: Script-Fu メモ
** ホームに戻る

コメント

コメントの投稿

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

|