バッファを並べて分割するためのEmacsの設定


90

多くのEmacs関数は自動的に画面を分割します。ただし、これらはすべて、ウィンドウが上下に重なるように行われます。代わりに、デフォルトで並んでいるように分割する方法はありますか?


12
この質問では、水平と垂直の使い方を入れ替えます。デフォルトの動作は、水平に分割することです(分割は画面全体の水平線です)。
Skilldrick、2010年

22
Cx 3は、ウィンドウを並べて表示するコマンドに対して、split-window-horizo​​ntallyコマンドを実行するので、同じものを使用しています。
Nikwin、2010年

@Skilldrickの "Vertical"と "horizo​​ntal"はあいまいであり、異なる解釈になる可能性があります。それらは、ディバイダーの方向やパーティションの方向を表すことができます。私の通常の傾向は、元の質問の言い回しに同意することです(つまり、私は通常、「垂直方向に分割する」を「垂直方向のスペースを分割する」と解釈します)。
jamesdlin 2017年

回答:


92
(setq split-height-threshold nil)
(setq split-width-threshold 0)

GNU Emacs Lispリファレンスマニュアル:ウィンドウオプションの選択


8
これらは、split-window-preferred-functionと、設定されているsplit-window-sensibly関数にどのように影響するかによって動作することに注意してください。そのドキュメントを読むと、設定されているこれらの変数がどのように影響するかがわかります。デフォルトで垂直分割を好むユーザーには、システムがウィンドウを水平に分割できない(setq split-width-threshold nil)を使用できます。
Kendall Helmstetter Gelner、2010

5
ドキュメントを読んで少し遊んだ後、split-height-thresholdをnilに設定し、split-width-thresholdを80に設定して、最初に水平方向に分割できるかどうかを確認し、次に垂直方向にのみ試行できるようにします。垂直方向にのみ分割することは、ウィンドウが狭くなるにつれて醜くなります。
Nikwin、2010年

これはもっともらしいことです。ただし、これはemacsのGDB / GUD統合では機能しません。1つのウィンドウでデバッガを起動すると、emacsは常に垂直方向に分割されます。そのためのGUD / GDB固有の設定はありますか?
mefiX 2010

@Nikwin:私の場合、このソリューションでは "Cx 4 b"を2つの80列のウィンドウを横に並べるように制限しています(現在の画面の領域はそれだけに収まります)。「Cx 4 b」をもう一度呼び出しても、垂直方向に分割された新しい「その他」ウィンドウは開きません。代わりに、現在利用可能な「その他」のウィンドウでバッファを開きます。あなたが説明したようにそれをどのように動作させることができますか(水平にしてから垂直に試してください)?
アベンデール、2011

これは、私が知っているおなじみのCx何かの形式ではありません。これらのコマンドを実行するにはどうすればよいですか?
user1552512 2012年

6

ここでは2つの解決策があります。好きなものを使用してください。

A:デフォルトで垂直(左/右):

(setq split-height-threshold nil)
(setq split-width-threshold 0)

B:現在のウィンドウが十分に広い場合、ウィンドウを自動的に垂直方向に分割します(左/右)

(defun display-new-buffer (buffer force-other-window)
  "If BUFFER is visible, select it.
If it's not visible and there's only one window, split the
current window and select BUFFER in the new window. If the
current window (before the split) is more than 100 columns wide,
split horizontally(left/right), else split vertically(up/down).
If the current buffer contains more than one window, select
BUFFER in the least recently used window.
This function returns the window which holds BUFFER.
FORCE-OTHER-WINDOW is ignored."
  (or (get-buffer-window buffer)
    (if (one-window-p)
        (let ((new-win
               (if (> (window-width) 100)
                   (split-window-horizontally)
                 (split-window-vertically))))
          (set-window-buffer new-win buffer)
          new-win)
      (let ((new-win (get-lru-window)))
        (set-window-buffer new-win buffer)
        new-win))))
