2014-03-04 11 views
5

Es gibt viele nützliche emacs-Befehle, die Dinge im "anderen Fenster" erledigen (wie C-x C-b, um die Pufferliste anzuzeigen, oder C-h a, um verfügbare Befehle oder viele andere anzuzeigen).Emacs: Ist es möglich, ein bestimmtes Fenster immer als "anderes Fenster" zu verwenden?

Mein Problem: Dies scheint nicht gut zu spielen mit einer Reihe von sorgfältig angeordneten Fenstern in einem Rahmen, die jeweils spezifischen Inhalt zeigen.

Immer, wenn ich eines dieser "anderen Fenster" -Befehle verwende, ersetzt es den Inhalt eines anderen Fensters, das (1) möglicherweise zu schmal ist, um die angezeigten Informationen deutlich anzuzeigen, und (2) muss möglicherweise manuell sein "bereinigt" danach, indem es auf seinen korrekten Puffer zurückgesetzt wird. (Und Sie sollten besser nicht die Pufferliste überprüfen, wenn Sie dies tun, oder Sie werden noch ein anderes Fenster durcheinander bringen!)

(Emacs verwendet nicht immer das gleiche "andere Fenster", auch wenn die Befehle ausgegeben werden B. die C-x C-b Ausgabe könnte in ein "anderes" Fenster gehen, während C-h a seine Ergebnisse in einem anderen "anderen" Fenster zeigt. Ebenso scrollt C-M-v manchmal ein anderes "anderes" Fenster von dem, in dem Ausgabe gerade erschienen ist .)

ich einen Weg, um dieses Problem, wie zu lösen oder zu arbeiten möchte:

  1. Ich würde wirklich gerne in der Lage sein, ein bestimmtes Fenster anzugeben, das immer als "anderes Fenster" für jedes Fenster in diesem Rahmen verwendet wird.

  2. Wenn das nicht klappt, gibt es vielleicht eine Möglichkeit, die Fensterreihenfolge neu anzuordnen und/oder unsichtbare Fenster zu verwenden, um den Effekt von Lösung 1 zu erhalten, indem Sie möglicherweise viel Fenster-Shuffling hinter den Kulissen machen es wird ein zusätzlicher Befehl benötigt, der vor oder vorzugsweise nach dem Befehl einzugeben ist, der in ein "anderes Fenster" schreibt.

  3. Failing diese, möchte ich einen Befehl, der die letzte Puffer Änderung in einem Fenster rückgängig macht, so dass Fenster verwendet wurde, geht zurück zu dem, was es zeigte, kurz bevor es verwendet wurde.

(Zur Zeit verwende ich workgroups.el und ich verwende eine separate Arbeitsgruppe für die Dokumentation überprüft, aber das ist eindeutig suboptimal. „Aktualisieren“ die Arbeitsgruppe nicht erreicht Lösung 3, da es scheint, nur den Puffer zu ändern zurück, wenn es sich um eine normale Datei war)

EDIT:. ich sehe diese Frage zu this similar question sehr ähnlich ist, aber diese Frage keine Antwort bekommen haben es suchte. Da die ideale Lösung vielleicht nicht existiert, interessiere ich mich auch explizit für Work-Arounds.

Antwort

2

diejenigen Andernfalls würde ich einen Befehl wie das den letzten Pufferwechsel in jedem Fenster rückgängig macht so aus jedem Fenster verwendet wurde, gehe zurück auf , was es zeigt, kurz bevor es verwendet wurde.

Eine mögliche Lösung ist winner-mode zu verwenden. Aktivieren Sie es von

(winner-mode 1) 

Es bietet zwei Befehl winner-undo und winner-redo hinzufügen, die rückgängig gemacht werden und Fensterkonfigurationen wiederholen sind.

Auch, weil Sie workgroups.el erwähnen versuchen Sie workgroups2, eine Gabelung von workgroups.el. Es bietet ähnliche Befehle (wg-undo-wconfig-change und wg-redo-wconfig-change) zum Wiederherstellen von Fensterkonfigurationen

+0

Danke für den Zeiger auf Arbeitsgruppen2! Das ursprüngliche Projekt 'github.com/tlh/workgroups.el' wurde seit Jahren nicht mehr aktualisiert, aber jetzt scheint es (mindestens) zwei Gabeln zu geben, die versuchen, es fortzusetzen (vielleicht nicht bewusst voneinander?), Eins an 'github.com/workgroups/workgroups.el' (die ich benutzte) und eine an' github.com/pashinin/workgroups2'. In die Pashinin-Gabel scheint viel Arbeit gesteckt worden zu sein - ich werde es versuchen. – Matt

0

Alle Leute werden meiner Antwort nicht zustimmen. Aber jemand könnte das für produktiv halten.

Machen Sie alles ein Fenster pro Rahmen.

;;Disable split-window 
(defun split-window-below() 
    (interactive) 
    ;;do nothing 
) 

(defun split-window-right() 
    (interactive) 
    ;;do nothing 
) 

Dann können Sie Split-Fenster nicht mehr. Wenn Sie einen anderen Puffer anzeigen müssen, verwenden Sie einen anderen Rahmen (C-x ).

+0

Ich nehme an, dass das technisch die Frage im Titel anspricht, obwohl es meine beschriebene Situation nicht anspricht. – Matt

0

Eine Lösung für # 1 kam letzte Woche zu mir. Die Idee ist, alle Fenster außer Ihren Bedenken zu widmen. Auf diese Weise können Sie ein Fenster sperren. Es klingt ein wenig andersherum.

(defvar window-locked-p nil) 
(defun lockon-window() 
    "Set a target window to be used when calls `other-window'. 
To set the target window, first put point to the window, then 
call this. Technically this sets all window dedicated but the 
target window. Call again to free windows." 
    (interactive) 
    (walk-windows 
    (lambda (win) 
    (set-window-dedicated-p win (not window-locked-p)))) 
    (if window-locked-p 
     (message "All windows are free") 
    (set-window-dedicated-p (selected-window) nil) 
    (message "Window is locked on")) 
    (setq window-locked-p (not window-locked-p))) 

Eine Lösung für # 3 zu mir kam, als ich Thing von Stevie Ray Vaughan & Double Trouble schieben zuhörte. Ein aufgesprungener Puffer befindet sich eine Schicht über anderen Puffern.

(winner-mode 1) 
(defun slide-window() 
    "This slides a buffer, in an unexpected window, to next-window. 
Call this with point on the window. This only works soon after a 
buffer was popped by `other-window' to an unexpected window. 
Technically this recalls previous buffer-set by (winner-undo) 
then shows the buffer to next-window. This is complementary to 
`lockon-window'." 
    (interactive) 
    (let ((buf (buffer-name))) 
    (winner-undo) 
    (set-window-buffer (next-window) buf) 
    (message "Window is slided") 
    (other-window 1))) 
Verwandte Themen