Voici quatre (4) exemples de display-bufferfamilles de fonctions personnalisées qui peuvent être personnalisées pour répondre aux besoins particuliers d'un utilisateur - ci - dessus ; ci-dessous ; gauche ; à droite - et voici quatre (4) interactivefonctions pour afficher le fichier ou le répertoire de la ligne courante d'un dired-modetampon. Il n'y a que trois conditions: (a) s'il existe déjà une fenêtre affichant le tampon cible, choisissez-le; (b) s'il existe une fenêtre disponible dans la direction souhaitée, alors utilisez-la; (c) le fourre-tout est de créer une nouvelle fenêtre dans la direction souhaitée si les autres conditions ne sont pas remplies.
Usage:
M-x dired-display-above
M-x dired-display-below
M-x dired-display-left
M-x dired-display-right
Il y a tellement de raccourcis clavier déjà intégrés à dired-modeet dired+que je n'ose pas essayer de créer le mien. L'utilisateur est libre de choisir ses propres raccourcis clavier, ce qui dépasse le cadre de cet exemple limité.
L'utilisateur est libre d'ajouter des conditions supplémentaires à l'exemple de display-bufferfamille de fonctions pour gérer plus de situations - par exemple, plus de fenêtres qu'un couple.
(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: Voici une implémentation légèrement plus sophistiquée / amusante du concept ci-dessus, qui donne à l'utilisateur la possibilité de l'utiliser de manière non interactive ou interactive ; par exemple, M-x dired-display-buffer- où l'utilisateur sera invité à choisir un répertoire s'il ne survole pas un fichier dans dired-mode, et à choisir une direction d'affichage (gauche, droite, dessus, dessous).
(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)))
windowpour désigner un quadrant tampon dans le mêmeframe. Aframeest considéré comme l'ensemble du chaton-kaboodle, qui peut contenir de nombreuses fenêtres. Emacs peut générer plusieurs images, chaque image contenant plusieurs fenêtres.