現在のバッファーでシェルを開くにはどうすればよいですか?


8

関数「shell」では、この行はシェルバッファーを表示し、ほとんどの場合、ランダムフレームで開いている新しいシェルを表示します。そして、私はバッファを交換しなければなりません、それは迷惑です。

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

ドキュメントで言う:

そのウィンドウが別のグラフィックフレームにある場合、可能であれば、そのフレームに入力フォーカスが与えられます。

ターゲットフレームにバッファを表示する方法がわかりません。elispでは十分ではありません。どうすればできますか?誰かが助けてくれてありがとう。


2
これは私を夢中にさせています、あなたは解決策を見つけましたか?
Nisba 2017

あなたはibuffer試してみてくださいemacs.stackexchange.com/questions/38659/...
ピエールALBARÈDE

ibufferを試す必要があります。このemacs.stackexchange.com/questions/38659/…を参照してください
PierreALBARÈDE

回答:


5

元のポスターは、同じフレームで現在選択されているウィンドウをターゲットにすることを意味していると思います。元のポスターが別のフレームの特定のウィンドウをターゲットにしたい場合は、次の関連するスレッドで複雑な例を参照してください:https : //stackoverflow.com/questions/18346785/how-to-intercept-a-file-開く前に決定するフレーム

組み込み関数をコピーして、の代わりにを使用shellするという新しい関数を作成しました。この新しい関数は、ウィンドウでバッファを選択せず​​に、バッファを生成または検索します。shell-get-buffer-createwith-current-buffer ...pop-to-buffer*shell*

*shell*現在選択されているウィンドウにバッファを表示するには、次のコマンドを使用します。

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

または

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

または

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

my-display-buffer左、右、上、または下の4方向に表示できるというカスタム関数を作成しました。3つの可能性があります:(1)フレームのウィンドウがすでにターゲットバッファーを表示している場合、同じウィンドウを再利用します。(2)選択したウィンドウに対して指定された方向にすでにウィンドウがある場合は、そのウィンドウにターゲットバッファーを表示します。(3)指定した方向にウィンドウがない場合は、その方向にウィンドウを作成し、そのウィンドウにターゲットバッファーを表示します。

使用例

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

または

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

または

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

または

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

コード

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

そして、これはeshell-get-buffer-create上記と同じように機能するものです...

(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

あなたの質問への直接の答えではありませんが、多分これはあなたのための解決策です。

M-x install-package shell-pop

melpaまたはmelpa-stableからパッケージshell-popをインストールするには。そして、評価(のためのトライアウトで*scratch*経由してC-x C-e、後で中.emacs

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

これにより、フレームの下部にシェルがポップアップします。この場合は、ctrl-meta-retを押したときに表示されます。キーボードシーケンスを繰り返すと、以前の位置に戻ります。

詳細については、https://github.com/kyagi/shell-pop-elを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.