From: Stefan Monnier via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org>
To: help-gnu-emacs@gnu.org
Subject: Re: Advice on custom packages that conflict with tramp
Date: Fri, 10 Mar 2023 11:19:18 -0500 [thread overview]
Message-ID: <jwvzg8kbnqh.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: CAA5t8VoeiC96RBU2uPFErXaEkmr=yYBpGnzCJEa3Vzi+db_cvw@mail.gmail.com
> 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
prev parent reply other threads:[~2023-03-10 16:19 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-07 21:30 Advice on custom packages that conflict with tramp David Karr
2023-03-10 16:19 ` Stefan Monnier via Users list for the GNU Emacs text editor [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=jwvzg8kbnqh.fsf-monnier+emacs@gnu.org \
--to=help-gnu-emacs@gnu.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).