最も外側の境界でウィンドウを分割


8

新しいフルハイトウィンドウ分割を既存の(分割された)ウィンドウ構成に追加する方法を探しています。適切に説明する方法がわからないので、2つのウィンドウ構成例の望ましい動作を示すASCIIグラフィックを投稿します。

             from                              to  

  +-------------------------+      +---------------------+---+  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  |            A            |  =>  |           A         | E |  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  +-------------------------+      +---------------------+---+  

  +------------+------------+      +----------+----------+---+  
  |            |     B      |      |          |   B      |   |
  |     A      +------------+      |     A    +----------+   |
  |            |     C      |  =>  |          |   C      | E | 
  +------------+------------+      +----------+----------+   |
  |            D            |      |          D          |   |
  +-------------------------+      +---------------------+---+  

ここで、関数は、新しいウィンドウの所望の幅を受け付けるEとの幅を縮小ABC、およびDそれに応じ。Edit2:上記の2つの図面は、具体的なケースで予想される動作の例であることに注意してください。from列の構成とは関係なくこれを行う一般的な関数を探しています(つまり、from列のウィンドウ[スプリット]の数は任意である必要があります)。

フレームの左側と上下にこの機能を探しています。

編集: @Nsukami_のコメントから、私が探している機能は、より抽象的な問題の特殊なケースであることがわかりました。だから私はその問題を言います:

ウィンドウ構成(ウィンドウとバッファーの数で構成されます)をどのように保存し、保存された構成を既存のウィンドウに「貼り付け」ますか?

「ペースト」、相対ウィンドウサイズと分割を維持する必要があります。当然、結果として貼り付けられる構成は、スケーリングされたコピーです。


最初の動作は、サイズ引数をsplit-window-rightasに渡すことで取得できますC-u -width C-x 3widthを好きなように変更し、マイナス記号に注意してください。
Vamsi 2014年

いくつかのレイアウトを事前定義することを考えていますが、わかりません。
Nsukami _ 2014

@Nsukami_それは、ウィンドウのレイアウト(の例えばレイアウトを保存することは可能ですABC、およびD)、その後、インサート新しいウィンドウにこのレイアウト?次に、1)現在のウィンドウ構成を保存し、2)レイアウトを変更して1つのウィンドウのみを表示し、次に水平に分割します[本質的にウィンドウEと他のウィンドウのプレースホルダーウィンドウを形成し、それを呼び出しますZ]、3 )最後に、元のレイアウトを左側のウィンドウに挿入します(Z
elemakil 2014年

ウィンドウサイズも含まれているため、挿入前にレイアウトを調整する必要があります。また、特定の1つのウィンドウへのレイアウトの挿入は、カスタムelisp AFAIKなしでは不可能です
Vamsi

回答:


5

次の関数はあなたが望むことをするはずです。トリックは、現在のフレームのルートウィンドウを分割することです。

(defun my-split-main-window (direction size)
  "Split the main window in the DIRECTION where DIRECTION is a symbol with
possible values of right, left, above or below and SIZE is the final size of the
windows, if the window is split horizontally (i.e. in DIRECTION below or above)
SIZE is assumed to be the target height otherwise SIZE is assumed to be the
target width"
  (let* ((new-window (split-window (frame-root-window) nil direction))
         (horizontal (member direction '(right left))))
    (save-excursion 
      (select-window new-window)
      (enlarge-window (- size (if horizontal
                                  (window-width)
                                (window-height)))
                      horizontal))
    new-window))

ウィンドウを分割する方向と新しいウィンドウのサイズを指定して関数を呼び出します。上記は新しく作成されたウィンドウを返します。概念とウィンドウとフレームは、GNU Emacs Lispリファレンスマニュアルで非常によく説明されています


パーフェクト!これがまさに私が欲しかったものです。
elemakil 2014年

0

最善の解決策であるかどうかはわかりません。抽象化が不十分なため、実際に解決しているのは1つのユースケースだけです。トリックは、layoutXからlayoutYに移動する関数と、layoutYからlayoutXに移動する関数を記述することです。

(defun from-x-to-y ()
 (interactive)
 (delete-other-windows)
 (split-window-vertically) ;;
 (let ((current-prefix-arg 10)) ;; emulate C-u
   (call-interactively 'enlarge-window) ;; resize
   )
 (split-window-horizontally) ;; -> |
 (next-multiframe-window)
 (split-window-vertically) ;;  -> --
 (previous-multiframe-window)
)

(defun from-y-to-x ()
  (interactive)
  (delete-other-windows)
  (split-window-horizontally) ;; -> |
  (let ((current-prefix-arg -60)) ;; emulate C-u
    (call-interactively 'shrink-window-horizontally) ;; resize
    )
  (split-window-vertically) ;; -> --
  (let ((current-prefix-arg 10)) ;;
    (call-interactively 'enlarge-window) ;;
    )
  (split-window-horizontally) ;;
  (next-multiframe-window)
  (split-window-vertically) 
  (previous-multiframe-window)
)

解決策が役立つことを願っています

ウィンドウ構成(ウィンドウとバッファーの数で構成されます)をどのように保存し、保存された構成を既存のウィンドウに「貼り付け」ますか?

layout.elという名前のパッケージを見つけましたが、私はそれを使用したことがありませんが、探しているもののようです。

編集:

より一般的な解決策を見つけよM-x switch-to-buffer-other-frameうとすると、レイアウトX を使用して、フレーム内のバッファーからレイアウトYを使用した別のフレーム内の別のバッファーに移動できると思われます。

レイアウトXを使用して、このレイアウトをレジスタに保存しC-x r f(frame-configuration-to-register)、別のレイアウトに移動し、必要に応じて前のレイアウトに切り替えて、レジスタ内の内容をC-x r j (jump-登録するために)


私が知る限りでlayout.elは、winnerフレーム全体のウィンドウ構成を(再)格納し、完全な構成を保存せずに既存のウィンドウに復元するのと同じようなことを行います。一方、あなたが書いた関数は、私が探している一般的なソリューションではありません。彼らは私の具体的な問題としてではなく、単なる例として意図された私の2番目の例を解決します。一般的なケースで機能する解決策を探しています。
elemakil 2014年

まだ掘り下げており、switch-to-buffer-other-frame「from」がフレームで「to」が別のフレームである場合の一般的な解決策は可能だと思います
Nsukami _
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.