Cách sử dụng Tiếng Nhật Bản để mở từ dired / ibuffer sang khung khác


8

Tôi có hai cửa sổ mở và chia theo chiều dọc (khung đơn):

A) chứa công việc của tôi
B) chứa dired hoặc ibuffer.

Tôi muốn có thể điều hướng đến một tệp / bộ đệm trong khung B và nhấn "o" để nó mở trong khung A. Điều này có thể không? Ngay bây giờ emacs đang tạo một khung mới ở phần dưới của khung A để mở tệp.

chỉnh sửa: theo danh sách luật người dùng, hành vi được mô tả ở trên sẽ xảy ra khi khung lớn. Điều này dường như là trường hợp của tôi bởi vì bây giờ tôi đang ở nhà (không phải trên màn hình bên ngoài, khung nhỏ hơn) emacs đang cư xử như tôi mong muốn. Câu hỏi bây giờ trở thành: tôi có thể ngăn emacs mở một cửa sổ mới khi khung hiện tại lớn không?


1
Chào mừng đến với diễn đàn beta Emacs. Là một phần của biệt ngữ / biệt ngữ Emacs, chúng tôi sử dụng từ này windowđể chỉ một góc phần tư đệm trong cùng frame. A frameđược coi là toàn bộ kitten-kaboodle, có thể có nhiều cửa sổ bên trong nó. Emacs có thể tạo nhiều khung, với mỗi khung chứa nhiều cửa sổ.
luật

Cảm ơn bạn đã làm rõ! Tôi đã là một người dùng emacs lâu năm nhưng chưa bao giờ hiểu đầy đủ về thuật ngữ này.
Robert

Câu trả lời:


6

Dưới đây là bốn (4) display-buffernhóm chức năng tùy chỉnh mẫu có thể được tùy chỉnh tùy chỉnh để phù hợp với nhu cầu cụ thể của người dùng - ở trên ; bên dưới ; trái ; bên phải - và đây là bốn (4) interactivechức năng để hiển thị tệp hoặc thư mục của dòng hiện tại của dired-modebộ đệm. Chỉ có ba điều kiện: (a) nếu đã có cửa sổ hiển thị bộ đệm đích, sau đó chọn nó; (b) nếu có một cửa sổ theo hướng mong muốn có sẵn, thì hãy sử dụng nó; (c) bắt tất cả là tạo một cửa sổ mới theo hướng mong muốn nếu các điều kiện khác không được đáp ứng.

Sử dụng:

M-x dired-display-above

M-x dired-display-below

M-x dired-display-left

M-x dired-display-right

Có rất nhiều ràng buộc chính đã được tích hợp sẵn dired-modedired+tôi không dám tự mình tạo ra các ràng buộc . Người dùng có thể tự do chọn các phím tắt riêng của mình, nằm ngoài phạm vi của ví dụ giới hạn này.

Người dùng có thể tự do thêm các điều kiện bổ sung vào nhóm hàm mẫu display-bufferđể xử lý nhiều tình huống hơn - ví dụ: nhiều cửa sổ hơn chỉ là một cặp.

