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

[xyzzy:03688] process-filter



おおいわ@東大理情です。はじめまして。
xyzzy 愛用させていただいています。

xyzzy-lisp でネットワークのクライアントを
書いていて、その中で process-filter を使おうと思っているのですが、
elisp のマニュアルにあるものをベースにちょっと改変して

(defvar my-process-premature-string "")

(defun my-process-filter (proc str)
  (let ((old-buffer (selected-buffer)))
    (unwind-protect
        (progn
          (set-buffer (process-buffer proc))
          (save-excursion
            (goto-char (point-max)) ;;(1)
            (while (string-match "\r?\n" str)
              (let ((line (concat my-process-premature-string
                                  (substring str 0 (match-beginning 0)))))
                (insert (format nil ">~A<~%" line))
                (setq my-process-premature-string "")
                (setq str (substring str (match-end 0)))))
            (setq my-process-premature-string str))
          (goto-char (point-max))) ;;(2)
      (set-buffer old-buffer))))

こんな感じのフィルタを書いたのですが、

1) このフィルタ自体はネットワークからデータが届いた時点で走る
 (goto-char を end-of-buffer にすると "Mark set" と表示される)
 のだが、結果が画面に反映されず、次のキー入力で一気に表示される。

2) (1) の goto-char の結果はきちんと反映され、内容はバッファの末尾に
 追加されるのだが、(2) の goto-char でバッファの最後が表示されるよう
 スクロールして欲しいのだがされない。C-x o でバッファを移動すると
 やっぱり point は元の位置にある。

という動作をするのですが、どのように修正すればいいでしょうか。

-- 
大岩 寛   Yutaka Oiwa        
       東京大学大学院 理学系研究科情報科学専攻 修士課程 米澤研究室
      <oiwa@xxxxxxxxxxxxxxxxxxxxx>, <yutaka@xxxxxxxxxxxxxxxxxxxxx>
PGP fingerprint = C9 8D 5C B8 86 ED D8 07  EA 59 34 D8 F4 65 53 61

Index Home