文字を左から右とか右から左に流してみる

昨日の続き的感じで.
まずは左から右に文字を動かしてみる. 左から右はすぐにでけた.

(let* ((face   'highlight)
       (defstr "ほげ")
       (loops  (- (window-width) (string-width defstr)))
       ep)
  (save-excursion
    (goto-char (window-start))
    (forward-line 1)
    (setq ep (point)))
  (dotimes (i loops)
    (let ((str defstr) ol)
      (setq ol (make-overlay (window-start) ep))
      (setq str (concat (make-string i ? )
                           str
                           (make-string (- (window-width)
                                           (+ (string-width str) i))
                                        ? )
                           "\n"))
      (setq str (propertize str 'face face))
      (unwind-protect (progn
                        (overlay-put ol 'after-string str)
                        (overlay-put ol 'invisible t)
                        (sleep-for 0.1)
                        (discard-input)
                        (redisplay))
        (delete-overlay ol))))
  (discard-input))

sit-forじゃ駄目. 文字を入力すると止まる
sleep-forをそのまま使うと駄目.
redisplayをしてやらないと再描画されない.
そして, それだけでも駄目.
discard-inputをredisplayの前にしてやらないとキーボードから入力があると止まる.



次に文字を右から左に流してみる.
とりあえず作ってみたけど, かなり不満. 日本語に対応させようとして失敗してるなあ.
動くには動くけど, ね.

(let* ((face         'highlight)
;;       (defstr       "あいうえおabcde")
       (defstr       "abcde")
       (defstr-width (length defstr))
       (loops        (+ (window-width) defstr-width))
       (spc 0)
       ep)
  (save-excursion
    (goto-char (window-start))
    (forward-line 1)
    (setq ep (point)))
  (dotimes (i loops)
    (let* ((str     (cond
                     ((>= defstr-width i)
                      (substring defstr 0 i))
                     ((>= spc (window-width))
                      (substring defstr (- spc (window-width))))
                     (t
                      defstr)))
           (strdiff (- (string-width str) (length str)))
           ol)
      (setq spc (+ i strdiff))
      (setq ol (make-overlay (window-start) ep))
      (setq str (concat
                 ;; left side space
                 (make-string (cond
                               ((>= defstr-width i)
                                (- (window-width) spc))
                               ((>= spc (window-width))
                                0)
                               (t
                                (- (window-width) spc)))
                              ? )
                 str
                 ;; right side space
                 (make-string (cond
                               ((>= defstr-width i)
                                0)
                               ((>= spc (window-width))
                                (- (+ loops) spc))
                               (t
                                (- i defstr-width)))
                              ? )
                 "\n"))
      (setq str (propertize str 'face face))
      (unwind-protect (progn
                        (overlay-put ol 'after-string str)
                        (overlay-put ol 'invisible t)
                        (sleep-for 0.05)
                        (discard-input)
                        (redisplay))
        (delete-overlay ol))))
  (discard-input))

左から右バージョンとの違いに, ニコニコみたいに1文字ずつぴょこっと表われていく感じにして,
左端に到達したらやはり先頭の文字から消えていく感を出そうかなとしてぐらい.
幅がねー日本語だと2文字分になるからややこしくなる. 空白で埋めてるからその計算がねー. ややこしい.
それが無ければねえ, いいんだけど.
アルファベットだけなら文字幅は固定だから問題なす.

更新時刻

2008年, 5月31日, 23:50