[xyzzy:06959] Re: 入力文字数の制限
- Subject: [xyzzy:06959] Re: 入力文字数の制限
- From: MATUDA Rito <rito.m@xxxxxxxxxxxxx>
- X-mailer: EdMax Ver2.85
まつだです
hbwさんはじめまして
> xyzzyにて、入力する文字数を制限するということは可能なのでしょうか?
> 半角文字を1文字、全角文字を2文字と見て制限したいのですが・・・。
> そして、設定された文字数以上(たとえば100文字)を入力すると、
> 「制限を越えました」などとメッセージを表示するようにしたいのです。
> 例をあげると携帯電話のメールを作成するようなものです。
直接入力文字数を制限するのではないですけど、バッファのバイト数(携帯で
受信した時の)を表示するマクロがあれば便利かな、と思い書いてみました。
一応J-Phoneの制御文字込みのバイト数も計算してます。
お役に立つかどうかわかりませんが…。
;; 計算方法はYuichiさんのホームページからのぱくりです
;; http://www2u.biglobe.ne.jp/~yuichi/rest/strcount.html
;; 改行コードは1バイトとして数えてます(自信なし)
(defun rito-count-keitaimail-byte ()
(interactive)
(save-excursion
;; pre 0:英数 1:半角カナ 2:全角
(let ((bt 0) (ctl 0) (code 0) (pre 0))
(long-operation
(goto-char (point-min))
(while (not (eobp))
(setq code (char-code (following-char)))
(cond
;; 0x7E 半角英数
((<= code 126)
(incf bt)
(cond
((eq pre 1) (incf ctl)) ; カナ→英数
((eq pre 2) (incf ctl 3))) ; 全角→英数
(setq pre 0))
;; 0xA1-0xDF 半角カナ
((and
(<= 161 code)
(<= code 223))
(incf bt)
(cond
((eq pre 0) (incf ctl)) ; 英数→カナ
((eq pre 2) (incf ctl 4))) ; 全角→カナ
(setq pre 1))
;; 全角
(t
(incf bt 2)
(cond
((eq pre 0) (incf ctl 3)) ; 英数→全角
((eq pre 1) (incf ctl 4))) ; カナ→全角
(setq pre 2)))
(message "数えてます〜 ~6D/~6D" bt (+ bt ctl))
(forward-char 1))
(cond
((eq pre 1) (incf ctl)) ; カナで終わる
((eq pre 2) (incf ctl 3)))) ; 全角で終わる
(message-box
(concat
(format nil
"携帯で受信すると~Dバイト\n"
bt)
(format nil
"制御文字込みなら~Dバイト(たぶん)\n\n"
(+ bt ctl))
(format nil "DoCoMo\t:~A(~D円)\n"
(if (> bt 500) "×" "○")
(ceiling (* (/ bt 128) 0.3)))
(format nil "AU\t\t:~A(~D円)\n"
(if (> bt 10000) "×" "○")
(ceiling (* (/ bt 128) 0.27)))
(format nil "J-Phone\t:~A\n"
(if (> (+ bt ctl) 384) "×" "○"))
(format nil "J-Phone(L)\t:~A(~D円)\n"
(if (> (+ bt ctl) 6000) "×" "○")
(if (> (+ bt ctl) 384) 8 0))
"\n※受信料金のお見積は適当です")))))
--
松田 里都
rito.m@xxxxxxxxxxxxx