松尾です。

先日、アイコン画像を非同期で取得するようにしてから、カーソルが
意図しない位置に動くトラブルが起こっていましたが原因が分かり
ましたので報告します。現在のHEADではこの問題は起こらないと
思います。

現象としては非同期取得に使っているurl-retrieveに渡すcallback内で
bufferを切り替えると問題が起こるようです。
GNU Emacs 23.1.1 (i386-mingw-nt5.1.2600)
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.1.1 (i686-pc-cygwin) of 2007-07-19 on HERRING
で問題が起こるのを確認しています。

proxyを使うか使わないかでも変わるみたいで、callbackが実行される
タイミングが関係しているようです。

恐らく、同じbufferなのにsentinelとして起動しているcallback内と
通常のcommand loopで起動しているプロセスとで別々のカーソル位置を
持ってしまう場合があって、そのときにどちらのカーソル位置が生き
残るかで結果が変わってしまうのだと思います。
callback内で切り替えた先のbufferのカーソルだけが影響を受けるよう
なのでHEADではdummy bufferを用意してそちらに移るように変更しました。

問題を再現するコードを添付してあります。
emacs -q --no-site-file --load unintended-cursor-motion.el
として起動し、M-x mytest1を実行するとこちらの環境ではカーソル
位置が末尾に移動します。mytest1の代わりにmytest2やmytest3を実行
するとカーソル位置はbuffer先頭のままです。

---
松尾 直志 <t...@mymail.twin.jp>
(setq test-buffer-name "test buffer")
(defun myprepare (url)
  (switch-to-buffer (generate-new-buffer test-buffer-name))
  (insert "1\n2\n3\n")
  (url-retrieve url (lambda (&rest args) (set-buffer test-buffer-name)))
  (goto-char (point-min)))

(defun mytest1 ()
  (interactive)
  (myprepare "http://www.jp.debian.org/logos/openlogo-nd-50.png";))

(defun mytest2 ()
  (interactive)
  (myprepare "http://www.google.co.jp/images/logo_sm.gif";))

(defun mytest3 ()
  (interactive)
  (myprepare "http://www.jp.debian.org/Pics/lennybanner_indexed.png";))

------------------------------------------------------------------------------
_______________________________________________
twmode-users mailing list
twmode-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/twmode-users

メールによる返信