[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:06959] Re: 入力文字数の制限



まつだです
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

Index Home