2013-03-15 36 views
1

當我們在dired中使用時,它會在「其他窗口」中打開文件。但是如果有多個其他窗口可見,則它會隨機選擇。有沒有辦法選擇打開該文件的窗口?從dired在特定窗口中打開文件

+0

請看下面的例子來顯示的緩衝液(來自dired模式打開)上方,下方,左側或右側:https://emacs.stackexchange.com/a/15118/2287 – lawlist 2017-12-03 23:20:05

回答

0

我懷疑這種行爲是隨機的,但您可以通過掛鉤到display-buffer並綁定您自己的命令來更改它。

請注意,大多數代碼是按區域排序窗口列表。

(defvar le::dired-chosen-window nil 
    "current chosen window to show buffers for `le::dired-choose-window-action'") 

(defun le::window-list-for-completion() 
    "Return alist of (BUFFER-NAME . WINDOW) sorted by size, 
    suitable for completion." 
    ;; Schwartzian transform 
    (mapcar 
    (lambda (cell) 
    (let ((window (car cell))) 
     (cons (concat 
       (when (and (boundp 'window-numbering-mode) 
         window-numbering-mode) 
       (format "%s: " 
         (window-numbering-get-number-string window))) 
       (buffer-name (window-buffer window))) 
      window))) 
    (sort (loop with boost-alist = (if (eq major-mode 'dired-mode) 
             (list (cons (selected-window) -1000000)) 
            nil) 
       for window in (window-list nil 0 (window-at 0 0)) 
       for index from 0 
       collect (cons window (+ 
            (* (window-total-width window) 
             (window-total-height window) 
             100) 
            index 
            (let ((boost (assq window boost-alist))) 
             (if boost 
              (cdr boost) 
             0))))) 
     (lambda (a b) 
      (> (cdr a) (cdr b)))))) 

(defun le::dired-choose-window (window) 
    "Choose window to display buffer in. 
Reset selection with universal prefix (C-u)." 
    (interactive (let ((completions (le::window-list-for-completion))) 
       (list (unless current-prefix-arg 
         (cdr (assoc (completing-read "window holding buffer: " completions) completions)))))) 
    (setq le::dired-chosen-window window)) 

(defun le::dired-choose-window-action (buffer alist) 
    "action to display buffer in `le::dired-chosen-window'" 
    (window--display-buffer buffer le::dired-chosen-window 'reuse)) 

(defun le::dired-find-file-specified-window() 
    "Dired command to display buffer in chosen window" 
    (interactive) 
    (let ((display-buffer-overriding-action '((le::dired-choose-window-action)))) 
    (dired-find-file-other-window))) 


(define-key dired-mode-map [remap dired-find-file-other-window] 'le::dired-find-file-specified-window) 
  1. 評估緩衝區。
  2. 選擇與le::dired-choose-window-action
  3. Ø從dired在選擇窗口中打開文件的窗口。
+0

耶它實際上在打開的窗口中以循環方式打開。我會嘗試你的作品,並讓你知道如果這是我想要的。謝謝 ! – navderm 2013-03-18 18:08:36

1

我也很害怕dired的這種行爲。我喜歡的方式ace-window讓您輕鬆選擇只有一個鍵擊窗,所以寫的,它可以讓我用它來從我選擇的窗口dired打開文件的函數:

(require 'ace-window) 
(defun find-file-ace-window() 
    "Use ace window to select a window for opening a file from dired." 
    (interactive) 
    (let ((file (dired-get-file-for-visit))) 
    (if (> (length (aw-window-list)) 1) 
     (aw-select "" (lambda (window) 
         (aw-switch-to-window window) 
         (find-file file))) 
     (find-file-other-window file)))) 

要更換dired標準find-file-other-window命令添加

(define-key dired-mode-map "o" 'find-file-ace-window)