(defun my-display-buffer-below (buffer alist)
"Doc-string."
  (let (
      (window
        (cond
          ((get-buffer-window buffer (selected-frame)))
          ((window-in-direction 'below))
          (t
            (split-window (selected-window) nil 'below)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

(defun my-display-buffer-above (buffer alist)
"Doc-string."
  (let (
      (window
        (cond
          ((get-buffer-window buffer (selected-frame)))
          ((window-in-direction 'above))
          (t
            (split-window (selected-window) nil 'above)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

(defun my-display-buffer-left (buffer alist)
"Doc-string."
  (let (
      (window
        (cond
          ((get-buffer-window buffer (selected-frame)))
          ((window-in-direction 'left))
          (t
            (split-window (selected-window) nil 'left)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

(defun my-display-buffer-right (buffer alist)
"Doc-string."
  (let (
      (window
        (cond
          ((get-buffer-window buffer (selected-frame)))
          ((window-in-direction 'right))
          (t
            (split-window (selected-window) nil 'right)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

(defun dired-display-above ()
"Doc-string."
(interactive)
  (let* (
      (file-or-dir (dired-get-file-for-visit))
      (buffer (find-file-noselect file-or-dir)))
    (my-display-buffer-above buffer nil)))

(defun dired-display-below ()
"Doc-string."
(interactive)
  (let* (
      (file-or-dir (dired-get-file-for-visit))
      (buffer (find-file-noselect file-or-dir)))
    (my-display-buffer-below buffer nil)))

(defun dired-display-left ()
"Doc-string."
(interactive)
  (let* (
      (file-or-dir (dired-get-file-for-visit))
      (buffer (find-file-noselect file-or-dir)))
    (my-display-buffer-left buffer nil)))

(defun dired-display-right ()
"Doc-string."
(interactive)
  (let* (
      (file-or-dir (dired-get-file-for-visit))
      (buffer (find-file-noselect file-or-dir)))
    (my-display-buffer-right buffer nil)))

EDIT: Dưới đây là một triển khai thú vị / tinh vi hơn một chút về khái niệm trên, mang đến cho người dùng khả năng sử dụng không tương tác hoặc tương tác này ; ví dụ: M-x dired-display-buffer- nơi người dùng sẽ được nhắc chọn thư mục nếu không di chuột qua tệp dired-modevà chọn hướng hiển thị (trái, phải, trên, dưới).

(defun my-display-buffer (buffer-or-name 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* ((buffer
           (if (bufferp buffer-or-name)
             buffer-or-name
             (get-buffer buffer-or-name)))
         (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))

(defun dired-display-buffer (&optional direction alist)
"Display a dired-mode buffer or a file underneath point in a dired-mode buffer."
(interactive)
  (let* ((file-or-dir (or (and (eq major-mode 'dired-mode) (dired-get-file-for-visit))
                               (read-directory-name "Directory:  ")))
         (buffer (find-file-noselect file-or-dir))
         (direction
           (if direction
             direction
             (let ((char (read-char-exclusive (concat
                      "["
                      (propertize "l" 'face '(:foreground "red"))
                      "]"
                      (propertize "eft" 'face '(:foreground "blue"))
                      " | ["
                      (propertize "r" 'face '(:foreground "red"))
                      "]"
                      (propertize "ight" 'face '(:foreground "blue"))
                      " | ["
                      (propertize "a" 'face '(:foreground "red"))
                      "]"
                      (propertize "bove" 'face '(:foreground "blue"))
                      " | ["
                      (propertize "b" 'face '(:foreground "red"))
                      "]"
                      (propertize "elow" 'face '(:foreground "blue"))))))
                (cond
                  ((eq char ?l)
                    'left)
                  ((eq char ?r)
                    'right)
                  ((eq char ?a)
                    'above)
                  ((eq char ?b)
                    'below)
                  ;;; FIXME:  @lawlist may add a loop similar to `org-capture'
                  ;;; whereby a new `read-char-exclusive' will be initiated if
                  ;;; a user did not initially choose a valid option (l/r/a/b).
                  (t
                    (let ((debug-on-quit nil)
                          (msg (concat "dired-display-buffer:  "
                                       "You did not select l/r/a/b "
                                       "-- exiting.")))
                      (signal 'quit `(,msg)))))))))
    (my-display-buffer buffer alist direction)))

oh điều này là hoàn hảo Ai đó có thể giúp tôi với hydra đơn giản cho dired-mode-map, ràng buộc ovà sau đó hjklđể hiển thị trên / dưới / trái / phải không?
iLemming

oh tôi nghĩ rằng tôi đã nhận nó: (defhydra dired-open (dired-mode-map "O" :exit t) "dired-open" ("j" dired-display-below "below") ("k" dired-display-above "above") ("h" dired-display-left "left") ("l" dired-display-right "left"))
iLemming 7/11/2016

Điều nhỏ về cách tiếp cận - nó không nhảy đến cửa sổ vừa tạo. Không thể tìm ra cách buộc nó.
iLemming

2
@Agzam - Chức năng select-windowcó thể được sử dụng ở cuối đuôi của mỗi my-display-buffer-...chức năng. Như bạn có thể thấy, kết quả / giá trị được ném ở cuối dòng cuối cùngwindow. Nếu bạn không cần kết quả / giá trị để sử dụng kết hợp với chức năng khác, thì chỉ cần bọc window dòng cuối cùng với điều này : (select-window window). Làm điều đó với tất cả bốn (4) hàm - tức là my-display-buffer-below; my-display-buffer-above; my-display-buffer-left; và my-display-buffer-right.
luật

3

Câu hỏi của bạn không rõ ràng, và vì vậy rủi ro được đóng lại. Bạn có hai khung hình hoặc một khung hình duy nhất với hai cửa sổ Emacs không? Dù chúng là gì, nếu có hai, mỗi cái có được chia theo chiều dọc không? Và bạn có ý nghĩa gì khi "chia theo chiều dọc"? Bạn có ý nghĩa gì bởi một "khung"? Bạn có ý nghĩa gì bởi "nó", trong "mở nó trong khung A"?

Một dự đoán hoang dã là bạn có một khung Emacs duy nhất được chia thành hai cửa sổ Emacs, A và B, với cửa sổ A phía trên cửa sổ B, cửa sổ B được chọn và cửa sổ B đang hiển thị bộ đệm Dired.

obị ràng buộc theo mặc định dired-find-file-other-window. Nếu phỏng đoán hoang dã ở trên là chính xác thì otrên tên tệp trong B sẽ mở trong A. Đây là những gì tôi thấy khi bắt đầu Emacs mà không có tệp init : emacs -Q. Bạn không thấy điều đó sao?

Nếu đây không phải là kịch bản, vui lòng mô tả rõ ràng những gì bạn đang làm, từng bước, bắt đầu với emacs -Q.


2
Nó phụ thuộc vào kích thước của khung - một khung lớn sẽ dẫn đến hành vi được mô tả bởi OP; trong khi đó, một khung nhỏ hơn sẽ dẫn đến hành vi mà Drew mô tả.
luật

danh sách luật tôi nghĩ rằng đó là chính xác những gì đang xảy ra. Khi được gắn vào màn hình ngoài của tôi với một khung lớn những gì tôi mô tả xảy ra, nhưng bây giờ tôi đang ở nhà trên màn hình máy tính xách tay nhỏ hơn của mình, nó hỏi như tôi mong muốn - có cách nào để buộc nó không mở một cửa sổ khác không?
Robert

Xin chào Drew xin lỗi tôi không hoàn toàn theo kịp tốc độ của biệt ngữ emacs liên quan đến sự khác biệt giữa khung và cửa sổ. Điều tôi muốn nói trong câu hỏi ban đầu của tôi (nếu bây giờ tôi hiểu chính xác các cửa sổ và khung) là tôi có một khung emacs duy nhất và hai cửa sổ emacs cạnh nhau (theo chiều dọc Cx 3). Mọi thứ hoạt động như dự định khi tôi ở trên máy tính xách tay của tôi và khung hình nhỏ, nhưng như danh sách luật chỉ ra khi khung lớn như những gì tôi mô tả xảy ra.
Robert

Vâng, nó là có thể. Tuy nhiên, một thiết lập chung của display-bufferhọ các biến sẽ ảnh hưởng đến các tình huống khác chưa lường trước được. Bạn có thể tùy chỉnh display-buffer-alist, điều này hơi khó hiểu ngay cả đối với người dùng Emacs có kinh nghiệm. Có các biến kiểm soát thời điểm phân chia các cửa sổ và kích thước tối thiểu của các cửa sổ, và danh sách cứ lặp đi lặp lại. Để ngăn chặn sự bùng phát, bạn có thể tư vấn dired-find-file-other-windowvới phiên bản giới hạn cho phép display-buffer-alist, nhưng tôi sẽ để câu trả lời đó cho người tham gia diễn đàn khác. Có nhiều giải pháp. :)
luật

0

LƯU Ý : Các biến sau đây là toàn cục , có nghĩa là chúng sẽ ảnh hưởng đến các chức năng khác bên cạnh dired-find-file-other-window. Người dùng có thể muốn tư vấn chức năng có vấn đề để không ảnh hưởng đến toàn cầu các chức năng khác. [Tuy nhiên, tác giả này sẽ để tùy chọn đó cho người tham gia diễn đàn khác.] Ngoài ra, có một câu trả lời khác mà tác giả này đã đăng có chứa các chức năng tùy chỉnh có thể được sử dụng để không ảnh hưởng đến bất kỳ điều gì khác.


Biến split-width-thresholdcó một chuỗi doc có ghi:

Minimum width for splitting windows sensibly.
If this is an integer, ‘split-window-sensibly’ may split a window
horizontally only if it has at least this many columns.  If this
is nil, ‘split-window-sensibly’ is not allowed to split a window
horizontally.

Đặt các mục sau trong .emacstệp sẽ đạt được hiệu quả mong muốn. Người dùng cũng có thể đặt giá trị thành một số cao hơn. Giá trị mặc định là 160

(setq split-width-threshold nil)

Đây là một liên kết đến phần có liên quan trong hướng dẫn:

https://www.gnu.org/software/emacs/manual/html_node/emacs/Window-Choice.html


Xem thêm biến liên quan split-height-threshold, có giá trị mặc định là 80

Chuỗi doc-trạng thái:

Minimum height for splitting windows sensibly.
If this is an integer, `split-window-sensibly' may split a window
vertically only if it has at least this many lines.  If this is
nil, `split-window-sensibly' is not allowed to split a window
vertically.  If, however, a window is the only window on its
frame, `split-window-sensibly' may split it vertically
disregarding the value of this variable.

Điều này thực sự làm việc khá tốt! Bây giờ nếu bất cứ điều gì buồn cười bắt đầu xảy ra, tôi ít nhất biết nơi để tìm. Cảm ơn một lần nữa!
Robert
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.