Hier sind vier (4) Beispiele für benutzerdefinierte display-buffer
Funktionsfamilien, die individuell auf die speziellen Bedürfnisse eines Benutzers zugeschnitten werden können - siehe oben ; unten ; links ; rechts - und hier sind vier (4) interactive
Funktionen zum Anzeigen der Datei oder des Verzeichnisses der aktuellen Zeile eines dired-mode
Puffers. Es gibt nur drei Bedingungen: (a) Wenn bereits ein Fenster mit dem Zielpuffer vorhanden ist, wählen Sie ihn aus. (b) Wenn ein Fenster in der gewünschten Richtung verfügbar ist, verwenden Sie es. (c) Der Haken ist, ein neues Fenster in die gewünschte Richtung zu erstellen, wenn die anderen Bedingungen nicht erfüllt sind.
Verwendungszweck:
M-x dired-display-above
M-x dired-display-below
M-x dired-display-left
M-x dired-display-right
Es sind so viele Tastenkombinationen bereits eingebaut dired-mode
und dired+
, dass ich es nicht wage, meine eigenen zu erfinden. Dem Benutzer steht es frei, seine eigenen Tastaturkürzel zu wählen, was den Rahmen dieses begrenzten Beispiels sprengt.
Dem Benutzer steht es frei, der Beispielfunktionsfamilie zusätzliche Bedingungen hinzuzufügen display-buffer
, um mehr Situationen zu bewältigen - z. B. mehr Fenster als nur ein paar.
(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)))
BEARBEITEN: Hier ist eine etwas ausgefeiltere / unterhaltsamere Implementierung des obigen Konzepts, die dem Benutzer die Möglichkeit gibt, dieses nicht interaktiv oder interaktiv zu verwenden . zB M-x dired-display-buffer
- wo der Benutzer aufgefordert wird, ein Verzeichnis auszuwählen, wenn er nicht mit der Maus über eine Datei fährt dired-mode
, und eine Anzeigerichtung zu wählen (links, rechts, oben, unten).
(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)))
window
, um auf einen Pufferquadranten innerhalb desselben zu verweisenframe
. Aframe
wird als das ganze Kätzchen-Kaboodle betrachtet, das viele Fenster enthalten kann. Emacs können mehrere Frames generieren, wobei jeder Frame mehrere Fenster enthält.