From unknown Sun Jun 22 22:41:41 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#15189 <15189@debbugs.gnu.org> To: bug#15189 <15189@debbugs.gnu.org> Subject: Status: 24.3.50; display-buffer does not work well with custom frames. Reply-To: bug#15189 <15189@debbugs.gnu.org> Date: Mon, 23 Jun 2025 05:41:41 +0000 retitle 15189 24.3.50; display-buffer does not work well with custom frames. reassign 15189 emacs submitter 15189 Keith David Bershatsky severity 15189 normal thanks From debbugs-submit-bounces@debbugs.gnu.org Sun Aug 25 20:51:07 2013 Received: (at submit) by debbugs.gnu.org; 26 Aug 2013 00:51:07 +0000 Received: from localhost ([127.0.0.1]:55597 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VDl1N-0001ca-OV for submit@debbugs.gnu.org; Sun, 25 Aug 2013 20:51:07 -0400 Received: from eggs.gnu.org ([208.118.235.92]:41550) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VDl1J-0001cH-SD for submit@debbugs.gnu.org; Sun, 25 Aug 2013 20:51:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VDl1F-0005uv-03 for submit@debbugs.gnu.org; Sun, 25 Aug 2013 20:51:01 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_DKIM_INVALID autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:37817) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VDl1E-0005ur-TA for submit@debbugs.gnu.org; Sun, 25 Aug 2013 20:50:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43229) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VDl19-0003pl-Uf for bug-gnu-emacs@gnu.org; Sun, 25 Aug 2013 20:50:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VDl14-0005sK-AZ for bug-gnu-emacs@gnu.org; Sun, 25 Aug 2013 20:50:51 -0400 Received: from cobb.liquidweb.com ([50.28.13.150]:45442) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VDl13-0005s3-WE for bug-gnu-emacs@gnu.org; Sun, 25 Aug 2013 20:50:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lawlist.com; s=default; h=Content-Type:MIME-Version:Subject:To:From:Message-ID:Date; bh=H4zo05DaPesQnarOEOVeuPgXR15BgDZeuEiCkICqG/4=; b=FT7lXS1S3dA+H23noshVRuEYBTmA6XLXpM7ue3nfMp9pbcKTKIX7rVZ6Y4B58ag8irQTaiCx/Fe+Fz+PYccUMScDwGR4oSQXFzVnr01Wz91dgC+F8gKTZQUSZnA2R9t7; Received: from cpe-75-85-5-102.socal.res.rr.com ([75.85.5.102]:49261 helo=MP.local) by cobb.liquidweb.com with esmtp (Exim 4.80.1) (envelope-from ) id 1VDl0z-0004tF-W9 for bug-gnu-emacs@gnu.org; Sun, 25 Aug 2013 20:50:42 -0400 Date: Sun, 25 Aug 2013 17:50:43 -0700 Message-ID: From: Keith David Bershatsky To: bug-gnu-emacs@gnu.org Subject: 24.3.50; display-buffer does not work well with custom frames. User-Agent: / () / () APEL/10.8 Emacs/24.3.50 (x86_64-apple-darwin10.8.0) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by - "") Content-Type: text/plain; charset=US-ASCII X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cobb.liquidweb.com X-AntiAbuse: Original Domain - gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lawlist.com X-Get-Message-Sender-Via: cobb.liquidweb.com: acl_c_relayhosts_text_entry: lawlist|lawlist.com X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -3.3 (---) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) The documentation for (display-buffer) uses an example with (get-buffer-create "*foo*"): http://www.gnu.org/software/emacs/manual/html_node/elisp/Display-Action-Functions.html This does not work well with find-file in conjunction with several frames because find-file is executed BEFORE custom frame functions are run. The result is that the buffer that initially had focus ends up getting buried even though the file being opened is in a new frame. The only reliable workaround appears to be calling the find-file command AFTER the custom frame functions are run, which (in my lay opinion) defeats the purpose of using display-buffer. If the display-buffer function was never intended by the developers to be used with find-file and custom frames, then perhaps this email could be treated as a feature request "wish-list" instead of being treated as a bug report. Below is a detailed example that demonstrates what I am experiencing -- just plug it in and run the function "example". Here is a link to a working example that does not use display-buffer: http://stackoverflow.com/questions/18346785/how-to-intercept-a-file-before-it-opens-and-decide-which-frame ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun example () (interactive) (custom-find-file "*bar*") (set-frame-position (selected-frame) 0 0) (mark-whole-buffer) (delete-region (region-beginning) (region-end)) (insert "\*bar\* is about to be buried.") (message "\*bar\* is about to be buried.") (sit-for 3) (custom-find-file "foo.txt") (set-frame-position (selected-frame) 100 100) (mark-whole-buffer) (delete-region (region-beginning) (region-end)) (insert "\"foo.txt\" is about to be buried.") (message "\"foo.txt\" is about to be buried.") (sit-for 3) (custom-find-file "doe.org") (set-frame-position (selected-frame) 200 200) (mark-whole-buffer) (delete-region (region-beginning) (region-end)) (insert "\"doe.org\" is about to be buried.") (message "\"doe.org\" is about to be buried.") (sit-for 3) (custom-find-file "*undefined*") (set-frame-position (selected-frame) 300 300) (mark-whole-buffer) (delete-region (region-beginning) (region-end)) (insert "\*undefined\* is now visible in two (2) frames.") (message "\*undefined\* is now visible in two (2) frames.") ) (defvar lawlist-system-buffer-regexp nil "Regexps matching `buffer-filename` for frame name `SYSTEM`.") (setq lawlist-system-buffer-regexp '("*scratch*" "*bar*")) (defvar lawlist-main-buffer-regexp nil "Regexps matching `buffer-filename` for frame name `MAIN`.") (setq lawlist-main-buffer-regexp '("\\.txt" "\\.tex" "\\.el" "\\.yasnippet")) (defvar lawlist-org-buffer-regexp nil "Regexps matching `buffer-filename` for frame name `ORG`.") (setq lawlist-org-buffer-regexp '("[*]todo-list[*]" "\\.org_archive" "\\.org")) (defun lawlist-regexps-match-p (regexps string) (catch 'matched (dolist (regexp regexps) (if (string-match regexp string) (throw 'matched t))))) (defvar buffer-filename nil) (defun custom-find-file (&optional buffer-filename) "Locate or create a specific frame, and then open the file." (interactive) (unless buffer-filename (setq buffer-filename (read-file-name "Select File: "))) (if buffer-filename (display-buffer (find-file buffer-filename)))) (defun lawlist-display-buffer-function (&optional buffer flag) (if buffer-filename (progn (when (lawlist-regexps-match-p lawlist-org-buffer-regexp buffer-filename) (if (frame-exists "ORG") (switch-to-frame "ORG") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (and (not (equal "MAIN" (frame-parameter frame 'name))) (not (equal "SYSTEM" (frame-parameter frame 'name))) (not (equal "ORG" (frame-parameter frame 'name))) (not (equal "WANDERLUST" (frame-parameter frame 'name))) (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "ORG")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "ORG")) (progn (make-frame) (set-frame-name "ORG"))) )) (when (lawlist-regexps-match-p lawlist-main-buffer-regexp buffer-filename) (if (frame-exists "MAIN") (switch-to-frame "MAIN") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (and (not (equal "MAIN" (frame-parameter frame 'name))) (not (equal "SYSTEM" (frame-parameter frame 'name))) (not (equal "ORG" (frame-parameter frame 'name))) (not (equal "WANDERLUST" (frame-parameter frame 'name))) (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MAIN")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MAIN")) (progn (make-frame) (set-frame-name "MAIN"))) )) (when (lawlist-regexps-match-p lawlist-system-buffer-regexp buffer-filename) (if (frame-exists "SYSTEM") (switch-to-frame "SYSTEM") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (and (not (equal "MAIN" (frame-parameter frame 'name))) (not (equal "SYSTEM" (frame-parameter frame 'name))) (not (equal "ORG" (frame-parameter frame 'name))) (not (equal "WANDERLUST" (frame-parameter frame 'name))) (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "SYSTEM")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "SYSTEM")) (progn (make-frame) (set-frame-name "SYSTEM"))) )) (when (and (not (lawlist-regexps-match-p lawlist-org-buffer-regexp buffer-filename)) (not (lawlist-regexps-match-p lawlist-main-buffer-regexp buffer-filename)) (not (lawlist-regexps-match-p lawlist-system-buffer-regexp buffer-filename)) ) (if (frame-exists "MISCELLAENOUS") (switch-to-frame "MISCELLAENOUS") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (and (not (equal "MAIN" (frame-parameter frame 'name))) (not (equal "SYSTEM" (frame-parameter frame 'name))) (not (equal "ORG" (frame-parameter frame 'name))) (not (equal "WANDERLUST" (frame-parameter frame 'name))) (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MISCELLAENEOUS")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MISCELLAENEOUS")) (progn (make-frame) (set-frame-name "MISCELLAENEOUS")))))))) (setq display-buffer-function 'lawlist-display-buffer-function) (defun frame-exists (frame-name) (not (eq nil (get-frame frame-name)))) (defun get-frame-name (&optional frame) "Return the string that names FRAME (a frame). Default is selected frame." (unless frame (setq frame (selected-frame))) (if (framep frame) (cdr (assq 'name (frame-parameters frame))) (error "Function `get-frame-name': Argument not a frame: `%s'" frame))) (defun get-frame (frame) "Return a frame, if any, named FRAME (a frame or a string). If none, return nil. If FRAME is a frame, it is returned." (cond ((framep frame) frame) ((stringp frame) (catch 'get-a-frame-found (dolist (fr (frame-list)) (when (string= frame (get-frame-name fr)) (throw 'get-a-frame-found fr))) nil)) (t (error "Function `get-frame-name': Arg neither a string nor a frame: `%s'" frame)))) (defun switch-to-frame (frame-name) (let ((frames (frame-list))) (catch 'break (while frames (let ((frame (car frames))) (if (equal (frame-parameter frame 'name) frame-name) (throw 'break (select-frame-set-input-focus frame)) (setq frames (cdr frames)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; In GNU Emacs 24.3.50.1 (x86_64-apple-darwin10.8.0, NS apple-appkit-1038.36) of 2013-08-22 on MP.local Bzr revision: 113971 monnier@iro.umontreal.ca-20130822040645-0fc4fi87eir72jnb Windowing system distributor `Apple', version 10.3.1038 Configured using: `configure --with-ns' Important settings: locale-coding-system: nil default enable-multibyte-characters: t Major mode: Text Minor modes in effect: whitespace-mode: t yas-global-mode: t yas-minor-mode: t global-highlight-parentheses-mode: t global-linum-mode: t linum-mode: t delete-selection-mode: t flyspell-mode: t frame-bufs-mode: t tabbar-mode: t highlight-parentheses-mode: t osx-key-mode: t tooltip-mode: t mouse-wheel-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t line-number-mode: t global-visual-line-mode: t visual-line-mode: t transient-mark-mode: t Recent input: x e x a m p l e s-w s-w s-w s-w s-w s-w s-w y s-w s-w s-w y s-w s-w s-w s-w s-w s-w s-o Recent messages: Word wrapping enabled *beep* Beginning of buffer *beep* Beginning of buffer Load-path shadows: ~/.0.data/.0.emacs/elpa/flim/md4 hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/md4 ~/.0.data/.0.emacs/elpa/flim/hex-util hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/hex-util ~/.0.data/.0.emacs/elpa/flim/sasl hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/net/sasl ~/.0.data/.0.emacs/elpa/flim/sasl-ntlm hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/net/sasl-ntlm ~/.0.data/.0.emacs/elpa/flim/sasl-digest hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/net/sasl-digest ~/.0.data/.0.emacs/elpa/flim/sasl-cram hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/net/sasl-cram ~/.0.data/.0.emacs/elpa/flim/ntlm hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/net/ntlm ~/.0.data/.0.emacs/elpa/flim/hmac-md5 hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/net/hmac-md5 ~/.0.data/.0.emacs/elpa/flim/hmac-def hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/net/hmac-def ~/.0.data/.0.emacs/elpa/wanderlust/rfc2368 hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/mail/rfc2368 ~/.0.data/.0.emacs/elpa/wanderlust/utf7 hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/gnus/utf7 ~/.0.data/.0.emacs/elpa/semi/smime hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/gnus/smime ~/.0.data/.0.emacs/elpa/el-get/.dir-locals hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/gnus/.dir-locals ~/.0.data/.0.emacs/elpa/semi/pgg hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/obsolete/pgg ~/.0.data/.0.emacs/elpa/semi/pgg-pgp5 hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/obsolete/pgg-pgp5 ~/.0.data/.0.emacs/elpa/semi/pgg-pgp hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/obsolete/pgg-pgp ~/.0.data/.0.emacs/elpa/semi/pgg-parse hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/obsolete/pgg-parse ~/.0.data/.0.emacs/elpa/semi/pgg-gpg hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/obsolete/pgg-gpg ~/.0.data/.0.emacs/elpa/semi/pgg-def hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/obsolete/pgg-def ~/.0.data/.0.emacs/elpa/utilities/longlines hides /Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/Resources/lisp/obsolete/longlines Features: (shadow wl-mime mime-edit pgg-parse pccl pccl-20 signature mime-setup mail-mime-setup semi-setup mime-pgp pgg-def mime-play filename mime-image modb-standard elmo-imap4 time-stamp emacsbug message rfc822 mml mml-sec mm-decode mm-bodies mm-encode mailabbrev gmm-utils mailheader org-wl org-w3m org-vm org-rmail org-mhe org-mew org-irc org-jsinfo org-infojs org-html org-exp ob-exp org-exp-blocks org-agenda org-info org-gnus org-docview org-bibtex bibtex org-bbdb disp-table whitespace yasnippet wl-demo wl-draft eword-encode wl-template sendmail mail-utils elmo-net elmo-cache elmo-map elmo-dop wl-news wl-address wl-thread wl-folder wl wl-e21 bbdb-autoloads bbdb el-get el-get-autoloads el-get-list-packages el-get-notify help-mode el-get-dependencies el-get-build el-get-status el-get-recipes el-get-byte-compile el-get-methods el-get-fossil el-get-svn el-get-pacman el-get-github-zip el-get-github-tar el-get-http-zip el-get-http-tar el-get-hg el-get-git-svn el-get-fink el-get-emacswiki el-get-http el-get-emacsmirror el-get-github el-get-git el-get-elpa el-get-darcs el-get-cvs el-get-bzr el-get-brew el-get-builtin el-get-apt-get el-get-custom el-get-core autoload lisp-mnt savehist itunes osx-osascript linum delsel server multiple-cursors mc-separate-operations rectangular-region-mode mc-mark-more thingatpt mc-cycle-cursors mc-edit-lines multiple-cursors-core rect flyspell ispell saveplace auto-save-buffers-enhanced auctex-autoloads tex-site info multiple-cursors-autoloads yasnippet-autoloads package desktop frameset init-tabbar init-frames tabbar frame-cmds frame-fns avoid calendar-lawlist lawlist-calendar init-org derived cl-macs gv edmacro kmacro org-toodledo mailcap-toodledo http-post-simple cl url-http tls url-auth mail-parse rfc2231 rfc2047 rfc2045 ietf-drums url-gw url url-proxy url-privacy url-expand url-methods url-history url-cookie url-domsuf url-util url-parse auth-source eieio eieio-core gnus-util mm-util mail-prsvr password-cache url-vars mailcap json xml org ob-tangle ob-ref ob-lob ob-table org-footnote org-src ob-comint ob-keys org-pcomplete pcomplete comint ansi-color ring org-list org-faces org-entities noutline outline org-version ob-emacs-lisp ob org-compat org-macs ob-eval org-loaddefs format-spec find-func cal-menu calendar cal-loaddefs init-yas init-wl lawlist-tls wl-spam wl-action wl-summary byte-opt ps-print ps-def lpr wl-refile wl-util pp elmo-flag elmo-localdir bytecomp byte-compile cconv wl-message elmo-mime mmelmo-buffer mmelmo-imap mime-view mime-conf calist semi-def mmimap mime-parse mmbuffer mmgeneric wl-highlight wl-vars wl-version epg-config elmo-multi elmo-spam elsp-header elsp-generic elmo elmo-signal elmo-msgdb modb modb-generic modb-entity mime elmo-util emu invisible inv-23 poem poem-e20 poem-e20_3 utf7 eword-decode mel mime-def alist std11 mcharset mcs-20 mcs-e20 pces pces-e20 pces-20 broken pcustom elmo-date elmo-vars elmo-version path-util poe pym static apel-ver product luna mime-w3m w3m-load w3m browse-url doc-view jka-compr dired image-mode timezone w3m-hist w3m-fb bookmark-w3m w3m-ems wid-edit cl-loaddefs cl-lib w3m-ccl ccl w3m-favicon w3m-image w3m-proc w3m-util hideshow easymenu highlight-parentheses init-osxkeys easy-mmode redo advice help-fns time-date tooltip ediff-hook vc-hooks lisp-float-type mwheel ns-win tool-bar dnd fontset image regexp-opt fringe tabulated-list newcomment lisp-mode prog-mode register page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core frame cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer nadvice loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote make-network-process ns multi-tty emacs) From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 26 09:07:00 2013 Received: (at 15189) by debbugs.gnu.org; 26 Aug 2013 13:07:00 +0000 Received: from localhost ([127.0.0.1]:56638 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VDwVX-0006Bu-Hn for submit@debbugs.gnu.org; Mon, 26 Aug 2013 09:06:59 -0400 Received: from mout.gmx.net ([212.227.17.20]:51706) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VDwVU-0006Bf-NM for 15189@debbugs.gnu.org; Mon, 26 Aug 2013 09:06:57 -0400 Received: from [62.47.36.96] ([62.47.36.96]) by mail.gmx.com (mrgmx101) with ESMTPA (Nemesis) id 0LmfKJ-1VmS2m45Eh-00aCTM for <15189@debbugs.gnu.org>; Mon, 26 Aug 2013 15:06:56 +0200 Message-ID: <521B52E8.3050109@gmx.at> Date: Mon, 26 Aug 2013 15:06:48 +0200 From: martin rudalics MIME-Version: 1.0 To: Keith David Bershatsky Subject: Re: bug#15189: 24.3.50; display-buffer does not work well with custom frames. References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:gIysxSRupWFcfSWfzDGI+VaHzRUhlcNJE4sAq5n7BteaM7vMr/8 GXZgEH348z3X5ulttrnMH+yoplbTyGba6/c9yl5s0Nq/Jga0ikq4j1D11gJ8rq6bv2TZj6d ScdhMxikTsrMQK9usDKD+HmRCOPrigQaSAKXO6SdrNlxzgEQUm1LLOM2L3ZhpnjNSRUeQ2P kDP2pun1HRKOXDYF5CWaA== X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 15189 Cc: 15189@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) > This does not work well with find-file in conjunction with several > frames because find-file is executed BEFORE custom frame functions are > run. The result is that the buffer that initially had focus ends up > getting buried even though the file being opened is in a new frame. > The only reliable workaround appears to be calling the find-file > command AFTER the custom frame functions are run, which (in my lay > opinion) defeats the purpose of using display-buffer. IIUC you want to make `find-file' behave like `find-file-other-frame' by default. Is that correct? Or what am I missing? martin From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 26 11:01:36 2013 Received: (at 15189) by debbugs.gnu.org; 26 Aug 2013 15:01:36 +0000 Received: from localhost ([127.0.0.1]:57158 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VDyIR-0000ol-PZ for submit@debbugs.gnu.org; Mon, 26 Aug 2013 11:01:36 -0400 Received: from mout.gmx.net ([212.227.17.21]:57097) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VDyIO-0000oa-Aw for 15189@debbugs.gnu.org; Mon, 26 Aug 2013 11:01:33 -0400 Received: from [62.47.36.96] ([62.47.36.96]) by mail.gmx.com (mrgmx001) with ESMTPA (Nemesis) id 0MGj8j-1VI4uR2yHp-00DbUu for <15189@debbugs.gnu.org>; Mon, 26 Aug 2013 17:01:30 +0200 Message-ID: <521B6DC4.4020006@gmx.at> Date: Mon, 26 Aug 2013 17:01:24 +0200 From: martin rudalics MIME-Version: 1.0 To: 15189@debbugs.gnu.org Subject: Re: bug#15189: 24.3.50; display-buffer does not work well with custom frames. References: <521B52E8.3050109@gmx.at> <4066A3F6-AB96-43EE-B8F4-E3DF2F73CBD2@lawlist.com> In-Reply-To: <4066A3F6-AB96-43EE-B8F4-E3DF2F73CBD2@lawlist.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:Txy75ubyG1QJWNSONkJln4IBnqvVAq2NYwdJ+IwzDuP5BjDjkTg DncDjxUdvWFydfc3a/j21XywAFqzIBkfSwAR8w8o+b60/oDAj4a6NZv2mChjhGh0oIERCQt 54ZVSE1sTzGkscWuXlXS0rY6NTkazwvZKTdp5IXlrtRH/4InCK+vu4aS+NSMfVG4Mzht/SP hEq8lE2tjv1yAio+MYOvg== X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 15189 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) > Yes, that is correct -- with the additional magic of > lawlist-display-buffer-function. My workaround is simply calling > find-file at the very end of the lawlist-display-buffer-function, > which defeats the purpose of using display-buffer. You mean here? (display-buffer (find-file buffer-filename)) Why can't you use (display-buffer (find-file-noselect buffer-filename)) instead? martin From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 26 12:34:44 2013 Received: (at 15189) by debbugs.gnu.org; 26 Aug 2013 16:34:44 +0000 Received: from localhost ([127.0.0.1]:57342 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VDzka-0003El-90 for submit@debbugs.gnu.org; Mon, 26 Aug 2013 12:34:44 -0400 Received: from mout.gmx.net ([212.227.15.15]:64179) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VDzkY-0003Ea-3J for 15189@debbugs.gnu.org; Mon, 26 Aug 2013 12:34:43 -0400 Received: from [62.47.36.96] ([62.47.36.96]) by mail.gmx.com (mrgmx001) with ESMTPA (Nemesis) id 0Ltqb7-1WENtd3Qu5-01192s for <15189@debbugs.gnu.org>; Mon, 26 Aug 2013 18:34:40 +0200 Message-ID: <521B8399.8000907@gmx.at> Date: Mon, 26 Aug 2013 18:34:33 +0200 From: martin rudalics MIME-Version: 1.0 To: Keith David Bershatsky Subject: Re: bug#15189: 24.3.50; display-buffer does not work well with custom frames. References: <521B52E8.3050109@gmx.at> <4066A3F6-AB96-43EE-B8F4-E3DF2F73CBD2@lawlist.com> <521B6B84.5060106@gmx.at> <742F02FA-4469-4BCA-94A5-D8A7A679B52B@lawlist.com> In-Reply-To: <742F02FA-4469-4BCA-94A5-D8A7A679B52B@lawlist.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:UpyXhkDMtvEhqs8RfzUaqZBkeWaoSoW94q2cpX+nMXJiBKWEY+q 96Inffn+BgSvNAChUAYWOFa91JsLgLdkIWwmHJQwrfYRxVZEzzlaBNXHsaBysZkvikViiJQ U3ObO3tb3B2b75HsUCpjZhZzeQnQ4TzCkixoqQnCZRr4jpxMI4R9d6c7QW0obVmI2aOd01r NmnXgf1KavZLxONpg9fWQ== X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 15189 Cc: 15189@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) Please keep 15189@debbugs.gnu.org CCed so others can read your mails too. > Yes, that works now if we also add the following line to the end of > lawlist-display-buffer-function: (switch-to-buffer (get-file-buffer > buffer-filename)) I'm still not quite sure whether I understand what you want to do. An idiom like (display-buffer (find-file buffer-filename)) is practically always wrong because it usually will (1) display the buffer via `find-file' which calls `switch-to-buffer' which bypasses `display-buffer' by calling `set-window-buffer' directly and (2) display the buffer a second time which might result in reusing the window used in (1) but may also use another window according to your buffer display settings. In any case, a doc-string like "Locate or create a specific frame, and then open the file." is inappropriate because the function nowhere does what you say here. > I expected display-buffer to execute the display-buffer-function first > in time (e.g., before executing find-file), but that is not the case. I'm afraid you're confusing things here. `display-buffer' does execute `display-buffer-function' first but its arguments get evaluated before its body. This is something you certainly want too because how would `display-buffer' otherwise know the buffer it is supposed to display? > If the purpose of display-buffer is not to execute the > display-buffer-function first in time (e.g., before executing > find-file), then I made an erroneous assumption regarding the reason > for using display-buffer. I suppose you made the erroneous assumption that `find-file' does not display the file's buffer. That's why I suggested to use `find-file-noselect' instead. Anyway, using `display-buffer-function' is deprecated since Emacs 24.3 and was hardly used in previous versions. What you probably want to do is to customize `display-buffer-alist' instead. martin From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 26 16:15:15 2013 Received: (at 15189) by debbugs.gnu.org; 26 Aug 2013 20:15:16 +0000 Received: from localhost ([127.0.0.1]:57568 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VE3By-0000ak-NR for submit@debbugs.gnu.org; Mon, 26 Aug 2013 16:15:15 -0400 Received: from cobb.liquidweb.com ([50.28.13.150]:54149) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VE3Bv-0000aZ-Ne for 15189@debbugs.gnu.org; Mon, 26 Aug 2013 16:15:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lawlist.com; s=default; h=Content-Type:MIME-Version:Cc:Subject:To:From:Message-ID:Date; bh=BV0vB33cWEoe+0yEZp34qvDCjr4p6DWpbjrz3U4klHY=; b=BskCt3YsQPHlUFx5XxREbp4yebwfP7CfPWPU/5QT0mQK0bfmMBGDNDaAslW0iJr+IC7UhwJFlZ7TbPyxgQVI0tbr0xKx8gWOGtSMG84oONpZhxdqwAX3HEhfcArwZOVe; Received: from cpe-75-85-5-102.socal.res.rr.com ([75.85.5.102]:52154 helo=MP.local) by cobb.liquidweb.com with esmtp (Exim 4.80.1) (envelope-from ) id 1VE3Br-0006Sa-HA; Mon, 26 Aug 2013 16:15:07 -0400 Date: Mon, 26 Aug 2013 13:15:09 -0700 Message-ID: From: Keith David Bershatsky To: martin rudalics Subject: Re: bug#15189: 24.3.50; display-buffer does not work well with custom frames. User-Agent: / () / () APEL/10.8 Emacs/24.3.50 (x86_64-apple-darwin10.8.0) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by - "") Content-Type: text/plain; charset=US-ASCII X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cobb.liquidweb.com X-AntiAbuse: Original Domain - debbugs.gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lawlist.com X-Get-Message-Sender-Via: cobb.liquidweb.com: acl_c_relayhosts_text_entry: lawlist|lawlist.com X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 15189 Cc: 15189@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) Thank you for the clarification. My goal is to cover the two common types of situations: * File is opened -- creating a new one, or opening one that already exists. * Buffer is created without opening a specific file. It appears that display-buffer-alist ONLY works for some of the no-file buffers, like *Help*. Files that are opened get ignored by the display-buffer-alist. Using your suggestion of find-file-noselect works well with the initial example, and then just adding (switch-to-buffer (get-file-buffer buffer-filename)) to the tail end of the lawlist-display-buffer-function. So, correct please if I wrong, it appears that a different solution is needed for each of the two scenarios. Here is the code that works for display-buffer-alist, but not for actual files being opened. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar system-nofile-regexp nil "Regexps matching `buffer-filename` for frame name `SYSTEM`.") (setq system-nofile-regexp '("\\(\\*Metahelp\\*\\|\\*Help\\*\\)")) (defvar main-nofile-regexp nil "Regexps matching `buffer-filename` for frame name `MAIN`.") (setq main-nofile-regexp '("\\.pdf")) (defvar org-nofile-regexp nil "Regexps matching `buffer-filename` for frame name `ORG`.") (setq org-nofile-regexp '("\\*Org Agenda\\*")) (setq display-buffer-alist `((lawlist-p . (nofile-display-buffer-pop-up-frame)))) (defun lawlist-p (buffer action) (declare (ignore action)) (let ((buffer (get-buffer buffer))) (or (lawlist-regexps-match-p org-nofile-regexp (buffer-name buffer)) (lawlist-regexps-match-p main-nofile-regexp (buffer-name buffer)) (lawlist-regexps-match-p system-nofile-regexp (buffer-name buffer)) ))) (defun nofile-display-buffer-pop-up-frame (buffer alist) (when (lawlist-regexps-match-p org-nofile-regexp (buffer-name buffer)) (if (frame-exists "ORG") (switch-to-frame "ORG") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (and (not (equal "MAIN" (frame-parameter frame 'name))) (not (equal "SYSTEM" (frame-parameter frame 'name))) (not (equal "ORG" (frame-parameter frame 'name))) (not (equal "WANDERLUST" (frame-parameter frame 'name))) (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "ORG") (toggle-frame-maximized)))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "ORG")) (progn (make-frame) (set-frame-name "ORG") (toggle-frame-maximized))) )) (when (lawlist-regexps-match-p main-nofile-regexp (buffer-name buffer)) (if (frame-exists "MAIN") (switch-to-frame "MAIN") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (and (not (equal "MAIN" (frame-parameter frame 'name))) (not (equal "SYSTEM" (frame-parameter frame 'name))) (not (equal "ORG" (frame-parameter frame 'name))) (not (equal "WANDERLUST" (frame-parameter frame 'name))) (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MAIN") (toggle-frame-maximized)))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MAIN")) (progn (make-frame) (set-frame-name "MAIN") (toggle-frame-maximized))) )) (when (lawlist-regexps-match-p system-nofile-regexp (buffer-name buffer)) (if (frame-exists "SYSTEM") (switch-to-frame "SYSTEM") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (and (not (equal "MAIN" (frame-parameter frame 'name))) (not (equal "SYSTEM" (frame-parameter frame 'name))) (not (equal "ORG" (frame-parameter frame 'name))) (not (equal "WANDERLUST" (frame-parameter frame 'name))) (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "SYSTEM") (toggle-frame-maximized)))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "SYSTEM")) (progn (make-frame) (set-frame-name "SYSTEM") (toggle-frame-maximized))) )) (when (and (not (lawlist-regexps-match-p org-nofile-regexp (buffer-name buffer))) (not (lawlist-regexps-match-p main-nofile-regexp (buffer-name buffer))) (not (lawlist-regexps-match-p system-nofile-regexp (buffer-name buffer))) ) (if (frame-exists "MISCELLAENOUS") (switch-to-frame "MISCELLAENOUS") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (and (not (equal "MAIN" (frame-parameter frame 'name))) (not (equal "SYSTEM" (frame-parameter frame 'name))) (not (equal "ORG" (frame-parameter frame 'name))) (not (equal "WANDERLUST" (frame-parameter frame 'name))) (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MISCELLAENEOUS") (toggle-frame-maximized)))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MISCELLAENEOUS")) (progn (make-frame) (set-frame-name "MISCELLAENEOUS") (toggle-frame-maximized))))) (if (and (featurep 'init-frames) frame-bufs-mode) (frame-bufs-add-buffer buffer (selected-frame))) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GENERIC FRAME UTILITIES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun frame-exists (frame-name) (not (eq nil (get-frame frame-name)))) (defun get-frame-name (&optional frame) "Return the string that names FRAME (a frame). Default is selected frame." (unless frame (setq frame (selected-frame))) (if (framep frame) (cdr (assq 'name (frame-parameters frame))) (error "Function `get-frame-name': Argument not a frame: `%s'" frame))) (defun get-frame (frame) "Return a frame, if any, named FRAME (a frame or a string). If none, return nil. If FRAME is a frame, it is returned." (cond ((framep frame) frame) ((stringp frame) (catch 'get-a-frame-found (dolist (fr (frame-list)) (when (string= frame (get-frame-name fr)) (throw 'get-a-frame-found fr))) nil)) (t (error "Function `get-frame-name': Arg neither a string nor a frame: `%s'" frame)))) (defun switch-to-frame (frame-name) (let ((frames (frame-list))) (catch 'break (while frames (let ((frame (car frames))) (if (equal (frame-parameter frame 'name) frame-name) (throw 'break (select-frame-set-input-focus frame)) (setq frames (cdr frames)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; At Mon, 26 Aug 2013 18:34:33 +0200, martin rudalics wrote: > > Please keep 15189@debbugs.gnu.org CCed so others can read your mails > too. > > > Yes, that works now if we also add the following line to the end of > > lawlist-display-buffer-function: (switch-to-buffer (get-file-buffer > > buffer-filename)) > > I'm still not quite sure whether I understand what you want to do. > An idiom like > > (display-buffer > (find-file buffer-filename)) > > is practically always wrong because it usually will (1) display the > buffer via `find-file' which calls `switch-to-buffer' which bypasses > `display-buffer' by calling `set-window-buffer' directly and (2) display > the buffer a second time which might result in reusing the window used > in (1) but may also use another window according to your buffer display > settings. In any case, a doc-string like > > "Locate or create a specific frame, and then open the file." > > is inappropriate because the function nowhere does what you say here. > > > I expected display-buffer to execute the display-buffer-function first > > in time (e.g., before executing find-file), but that is not the case. > > I'm afraid you're confusing things here. `display-buffer' does execute > `display-buffer-function' first but its arguments get evaluated before > its body. This is something you certainly want too because how would > `display-buffer' otherwise know the buffer it is supposed to display? > > > If the purpose of display-buffer is not to execute the > > display-buffer-function first in time (e.g., before executing > > find-file), then I made an erroneous assumption regarding the reason > > for using display-buffer. > > I suppose you made the erroneous assumption that `find-file' does not > display the file's buffer. That's why I suggested to use > `find-file-noselect' instead. Anyway, using `display-buffer-function' > is deprecated since Emacs 24.3 and was hardly used in previous versions. > What you probably want to do is to customize `display-buffer-alist' > instead. > > martin From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 27 02:47:34 2013 Received: (at 15189) by debbugs.gnu.org; 27 Aug 2013 06:47:34 +0000 Received: from localhost ([127.0.0.1]:58061 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VED3t-0001uU-1l for submit@debbugs.gnu.org; Tue, 27 Aug 2013 02:47:33 -0400 Received: from mout.gmx.net ([212.227.17.21]:54554) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VED3q-0001uH-2h for 15189@debbugs.gnu.org; Tue, 27 Aug 2013 02:47:31 -0400 Received: from [62.47.35.206] ([62.47.35.206]) by mail.gmx.com (mrgmx103) with ESMTPA (Nemesis) id 0MPlMc-1VANJS2nQI-004ztT for <15189@debbugs.gnu.org>; Tue, 27 Aug 2013 08:47:28 +0200 Message-ID: <521C4B77.80107@gmx.at> Date: Tue, 27 Aug 2013 08:47:19 +0200 From: martin rudalics MIME-Version: 1.0 To: Keith David Bershatsky Subject: Re: bug#15189: 24.3.50; display-buffer does not work well with custom frames. References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:Ln8AAQUB68DMF5MktXonJ16ezm+zevoyD9r8C1Lm+9DBhJ5FgjM GwlLQgOMN668Et1+yVyvjJYa1ElS2dGi/774snH2LNmv+/eqllWUBHdnNy47mXHCRuctm2P NMSNhVR/cTVoBMDyEDbE0pp3Pci4sIMcrNzg4T/XliLQi9syg81mhnD6hqUoEcwcnUvVLKg X61N7TiZeXi4/o2UnmWJA== X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 15189 Cc: 15189@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) > Using your suggestion of find-file-noselect works well with the initial example, and then just adding (switch-to-buffer (get-file-buffer buffer-filename)) to the tail end of the lawlist-display-buffer-function. If you want to show a file-visiting buffer in the selected window, yes. I'd rather add a rule that calls `display-buffer-same-window' and rewrite the code (when (lawlist-regexps-match-p ...) ...) (when (lawlist-regexps-match-p ...) ...) as (cond ((lawlist-regexps-match-p ...) ...) ((lawlist-regexps-match-p ...) ...) (t (display-buffer-same-window ...))) BTW you should also make code like (if (and (not (equal "MAIN" (frame-parameter frame 'name))) (not (equal "SYSTEM" (frame-parameter frame 'name))) (not (equal "ORG" (frame-parameter frame 'name))) (not (equal "WANDERLUST" (frame-parameter frame 'name))) (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) more readable by defining a variable like (defvar my-regexp "^\\(?:MAIN\\|SYSTEM\\|ORG\\|WANDERLUST\\| MISCELLANEOUS\\)$" "My doc-string.") and using (not (string-match my-regexp (frame-parameter frame 'name))) instead. martin From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 27 18:30:17 2013 Received: (at 15189) by debbugs.gnu.org; 27 Aug 2013 22:30:17 +0000 Received: from localhost ([127.0.0.1]:59995 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VERmC-0003Fa-6p for submit@debbugs.gnu.org; Tue, 27 Aug 2013 18:30:17 -0400 Received: from cobb.liquidweb.com ([50.28.13.150]:37686) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VERm7-0003FQ-Qy for 15189@debbugs.gnu.org; Tue, 27 Aug 2013 18:30:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lawlist.com; s=default; h=Content-Type:MIME-Version:Cc:Subject:To:From:Message-ID:Date; bh=zcrVy+lYW9FtHdxmpZ839VbFVoyMe5lyIeaZbUSITXw=; b=69yN6+zOwlvim5P7H/lWlyfHneWhh+r09F6pJK/fS0Pe69W5TiOTQT52igpnTXbRTh0uFwPvIqhMy/Ts9oGQuPWCkkvTNknHDLRQMD6DwZkiUN1bkykxqQdB7PmS2dZc; Received: from cpe-75-85-5-102.socal.res.rr.com ([75.85.5.102]:52324 helo=MP.local) by cobb.liquidweb.com with esmtp (Exim 4.80.1) (envelope-from ) id 1VERm5-00039C-IM; Tue, 27 Aug 2013 18:30:09 -0400 Date: Tue, 27 Aug 2013 15:30:09 -0700 Message-ID: From: Keith David Bershatsky To: martin rudalics Subject: Re: bug#15189: 24.3.50; display-buffer does not work well with custom frames. User-Agent: / () / () APEL/10.8 Emacs/24.3.50 (x86_64-apple-darwin10.8.0) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by - "") Content-Type: text/plain; charset=US-ASCII X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cobb.liquidweb.com X-AntiAbuse: Original Domain - debbugs.gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lawlist.com X-Get-Message-Sender-Via: cobb.liquidweb.com: acl_c_relayhosts_text_entry: lawlist|lawlist.com X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 15189 Cc: 15189@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) Thank you for the suggestions and examples -- greatly appreciated !!! Here is the revised code that appears to be working correctly for both types of situations -- i.e., file-visiting buffers, and nofile-visiting buffers. Keith ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EXAMPLE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun example () (interactive) (custom-find-file "*bar*") (set-frame-position (selected-frame) 0 0) (minibuffer-message "\*bar\* appears in frame name SYSTEM.") (sit-for 3) (custom-find-file "foo.txt") (set-frame-position (selected-frame) 100 100) (minibuffer-message "\"foo.txt\" appears in frame name MAIN.") (sit-for 3) (custom-find-file "doe.org") (set-frame-position (selected-frame) 200 200) (minibuffer-message "\"doe.org\" appears in frame name ORG.") (sit-for 3) (custom-find-file "*undefined*") (set-frame-position (selected-frame) 300 300) (minibuffer-message "\*undefined\* appears in frame name MISCELLANEOUS.") (sit-for 3) (display-buffer (get-buffer-create "*example*")) (other-window 1) (minibuffer-message "display-buffer-alist controls where \*example\* is displayed.") (sit-for 3) (kill-buffer "*bar*") (kill-buffer "foo.txt") (kill-buffer "doe.org") (kill-buffer "*undefined*") (kill-buffer "*example*") (make-frame) (delete-frame (get-frame "SYSTEM")) (delete-frame (get-frame "MAIN")) (delete-frame (get-frame "ORG")) (delete-frame (get-frame "MISCELLANEOUS"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FILE-VISITING BUFFER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar lawlist-regexp-frame-names "^\\(?:MAIN\\|SYSTEM\\|ORG\\|MISCELLANEOUS\\)$" "Regexp matching frames with specific names.") (defvar lawlist-system-buffer-regexp nil "Regexps matching `buffer-filename` for frame name `SYSTEM`.") (setq lawlist-system-buffer-regexp '("*scratch*" "*bar*")) (defvar lawlist-main-buffer-regexp nil "Regexps matching `buffer-filename` for frame name `MAIN`.") (setq lawlist-main-buffer-regexp '("\\.txt" "\\.tex" "\\.el" "\\.yasnippet")) (defvar lawlist-org-buffer-regexp nil "Regexps matching `buffer-filename` for frame name `ORG`.") (setq lawlist-org-buffer-regexp '("[*]todo-list[*]" "\\.org_archive" "\\.org")) (defvar buffer-filename nil) (defun custom-find-file (&optional buffer-filename) "Locate or create a specific frame, and then open the file." (interactive) (unless buffer-filename (setq buffer-filename (read-file-name "Select File: "))) (if buffer-filename (progn (setq display-buffer-function 'lawlist-display-buffer-function) (display-buffer (find-file-noselect buffer-filename)) (setq display-buffer-function nil) ))) (defun lawlist-display-buffer-function (&optional buffer flag) (if buffer-filename (progn (cond ((lawlist-regexp-match-p lawlist-org-buffer-regexp buffer-filename) (if (frame-exists "ORG") (switch-to-frame "ORG") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match lawlist-regexp-frame-names (frame-parameter frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "ORG")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "ORG")) (progn (make-frame) (set-frame-name "ORG"))) )) ((lawlist-regexp-match-p lawlist-main-buffer-regexp buffer-filename) (if (frame-exists "MAIN") (switch-to-frame "MAIN") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match lawlist-regexp-frame-names (frame-parameter frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MAIN")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MAIN")) (progn (make-frame) (set-frame-name "MAIN"))) )) ((lawlist-regexp-match-p lawlist-system-buffer-regexp buffer-filename) (if (frame-exists "SYSTEM") (switch-to-frame "SYSTEM") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match lawlist-regexp-frame-names (frame-parameter frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "SYSTEM")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "SYSTEM")) (progn (make-frame) (set-frame-name "SYSTEM"))) )) ((and (not (lawlist-regexp-match-p lawlist-org-buffer-regexp buffer-filename)) (not (lawlist-regexp-match-p lawlist-main-buffer-regexp buffer-filename)) (not (lawlist-regexp-match-p lawlist-system-buffer-regexp buffer-filename)) ) (if (frame-exists "MISCELLANEOUS") (switch-to-frame "MISCELLANEOUS") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match lawlist-regexp-frame-names (frame-parameter frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MISCELLANEOUS")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MISCELLANEOUS")) (progn (make-frame) (set-frame-name "MISCELLANEOUS"))))) (t (display-buffer-same-window))) (switch-to-buffer (get-file-buffer buffer-filename)) ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DISPLAY BUFFER NO FILE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar system-nofile-regexp nil "Regexps matching `buffer-name buffer` for frame name `SYSTEM`.") (setq system-nofile-regexp '("\\(\\*Metahelp\\*\\|\\*Help\\*\\)")) (defvar main-nofile-regexp nil "Regexps matching `buffer-name buffer` for frame name `MAIN`.") (setq main-nofile-regexp '("\\*example\\*")) (defvar org-nofile-regexp nil "Regexps matching `buffer-name buffer` for frame name `ORG`.") (setq org-nofile-regexp '("\\*Org Agenda\\*")) (setq display-buffer-alist '((lawlist-p . (nofile-display-buffer-pop-up-frame)))) (defun lawlist-p (buffer action) (let ((buffer (get-buffer buffer))) (or (lawlist-regexp-match-p org-nofile-regexp (buffer-name buffer)) (lawlist-regexp-match-p main-nofile-regexp (buffer-name buffer)) (lawlist-regexp-match-p system-nofile-regexp (buffer-name buffer)) ))) (defun nofile-display-buffer-pop-up-frame (buffer alist) (cond ((lawlist-regexp-match-p org-nofile-regexp (buffer-name buffer)) (if (frame-exists "ORG") (switch-to-frame "ORG") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match lawlist-regexp-frame-names (frame-parameter frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "ORG")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "ORG")) (progn (make-frame) (set-frame-name "ORG"))) )) ((lawlist-regexp-match-p main-nofile-regexp (buffer-name buffer)) (if (frame-exists "MAIN") (switch-to-frame "MAIN") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match lawlist-regexp-frame-names (frame-parameter frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MAIN")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MAIN")) (progn (make-frame) (set-frame-name "MAIN"))) )) ((lawlist-regexp-match-p system-nofile-regexp (buffer-name buffer)) (if (frame-exists "SYSTEM") (switch-to-frame "SYSTEM") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match lawlist-regexp-frame-names (frame-parameter frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "SYSTEM")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "SYSTEM")) (progn (make-frame) (set-frame-name "SYSTEM"))) )) ((and (not (lawlist-regexp-match-p org-nofile-regexp (buffer-name buffer))) (not (lawlist-regexp-match-p main-nofile-regexp (buffer-name buffer))) (not (lawlist-regexp-match-p system-nofile-regexp (buffer-name buffer))) ) (if (frame-exists "MISCELLANEOUS") (switch-to-frame "MISCELLANEOUS") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match lawlist-regexp-frame-names (frame-parameter frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MISCELLANEOUS")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MISCELLANEOUS")) (progn (make-frame) (set-frame-name "MISCELLANEOUS"))))) (t (display-buffer-same-window))) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GENERIC REGEXP FUNCTION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun lawlist-regexp-match-p (regexps string) (catch 'matched (dolist (regexp regexps) (if (string-match regexp string) (throw 'matched t))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;; GENERIC BUFFER / FRAME UTILITIES ;;;;;;;;;;;;;;;;;;;;;;;; (defun frame-exists (frame-name) (not (eq nil (get-frame frame-name)))) (defun get-frame-name (&optional frame) "Return the string that names FRAME (a frame). Default is selected frame." (unless frame (setq frame (selected-frame))) (if (framep frame) (cdr (assq 'name (frame-parameters frame))) (error "Function `get-frame-name': Argument not a frame: `%s'" frame))) (defun get-frame (frame) "Return a frame, if any, named FRAME (a frame or a string). If none, return nil. If FRAME is a frame, it is returned." (cond ((framep frame) frame) ((stringp frame) (catch 'get-a-frame-found (dolist (fr (frame-list)) (when (string= frame (get-frame-name fr)) (throw 'get-a-frame-found fr))) nil)) (t (error "Function `get-frame-name': Arg neither a string nor a frame: `%s'" frame)))) (defun switch-to-frame (frame-name) (let ((frames (frame-list))) (catch 'break (while frames (let ((frame (car frames))) (if (equal (frame-parameter frame 'name) frame-name) (throw 'break (select-frame-set-input-focus frame)) (setq frames (cdr frames)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; At Tue, 27 Aug 2013 08:47:19 +0200, martin rudalics wrote: > > > Using your suggestion of find-file-noselect works well with the initial example, and then just adding (switch-to-buffer (get-file-buffer buffer-filename)) to the tail end of the lawlist-display-buffer-function. > > If you want to show a file-visiting buffer in the selected window, yes. > I'd rather add a rule that calls `display-buffer-same-window' and rewrite > the code > > (when (lawlist-regexps-match-p ...) > ...) > (when (lawlist-regexps-match-p ...) > ...) > > as > > (cond > ((lawlist-regexps-match-p ...) > ...) > ((lawlist-regexps-match-p ...) > ...) > (t > (display-buffer-same-window ...))) > > BTW you should also make code like > > (if (and > (not (equal "MAIN" (frame-parameter frame 'name))) > (not (equal "SYSTEM" (frame-parameter frame 'name))) > (not (equal "ORG" (frame-parameter frame 'name))) > (not (equal "WANDERLUST" (frame-parameter frame 'name))) > (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) > > more readable by defining a variable like > > (defvar my-regexp "^\\(?:MAIN\\|SYSTEM\\|ORG\\|WANDERLUST\\| MISCELLANEOUS\\)$" > "My doc-string.") > > and using > (not (string-match my-regexp (frame-parameter frame 'name))) > > instead. > > martin From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 27 23:59:36 2013 Received: (at submit) by debbugs.gnu.org; 28 Aug 2013 03:59:36 +0000 Received: from localhost ([127.0.0.1]:60230 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VEWut-0003Cx-Ry for submit@debbugs.gnu.org; Tue, 27 Aug 2013 23:59:36 -0400 Received: from eggs.gnu.org ([208.118.235.92]:46098) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VEWur-0003Cp-Us for submit@debbugs.gnu.org; Tue, 27 Aug 2013 23:59:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VEWui-0002TY-80 for submit@debbugs.gnu.org; Tue, 27 Aug 2013 23:59:33 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:38492) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VEWui-0002TU-48 for submit@debbugs.gnu.org; Tue, 27 Aug 2013 23:59:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47794) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VEWua-00068M-QN for bug-gnu-emacs@gnu.org; Tue, 27 Aug 2013 23:59:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VEWuR-0002Qw-MO for bug-gnu-emacs@gnu.org; Tue, 27 Aug 2013 23:59:16 -0400 Received: from plane.gmane.org ([80.91.229.3]:53831) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VEWuR-0002Qk-Gt for bug-gnu-emacs@gnu.org; Tue, 27 Aug 2013 23:59:07 -0400 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1VEWuO-0007NJ-Oc for bug-gnu-emacs@gnu.org; Wed, 28 Aug 2013 05:59:04 +0200 Received: from 70-59-17-50.hlrn.qwest.net ([70.59.17.50]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 28 Aug 2013 05:59:04 +0200 Received: from kevin.d.rodgers by 70-59-17-50.hlrn.qwest.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 28 Aug 2013 05:59:04 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: bug-gnu-emacs@gnu.org From: Kevin Rodgers Subject: Re: bug#15189: 24.3.50; display-buffer does not work well with custom frames. Date: Tue, 27 Aug 2013 21:59:31 -0600 Lines: 30 Message-ID: References: <521C4B77.80107@gmx.at> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 70-59-17-50.hlrn.qwest.net User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.28) Gecko/20120306 Thunderbird/3.1.20 In-Reply-To: <521C4B77.80107@gmx.at> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -2.4 (--) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.4 (--) On 8/27/13 12:47 AM, martin rudalics wrote: > BTW you should also make code like > > (if (and > (not (equal "MAIN" (frame-parameter frame 'name))) > (not (equal "SYSTEM" (frame-parameter frame 'name))) > (not (equal "ORG" (frame-parameter frame 'name))) > (not (equal "WANDERLUST" (frame-parameter frame 'name))) > (not (equal "MISCELLANEOUS" (frame-parameter frame 'name))) ) > > more readable by defining a variable like > > (defvar my-regexp "^\\(?:MAIN\\|SYSTEM\\|ORG\\|WANDERLUST\\| MISCELLANEOUS\\)$" > "My doc-string.") > > and using > (not (string-match my-regexp (frame-parameter frame 'name))) > > instead. Or: (defvar my-list '("MAIN" "SYSTEM" "ORG" "WANDERLUST" "MISCELLANEOUS") "My doc string.") ... (not (member (frame-parameter frame 'name) my-string)) -- Kevin Rodgers Denver, Colorado, USA From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 28 12:35:19 2013 Received: (at 15189) by debbugs.gnu.org; 28 Aug 2013 16:35:19 +0000 Received: from localhost ([127.0.0.1]:33660 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VEiiE-0006x6-OX for submit@debbugs.gnu.org; Wed, 28 Aug 2013 12:35:19 -0400 Received: from cobb.liquidweb.com ([50.28.13.150]:37301) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VEiiC-0006wv-3Z for 15189@debbugs.gnu.org; Wed, 28 Aug 2013 12:35:17 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lawlist.com; s=default; h=To:References:Message-Id:Content-Transfer-Encoding:Cc:Date:In-Reply-To:From:Content-Type:Mime-Version:Subject; bh=Z5wnP1WGj1MJgu4HjBEHNNQOomWgMn3+FNtfrXHTQRo=; b=WBljOTtq5DXTMpKl2WHi5tdksTCAE+za3gXZJympJcVSbNJFxDCKBaH2KbOdjL00lclhnht91TNGNNqqveFF/QNXcUE9bb0kyKREBNYbSW90nqlSb2pYLvBzP64wctki; Received: from cpe-75-85-5-102.socal.res.rr.com ([75.85.5.102]:50236 helo=[192.168.0.3]) by cobb.liquidweb.com with esmtpa (Exim 4.80.1) (envelope-from ) id 1VEiiA-0002Ki-G3; Wed, 28 Aug 2013 12:35:14 -0400 Subject: Re: bug#15189: 24.3.50; display-buffer does not work well with custom frames. Mime-Version: 1.0 (Apple Message framework v1084) Content-Type: text/plain; charset=us-ascii From: Keith David Bershatsky In-Reply-To: <521C4B77.80107@gmx.at> Date: Wed, 28 Aug 2013 09:35:12 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: <1C47ED2B-8360-41D1-8C4E-6A30392846EC@lawlist.com> References: <521C4B77.80107@gmx.at> To: martin rudalics X-Mailer: Apple Mail (2.1084) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cobb.liquidweb.com X-AntiAbuse: Original Domain - debbugs.gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lawlist.com X-Get-Message-Sender-Via: cobb.liquidweb.com: authenticated_id: lawlist/from_h X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 15189 Cc: 15189@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) I have consolidated all of the magic into the display-buffer-alist, so = that it can be used for both types of situations -- i.e., file-visiting, = and non-file-visiting buffers. This revision longer relies upon the = display-buffer-function, which is slated to be discontinued. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EXAMPLE = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun example () (interactive) (lawlist-find-file "*bar*") (set-frame-height (selected-frame) 15) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 0 0) (message "\*bar\* appears in frame name SYSTEM.") (sit-for 3) (lawlist-find-file "foo.txt") (set-frame-height (selected-frame) 15) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 100 100) (message "\"foo.txt\" appears in frame name MAIN.") (sit-for 3) (lawlist-find-file "doe.org") (set-frame-height (selected-frame) 15) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 200 200) (message "\"doe.org\" appears in frame name ORG.") (sit-for 3) (lawlist-find-file "*buffer-filename-non-regexp*") (set-frame-height (selected-frame) 15) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 300 300) (message "\*IS\* buffer-filename. \*NOT\* defined by any special = regexp.") (sit-for 8) (display-buffer (get-buffer-create "*get-buffer-create-example*")) (set-frame-height (selected-frame) 15) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 400 400) (message "\*NOT\* buffer-filename. \*\*IS\*\* defined by = main-buffer-regexp.") (sit-for 8) (display-buffer (get-buffer-create "*get-buffer-create-UNDEFINED*")) (message "\*NOT\* buffer-filename. \*NOT\* defined by any special = regexp.") (sit-for 8) (kill-buffer "*bar*") (kill-buffer "foo.txt") (kill-buffer "doe.org") (kill-buffer "*buffer-filename-non-regexp*") (kill-buffer "*get-buffer-create-example*") (kill-buffer "*get-buffer-create-UNDEFINED*") (make-frame) (delete-frame (get-frame "SYSTEM")) (delete-frame (get-frame "MAIN")) (delete-frame (get-frame "ORG")) (delete-frame (get-frame "MISCELLANEOUS")) (message "THE END.")) ;;;;;;;;;;;;;;;;; DISPLAY-BUFFER-ALIST and DISPLAY-BUFFER = ;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar regexp-frame-names = "^\\(?:MAIN\\|SYSTEM\\|ORG\\|MISCELLANEOUS\\)$" "Regexp matching frames with specific names.") (defvar system-buffer-regexp nil "Regexps matching `buffer-filename` for frame name `SYSTEM`.") (setq system-buffer-regexp '("*scratch*" "*bar*")) (defvar main-buffer-regexp nil "Regexps matching `buffer-filename` for frame name `MAIN`.") (setq main-buffer-regexp '("\\.txt" "\\.tex" "\\.el" "\\.yasnippet" = "\\*get-buffer-create-example\\*")) (defvar org-buffer-regexp nil "Regexps matching `buffer-filename` for frame name `ORG`.") (setq org-buffer-regexp '("[*]todo-list[*]" "\\.org_archive" "\\.org")) (defvar buffer-filename nil) = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;= ;;;;;;;;;;; (defun lawlist-find-file (&optional buffer-filename) "With assistance from the display-buffer-alist, locate or create a = specific frame, and then open the file." (interactive) (unless buffer-filename (setq buffer-filename (read-file-name "Select = File: "))) ;; If using a version of Emacs built `--with-ns`, then user may = substitute: ;; (unless buffer-filename (setq buffer-filename ;; (ns-read-file-name "Select File:" "~/" t nil))) (if buffer-filename (display-buffer (find-file-noselect buffer-filename)))) (setq display-buffer-alist '((".*" . = (lawlist-display-buffer-pop-up-frame)))) (defun lawlist-display-buffer-pop-up-frame (buffer alist) (cond ((regexp-match-p org-buffer-regexp (buffer-name buffer)) (if (frame-exists "ORG") (switch-to-frame "ORG") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match regexp-frame-names (frame-parameter = frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "ORG")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "ORG")) (progn (make-frame) (set-frame-name "ORG"))) ) (set-window-buffer (frame-selected-window) (buffer-name buffer))) ((regexp-match-p main-buffer-regexp (buffer-name buffer)) (if (frame-exists "MAIN") (switch-to-frame "MAIN") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match regexp-frame-names (frame-parameter = frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MAIN")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MAIN")) (progn (make-frame) (set-frame-name "MAIN"))) ) (set-window-buffer (frame-selected-window) (buffer-name buffer))) ((regexp-match-p system-buffer-regexp (buffer-name buffer)) (if (frame-exists "SYSTEM") (switch-to-frame "SYSTEM") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match regexp-frame-names (frame-parameter = frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "SYSTEM")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "SYSTEM")) (progn (make-frame) (set-frame-name "SYSTEM"))) ) (set-window-buffer (frame-selected-window) (buffer-name buffer))) ((and (not (regexp-match-p org-buffer-regexp (buffer-name buffer))) (not (regexp-match-p main-buffer-regexp (buffer-name buffer))) (not (regexp-match-p system-buffer-regexp (buffer-name = buffer))) buffer-filename ) (if (frame-exists "MISCELLANEOUS") (switch-to-frame "MISCELLANEOUS") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match regexp-frame-names (frame-parameter = frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MISCELLANEOUS")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MISCELLANEOUS")) (progn (make-frame) (set-frame-name "MISCELLANEOUS")))) (set-window-buffer (frame-selected-window) (buffer-name buffer))) (t (set-window-buffer (split-window-horizontally) (buffer-name = buffer))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GENERIC REGEXP FUNCTION = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun regexp-match-p (regexps string) (catch 'matched (dolist (regexp regexps) (if (string-match regexp string) (throw 'matched t))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;; GENERIC BUFFER / FRAME UTILITIES = ;;;;;;;;;;;;;;;;;;;;;;;; (defun frame-exists (frame-name) (not (eq nil (get-frame frame-name)))) (defun get-frame-name (&optional frame) "Return the string that names FRAME (a frame). Default is selected = frame." (unless frame (setq frame (selected-frame))) (if (framep frame) (cdr (assq 'name (frame-parameters frame))) (error "Function `get-frame-name': Argument not a frame: `%s'" = frame))) (defun get-frame (frame) "Return a frame, if any, named FRAME (a frame or a string). If none, return nil. If FRAME is a frame, it is returned." (cond ((framep frame) frame) ((stringp frame) (catch 'get-a-frame-found (dolist (fr (frame-list)) (when (string=3D frame (get-frame-name fr)) (throw 'get-a-frame-found fr))) nil)) (t (error "Function `get-frame-name': Arg neither a string nor a frame: = `%s'" frame)))) (defun switch-to-frame (frame-name) (let ((frames (frame-list))) (catch 'break (while frames (let ((frame (car frames))) (if (equal (frame-parameter frame 'name) frame-name) (throw 'break (select-frame-set-input-focus frame)) (setq frames (cdr frames)))))))) ;;;;;;;;;;;;;;;;;;;;;;;; IF BUILT --with-ns, THEN ALSO USE = ;;;;;;;;;;;;;;;;;;;;;;;;;; (defalias 'ns-find-file 'lawlist-ns-find-file) (defun lawlist-ns-find-file () "Do a `find-file' with the `ns-input-file' as argument." (interactive) (let* ((f (file-truename (expand-file-name (pop ns-input-file) command-line-default-directory))) (file (find-file-noselect f)) (bufwin1 (get-buffer-window file 'visible)) (bufwin2 (get-buffer-window "*scratch*" 'visible))) (cond (bufwin1 (select-frame (window-frame bufwin1)) (raise-frame (window-frame bufwin1)) (select-window bufwin1)) ((and (eq ns-pop-up-frames 'fresh) bufwin2) (ns-hide-emacs 'activate) (select-frame (window-frame bufwin2)) (raise-frame (window-frame bufwin2)) (select-window bufwin2) (lawlist-find-file f)) (t (ns-hide-emacs 'activate) (lawlist-find-file f))))) = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;= ;;;;;;;;;;;= From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 28 20:22:00 2013 Received: (at 15189) by debbugs.gnu.org; 29 Aug 2013 00:22:00 +0000 Received: from localhost ([127.0.0.1]:34503 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VEpzr-0002Vq-BF for submit@debbugs.gnu.org; Wed, 28 Aug 2013 20:22:00 -0400 Received: from cobb.liquidweb.com ([50.28.13.150]:56546) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1VEpzn-0002Vf-LN for 15189@debbugs.gnu.org; Wed, 28 Aug 2013 20:21:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lawlist.com; s=default; h=To:References:Message-Id:Content-Transfer-Encoding:Cc:Date:In-Reply-To:From:Content-Type:Mime-Version:Subject; bh=+joIX6wzXLa/BOWDxhAF8Ydd7z7IXK3Ol/5CYz74ih0=; b=D41RLB7ouwGsQQHr+MYzgn4+J+sfVoOOzYhcl2M7ATJBBYwI7al06XtzfHEX9v6/uCNOQN4SzrOSMz0mAqKW75OghcRqNKJD1s2+Guk53gzBGcIMAskCT5MtaXFxM/l0; Received: from cpe-75-85-5-102.socal.res.rr.com ([75.85.5.102]:53947 helo=[192.168.0.3]) by cobb.liquidweb.com with esmtpa (Exim 4.80.1) (envelope-from ) id 1VEpzk-0000d7-CT; Wed, 28 Aug 2013 20:21:52 -0400 Subject: Re: bug#15189: 24.3.50; display-buffer does not work well with custom frames. Mime-Version: 1.0 (Apple Message framework v1084) Content-Type: text/plain; charset=us-ascii From: Keith David Bershatsky In-Reply-To: <521C4B77.80107@gmx.at> Date: Wed, 28 Aug 2013 17:21:52 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: References: <521C4B77.80107@gmx.at> To: martin rudalics X-Mailer: Apple Mail (2.1084) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cobb.liquidweb.com X-AntiAbuse: Original Domain - debbugs.gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lawlist.com X-Get-Message-Sender-Via: cobb.liquidweb.com: authenticated_id: lawlist/from_h X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 15189 Cc: 15189@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) Okay, I think I have a better understanding now of how display-buffer = works in conjunction with the display-buffer-alist. There just weren't = any really good examples on the internet or in the official = documentation from which to work from. I've updated my post on = stackoverflow.com, and that should help other novice programmers (like = myself) in the future who Google some of the relevant keywords. I = noticed quite a few comments on the internet about the display-buffer = family of functions being worthy of a doctoral thesis due to the level = of complexity. And with my legal background, I was beginning to think = that this project was similar to understanding the rule against = perpetuities -- something that all law school students fear will be = tested: http://en.wikipedia.org/wiki/Rule_against_perpetuities I recommend that the documentation be updated to include several working = examples of the display-buffer family of functions, which would help to = remove the mysticism surrounding the usage. The level of "perceived" = complexity would be significantly reduced once those working examples = become available. Thank you so much for teaching me a few new things about programming and = the display-buffer family. In case you or anyone else who has been reading these e-mail exchanges = is interested in the project I've been working on, I am resurrecting = Frame-Bufs written by Al Parker a few years ago and marrying it with = Tabbar. It's far from done, but it is working already and is coming = along quite nicely thanks to all the wonderful help from people like you = :) https://github.com/lawlist/tabbar-lawlist Thanks again, Keith ;;;;;;;;;;;;;;;;; DISPLAY-BUFFER-ALIST and DISPLAY-BUFFER = ;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun example () (interactive) ;; condition # 3 | file-visiting buffer (lawlist-find-file "*bar*") (set-frame-height (selected-frame) 20) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 0 0) (message "\*bar\* appears in frame name SYSTEM.") (sit-for 3) ;; condition # 4(a) | no-file-visiting buffer (display-buffer (get-buffer-create "*NO-FILE-special-buffer-regexp*")) (message "NO-FILE buffer existing frame, without other windows.") (sit-for 3) ;; condition # 2(a) | file-visiting buffer (lawlist-find-file "foo.txt") (set-frame-height (selected-frame) 20) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 100 100) (message "\"foo.txt\" appears in frame name MAIN.") (sit-for 3) ;; condition # 1 | file-visiting buffer (lawlist-find-file "doe.org") (set-frame-height (selected-frame) 20) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 200 200) (message "\"doe.org\" appears in frame name ORG.") (sit-for 3) ;; condition # 4(b) | file-visiting buffer (lawlist-find-file "*FILE-special-buffer-regexp*") (message "FILE buffer existing frame, without other windows.") (sit-for 3) ;; condition # 6 | no-file-visiting buffer default display (calendar) (message "Default for no-file-visiting-buffers.") (sit-for 3) ;; condition # 5 | file-visiting buffer with no pre-defined regexp. (lawlist-find-file "*FILE-undefined-regexp*") (set-frame-height (selected-frame) 20) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 300 300) (message "\*IS\* buffer-filename. \*NOT\* defined by any particular = regexp.") (sit-for 3) ;; condition # 2(b) | no-file-visiting buffer (display-buffer (get-buffer-create "*NO-FILE-main-buffer-regexp*")) (set-frame-height (selected-frame) 20) (set-frame-width (selected-frame) 80) (set-frame-position (selected-frame) 400 400) (message "\*NOT\* buffer-filename. \*IS\* defined by = main-buffer-regexp.") (sit-for 3) (kill-buffer "*bar*") (kill-buffer "foo.txt") (kill-buffer "doe.org") (kill-buffer "*FILE-undefined-regexp*") (kill-buffer "*NO-FILE-main-buffer-regexp*") (kill-buffer "*Calendar*") (kill-buffer "*FILE-special-buffer-regexp*") (kill-buffer "*NO-FILE-special-buffer-regexp*") (make-frame) (delete-frame (get-frame "SYSTEM")) (delete-frame (get-frame "MAIN")) (delete-frame (get-frame "ORG")) (delete-frame (get-frame "MISCELLANEOUS")) (message "THE END.")) (defvar regexp-frame-names = "^\\(?:MAIN\\|SYSTEM\\|ORG\\|MISCELLANEOUS\\)$" "Regexp matching frames with specific names.") (defvar system-buffer-regexp nil "Regexp of file / buffer names displayed in frame `SYSTEM`.") (setq system-buffer-regexp '("*scratch*" "*bbdb*" "*bar*")) (defvar main-buffer-regexp nil "Regexp of file / buffer names displayed in frame `MAIN`.") (setq main-buffer-regexp '("\\.txt" "\\.tex" "\\.el" "\\.yasnippet" = "\\*NO-FILE-main-buffer-regexp\\*")) (defvar org-buffer-regexp nil "Regexp of file / buffer names displayed in frame `ORG`.") (setq org-buffer-regexp '("[*]TODO[*]" "[*]Org Agenda[*]" = "\\.org_archive" "\\.org")) (defvar special-buffer-regexp nil "Regexp of file / buffer names that will .") (setq special-buffer-regexp '("[*]NO-FILE-special-buffer-regexp[*]" = "*FILE-special-buffer-regexp*")) (defvar buffer-filename nil) (defun lawlist-find-file (&optional buffer-filename) "With assistance from the display-buffer-alist, locate or create a = specific frame, and then open the file." (interactive) (unless buffer-filename (setq buffer-filename (read-file-name "Select File: " "~/" nil nil nil nil))) ;; If using a version of Emacs built `--with-ns`, then user may = substitute: ;; (unless buffer-filename (setq buffer-filename ;; (ns-read-file-name "Select File:" "~/" t nil nil))) (if buffer-filename (display-buffer (find-file-noselect buffer-filename)))) (setq display-buffer-alist '((".*" . = (lawlist-display-buffer-pop-up-frame)))) (defun lawlist-display-buffer-pop-up-frame (buffer alist) (cond ;; condition # 1 -- either file-visiting or no-file buffers ((regexp-match-p org-buffer-regexp (buffer-name buffer)) (if (frame-exists "ORG") (switch-to-frame "ORG") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match regexp-frame-names (frame-parameter = frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "ORG")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "ORG")) (progn (make-frame) (set-frame-name "ORG"))) ) (if (and (featurep 'init-frames) frame-bufs-mode) (frame-bufs-add-buffer (get-buffer buffer) (selected-frame))) (set-window-buffer (frame-selected-window) (buffer-name buffer))) ;; condition # 2 -- either file-visiting or no-file buffers ((regexp-match-p main-buffer-regexp (buffer-name buffer)) (if (frame-exists "MAIN") (switch-to-frame "MAIN") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match regexp-frame-names (frame-parameter = frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MAIN")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MAIN")) (progn (make-frame) (set-frame-name "MAIN"))) ) (if (and (featurep 'init-frames) frame-bufs-mode) (frame-bufs-add-buffer (get-buffer buffer) (selected-frame))) (set-window-buffer (frame-selected-window) (buffer-name buffer))) ;; condition # 3 -- either file-visiting or no-file buffers ((regexp-match-p system-buffer-regexp (buffer-name buffer)) (if (frame-exists "SYSTEM") (switch-to-frame "SYSTEM") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match regexp-frame-names (frame-parameter = frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "SYSTEM")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "SYSTEM")) (progn (make-frame) (set-frame-name "SYSTEM"))) ) (if (and (featurep 'init-frames) frame-bufs-mode) (frame-bufs-add-buffer (get-buffer buffer) (selected-frame))) (set-window-buffer (frame-selected-window) (buffer-name buffer))) ;; condition # 4 ;; display buffer in the existing frame, without other windows ((regexp-match-p special-buffer-regexp (buffer-name buffer)) (if (and (featurep 'init-frames) frame-bufs-mode) (frame-bufs-add-buffer (get-buffer buffer) (selected-frame))) (set-window-buffer (frame-selected-window) (buffer-name buffer))) ;; condition # 5 ;; file-visiting buffers that do NOT match any pre-defined regexp ((and (not (regexp-match-p org-buffer-regexp (buffer-name buffer))) (not (regexp-match-p main-buffer-regexp (buffer-name buffer))) (not (regexp-match-p system-buffer-regexp (buffer-name = buffer))) (not (regexp-match-p special-buffer-regexp (buffer-name = buffer))) buffer-filename ) (if (frame-exists "MISCELLANEOUS") (switch-to-frame "MISCELLANEOUS") ;; If unnamed frame exists, then take control of it. (catch 'break (dolist (frame (frame-list)) (if (not (string-match regexp-frame-names (frame-parameter = frame 'name))) (throw 'break (progn (switch-to-frame (frame-parameter frame 'name)) (set-frame-name "MISCELLANEOUS")))))) ;; If dolist found no unnamed frame, then create / name it. (if (not (frame-exists "MISCELLANEOUS")) (progn (make-frame) (set-frame-name "MISCELLANEOUS")))) (if (and (featurep 'init-frames) frame-bufs-mode) (frame-bufs-add-buffer (get-buffer buffer) (selected-frame))) (set-window-buffer (frame-selected-window) (buffer-name buffer))) ;; condition # 6 ;; default display for no-file-visiting buffers (t nil) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GENERIC REGEXP FUNCTION = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun regexp-match-p (regexps string) "Before the lisp function, define the variable like this:\n (defvar example-regexp nil \"Regexps matching `buffer-name buffer` for frame name `SYSTEM`.\") (setq example-regexp '(\"\\(\\*foo\\*\\|\\*bar\\*\\)\")) \nWithin the lisp function, use something like this:\n (regexp-match-p example-regexp (buffer-name buffer)) \nOr, this:\n (regexp-match-p example-regexp buffer-filename)" (catch 'matched (dolist (regexp regexps) (if (string-match regexp string) (throw 'matched t))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GENERIC FRAME UTILITIES = ;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun frame-exists (frame-name) (not (eq nil (get-frame frame-name)))) (defun get-frame-name (&optional frame) "Return the string that names FRAME (a frame). Default is selected = frame." (unless frame (setq frame (selected-frame))) (if (framep frame) (cdr (assq 'name (frame-parameters frame))) (error "Function `get-frame-name': Argument not a frame: `%s'" = frame))) (defun get-frame (frame) "Return a frame, if any, named FRAME (a frame or a string). If none, return nil. If FRAME is a frame, it is returned." (cond ((framep frame) frame) ((stringp frame) (catch 'get-a-frame-found (dolist (fr (frame-list)) (when (string=3D frame (get-frame-name fr)) (throw 'get-a-frame-found fr))) nil)) (t (error "Function `get-frame-name': Arg neither a string nor a frame: = `%s'" frame)))) (defun switch-to-frame (frame-name) (let ((frames (frame-list))) (catch 'break (while frames (let ((frame (car frames))) (if (equal (frame-parameter frame 'name) frame-name) (throw 'break (select-frame-set-input-focus frame)) (setq frames (cdr frames)))))))) ;;;;;;;;;;;;;;;;;;;;;;;; IF BUILT --with-ns, THEN ALSO USE = ;;;;;;;;;;;;;;;;;;;;;;;;;; (defalias 'ns-find-file 'lawlist-ns-find-file) (defun lawlist-ns-find-file () "Do a `find-file' with the `ns-input-file' as argument." (interactive) (let* ((f (file-truename (expand-file-name (pop ns-input-file) command-line-default-directory))) (file (find-file-noselect f)) (bufwin1 (get-buffer-window file 'visible)) (bufwin2 (get-buffer-window "*scratch*" 'visible))) (cond (bufwin1 (select-frame (window-frame bufwin1)) (raise-frame (window-frame bufwin1)) (select-window bufwin1)) ((and (eq ns-pop-up-frames 'fresh) bufwin2) (ns-hide-emacs 'activate) (select-frame (window-frame bufwin2)) (raise-frame (window-frame bufwin2)) (select-window bufwin2) (lawlist-find-file f)) (t (ns-hide-emacs 'activate) (lawlist-find-file f)))))= From debbugs-submit-bounces@debbugs.gnu.org Mon Feb 10 16:34:08 2014 Received: (at control) by debbugs.gnu.org; 10 Feb 2014 21:34:08 +0000 Received: from localhost ([127.0.0.1]:41912 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WCyUS-00086X-Fw for submit@debbugs.gnu.org; Mon, 10 Feb 2014 16:34:08 -0500 Received: from fencepost.gnu.org ([208.118.235.10]:54418 ident=Debian-exim) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WCyUQ-00086Q-Gw for control@debbugs.gnu.org; Mon, 10 Feb 2014 16:34:06 -0500 Received: from rgm by fencepost.gnu.org with local (Exim 4.71) (envelope-from ) id 1WCyUQ-0006ny-5A for control@debbugs.gnu.org; Mon, 10 Feb 2014 16:34:06 -0500 Date: Mon, 10 Feb 2014 16:34:06 -0500 Message-Id: Subject: control message for bug 15189 To: X-Mailer: mail (GNU Mailutils 2.1) From: Glenn Morris X-Spam-Score: -5.6 (-----) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.6 (-----) close 15189 From unknown Sun Jun 22 22:41:41 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Tue, 11 Mar 2014 11:24:07 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator