From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Stefan Monnier via Users list for the GNU Emacs text editor Newsgroups: gmane.emacs.help Subject: Re: Advice on custom packages that conflict with tramp Date: Fri, 10 Mar 2023 11:19:18 -0500 Message-ID: References: Reply-To: Stefan Monnier Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="8426"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) To: help-gnu-emacs@gnu.org Cancel-Lock: sha1:nnCyW2vIGKf1Sp7+QBhDA8mOtOw= Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Fri Mar 10 17:20:05 2023 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pafTR-00020Y-KX for geh-help-gnu-emacs@m.gmane-mx.org; Fri, 10 Mar 2023 17:20:05 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pafSv-0003vx-0G; Fri, 10 Mar 2023 11:19:33 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pafSr-0003vB-UQ for help-gnu-emacs@gnu.org; Fri, 10 Mar 2023 11:19:30 -0500 Original-Received: from ciao.gmane.io ([116.202.254.214]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pafSq-00039R-7c for help-gnu-emacs@gnu.org; Fri, 10 Mar 2023 11:19:29 -0500 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1pafSn-00013k-HY for help-gnu-emacs@gnu.org; Fri, 10 Mar 2023 17:19:25 +0100 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=116.202.254.214; envelope-from=geh-help-gnu-emacs@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: -15 X-Spam_score: -1.6 X-Spam_bar: - X-Spam_report: (-1.6 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.25, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.help:142966 Archived-At: > One of the Tramp team members took a brief look at my packages and said > that he did see at least one oddity in how I'm creating the shell buffers, > being that it creates the shell buffer (so I can control the name) and then > calls "shell" for that buffer. I can't see where it "creates the shell buffer" before calling `shell`. > (defun cycle-make-shell () > "Implements a ring of *shell* buffers. If current buffer is not a shell > buffer, then it will just execute 'shell'. If it IS a shell buffer, then > create a new shell buffer, starting with '*shell-1*', but skipping to the > next > number if that already exists." > (interactive) > (let* ((bufname (buffer-name (current-buffer)))) > (if (string-match "\*shell\\(\*\\|-\\([0-9][0-9]*\\)\*\\)" bufname) ^ ^ ^ ineffective BTW, why not check (derived-mode-p 'shell-mode) instead of checking the name? > (progn > (setq change-dir default-directory) > (setq done nil) Here you change those two *global* variables. Better define them locally with `let`. *Never* use `setq` on a variable unless you've locally defined it with `let` or you globally defined it with `defvar`. I recommend you regularly byte-compile your code (or use `flymake-mode`) to benefit from the compiler's warnings. > (while (not done) > (progn > (setq new-bufname (next-bufname bufname "shell")) > (if (bufferp (get-buffer new-bufname)) > (setq bufname new-bufname) > (setq done t) > ) > ) > ) > (if (bufferp (get-buffer "*shell*")) > (progn > (set-buffer "*shell*") > (rename-uniquely) > (setq tmp-bufname (buffer-name)) > )) > (shell) > (sit-for 1) > (set-buffer "*shell*") > (rename-buffer new-bufname) > ;; Now we need to somehow change the directory to "change-dir". > (set-buffer tmp-bufname) > (rename-buffer "*shell*") > (set-buffer new-bufname) If I were you, I'd change that function so that all your buffers are named `*shell-N*` (i.e. you won't have one called `*shell*` any more). Then you can just replace the above code with something like: (shell) (rename-uniquely) and call it a day. It makes the other case (i.e. when you call that command from a non-shell buffer) slightly more complicated since you have to look for a shell buffer, but nothing too bad. IOW something like: (defun my-cycle-make-shell () (interactive) (let ((dest nil)) (unless (derived-mode-p 'shell-mode) (let ((bufs (buffer-list))) (while (and bufs (not dest)) (if (with-current-buffer (car bufs) (derived-mode-p 'shell-mode)) (setq dest (car bufs)) (setq bufs (cdr bufs)))))) (if dest (pop-to-buffer-same-window dest) (shell) (rename-uniquely)))) Of course, you can use something else than `rename-uniquely` if you don't like the names it chooses :-) > (defun cycle-find-shell (&optional string) > (interactive "sEnter directory substring: ") AFAICT `string` is actually not searched as a substring but as a regexp. Stefan