oeditの更新とか

ver.5.9.6.1 (Ver.6.0β) (2008-01-15)
<機能改善>
・クリップボードにあるテキストをschemeマクロとして実行する機能を追加
  マクロを実行(クリップボード)メニュー
・schemeインタプリタの改善
  editor-get-selected-stringなどで取得するテキストの改行コードを"\n"に変更
  選択範囲の位置を取得する手続き(editor-get-selected-area)を追加

http://www.hi-ho.ne.jp/a_ogawa/oedit/chlog.htm

この更新で相当対話的にマクロが実行できるようになったんじゃないだろうか。例えば、今かれているテキストを全部クリップボードに入れてクリップボードの中身を実行させるマクロとかも簡単に書けそうなのでxyzzyの*scratch*のように実行できそうな予感。実行結果が何処に出るのかは不明だが。クリップボード拡張で、適当に好きなマクロを選んで実行とかでUI的には楽な気がする。editor-get-selected-stringも改行を認識できたらしいので、前にぼやいてたeolpもやれば出来るんじゃないかとか。
 あんまりマクロが多機能になってしまうと付いていけなくなりそうなので、今ぐらいで慣れておけば結構scheme知らなくても何とかなりそうだなぁとかで、時々触ってみるテスト。

■以下マクロを触ってみたgdgdな話
前にぼやいてたeolpをoeditのマクロで試してみた感じ

(define (eolp)
		"end-of-line 現在の行が行末か調べる"
		(let* ((str (editor-get-row-string (editor-get-cur-row)))
			   (col (string-length str)))
		  (app-msg-box (= col (editor-get-cur-col)))
		  ))

ただしこれ、現在のキャレット位置のcharを調べたりして探すのは何か汎用性に乏しい幹事になってしまったので、止めて違う方法でやってみたとか。
ついでに作った前よりは少しマシなeol

;;C-e で行末へ
(define (end-of-line)
		"行末へ移動"
		(let* ((str (editor-get-row-string (editor-get-cur-row)))
			   (col (string-length str)))
		(editor-set-row-col (editor-get-cur-row) col))

■追記:後で気づいたけどこれ2バイト文字が間に入ると駄目だ。何か穴だらけな。

試してたafter-charとか

(define (char-after row col)
		"rowとcolで指定した場所の文字列を取得"
		(editor-set-select-area row col row (+ col 1))
		(let ((str (editor-get-selected-string)))
		  (editor-set-select-area row col row col)
		  str))
; 今のところ文字列でしか取得できないのでcharじゃないけどその辺は無視
; 後改行とかも取得できないから。

こんな風に適当にchar-afterっポイのを作ってみたけど文字列でしか取得できないのでアレコレとか。この辺は随分前に試したのを書いたけど、その細かい所の話とかもついでにメモ。
改行とかが取得できていないのは、下みたいな感じで文字列からキャラに見るやりかえるとかを試していたら分かったとか。

(define (char-test)
		"char-afterのtest"
		(let* ((row (editor-get-cur-row))
			   (col (editor-get-cur-col))
			   (chr (char-after row col))
			   )
		  (cond ((string=? chr " ")
				 (and (define chr #\space)
					  (char? chr)
					  (app-msg-box "#\space")
					  ))
				((string=? chr "\n")
				 (and (define chr #\newline)
					  (char? chr)
					  (app-msg-box "#\newline")
					  ))
				)
		  ))

これで全部、文字に変えるとやってたら気が狂いそうなのでやらないけど。まずcharに何とか変更する方法とかないのかと思ったけど付属のリファレンス見る限り文字の所にcharとかないんだよな。無理やりこんなのでcharにしてみるとか?

(define (char chr)
		"無理やりっぽいchar"
		(string-ref chr 0))

(define (test)
		(app-msg-box (char? (char "a")))
		)
(app-set-key "Ctrl+0" test)

お、一応charになってるっぽい。

editor-get-row-cntとeditor-get-cur-rowの話。下みたいにして適当にC-0を押して調べたらeditor-get-row-cntは1からカウント開始で4行のファイルなら評価の結果が4だけど、editor-get-cur-rowの方は0からカウント開始で4行目で調べても評価結果は3らしい。

(define (test)
		(app-msg-box (editor-get-row-cnt)
					 (editor-get-cur-row))
		)
(app-set-key "Ctrl+0" test)

一応2バイト文字とか改行も判断できそうなchar-afterを無理やりやってみたけど、なんだろうなこの酷さは。書いた奴のほとんどがバッドノウハウっぽい件について。まあいいや。気にしないで置こう。そのうち本家が対応しそうだし

(define (char-after row col)
		"rowとcolで指定した場所の文字列を取得"
		(editor-set-select-area row col row (+ col 1))
		(let ((str (editor-get-selected-string)))
		  (if (string=? str "") ;2バイト文字とかだったら
			  (and
			   (editor-set-select-area row col row (+ col 2))
			   (define str (editor-get-selected-string))
			   (if (string=? str "") ;eolやeofだったら
				   (if (= (+ 1 row)(editor-get-row-cnt))
					   (define str "")
					 (define str "\n"))
					)
			   ))
		  (editor-set-select-area row col row col)
		  str))

後から、一所についてたリファレンスを適当に見てたらread-charとか入出力っぽいのは元からモリモリあるらしかったので、何か探せば下からあるのがたくさんありそう。でもreturnが検索しても見つからないから鬱になってググったら。
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3A%E3%81%AA%E3%81%9CScheme%E3%81%AB%E3%81%AFreturn%E3%81%8C%E7%84%A1%E3%81%84%E3%81%AE%E3%81%8B
な、なんだってー!?ΩΩΩ!
schemeってのは基本っぽい関数が色々ないのはそんな理由だったのかとか。