Comment puis-je ouvrir le shell dans le tampon actuel?


8

Dans la fonction "shell", cette ligne affiche le tampon du shell et presque toujours son nouveau shell ouvert dans un cadre aléatoire. Et je dois échanger les tampons, c'est ennuyeux.

...
(pop-to-buffer buffer)
...

Dans les documents dit:

Si cette fenêtre se trouve sur un cadre graphique différent, ce cadre reçoit le focus d'entrée si possible.

Je ne comprends pas comment afficher le tampon dans le cadre cible, je ne suis pas assez bon dans elisp. Comment je peux faire ça? Merci si quelqu'un pouvait aider.


2
cela me rend fou, avez-vous trouvé une solution?
Nisba


Vous devriez essayer ibuffer, voir ce emacs.stackexchange.com/questions/38659/… .
Pierre ALBARÈDE

Réponses:


5

Je suppose que l'affiche originale signifie cibler la fenêtre actuellement sélectionnée dans le même cadre. Dans le cas où l'affiche originale souhaite cibler une fenêtre spécifique dans un cadre différent, consultez ce fil associé pour un exemple complexe: /programming/18346785/how-to-intercept-a-file- avant d'ouvrir et de décider quelle image

J'ai copié la fonction intégrée shellet en ai créé une nouvelle appeléeshell-get-buffer-create , qui utilise à la with-current-buffer ...place de pop-to-buffer. Cette nouvelle fonction génère ou localise le *shell*tampon sans le sélectionner dans aucune fenêtre.

Pour afficher le *shell* tampon dans la fenêtre actuellement sélectionnée, utilisez:

(switch-to-buffer (shell-get-buffer-create))

ou

(pop-to-buffer-same-window (shell-get-buffer-create))

ou

(set-window-buffer (selected-window) (shell-get-buffer-create))

J'ai créé une fonction personnalisée appelée my-display-bufferqui peut s'afficher dans quatre directions - gauche, droite, au-dessus ou en dessous. Il y a trois possibilités: (1) Si une fenêtre sur le cadre affiche déjà le tampon cible, alors réutilisez simplement la même fenêtre. (2) S'il existe déjà une fenêtre dans la direction spécifiée par rapport à la fenêtre sélectionnée, affichez le tampon cible dans cette fenêtre. (3) S'il n'y a pas de fenêtre dans la direction spécifiée, créez-en une dans cette direction et affichez le tampon cible dans ladite fenêtre.

Exemple d'utilisation :

(my-display-buffer (shell-get-buffer-create) nil 'left)

ou

(my-display-buffer (shell-get-buffer-create) nil 'right)

ou

(my-display-buffer (shell-get-buffer-create) nil 'above)

ou

(my-display-buffer (shell-get-buffer-create) nil 'below)

Le code :

(require 'shell)

(defun shell-get-buffer-create (&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).
  (with-current-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)

(defun my-display-buffer (buffer alist direction &optional size pixelwise)
"BUFFER:  The buffer that will be displayed.
ALIST:  See the doc-string of `display-buffer' for more information.
DIRECTION:  Must use one of these symbols:  'left 'right 'below 'above
SIZE:  See the doc-string for `split-window'.
PIXELWISE:  See the doc-string for `split-window'.
There are three possibilities:
-  (1) If a window on the frame already displays the target buffer,
then just reuse the same window.
-  (2) If there is already a window in the specified direction in relation
to the selected window, then display the target buffer in said window.
-  (3) If there is no window in the specified direction, then create one
in that direction and display the target buffer in said window."
  (let ((window
          (cond
            ((get-buffer-window buffer (selected-frame)))
            ((window-in-direction direction))
            (t
              (split-window (selected-window) size direction pixelwise)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

Et, voici un eshell-get-buffer-createqui fonctionne de la même manière que ci-dessus ...

(require 'cl)
(require 'eshell)

(defun eshell-get-buffer-create (&optional arg)
"Create an interactive Eshell buffer.  Return the Eshell buffer,
creating it if needed.  The buffer used for Eshell sessions is
determined by the value of `eshell-buffer-name'.  A numeric prefix
arg (as in `C-u 42 M-x eshell RET') switches to the session with
that number, creating it if necessary.  A nonnumeric prefix arg
means to createa new session.  Returns the buffer selected (or created)."
  (interactive "P")
  (cl-assert eshell-buffer-name)
  (let ((buf (cond ((numberp arg)
        (get-buffer-create (format "%s<%d>"
                 eshell-buffer-name
                 arg)))
       (arg
        (generate-new-buffer eshell-buffer-name))
       (t
        (get-buffer-create eshell-buffer-name)))))
    (cl-assert (and buf (buffer-live-p buf)))
    (with-current-buffer buf
      (unless (derived-mode-p 'eshell-mode)
        (eshell-mode)))
    buf))

4

Pas une réponse directe à votre question, mais c'est peut-être une solution pour vous.

M-x install-package shell-pop

Pour installer le package shell-pop depuis melpa ou melpa-stable. Ensuite, évaluez (pour essayer dans *scratch*via C-x C-e, plus tard dans votre .emacs)

(global-set-key (kbd "<C-M-return>") 'shell-pop)

Cela fait apparaître un shell dans la partie inférieure de votre cadre, dans ce cas lorsque vous appuyez sur ctrl-meta-ret. La répétition de la séquence du clavier revient là où vous étiez.

Voir https://github.com/kyagi/shell-pop-el pour plus de détails.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.