Dans les EMACS précédents, "Shell M-x" Nouveau tampon de shell dans les fenêtres actuelles. p>
Mais récemment, je mettez à jour mes EMACS à GNU EMACS 26.0.50.2. "Shell M-X" Nouveau tampon de shell dans les autres fenêtres. Je recherche google et n'a pas pu trouver la réponse. Est-ce que quelqu'un sait comment prévenir ce comportement? P>
3 Réponses :
La raison est que Peut-être que quelqu'un d'autre peut remplacer la fonction avec un conseil. Je serais intéressé par cette solution. P> shell code> utilise
(tampon pop-to-tampon) code> au lieu de
(tampon de commutation à tampon) code>. Je ne sais pas comment conseiller la fonction, je ne peux donc pas vous donner une réponse appropriée. Toutefois, si vous voulez seulement
shell code> pour fonctionner comme vous le souhaitez, vous pouvez simplement ajouter toute la fonction de votre config.
(defun shell (&optional buffer)
"Run an inferior shell, with I/O through BUFFER (which defaults to `*shell*').
Interactively, a prefix arg means to prompt for BUFFER.
If `default-directory' is a remote file name, it is also prompted
to change if called with a prefix arg.
If BUFFER exists but shell process is not running, make new shell.
If BUFFER exists and shell process is running, just switch to BUFFER.
Program used comes from variable `explicit-shell-file-name',
or (if that is nil) from the ESHELL environment variable,
or (if that is nil) from `shell-file-name'.
If a file `~/.emacs_SHELLNAME' exists, or `~/.emacs.d/init_SHELLNAME.sh',
it is given as initial input (but this may be lost, due to a timing
error, if the shell discards input when it starts up).
The buffer is put in Shell mode, giving commands for sending input
and controlling the subjobs of the shell. See `shell-mode'.
See also the variable `shell-prompt-pattern'.
To specify a coding system for converting non-ASCII characters
in the input and output to the shell, use \\[universal-coding-system-argument]
before \\[shell]. You can also specify this with \\[set-buffer-process-coding-system]
in the shell buffer, after you start the shell.
The default comes from `process-coding-system-alist' and
`default-process-coding-system'.
The shell file name (sans directories) is used to make a symbol name
such as `explicit-csh-args'. If that symbol is a variable,
its value is used as a list of arguments when invoking the shell.
Otherwise, one argument `-i' is passed to the shell.
\(Type \\[describe-mode] in the shell buffer for a list of commands.)"
(interactive
(list
(and current-prefix-arg
(prog1
(read-buffer "Shell buffer: "
;; If the current buffer is an inactive
;; shell buffer, use it as the default.
(if (and (eq major-mode 'shell-mode)
(null (get-buffer-process (current-buffer))))
(buffer-name)
(generate-new-buffer-name "*shell*")))
(if (file-remote-p default-directory)
;; It must be possible to declare a local default-directory.
;; FIXME: This can't be right: it changes the default-directory
;; of the current-buffer rather than of the *shell* buffer.
(setq default-directory
(expand-file-name
(read-directory-name
"Default directory: " default-directory default-directory
t nil))))))))
(setq buffer (if (or buffer (not (derived-mode-p 'shell-mode))
(comint-check-proc (current-buffer)))
(get-buffer-create (or buffer "*shell*"))
;; If the current buffer is a dead shell buffer, use it.
(current-buffer)))
;; On remote hosts, the local `shell-file-name' might be useless.
(if (and (called-interactively-p 'any)
(file-remote-p default-directory)
(null explicit-shell-file-name)
(null (getenv "ESHELL")))
(with-current-buffer buffer
(set (make-local-variable 'explicit-shell-file-name)
(file-remote-p
(expand-file-name
(read-file-name
"Remote shell path: " default-directory shell-file-name
t shell-file-name))
'localname))))
;; The buffer's window must be correctly set when we call comint (so
;; that comint sets the COLUMNS env var properly).
(switch-to-buffer buffer)
(unless (comint-check-proc buffer)
(let* ((prog (or explicit-shell-file-name
(getenv "ESHELL") shell-file-name))
(name (file-name-nondirectory prog))
(startfile (concat "~/.emacs_" name))
(xargs-name (intern-soft (concat "explicit-" name "-args"))))
(unless (file-exists-p startfile)
(setq startfile (concat user-emacs-directory "init_" name ".sh")))
(apply 'make-comint-in-buffer "shell" buffer prog
(if (file-exists-p startfile) startfile)
(if (and xargs-name (boundp xargs-name))
(symbol-value xargs-name)
'("-i")))
(shell-mode)))
buffer)
Cette réponse n'explique pas pourquoi l'OP n'a pas vu le même comportement auparavant. Commande EMACS Shell CODE> a toujours utilisé
pop-to-tamper code>, revenant au moins EMACS 20.
En fait, dans les versions d'EMACS récentes shell code> utilise
pop-to-tamper-même fenêtre code>.
Intéressant. Peut-être que vous pourriez éditer la réponse avec un défadvice code> ou quoi que ce soit à utiliser dans ce type de situation?
Sauf si vous personnalisez les noms de vos tampons Shell, cela devrait être tout ce dont vous avez besoin:
(defun shell-same-window-advice (orig-fn &optional buffer) "Advice to make `shell' reuse the current window. Intended as :around advice." (let* ((buffer-regexp (regexp-quote (cond ((bufferp buffer) (buffer-name buffer)) ((stringp buffer) buffer) (:else "*shell*")))) (display-buffer-alist (cons `(,buffer-regexp display-buffer-same-window) display-buffer-alist))) (funcall orig-fn buffer))) (advice-add 'shell :around #'shell-same-window-advice)
Ajoutez cette ligne dans votre fichier .emacs: ceci corrigé pour moi. J'utilise EMACS 25.2 (9.0) sur un Mac et j'étais vraiment agacé par la coquille d'ouverture dans un autre cadre, voire un nouveau cadre lorsqu'il n'y avait qu'un.
C'est la source où j'ai reçu cette réponse. P> P>
Travaillé pour moi aussi. Merci!
Essayez de définir la variable
pop-up-windows code> à
nil code>. Est-ce que cela corrige le problème?