読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

emacsのwindow幅に合わせて、分割数を変える

tech emacs

 そろそろEmacsのウィンドウについて一言いっとくか - (rubikitch loves (Emacs Ruby CUI Books))で紹介されているother-window-or-split ですが、非常に便利に使わせてもらっています。ただ、外部ディスプレイに接続した時には縦二分割ではなく、もう少し分割数を増やしてで作業したいという気持ちがありました。そこでother-window-or-splitを少しだけ変えて、window幅に合わせて分割数を変えるようにしてみました。

 まず、window分割のユーティリティとして以下のelispが必要です。

(defun split-window-vertically-n (num_wins)
  (interactive "p")
  (if (= num_wins 2)
      (split-window-vertically)
    (progn
      (split-window-vertically
       (- (window-height) (/ (window-height) num_wins)))
      (split-window-vertically-n (- num_wins 1)))))
(defun split-window-horizontally-n (num_wins)
  (interactive "p")
  (if (= num_wins 2)
      (split-window-horizontally)
    (progn
      (split-window-horizontally
       (- (window-width) (/ (window-width) num_wins)))
      (split-window-horizontally-n (- num_wins 1)))))

 そしてother-window-or-splitを以下のように変えます。

(defun other-window-or-split ()
  (interactive)
  (when (one-window-p)
    (if (>= (window-body-width) 270)
        (split-window-horizontally-n 3)
      (split-window-horizontally)))
  (other-window 1))

 ほとんど変更は加えてませんが、少し説明すると、

  • window-body-widthで現在のwindowのcolumn数(半角文字数)がわかる
  • 1window 90文字あればよいと思い、270以上であれば3分割するようにした
  • split-window-horizontally-nが便利

という感じです。

 これでC-tあたりにother-window-or-splitを登録しておくと、何も考えずにC-tを押せば、大きい外部ディスプレイに接続していれば3分割に、小さいディスプレイなら2分割に自動的になり、分割している場合はそのままother-windowが実行されて便利です。