松尾です。

> (4) カーソル位置が予期しない位置に移動する問題
> 
> 「navi2ch の jit が動いている時に twitering-mode の更新が入ると
>   navi2ch のカーソル位置がずれる」という指摘がTLに流れました。
> 
> これは、松尾さんが以前に書いていたこの件だと思います。
> 
> | 現状、ひとつよく分からない点があって、
> | 「scroll-modeにしておき、*twittering* bufferをC-x b等で
> |   非表示にした状況」で放置しておいて、
> | 再び *twittering* buffer に戻るとカーソル位置のstatusが
> | 元々のものとは違うものになっている場合があります。

この件ですが、どうやらEmacs 22.2のバグのようです。
以下の手順で再現できます。
----
1. emacsを素の状態で起動し、test.elを読み込む
   emacs -q --no-site-file --load test.el

2. M-x myprepare を実行

3. C-x bで"test buffer"に switch する
----

2.で実行した myprepare() の末尾で mytest() を呼んでいます。

(defun mytest ()
  (interactive)
  (with-current-buffer test-buffer-name
    (goto-char (point-max))
    (save-excursion
      (goto-char (point-min))
      (insert "a"))))

呼び出し後には "test buffer" での point が buffer 末尾に
移動しているはずなのですが、Emacs 22.2 では buffer の途中に
置かれてしまいます。

嫌らしいことに、3.で実際に switch するまでは末尾を指して
いるようです。(2.の後で M-x mycheck とすると確認できます)

いくつかのバージョンで試してみましたが Emacs 21.4、22.1では
問題ありませんでした。Emacs 22.2 はDebian lennyのものも
NTEmacsもアウトです。

問題発生せず:
GNU Emacs 21.4.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 
2008-08-19 on ninsei, modified by Debian
GNU Emacs 22.1.1 (i686-pc-cygwin) of 2007-07-19 on HERRING

問題あり:
GNU Emacs 22.2.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 
2008-11-10 on raven, modified by Debian
GNU Emacs 22.2.1 (i386-mingw-nt5.1.2600) of 2008-03-27 on A208752


下記のbugと関連があるのかもしれませんが、よく分かっていません。
"bug#197: marked as done (next-error wrong position in target file) -   
gnu.emacs.bug | Google グループ"
http://groups.google.co.jp/group/gnu.emacs.bug/msg/75284e1f162a69b1

"Emacs bug report logs - #367"
http://debbugs.gnu.org/db/36/367.html


対処法としては indirect buffer を使えばこの bug を回避できないか
と考えています。
"Indirect Buffers - GNU Emacs Lisp Reference Manual"
http://www.gnu.org/software/emacs/manual/html_node/elisp/Indirect-Buffers.html#Indirect-Buffers

---
松尾 直志 <t...@mymail.twin.jp>


(setq test-buffer-name "test buffer")
(defun myprepare (&optional arg)
  (interactive)
  (let ((height (window-text-height))
        (buffer (generate-new-buffer test-buffer-name))
        (shift (if (integerp arg)
                   arg
                 1)))
    (with-current-buffer buffer
      (mapc
       (lambda (e)
         (insert "a\n"))
       (make-list (+ shift height) nil)))
    (switch-to-buffer buffer)
    (goto-char (point-min))
    (unless current-prefix-arg
      (set-window-start (selected-window)
                        (line-beginning-position (1+ shift))))
    (switch-to-buffer "*scratch*")
    (mytest)
    ))

(defun mytest ()
  (interactive)
  (with-current-buffer test-buffer-name
    (goto-char (point-max))
    (save-excursion
      (goto-char (point-min))
      (insert "a"))))

(defun mycheck ()
  (interactive)
  (with-current-buffer test-buffer-name
    (message "%s %s %s %s" (point) (point-max) (point-marker) (mark-marker))))

(defun myswitch ()
  (interactive)
  (let ((before
         (with-current-buffer test-buffer-name
           (point))))
    (switch-to-buffer test-buffer-name)
    (message "before:%s, after:%s" before (point))))
------------------------------------------------------------------------------
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
_______________________________________________
twmode-users mailing list
twmode-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/twmode-users

メールによる返信