From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Gergely Risko Newsgroups: gmane.emacs.devel Subject: Re: find-file-hook, recenter, scroll-conservatively and save-place Date: Fri, 01 Feb 2019 00:47:01 +0100 Message-ID: <87imy4tmoa.fsf@errge.nilcons.com> References: <877eelupkc.fsf@errge.nilcons.com> <5C52FCDD.7010803@gmx.at> <83y370zymm.fsf@gnu.org> <5C534206.7020100@gmx.at> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="34890"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: GNU Emacs with Gnus To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Feb 01 00:47:47 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gpM3e-00090h-Qe for ged-emacs-devel@m.gmane.org; Fri, 01 Feb 2019 00:47:46 +0100 Original-Received: from localhost ([127.0.0.1]:34609 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gpM3d-0003ZP-Pz for ged-emacs-devel@m.gmane.org; Thu, 31 Jan 2019 18:47:45 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:41143) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gpM33-0003ZE-H3 for emacs-devel@gnu.org; Thu, 31 Jan 2019 18:47:10 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gpM32-0002W4-LX for emacs-devel@gnu.org; Thu, 31 Jan 2019 18:47:09 -0500 Original-Received: from [195.159.176.226] (port=37350 helo=blaine.gmane.org) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gpM32-0002VQ-EI for emacs-devel@gnu.org; Thu, 31 Jan 2019 18:47:08 -0500 Original-Received: from list by blaine.gmane.org with local (Exim 4.89) (envelope-from ) id 1gpM31-0008QK-20 for emacs-devel@gnu.org; Fri, 01 Feb 2019 00:47:07 +0100 X-Injected-Via-Gmane: http://gmane.org/ Cancel-Lock: sha1:6X4Phib5xFAYUj41+2Gue+It+KY= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 195.159.176.226 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:232872 Archived-At: On 2019-01-31 19:44 (Thursday), martin rudalics writes: > When 'display-buffer' finds a '(window-start . recenter) ALIST entry > it would call 'recenter' after assigning the window buffer. I reproduced this behavior with advices and hooks in current Emacs, so we can play with it. This is a self-contained ~/.emacs (that I'm testing with --no-site-file --no-site-lisp --no-splash): -=-=-=-=-=-=-=-=-=-=- (save-place-mode 1) (setq vc-follow-symlinks t) (setq scroll-margin 3) (setq scroll-conservatively 101) (defvar-local nce/flagged-for-recenter nil) (defun nce/flag-for-recenter () (setq-local nce/flagged-for-recenter t)) (defun nce/recenter-if-flagged (ad-do-it buffer &rest args) (let ((window (apply ad-do-it buffer args))) (when (buffer-local-value 'nce/flagged-for-recenter buffer) (setq-local nce/flagged-for-recenter nil) (with-selected-window window (with-current-buffer buffer (condition-case nil (recenter) ('error t))))) window)) (add-hook 'find-file-hook 'nce/flag-for-recenter) (advice-add 'display-buffer :around 'nce/recenter-if-flagged) -=-=-=-=-=-=-=-=-=-=- It works quite well and it's a lot better than my previous find-file based solution (sent to Eli), because we only need one advice on display-buffer and not on all the various find file stuff. I only discovered one issue, startup.el contains this regarding command line parsing: -=-=-=-=-=-=-=-=-=-=- (let ((displayable-buffers-len (length displayable-buffers)) ;; `nondisplayed-buffers-p' is true if there exist buffers ;; in `displayable-buffers' that were not displayed to the ;; user. (nondisplayed-buffers-p nil)) (when (> displayable-buffers-len 0) (switch-to-buffer (car displayable-buffers))) <------ (when (> displayable-buffers-len 1) (switch-to-buffer-other-window (car (cdr displayable-buffers))) ;; Focus on the first buffer. (other-window -1)) (when (> displayable-buffers-len 2) -=-=-=-=-=-=-=-=-=-=- Here, the second file is properly recenterd, because it uses switch-to-buffer-other-window (so our display-buffer is called), but the first file is simply displayed with switch-to-buffer. So I guess we would have to put a recenter here in startup.el conditional on the buffer-local variable that was meant to display-buffer by the save-place hook. Or maybe replace the marked switch-to-buffer call with: (display-buffer (...) '(display-buffer-same-window)) Gergely