Re: [twmode-users] automatic redisplay
> icon 取得を非同期にしておき、定期 redisplay 時に取得済み > かどうかを判断して描画するようにすれば icon の非同期更新 > にも利用できると思います。 icon取得を非同期にして、そのcallbackで描画してもいいのかな、 と思います。 ところで、twittering-get-tweetsでtwittering-retrieve-image を実行している理由が判らないのですが、どうしてでしたっけ? twittering-make-display-spec-for-iconでも取得しているので、 ここで取得しなくてもよいと思うのですが、何か理由があったの かなあ… > 松尾です。 > b21fce6e486d1ff16929ddd15d42675ebd11d158 > でtimeline表示の部分更新を導入したため�...@での表示が > 更新されなくなっていた問題に対処しました。 > http://github.com/cvmat/twittering-mode/tree/auto-redisplay > にcommitしてあります。色々試していただけると助かります。 > 新しい timer 変数 twittering-timer-for-redisplaying を > 用意して、この timer で定期的に関数 > twittering-redisplay-status-on-buffer が呼び出される > 仕組みになっています。 > twittering-redisplay-status-on-buffer は *twittering* > buffer 内の 'need-to-be-updated property がnon-nilの値を > 持つ部分を探して更新します。 > 更新時には need-to-be-updated property の値をLISPの > 関数呼び出しのS式と思って解釈し、その結果の文字列で > 該当箇所を置き換えています。 > icon 取得を非同期にしておき、定期 redisplay 時に取得済み > かどうかを判断して描画するようにすれば icon の非同期更新 > にも利用できると思います。 > 現状、ひとつよく分からない点があって、 > 「scroll-modeにしておき、*twittering* bufferをC-x b等で > 非表示にした状況」で放置しておいて、 > 再び *twittering* buffer に戻るとカーソル位置のstatusが > 元々のものとは違うものになっている場合があります。 > *twittering* buffer を表示している場合にはこの現象は > 起こらないようです。 > また、 windows.el で window-configuration を保持した > まま非表示にしている場合も起こらないようです。 > ある twittering-timer-for-redisplaying が起動している > ときに twittering-timer が起動すると何か問題があるのかも > しれません。実際、現状は以下のようになってますが、 > (defun twittering-redisplay-status-on-buffer (&optional buffer) > (let ((buffer (or buffer (twittering-buffer))) > (deactivate-mark deactivate-mark)) > (with-current-buffer buffer > (save-excursion > (twittering-for-each-property-region > 'need-to-be-updated > (lambda (beg end value) > (let* ((func (car value)) > (args (cdr value)) > (updated-str (apply func args)) > (buffer-read-only nil)) > (delete-region beg end) > (goto-char beg) > (insert updated-str))) > buffer) > これのbuffer-read-onlyを束縛する場所をずらして > (defun twittering-redisplay-status-on-buffer (&optional buffer) > (let ((buffer (or buffer (twittering-buffer))) > (deactivate-mark deactivate-mark)) > (with-current-buffer buffer > (setq buffer-read-only nil) > (save-excursion > (twittering-for-each-property-region > 'need-to-be-updated > (lambda (beg end value) > (let* ((func (car value)) > (args (cdr value)) > (updated-str (apply func args))) > (delete-region beg end) > (goto-char beg) > (insert updated-str))) > buffer)) > (setq buffer-read-only t > とすると時折 read-only 関連の警告が表示されます。 > --- > 松尾 直志 -- 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
Re: [twmode-users] automatic redisplay
松尾です。 > > > > 現在のこの実装では、*twittering*が表示されていない場合は、 > > get-buffer-window-listはnilを返すと思います。window-listに > > 期待した値が設定されていないのではないでしょうか。 > > 昔のコードでは scroll-mode の時に、カーソル移動となっていましたが、今のコー > ドでは逆に scroll-mode でない時にカーソル移動になっているようです。 > (render 前の (point) が保存される感じです) > > なので、 scroll-mode で additional が t の時には window-list も > point-window-list も使われないように思います。 はい。 scroll-mode では window-list も point-window-list も 使わない実装になっています。 insert-before-markers で status を追加すると自動的にそれに 合わせて marker も動いてくれるので、 scroll-mode では使う 必要がなくなっています。 window-list や point-window-list を使うのは mapc の第2引数と してだけなので、 nil の場合には mapc で指定した処理が行われ ないだけで影響はないはずです。 どこでカーソルが移動しているのかは分かりませんが、もしかすると save-excursion の範囲が広過ぎて他の process から割り込まれて いるのかもしれません。そこで save-excursion の範囲を限定する パッチを書いてみました。 現在の hayamiz/master のHEAD ed67225499f77cadc419a4deffb13e3cace53b5c に対するパッチです。 これを当ててもカーソル移動の問題が起きるでしょうか。 --- 松尾 直志 diff -r dcc04eee46d1 twittering-mode.el --- a/twittering-mode.elMon Feb 01 00:45:29 2010 +0900 +++ b/twittering-mode.elTue Feb 02 23:59:13 2010 +0900 @@ -1900,27 +1900,27 @@ window-list))) (twittering-update-mode-line) (setq buffer-read-only nil) - (save-excursion - (unless additional - (erase-buffer)) - (let ((pos (twittering-get-first-status-head))) - (mapc - (lambda (status) -(let* ((id (cdr (assoc 'id status - ;; Find where the status should be inserted. - (while - (let* ((buf-id (get-text-property pos 'id))) -(if (and buf-id (twittering-status-id< id buf-id)) -(let ((next-pos - (twittering-get-next-status-head pos))) - (setq pos (or next-pos (point-max))) - next-pos) - nil))) - (unless (twittering-status-id= id (get-text-property pos 'id)) -(let ((formatted-status - (twittering-format-status -status twittering-status-format)) - (separator "\n")) + (unless additional + (erase-buffer)) + (let ((pos (twittering-get-first-status-head))) + (mapc +(lambda (status) + (let* ((id (cdr (assoc 'id status +;; Find where the status should be inserted. +(while +(let* ((buf-id (get-text-property pos 'id))) + (if (and buf-id (twittering-status-id< id buf-id)) + (let ((next-pos + (twittering-get-next-status-head pos))) +(setq pos (or next-pos (point-max))) +next-pos) +nil))) +(unless (twittering-status-id= id (get-text-property pos 'id)) + (let ((formatted-status + (twittering-format-status + status twittering-status-format)) +(separator "\n")) +(save-excursion (goto-char pos) ;; Use `insert-before-markers' in order to keep ;; which status is pointed by each marker. @@ -1928,8 +1928,8 @@ ;; Now, `pos' points the head of the status. ;; It must be moved to the current point ;; in order to skip the status inserted just now. - (setq pos (point)) - twittering-timeline-data))) + (setq pos (point))) +twittering-timeline-data)) (if (and twittering-image-stack window-system) (clear-image-cache)) (setq buffer-read-only t) -- The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com___ twmode-users mailing list twmode-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/twmode-users
Re: [twmode-users] automatic redisplay
;; ぼくもさっと読んだだけですが… yata_git...@y.haun.org writes: > 外しているかもしれませんが、気づいた点を。 > >> 「scroll-modeにしておき、*twittering* bufferをC-x b等で >> 非表示にした状況」で放置しておいて、 >> 再び *twittering* buffer に戻るとカーソル位置のstatusが >> 元々のものとは違うものになっている場合があります。 > >> *twittering* buffer を表示している場合にはこの現象は >> 起こらないようです。 > > 現在のこの実装では、*twittering*が表示されていない場合は、 > get-buffer-window-listはnilを返すと思います。window-listに > 期待した値が設定されていないのではないでしょうか。 昔のコードでは scroll-mode の時に、カーソル移動となっていましたが、今のコー ドでは逆に scroll-mode でない時にカーソル移動になっているようです。 (render 前の (point) が保存される感じです) なので、 scroll-mode で additional が t の時には window-list も point-window-list も使われないように思います。 -- 青田 -- The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com ___ twmode-users mailing list twmode-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/twmode-users
Re: [twmode-users] automatic redisplay
外しているかもしれませんが、気づいた点を。 > 「scroll-modeにしておき、*twittering* bufferをC-x b等で > 非表示にした状況」で放置しておいて、 > 再び *twittering* buffer に戻るとカーソル位置のstatusが > 元々のものとは違うものになっている場合があります。 > *twittering* buffer を表示している場合にはこの現象は > 起こらないようです。 (defun twittering-render-timeline (&optional additional) (with-current-buffer (twittering-buffer) (let* ((window-list (get-buffer-window-list (current-buffer) nil t)) (point-window-list (mapcar (lambda (window) (cons (window-point window) window)) window-list))) 現在のこの実装では、*twittering*が表示されていない場合は、 get-buffer-window-listはnilを返すと思います。window-listに 期待した値が設定されていないのではないでしょうか。 -- The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com ___ twmode-users mailing list twmode-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/twmode-users
[twmode-users] automatic redisplay
松尾です。 b21fce6e486d1ff16929ddd15d42675ebd11d158 でtimeline表示の部分更新を導入したため�...@での表示が 更新されなくなっていた問題に対処しました。 http://github.com/cvmat/twittering-mode/tree/auto-redisplay にcommitしてあります。色々試していただけると助かります。 新しい timer 変数 twittering-timer-for-redisplaying を 用意して、この timer で定期的に関数 twittering-redisplay-status-on-buffer が呼び出される 仕組みになっています。 twittering-redisplay-status-on-buffer は *twittering* buffer 内の 'need-to-be-updated property がnon-nilの値を 持つ部分を探して更新します。 更新時には need-to-be-updated property の値をLISPの 関数呼び出しのS式と思って解釈し、その結果の文字列で 該当箇所を置き換えています。 icon 取得を非同期にしておき、定期 redisplay 時に取得済み かどうかを判断して描画するようにすれば icon の非同期更新 にも利用できると思います。 現状、ひとつよく分からない点があって、 「scroll-modeにしておき、*twittering* bufferをC-x b等で 非表示にした状況」で放置しておいて、 再び *twittering* buffer に戻るとカーソル位置のstatusが 元々のものとは違うものになっている場合があります。 *twittering* buffer を表示している場合にはこの現象は 起こらないようです。 また、 windows.el で window-configuration を保持した まま非表示にしている場合も起こらないようです。 ある twittering-timer-for-redisplaying が起動している ときに twittering-timer が起動すると何か問題があるのかも しれません。実際、現状は以下のようになってますが、 (defun twittering-redisplay-status-on-buffer (&optional buffer) (let ((buffer (or buffer (twittering-buffer))) (deactivate-mark deactivate-mark)) (with-current-buffer buffer (save-excursion (twittering-for-each-property-region 'need-to-be-updated (lambda (beg end value) (let* ((func (car value)) (args (cdr value)) (updated-str (apply func args)) (buffer-read-only nil)) (delete-region beg end) (goto-char beg) (insert updated-str))) buffer) これのbuffer-read-onlyを束縛する場所をずらして (defun twittering-redisplay-status-on-buffer (&optional buffer) (let ((buffer (or buffer (twittering-buffer))) (deactivate-mark deactivate-mark)) (with-current-buffer buffer (setq buffer-read-only nil) (save-excursion (twittering-for-each-property-region 'need-to-be-updated (lambda (beg end value) (let* ((func (car value)) (args (cdr value)) (updated-str (apply func args))) (delete-region beg end) (goto-char beg) (insert updated-str))) buffer)) (setq buffer-read-only t とすると時折 read-only 関連の警告が表示されます。 --- 松尾 直志 -- The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com ___ twmode-users mailing list twmode-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/twmode-users