;; use display-buffer-alist instead of display-buffer-function if the following line won't work
(setq display-buffer-function 'display-new-buffer)

あなたの中にどれでも入れて .emacs/init.elファイルに。画面によっては、「100」を好きな値に変更できます。

1つのフレームに2つのウィンドウがあり、レイアウトを垂直から水平に、またはその逆に変更したい場合は、次の解決策があります。

(defun toggle-window-split ()
  (interactive)
    (if (= (count-windows) 2)
      (let* ((this-win-buffer (window-buffer))
            (next-win-buffer (window-buffer (next-window)))
            (this-win-edges (window-edges (selected-window)))
            (next-win-edges (window-edges (next-window)))
            (this-win-2nd
             (not (and (<= (car this-win-edges)
                        (car next-win-edges))
                    (<= (cadr this-win-edges)
                        (cadr next-win-edges)))))
         (splitter
          (if (= (car this-win-edges)
                 (car (window-edges (next-window))))
              'split-window-horizontally
            'split-window-vertically)))
    (delete-other-windows)
    (let ((first-win (selected-window)))
      (funcall splitter)
      (if this-win-2nd (other-window 1))
      (set-window-buffer (selected-window) this-win-buffer)
      (set-window-buffer (next-window) next-win-buffer)
      (select-window first-win)
      (if this-win-2nd (other-window 1))))))
;; C-x 4 t 'toggle-window-split
(define-key ctl-x-4-map "t" 'toggle-window-split)

.emacs/init.elファイルに入れて、C-x 4 tウィンドウのレイアウトを切り替えます。


ソリューション・ビューでは、私が使っていた時にundo-tree押すと、qバッファをcluseていません
アルパース

4
(setq split-height-threshold 0) (setq split-width-threshold 0)

目的の動作を得るために使用しなければならなかったものです(水平分割なし)



1

2つの変数をnilと0に設定するという単純な答えは機能しなかったため、2つの単純な関数を作成しました。1つはウィンドウをNX垂直バッファーに分割し、(たとえば)file.1 file.2という名前のファイルを開くだけです。 .file.NXは、2D(ファイルを開くためのNY行x NX列)で行うことを除いて、同じ考え方をしています。f.1f.2 ... f。[NX * NY] インストールするには、次のコードを.emacsに追加します。

    (defun grid-files-h (nx wx pfx)
  "Using dotimes, split the window into NX side-by-side buffers of width WX and load files starting with prefix PFX and ending in numbers 1 through NX"
  (let (ox fn k)  ; ox is not used, but fn is used to store the filename, and k to store the index string
    (dotimes (x (- nx 1) ox) ; go through buffers, x goes from 0 to nx-2 and ox is not used here
;     (print x)
      (setq k (number-to-string (+ x 1) ) )  ; k is a string that goes from "1" to "nx-1"
;     (print k)
      (setq fn (concat pfx k) ) ; fn is filename - concatenate prefix with k
;     (print fn)
      (find-file fn) ; open the filename in current buffer
      (split-window-horizontally wx) ; split window (current buffer gets wx-columns)
      (other-window 1) ; switch to the next (right) buffer
      )
    (setq k (number-to-string nx )) ; last (rightmost) buffer gets the "nx" file
    (setq fn (concat pfx k) ) ; fn = "pfx"+"nx"
    (find-file fn ) ; open fn
    (other-window 1) ; go back to the first buffer
    )  
  )

   (defun grid-files-sq (ny wy nx wx pfx)
      "Using dotimes, split the window into NX columns of width WX and NY rows of height WY and load files starting with prefix PFX and ending in numbers 1 through NX*NY"
      (let (oy ox fn k)  
        (dotimes (y ny oy) ; go through rows, y goes from 0 to ny-1 and oy is not used here
          (split-window-vertically wy) ; create this row
          (dotimes (x (- nx 1) ox) ; go through columns, x goes from 0 to nx-2 and ox is not used here
        (setq k (number-to-string (+ 1 (+ x (* y nx) ) ) ) ) ; k must convert 2 indecies (x,y) into one linear one (like sub2ind in matlab)
        (setq fn (concat pfx k) ) ; filename
        (find-file fn ) ; open
        (split-window-horizontally wx) ; create this column in this row (this "cell")
        (other-window 1) ; go to the next buffer on the right 
        )
          (setq k (number-to-string (+ nx (* y nx) ) ) ) ; rightmost buffer in this row needs a file too
          (setq fn (concat pfx k) ) ; filename
          (find-file fn ) ; open
          (other-window 1) ; go to next row (one buffer down)
          )
        )
      )

次に、垂直方向のものを使用するには、* scratch *(C-x b *scratch* RETC-x 1)に移動し、(grid-files-h 3 20 "file.")次に入力しC-x C-eます。または、正方形のqridをテストしたい場合はC-x 1、入力し(grid-files-sq 2 15 3 20 "f.")てからC-x C-e、次のように表示されます。 2x3グリッド

これはおそらくより効率的に/より効率的に実行できますが、それは開始であり、私が実行するために必要なことを実行します(連続して名前が付けられた小さなファイルの束を表示します)。自由に改善または再利用してください。


1

さまざまなプロジェクトで、emacsで複数のフレーム(OSXウィンドウ)を定期的に使用しています。これが、最初に左右のウィンドウに分割されたいくつかのフレームを設定する方法です。

  (defun make-maximized-split-frame (name)
    (let (( f (make-frame (list (cons 'name  name))) ))
      (maximize-frame f)
      (split-window (frame-root-window f) nil t)
      ))

  (make-maximized-split-frame "DocRaptor")
  (make-maximized-split-frame "Gauges")
  (make-maximized-split-frame "Instrumental")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.