martin rudalics writes: >> Keep place adds a hook so that, when a new message comes in on a >> non-visible buffer *and* point is at the bottom, point is moved up by >> one line. Doing this means that point stays on the last 'read' >> message. Here's the relevant code from keep-place: >> >>> (defun erc-keep-place (ignored) >>> "Move point away from the last line in a non-selected ERC buffer." >>> (when (and (not (eq (window-buffer (selected-window)) >>> (current-buffer))) >>> (>= (point) erc-insert-marker)) >>> (deactivate-mark) >>> (goto-char (erc-beg-of-input-line)) >>> (forward-line -1))) > > You could try to pretend that the position at which the buffer was > previously shown in a window is the position calculated here. Add after > the > > (forward-line -1) > > something like > > ;; For all non-minibuffer windows on all frames check whether the > ;; current buffer was shown in that window before. If so, update the > ;; window point positions stored for the buffer to the position we just > ;; calculated. > (dolist (frame (frame-list)) > (walk-window-tree > (lambda (window) > (let ((prev (assq (current-buffer) (window-prev-buffers window))) > (next (assq (current-buffer) (window-next-buffers window)))) > (when prev > (setf (nth 2 prev) (point-marker))) > (when next > (setf (nth 2 next) (point-marker))))) > frame nil 'nominibuf)) > > Completely _untested_ so you may have to tweak it appropriately! > >> Previously, this worked fine, since moving point on non-visible buffers >> meant the movement persisted till the buffer was next 'shown'. However, >> the new default of `switch-to-buffer-preserve-window-point' ensures that >> point stays wherever it was 'last seen'. I'm not sure how it does it, >> but I think it's saving point when a buffer is hidden and restoring it >> when it's seen again >> >>> (when (and entry >>> (or (eq switch-to-buffer-preserve-window-point t) >>> displayed)) >>> ;; Try to restore start and point of buffer in the selected >>> ;; window (Bug#4041). >>> (set-window-start (selected-window) (nth 1 entry) t) >>> (set-window-point nil (nth 2 entry))) > > Right. So with the hack above you would set (nth 2 entry) to the value > keep-place calculated. > >>> That's a possibility, but it would be too radical to go into 26.1, so >>> I think we should explore the less drastic alternatives first. >> >> I agree with Eli that this is too big of a change at this point, but I >> think this is the best long term solution. Perhaps we could >> `make-variable-buffer-local' on `switch-to-buffer-preserve-window-point' >> when enabling keep-place (later, of course). > > I can't yet assess all implications of such a solution so I'd certainly > defer it until all other measures have been exhausted. > >>> Since ‘keep-place’ is some sort of a minor mode, enabling it should warn >>> the user about the ‘switch-to-buffer-preserve-window-point’ >>> incompatibility. But I'm not familiar with ‘define-erc-module’ so we'd >>> probably need someone knowledgeable to do that. >> >> I think this is probably the best idea before the emacs 26 release. The >> definition of 'keep-place' is currently >> >>> (define-erc-module keep-place nil >>> "Leave point above un-viewed text in other channels." >>> ((add-hook 'erc-insert-pre-hook 'erc-keep-place)) >>> ((remove-hook 'erc-insert-pre-hook 'erc-keep-place))) >> >> I think we should be able to simply do something like >> >>> (define-erc-module keep-place nil >>> "Leave point above un-viewed text in other channels." >>> ((add-hook 'erc-insert-pre-hook 'erc-keep-place) >>> ;; poor name, but just an example >>> (erc-check-if-switch-to-buffer-preserve-and-warn)) >>> ((remove-hook 'erc-insert-pre-hook 'erc-keep-place))) >> >> I would be happy to submit a patch for this, if the Erc maintainer is >> busy. Does this seem like a good solution, or does anyone see a better >> way around this? > > If all else fails let's do that. First please try the proposal above. > > martin