From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.bugs Subject: bug#34179: 27.0.50; message hangs when buffer with process visible Date: Thu, 24 Jan 2019 19:47:02 +0100 Message-ID: <877eetnba1.fsf@web.de> References: <87fttj4dgj.fsf@web.de> <83ef938hik.fsf@gnu.org> <874l9yp50z.fsf@web.de> <87y37anpoj.fsf@web.de> <83pnsm6rxs.fsf@gnu.org> <878szanlua.fsf@web.de> <8736pinlk4.fsf@web.de> <87womum615.fsf@web.de> <87r2d2m5jf.fsf@web.de> <5C49E24F.7080800@gmx.at> <87d0olncf4.fsf@web.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="95166"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) Cc: 34179@debbugs.gnu.org To: martin rudalics Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Jan 24 19:57:06 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1gmkBV-000OcG-Fz for geb-bug-gnu-emacs@m.gmane.org; Thu, 24 Jan 2019 19:57:05 +0100 Original-Received: from localhost ([127.0.0.1]:59549 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gmkBU-0002hg-BP for geb-bug-gnu-emacs@m.gmane.org; Thu, 24 Jan 2019 13:57:04 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:33330) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gmkBE-0002cn-PB for bug-gnu-emacs@gnu.org; Thu, 24 Jan 2019 13:56:49 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gmk2k-00072k-OF for bug-gnu-emacs@gnu.org; Thu, 24 Jan 2019 13:48:03 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:44970) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gmk2k-00072W-9M for bug-gnu-emacs@gnu.org; Thu, 24 Jan 2019 13:48:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1gmk2k-00076O-48 for bug-gnu-emacs@gnu.org; Thu, 24 Jan 2019 13:48:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Michael Heerdegen Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 24 Jan 2019 18:48:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 34179 X-GNU-PR-Package: emacs Original-Received: via spool by 34179-submit@debbugs.gnu.org id=B34179.154835563627249 (code B ref 34179); Thu, 24 Jan 2019 18:48:02 +0000 Original-Received: (at 34179) by debbugs.gnu.org; 24 Jan 2019 18:47:16 +0000 Original-Received: from localhost ([127.0.0.1]:44251 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gmk1z-00075R-Ug for submit@debbugs.gnu.org; Thu, 24 Jan 2019 13:47:16 -0500 Original-Received: from mout.web.de ([212.227.15.3]:37623) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gmk1x-00075D-BL for 34179@debbugs.gnu.org; Thu, 24 Jan 2019 13:47:13 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1548355625; bh=WeYzvYVHdyJDN0X0W2W8nz7iPF6nfungXLE3hXmG2TQ=; h=X-UI-Sender-Class:From:To:Cc:Subject:References:Date:In-Reply-To; b=NYtawGu8QxwEAjXpkDcHrTu8NBwVkojgOFOy4oF4yUpMUo4JMhEOWKafnLvzBHZhu NJPp7lW8o8/QIDkek1TJsCkbR+AmRehN7EKNDuCNrfdoTwqdG3YaGSDNBO1VFD1OKf 4ChPn3pJjmc45xfW+SFf8wR7y3kljYrFapmGz/ss= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Original-Received: from drachen.dragon ([188.110.196.137]) by smtp.web.de (mrweb004 [213.165.67.108]) with ESMTPSA (Nemesis) id 0M5bEe-1h6kvB0MZ6-00xdov; Thu, 24 Jan 2019 19:47:05 +0100 In-Reply-To: <87d0olncf4.fsf@web.de> (Michael Heerdegen's message of "Thu, 24 Jan 2019 19:22:23 +0100") X-Provags-ID: V03:K1:yFyLiItgHuQPKdIii82vpc8a7h4c7auJd8kwcRAH2FLxngMy582 WOvgkvaRgb9udFCvaJ27UkW5lqOFs1g5/1almhCFOsvEu2Fz5XYCHyQNXyio37Qr7wOqVbF XGUzXI6nihteVCHZRw2vMEhA/n/toO4r1tYxK4g4vUODFSv8Wu21suBE6YWUomJzfxiZ2AJ FIks82xJRqdrGf4XDSyIw== X-UI-Out-Filterresults: notjunk:1;V03:K0:Obw6Ir9eWfk=:BzkqGz/PQOzbherAJ2B8pp o95BZkrA93+nKsNBQG9iVqGP6tYPLqAkaVwuhh7zE0TvPuuWRN4/i9bCpD0KMqMbXQ9fRCCge mK6XBoP0c602xgc4rZwI44SAC9+1LBqGBKz5k+ukkkIJOXShq+6y+N3tuZQlV6wYhZR+VWF85 68gBY4nRPuHCXFRl2VC7IPUiQZbsO4GUPhnq9iWajvseKSaK7Sv4HSX7KvtwLYmr8xo8Kfi79 4mrsShUQgDZLRGMXranqT03rp/RCx3ibswj8Vcg582YWfMJw31E3dg6e1ZnEDOroKl6Kt/joQ DNW0VkzB+MAiBkB8m4N72ILu0T9QNrbECoMAuJgdMOotGvO576nefViFYd2bj8lgZd0pWEwH/ fWkorRNp6u4X8JVFaQHSOZlJBQWC9hpgeNfqVJbejtbBOyQJXgFypvhTXRdPRkZe1pQqEW5LA aF8FWPe5tU0kd0HioL/H34sUMfCaSLJuGcrrmZWxpVveV+g0uN5SQ+lEoMU20TTZXyljM+VIR 2fINeqW9OnlTF7tnqfuSaqwThCKsEC1qu2p2TTWwHyh3gfiQGK3PYHHmlnt4axBe5WwJ6hz/0 osDdTC3UiC88er2ZJDH2fdvNLthZ4QpPXRIeuV6LvMYmwccZiszBnQy3+rYcMrsqp46j+j0dz l2nlVzrfoX5Uzxbr8mJRKW0+2u/jtoBuhlF+OxP0DigkBwtf4RniB/hBMSnXvsMyGnvNwYrXH WXrSrYFTegKTawGLhjbd83QQMUePjQtVTQ/MEMchHtbFexZGUSGEyjCYyY0ElVdQNndTle4o X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:154745 Archived-At: --=-=-= Content-Type: text/plain Hello again, I've found a recipe for emacs -Q, though, you need to load one of my private files. It's attached. It causes an outline of the currently displayed frames and windows printed in the echo area whenever a window is selected. AFAIK, this code wasn't related with every hang, but with lots. The crucial part seems to be the `message' call printing the table in the echo area. So, the recipe is: load the attached file, open a shell buffer (M-x shell), and C-x 5 2. Also selecting a different frame works. M-: (fracy-display-frame-list) seems to already suffice as recipe. Thanks, Michael. --=-=-= Content-Type: application/emacs-lisp Content-Disposition: attachment; filename=fracy.el Content-Transfer-Encoding: quoted-printable ;;; -*- lexical-binding: t -*- ;; - switch between windows, switch between frames in physical order ;; - show window layout in echo area ;; - highlight selected window/frame ;; - implement command that jumps to the previous used frame ;; - permutate window buffers (require 'ring) (require 'cl-lib) (defgroup fracy nil "Fracy Group." :group 'emacs) (defconst fracy-ring-size 10) (defvar fracy-frame-ring (make-ring fracy-ring-size) "Ring of last visited frames") (defvar fracy-ring-pointer 0) (defvar fracy-this-frame nil) (defvar fracy-face-height .7) (defface fracy-default `((t :inherit 'mode-line-inactive :height ,fracy-fac= e-height)) "" :group 'fracy) (defface fracy-warning `((t :inherit 'warning :height ,fracy-face-height)) "" :group 'fracy) (defface fracy-fringe `((t :inherit 'success)) "" :group 'fracy) (defface fracy-highlight `((t :inherit 'mode-line :height ,fracy-face-heigh= t)) "" :group 'fracy) (defun fracy-some-p (list) "Whether any element of LIST ist non-nil. Actionally, return the first non-nil element in LIST." (catch 'done (dolist (x list) (when x (throw 'done x))) nil)) (defun fracy-transpose-matrix (lists) "Transpose matrix given by LISTS. Not all elements of KISTS need to have equal length. Example: \(fracy-transpose-matrix '((1 2 3) (4 5 6) (7 8 ))) =3D=3D> \((1 4 7) (2 5 8) (3 6 nil))" (if (fracy-some-p lists) (cons (mapcar #'car lists) (fracy-transpose-matrix (mapcar #'cdr lists))) nil)) (defun fracy-frame-position (&optional frame) "Return the pixel position of the upper left corner of the frame. The result is a list (left top) of two integers. It is measured in relation to the upper left corner of the screen. In both cases, the visible half plain has a positive value." (cl-callf or frame (selected-frame)) ;; I hope that the left and right frame parameters are never -n or ;; '(- . z) (mapcar (lambda (z) (cond ((and (integerp z) (>=3D z 0)) z) ((eq (car-safe z) '+) (cadr z)) (t (error "%s" "frame position: please debug me")))) (list (frame-parameter frame 'left) (frame-parameter frame 'top)))) ;; return the frame left/right to the current one (defun my-next-frame-pos (f) (let* ((sorted-frame-list (my-visible-frames-b= y-left-pos))) (funcall (lambda (l) (or (cadr l) (car sorted-frame-= list))) (memq f sorted-frame-list)))) (defun my-prev-frame-pos (f) (let* ((sorted-frame-list (nreverse (my-visibl= e-frames-by-left-pos)))) (funcall (lambda (l) (or (cadr l) (car sorted-frame-= list))) (memq f sorted-frame-list)))) (defun my-visible-frames-by-left-pos () "Return a frame list sorted by their positions" (sort (filtered-frame-list (lambda (f) (eq t (frame-visible-p f)))) (lambda (f1 f2) (cl-destructuring-bind (f1l f1t f2l f2t) (append (fracy-frame-position f1) (fracy-frame-position f2)) (or (< f1l f2l) (and (=3D f1l f2l) (< f1t f2t))))))) (defadvice handle-switch-frame (after display-frame-list activate) (fracy-flash-window)) (defadvice handle-delete-frame (after display-frame-list activate) (fracy-flash-window)) ;; (defun fracy-flash-window () ;; (interactive) ;; "Flash the selected window." ;; (let ((buf (current-buffer)) ;; (cookie (face-remap-add-relative 'default :background ;; (face-attribute 'highlight :bac= kground)))) ;; (unless (window-minibuffer-p) ;; (fracy-display-frame-list)) ;; (sit-for 1) ;; (when (buffer-live-p buf) ;; (with-current-buffer buf (face-remap-remove-relative cookie))))) (defun fracy-flash-window () (interactive) "Flash the selected window." (unless (minibufferp) (fracy-display-frame-list) (let* ((win (selected-window)) (make-fringe-string (lambda (leftp) (let ((fringe-string (copy-sequence "fracy-fringe"))) (put-text-property 0 (length fringe-string) 'display (if leftp '(left-fringe right-triang= le fracy-fringe) '(right-fringe left-triangl= e fracy-fringe)) fringe-string) fringe-string))) ovl1 ovl2) (setq ovl1 (save-excursion (make-overlay (line-beginning-position) (p= oint))) ovl2 (save-excursion (make-overlay (point) (l= ine-end-position)))) (run-with-idle-timer 0.001 nil (lambda (win make-fringe-string ovl1 ovl2) (overlay-put ovl1 'window win) (overlay-put ovl2 'window win) (overlay-put ovl1 'before-string (funcall make= -fringe-string nil)) (overlay-put ovl2 'before-string (funcall make= -fringe-string t)) (unless (window-minibuffer-p) (fracy-display-f= rame-list))) win make-fringe-string ovl1 ovl2) (run-with-idle-timer 1.5 nil (lambda (&rest overlays) (mapcar #'delete-overla= y overlays)) ovl1 ovl2)))) (defun fracy-flash-frame () ;; (fracy-run-delayed .1 ;; (let ((visible-bell t)) (ding))) (fracy-flash-window)) (defun fracy-display-frame-list () (interactive) (catch 'desktop-switched (let* (message-log-max ;prevent our displayed message from logging (frames (or (my-visible-frames-by-left-pos) (throw 'desktop-swit= ched t))) (frame-window-list (mapcar (lambda (f) (window-list f nil (frame= -first-window f))) frames)) (window-matrix (fracy-transpose-matrix frame-window-list)) (space-for-buffer-name (floor (/ (min 20 (- (/ (frame-parameter (select= ed-frame) 'width) (length frames)) 1)) fracy-face-height 1.1)))) (when (> space-for-buffer-name 0) (message "%s" (let ((frm-nbr nil)) (mapconcat (lambda (wins) (let ((nbr 0)) (mapconcat (lambda (w) (cl-incf nbr) (cl-callf or frm-nbr (and (memq w (window-list= nil t)) nbr)) (let ((face (if (eq nbr frm-nbr) 'fracy-default 'fracy-highlight))) (concat (propertize (format "%S" nbr) 'face face) (propertize (truncate-string-to-width (if w (concat " " (buffer-name (window-bu= ffer w))) "") (1- space-for-buffer-name) nil ?\ (if window-system (string #x2026)= t)) 'face (cond ((eq w (selected-window)) 'fracy-hi= ghlight) ((window-minibuffer-p w) 'fracy-wa= rning) (t 'fracy-de= fault))) (propertize (format "%S" nbr) 'face face)))) wins (propertize " " 'display '(space :width lef= t-fringe))))) window-matrix "\n"))))))) (defun fracy-goto-frame (frame) (let ((fracy-frame-ring fracy-frame-ring)) (select-frame-set-input-focus frame) (fracy-display-frame-list))) ;; (defadvice display-buffer (after save-last-frame activate) ;; (let ((frame (selected-frame))) ;; (unless (and (not (ring-empty-p fracy-frame-ring)) ;; (eq frame (ring-ref fracy-frame-ring 0))) ;; (ring-insert fracy-frame-ring frame)))) (defun fracy-maybe-add-frame () (unless (and (symbolp this-command) (string-match "\\`fracy-" (symbol-name this-command))) (let ((frame (selected-frame))) (unless (and (not (ring-empty-p fracy-frame-ring)) (eq frame (ring-ref fracy-frame-ring 0))) (ring-remove+insert+extend fracy-frame-ring frame) ;; (message "%s" (mapconcat ;; (lambda (f) (frame-parameter f 'name)) ;; (ring-elements fracy-frame-ring) ;; "\n")) )))) (add-hook 'post-command-hook #'fracy-maybe-add-frame) (defun fracy-last-frame () (interactive) (if (eq last-command 'fracy-last-frame) (cl-incf fracy-ring-pointer) (setq fracy-ring-pointer 0 fracy-this-frame (selected-frame))) (let (frame) (if (catch 'found (while (< fracy-ring-pointer fracy-ring-size) (setq frame (ring-ref fracy-frame-ring fracy-ring-pointer)) (if (and (frame-live-p frame) (eq t (frame-visible-p frame)) (not (eq (selected-frame) frame))) (throw 'found t) (cl-incf fracy-ring-pointer) nil))) (fracy-goto-frame frame) (setq fracy-ring-pointer -1) (ding) (fracy-last-frame) (sit-for 2) (message "%s" "End of frame history")))) (defun fracy-redo () (interactive) (fracy-goto-frame fracy-this-frame)) (defun fracy-next-frame () (interactive) (select-frame-set-input-focus (my-next-frame-pos (selected-frame))) (fracy-flash-frame) (fracy-display-frame-list)) (defun fracy-previous-frame () (interactive) (select-frame-set-input-focus (my-prev-frame-pos (selected-frame))) (fracy-flash-frame) (fracy-display-frame-list)) (defun fracy-this-frame () (interactive) (select-frame-set-input-focus (selected-frame)) (fracy-flash-frame) (fracy-flash-window) (fracy-display-frame-list)) (defun fracy-next-window () (interactive) (other-window 1) (fracy-flash-window)) (defun fracy-previous-window () (interactive) (other-window -1) (fracy-flash-window)) (cl-defun fracy-permutate-window-buffers (perm &optional frame) "Permutate FRAMEs window buffers according to PERM. When called interactively, FRAME defaults to the selected frame, and PERM can be entered in the minibuffer. PERM has to be a list which will be interpreted as a permutation in cyclic form. So, for example, '(1 2 ... n) will rotate the window buffers downwards from above." (interactive (list (let* ((frame (selected-frame)) (windows (window-list frame 'never (frame-first-window fram= e))) (buffers-m-l-format-alist (mapcar (lambda (w) (let ((b (window-buffer w))) (cons b (buffer-local-value 'mode-line-fo= rmat b)))) windows))) (let ((buffers-done ()) (counter 1) result) (unwind-protect (progn (mapc (lambda (w) (let ((b (window-buffer w))) (unless (memq b buffers-done) (push b buffers-done) (with-current-buffer b (setq mode-line-format (cons `(:propertize ,(format "%d " counter) face (:foreground "red")) mode-line-format)) (cl-incf counter))))) windows) (setq result (read (format "(%s)" (let ((input (read-from-minibuffer "Permutation without p= arens (default: 1 2): "))) (if (string=3D input "") "1 2" input)))))) (mapc (pcase-lambda (`(,b . ,format)) (with-current-buffer b (setq mode-line-format format))) buffers-m-l-format-alist) result))))) (cl-assert `(listp ,perm)) (unless (cdr perm) (cl-return-from permutate-window-buffers 'done)) (cl-callf or frame (selected-frame)) (cl-loop for n in-ref perm do (cl-decf n)) (setq perm (nreverse perm)) (let* ((windows (window-list frame 'never (frame-first-window frame))) (first-window-buffer (window-buffer (nth (car perm) windows)))) (cl-loop for cell on perm if (cdr cell) do (setf (window-buffer (nth (car cell) windows)) (window-buffer (nth (cadr cell) windows))) else do (setf (window-buffer (nth (car cell) windows)) first-window-buffer)))) (defalias 'permutate-window-buffers #'fracy-permutate-window-buffers) ;; this doesn't work so well... ;; (add-hook ;flash selected window when changing window config ;; 'window-size-change-functions ;; (lambda (_) (when (memq last-command ;; '(split-window-vertically split-window-horizontally)) ;; ;;(run-with-idle-timer .2 nil 'fracy-flash-window) ;; (fracy-flash-window)))) (provide 'fracy) --=-=-=--