Làm thế nào tôi có thể mở shell trong bộ đệm hiện tại?


8

Trong chức năng "shell" dòng này hiển thị bộ đệm shell và hầu như luôn luôn mở shell mới của nó trong khung ngẫu nhiên. Và tôi phải trao đổi bộ đệm, thật khó chịu.

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

Trong tài liệu nói:

Nếu cửa sổ đó nằm trên một khung đồ họa khác, khung đó sẽ được lấy nét đầu vào nếu có thể.

Tôi không hiểu làm thế nào tôi có thể hiển thị bộ đệm trong khung mục tiêu, tôi không đủ tốt trong elisp. Làm thế nào tôi có thể làm điều đó? Cảm ơn nếu ai đó có thể giúp đỡ.


2
Điều này làm tôi phát điên, bạn đã tìm ra giải pháp chưa?
Nisba

Bạn nên dùng thử ibuffer emacs.stackexchange.com/questions/38659/ triệt
Pierre ALebarÈDE

Bạn nên thử ibuffer, xem emacs.stackexchange.com/questions/38659/ này .
Pierre ALebarÈDE

Câu trả lời:


5

Tôi giả định rằng áp phích gốc có nghĩa là nhắm mục tiêu cửa sổ hiện được chọn trong cùng một khung. Trong trường hợp người đăng ban đầu mong muốn nhắm mục tiêu một cửa sổ cụ thể trong một khung khác, sau đó xem chủ đề liên quan này để biết ví dụ phức tạp: /programming/18346785/how-to-intercept-a-file- trước-nó-mở-và-quyết-mà-khung

Tôi đã sao chép hàm dựng sẵn shellvà tạo một hàm mới gọi là shell-get-buffer-createsử dụng with-current-buffer ...thay cho pop-to-buffer. Hàm mới này tạo hoặc định vị *shell*bộ đệm mà không chọn nó trong bất kỳ cửa sổ nào.

Để hiển thị *shell*bộ đệm trong cửa sổ hiện được chọn, hãy sử dụng:

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

hoặc là

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

hoặc là

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

Tôi đã tạo một chức năng tùy chỉnh được gọi là my-display-buffercó thể hiển thị theo bốn hướng - trái, phải, trên hoặc dưới. Có ba khả năng: (1) Nếu một cửa sổ trên khung đã hiển thị bộ đệm đích, thì chỉ cần sử dụng lại cùng một cửa sổ. (2) Nếu đã có một cửa sổ theo hướng được chỉ định liên quan đến cửa sổ đã chọn, thì hiển thị bộ đệm đích trong cửa sổ đã nói. (3) Nếu không có cửa sổ theo hướng được chỉ định, thì hãy tạo một cửa sổ theo hướng đó và hiển thị bộ đệm đích trong cửa sổ đã nói.

Sử dụng mẫu :

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

hoặc là

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

hoặc là

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

hoặc là

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

Và, đây là một eshell-get-buffer-createhoạt động tương tự như trên ...

(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

Không phải là một câu trả lời trực tiếp cho câu hỏi của bạn, nhưng có lẽ đây là một giải pháp cho bạn.

M-x install-package shell-pop

Để cài đặt gói shell-pop từ melpa hoặc melpa-ổn định. Sau đó đánh giá (để thử *scratch*qua thông qua C-x C-e, sau này trong của bạn .emacs)

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

Điều này bật lên một lớp vỏ ở phần dưới của khung của bạn, trong trường hợp này khi nhấn ctrl-meta-ret. Lặp lại trình tự bàn phím trở lại vị trí của bạn.

Xem https://github.com/kyagi/shell-pop-el để biết chi tiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.