So öffnen Sie mit "o" von dired / ibuffer in einen anderen Frame


8

Ich habe zwei Fenster geöffnet und vertikal geteilt (Einzelbild):

A) enthält meine Arbeit
B) enthält entweder dired oder ibuffer.

Ich möchte in der Lage sein, zu einer Datei / einem Puffer in Bereich B zu navigieren und auf "o" zu klicken, um sie in Bereich A zu öffnen. Ist dies möglich? Im Moment erstellt emacs einen neuen Bereich im unteren Bereich von Bereich A, um die Datei zu öffnen.

Bearbeiten: Gemäß der Benutzerrechtsliste tritt das oben beschriebene Verhalten auf, wenn der Rahmen groß ist. Dies scheint bei mir der Fall zu sein, da sich Emacs jetzt, da ich zu Hause bin (nicht auf einem externen Monitor, kleinerer Rahmen), so verhalten, wie ich es mir wünsche. Jetzt stellt sich die Frage: Kann ich verhindern, dass Emacs ein neues Fenster öffnen, wenn der aktuelle Frame groß ist?


1
Willkommen im Emacs Beta-Forum. Als Teil des Emacs-Jargons / Jargons verwenden wir das Wort window, um auf einen Pufferquadranten innerhalb desselben zu verweisen frame. A framewird 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.
Lawlist

Danke für die Klarstellung! Ich war lange Zeit ein Emacs-Benutzer, habe aber die Terminologie nie vollständig verstanden.
Robert

Antworten:


6

Hier sind vier (4) Beispiele für benutzerdefinierte display-bufferFunktionsfamilien, die individuell auf die speziellen Bedürfnisse eines Benutzers zugeschnitten werden können - siehe oben ; unten ; links ; rechts - und hier sind vier (4) interactiveFunktionen zum Anzeigen der Datei oder des Verzeichnisses der aktuellen Zeile eines dired-modePuffers. 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-modeund 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)))

Oh, das ist perfekt. Kann mir jemand mit einfacher Hydra für dired-mode-map, gebunden an ound dann hjklfür die Anzeige über / unter / links / rechts helfen ?
iLemming

Oh, ich glaube, ich habe es verstanden: (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

Kleine Sache über den Ansatz - es springt nicht zum neu erstellten Fenster. Ich kann nicht herausfinden, wie ich es erzwingen soll.
iLemming

2
@Agzam - Die Funktion select-windowkann am Ende jeder my-display-buffer-...Funktion verwendet werden. Wie Sie sehen können, ist das Ergebnis / der Wert, der am Ende der allerletzten Zeile ausgegeben wird window,. Wenn Sie das Ergebnis / den Wert nicht benötigen, um es in Verbindung mit einer anderen Funktion zu verwenden, schließen Sie das window in der allerletzten Zeile einfach so ein : (select-window window). Tun Sie das mit allen vier (4) Funktionen - dh my-display-buffer-below; my-display-buffer-above;; my-display-buffer-left;; und my-display-buffer-right.
Lawlist

3

Ihre Frage ist unklar und daher besteht die Gefahr, dass sie geschlossen wird. Haben Sie zwei Frames oder einen einzelnen Frame mit zwei Emacs-Fenstern? Was auch immer sie sind, wenn es zwei gibt, ist jeder von ihnen vertikal geteilt? Und was meinst du mit "vertikal teilen"? Was meinst du mit einer "Scheibe"? Was meinst du mit "es" in "in Fenster A geöffnet haben"?

Eine wilde Vermutung ist, dass Sie einen einzelnen Emacs-Frame haben, der in zwei Emacs-Fenster A und B aufgeteilt ist, wobei Fenster A über Fenster B, Fenster B ausgewählt ist und Fenster B einen Dired-Puffer anzeigt.

oist standardmäßig an gebunden dired-find-file-other-window. Wenn die obige wilde Vermutung richtig ist, sollte oein Dateiname in B in A geöffnet werden. Dies wird beim Starten von Emacs ohne Init-Datei angezeigt : emacs -Q. Siehst du das nicht

Wenn dies nicht der Fall ist, beschreiben Sie bitte Schritt für Schritt klar, was Sie tun emacs -Q.


2
Dies hängt von der Größe des Frames ab. Ein großer Frame führt zu dem vom OP beschriebenen Verhalten. Ein kleinerer Rahmen führt zu dem von Drew beschriebenen Verhalten.
Lawlist

Lawlist Ich denke, genau das passiert. Wenn ich mit einem großen Rahmen an meinen externen Monitor angeschlossen werde, passiert das, was ich beschrieben habe, aber jetzt, wo ich auf meinem kleineren Laptop-Display zu Hause bin, fragt es nach meinen Wünschen - gibt es eine Möglichkeit, ihn zu zwingen, kein weiteres Fenster zu öffnen?
Robert

Hallo Drew, tut mir leid, ich bin in Bezug auf die Unterschiede zwischen einem Rahmen und einem Fenster nicht ganz auf dem neuesten Stand der Emacs-Sprache. Was ich in meiner ursprünglichen Frage gemeint habe (wenn ich jetzt Fenster und Rahmen richtig verstehe), ist, dass ich einen einzelnen Emacs-Rahmen und zwei Emacs-Fenster nebeneinander habe (vertikal Cx 3). Alles funktioniert wie beabsichtigt, wenn ich auf meinem Laptop bin und der Rahmen klein ist, aber wie in der Gesetzesliste angegeben, passiert, wenn der Rahmen groß ist, was ich beschreibe.
Robert

Ja, es ist möglich. Eine allgemeine Einstellung der display-bufferVariablenfamilie wirkt sich jedoch auf andere Situationen aus, die noch nicht vorgesehen sind. Sie können das anpassen display-buffer-alist, was selbst für erfahrene Emacs-Benutzer etwas verwirrend ist. Es gibt Variablen, die steuern, wann Fenster und Mindestgrößen von Fenstern aufgeteilt werden sollen, und die Liste wird fortgesetzt. Um den Ausbruch einzudämmen, könnten Sie dired-find-file-other-windoweine let-gebundene Version des empfehlen display-buffer-alist, aber ich werde diese Antwort einem anderen Forumsteilnehmer überlassen. Es gibt verschiedene Lösungen. :)
Lawlist

0

HINWEIS : Die folgenden Variablen sind global , was bedeutet, dass sie sich auch auf andere Funktionen auswirken dired-find-file-other-window. Der Benutzer möchte die betreffende Funktion möglicherweise beraten , um andere Funktionen nicht global zu beeinflussen. [Dieser Autor überlässt diese Option jedoch einem anderen Forumsteilnehmer.] Alternativ gibt es eine andere Antwort, die dieser Autor veröffentlicht hat und die benutzerdefinierte Funktionen enthält, die verwendet werden können, um nichts anderes zu beeinflussen.


Die Variable split-width-thresholdhat eine Dokumentzeichenfolge, die Folgendes angibt:

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.

Wenn Sie in der .emacsDatei Folgendes einstellen, wird der gewünschte Effekt erzielt. Der Benutzer kann den Wert auch auf eine höhere Zahl einstellen. Der Standardwert ist 160

(setq split-width-threshold nil)

Hier ist ein Link zum entsprechenden Abschnitt im Handbuch:

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


Siehe auch die zugehörige Variable split-height-thresholdmit dem Standardwert 80

Die Dokumentzeichenfolge lautet:

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.

Das hat eigentlich ganz gut geklappt! Wenn jetzt etwas Lustiges passiert, weiß ich zumindest, wo ich suchen muss. Danke noch einmal!
Robert
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.