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

Re: bugs related to tabs



On 2019-05-24 13:08, Katsumi Yamaoka wrote:
> I realized those three bugs all started with the commit 1870402:
> ,----
> | commit 1870402fd2c46ff47c115d3aa7cd455935ec96c8
> | Author: Boruch Baum <boruch_baum@xxxxxxx>
> | Date:   Mon Apr 15 10:15:58 2019 -0400
> |
> |     BUGFIX: allow new tabs to be loaded in background
> `----

I can confirm this now, and can provide an explanation, solution and
patch. In that commit 1870402, I introduced using the emacs function
`clone-buffer' in order to greatly speed up processing. That function
seems to correctly copy a source buffer's local variables to the new
buffer, and seems to correctly set the major mode (see there); however,
for some reason those actions either don't seem to be applied or fully
applied. The attached version of w3m-copy-buffer explicitly performs
those actions (presumably a second time, but now it seems to stick), and
seems from my testing (now with a gui-enabled emacs) to fix the bugs.

A simple way to see what buffer-local variables should be copied is to
evaluate function (buffer-local-variables) from a w3m buffer.

Choosing to persist and fix the above commit (1870402...) will fix the
bugs mentioned in the commit message and retain the performance boost of
using function clone-buffer. For me, a question remains whether to post
to the emacs developers a bug-report against that function (ie.
clone-buffer), because it isn't doing what it says it should, even
though the code indicates that is. What this following patched version
of `w3m-copy-buffer' does is just repeat line-by-line verbatim what
`clone-buffer' should already have done to the source buffer's local
variables.


(defun w3m-copy-buffer (&optional buffer new-name background empty last)
  "Copy an emacs-w3m BUFFER, and return the new buffer.

If BUFFER is nil, the current buffer is assumed. If NEW-NAME is
nil, a name is created based upon the name of the current buffer.

If BACKGROUND is non-nil, do not switch to the new buffer copy.
When (and only when) this function is called interactively, this
value is determined by `w3m-new-session-in-background', but can
be inverted by calling this function with a prefix argument.

If EMPTY is non-nil, an empty buffer is created, but with the
current buffer's history and settings.

If LAST is non-nil, the new buffer will be buried as the final
w3m buffer; otherwise, it will be sequenced next to the current
buffer."
  (interactive
    (list nil nil (if current-prefix-arg
                    (not w3m-new-session-in-background)
                   w3m-new-session-in-background)))
  (unless buffer
    (setq buffer (current-buffer)))
  (unless new-name
    (setq new-name (buffer-name buffer)))
  (when (string-match "<[0-9]+>\\'" new-name)
    (setq new-name (substring new-name 0 (match-beginning 0))))
  (cond
   (empty
    (let ((coding w3m-current-coding-system)
          (images w3m-display-inline-images)
          (init-frames (when (w3m-popup-frame-p)
                         (copy-sequence w3m-initial-frames)))
          (new (w3m-generate-new-buffer new-name (not last))))
      (w3m-history-store-position)
      (with-current-buffer new
        (w3m-history-copy buffer)
        (setq w3m-current-coding-system coding
              w3m-initial-frames init-frames
              w3m-display-inline-images
                (if w3m-toggle-inline-images-permanently
                  images
                 w3m-default-display-inline-images)))
      (when (not background)
        (w3m-popup-buffer new))
      new ; return value for this function
      ))
   (t ; ie. (not empty)
    (let ((lvars (buffer-local-variables))
           new)
      (with-current-buffer buffer
        (setq new (clone-buffer new-name)))
      (set-buffer new)
      ;; Begin: This next should not be necessary, as it is a
      ;;         duplicate of code existing in function
      ;;         clone-buffer.
    ; (w3m-mode)
      (mapc (lambda (v)
	      (condition-case ()	;in case var is read-only
          (if (symbolp v)
            (makunbound v)
           (set (make-local-variable (car v)) (cdr v)))
          (error nil)))
        lvars)
      ;; End:  This next should not be necessary
      (if (not background)
        (switch-to-buffer new))
      new ; return value for this function
      ))))


--
hkp://keys.gnupg.net
CA45 09B5 5351 7C11 A9D1  7286 0036 9E45 1595 8BC0