unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
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




      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).