ウィンドウレイアウトの切り替え


24

カスタムレイアウトを設定し、一時的に1つのファイルを全画面表示して、そのレイアウトを元に戻したい場合、手動でリフローする必要があります。

レイアウトを保存し、保存されたレイアウトを切り替えることができるプラグイン/ elispコードが欲しいです。

更新

皆さん、ありがとうございました。

勝者モードを使用するabo-aboの提案は本当に素晴らしく、ゼロ時間で動作するようになりました。

wasamasaは、私が聞いたことがない素晴らしいプラグインの束を提案し、レジスタの使用方法に関する情報を提供しました。

Jordon Biondoがレジスターの使用方法を説明してくれたので、実際に私が欲しかったのはこのようなものです。

皆さん、ありがとうございました。

回答:


23

これを行うための組み込みの方法は、レジスタを使用することです。

たとえばC-xrwa、現在のウィンドウ構成を保存して登録するために使用します。

次に、組み込みのバインディングC-x1を使用して実行できますdelete-other-windows

単一のファイルを見終わったら、を使用C-xrjaして、レジスタaに保存されているウィンドウ構成に戻ります。

要するに:

C-xrwa (設定をレジスタに保存)

C-x1 (他のウィンドウを削除する)

C-xrja (保存されたウィンドウ設定を再適用)


レジスタは扱いにくいと思いますが、カスタムウィンドウ構成スタックを使用して構成を管理します。

現在の構成をスタックにプッシュする2つのバインディングがあり、トップ構成をポップして適用します。

あなたのシーンでは、プッシュバインドを実行し、次にCx 1を実行し、次にポップバインドを実行します。

コードは次のとおりです。

(defvar winstack-stack '()
  "A Stack holding window configurations.
Use `winstack-push' and
`winstack-pop' to modify it.")

(defun winstack-push()
  "Push the current window configuration onto `winstack-stack'."
  (interactive)
  (if (and (window-configuration-p (first winstack-stack))
         (compare-window-configurations (first winstack-stack) (current-window-configuration)))
      (message "Current config already pushed")
    (progn (push (current-window-configuration) winstack-stack)
           (message (concat "pushed " (number-to-string
                                       (length (window-list (selected-frame)))) " frame config")))))

(defun winstack-pop()
  "Pop the last window configuration off `winstack-stack' and apply it."
  (interactive)
  (if (first winstack-stack)
      (progn (set-window-configuration (pop winstack-stack))
             (message "popped"))
    (message "End of window stack")))

その後、バインドできるwinstack-pushようなものにC-cC-u、そしてwinstack-popために C-cC-o簡単に周りにジャンプします。


これはとてもいいです!
lukas.pukenis

20

を使用しますwinner-mode。私のセットアップは次のとおりです。

(winner-mode)
(global-set-key [f7] 'winner-undo)
(global-set-key [C-f7] 'winner-redo)
(global-set-key [f9] 'delete-other-windows)
(global-set-key [C-f9] 'delete-window)

レイアウトなどにブックマークを付ける方法があるかどうかはわかりませんが、前のレイアウトに継続的に切り替えることができれば十分です。


うわー、前のレイアウトに戻ることができるだけで、私にとっては大いに役立ちます。ありがとう!
lukas.pukenis

11

Emacsは、現在のウィンドウ構成などのデータを保存および適用するためのレジスタを提供します。これはC-x r wおよびで実行できますC-x r j。ただし、ウィンドウレジスタを覚えておく必要があるため、このアプローチは扱いにくいものになります。

これを改善するためのパッケージがいくつかあります。iregisterを使用すると、この基本機能の検査と対話がより簡単になります。私が知っている他のものは、タブを表示するためにヘッダーバーを使用するelscreenescreenなど、レジスタに影響を与えずに使用します。workgroupsworkgroups2は、この問題に対する2つの新しい、より広範なアプローチです。私は個人的にどちらも好きではなかったので、自分の書いたものを中間のどこかに置き、バグや複雑さが減ることを願っています。


これはレジスターに関するすばらしいことですが、この場合、どのように使用すればよいですか?リストされているプラ​​グインをチェックして、成功したかどうかを確認します:)
lukas.pukenis

現在のレイアウトをレジスタに保存し、いくつかの変更を行ってから、古い状態に切り替えたい場合は、レジスタからレイアウトを復元します。リストしたパッケージは、レイアウトを切り替えるたびにこれを行うという精神的な負担から解放されます。
wasamasa

(.emacsファイルで)起動時に特定のウィンドウ構成を作成し、それをレジスタに保存することは可能ですか?(window-configuration-to-register "1").emacsでコマンドとして試しましたが、機能しませんでした
pm

そのためにdesktop.elを使用してみてください。以前は眉毛とうまく組み合わせられていました。
wasamasa

2

現在のウィンドウレイアウトをレジスタに保存してから、を使用して復元できjump-to-registerます。このコマンドwindow-configuration-to-registerC-x r wデフォルトでバインドされています。

たとえば、ウィンドウを便利な方法で配置した場合、次iを使用して登録するためにウィンドウを保存し、後でを使用しC-x r w iてレイアウトを復元できますC-x r j i


1
ハ、私たち3人は同時にレジスターについて答えました。
グルーカス

1

Zygosporeは、複数のウィンドウを開いており、そのうちの1つを一時的に最大化したい状況をすばやく修正します。の動作を変更しますC-x 1。複数のウィンドウを開いている場合、デフォルトのように動作delete-other-windowsし、表示しているウィンドウ以外のすべてのウィンドウを削除します。もう一度押すと、他のウィンドウが復元されます。

勝者モードはより一般的なソリューションを提供しますが、zygosporeはフレーム内の1つのウィンドウに一時的にズームインするのに最適です。最良のことは、新しいキーバインディングを使用しないことです。C-x 1非常に直感的な方法で再定義するため、学習する新しいバインディングはありません。


1

これは興味深い質問です。数年前、私はすべてのソリューションを調査しました。workgroups2.elのみが、すべてのコーナーケースをカバーするのに十分な重量です。

ただし、workgroups2 UIは災害です。たとえば、worksgroup-modeを有効にすると(READMEの提案どおり)、emacsの起動時に以前のレイアウトが自動的にロードされます。そのため、起動は毎回非常に遅くなります。

私の解決策は、workgroups2をすぐに使えるツールではなくAPIのコレクションとして扱うことです。そこで、@ abo-aboからivy-mode(https://github.com/abo-abo/swiper)を使用してデフォルトのUIインタラクションを変更します

ここに画像の説明を入力してください

全ウィンドウの切り替えは簡単で、勝者モードのAPIを使用するだけで十分です。

ここに完全なコードがあります(私が使用するのはM-x toggle-full-windowM-x wg-create-workgroupおよびのみで、M-x my-wg-switch-workgroup前述のようにswiperのインストールも必要です)

(defun toggle-full-window()
  "Toggle the full view of selected window"
  (interactive)
  ;; @see http://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html
  (if (window-parent)
      (delete-other-windows)
    (winner-undo)))

(setq wg-use-default-session-file nil)
;; don't open last workgroup automatically in `wg-open-session',
;; I only want to check available workgroups! Nothing more.
(setq wg-load-last-workgroup nil)
(setq wg-open-this-wg nil)

;(workgroups-mode 1) ; put this one at the bottom of .emacs
;; by default, the sessions are saved in "~/.emacs_workgroups"
(autoload 'wg-create-workgroup "workgroups2" nil t)

(defun my-wg-switch-workgroup ()
  (interactive)
  (let (group-names selected-group)
    (unless (featurep 'workgroups2)
      (require 'workgroups2))
    (setq group-names
          (mapcar (lambda (group)
                    ;; re-shape list for the ivy-read
                    (cons (wg-workgroup-name group) group))
                  (wg-session-workgroup-list (read (f-read-text (file-truename wg-session-file))))))
    (ivy-read "work groups" group-names
              :action (lambda (group)
                        (wg-find-session-file wg-default-session-file)
                        (wg-switch-to-workgroup group)))))

(eval-after-load 'workgroups2
  '(progn
     ;; make sure wg-create-workgroup always success
     (defadvice wg-create-workgroup (around wg-create-workgroup-hack activate)
       (unless (file-exists-p (wg-get-session-file))
         (wg-reset t)
         (wg-save-session t))

       (unless wg-current-session
         ;; code extracted from `wg-open-session'.
         ;; open session but do NOT load any workgroup.
         (let ((session (read (f-read-text (file-truename wg-session-file)))))
           (setf (wg-session-file-name session) wg-session-file)
           (wg-reset-internal (wg-unpickel-session-parameters session))))
       ad-do-it
       ;; save the session file in real time
       (wg-save-session t))

     (defadvice wg-reset (after wg-reset-hack activate)
       (wg-save-session t))

     ;; I'm fine to to override the original workgroup
     (defadvice wg-unique-workgroup-name-p (around wg-unique-workgroup-name-p-hack activate)
       (setq ad-return-value t))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.