きくらげ観察日記

好きなことを、適当に。

Emacsで快適なウィンドウ操作を行う

Emacsのウィンドウ周りが結構不便だったので、いい感じに簡単に操作できる関数を書いてみました。

まずは1つめ。

;; 空気を読んでいい感じにウィンドウを分割してくれるやつ
(defun split-window-automatically ()
  (interactive)
  (if (> (window-width) (* 2.5 (window-height)))
      (split-window-horizontally)
    (split-window-vertically)))
(global-set-key (kbd "C-x w") 'split-window-automatically)

コメントの通り空気を読んでいい感じにウィンドウを分割してくれます。具体的に言うと、現在のウィンドウが縦長だった場合は縦に、横長だった場合は横にウィンドウを分割するようになっています。
これでもうC-xと打ったあとに「あれ、次に打つの2と3のどっちだっけ?」と一瞬悩む必要もなくなります。


2つめ。

;; ウィンドウが上のほうにあれば縦に縮小し、下のほうにあれば縦に拡大する
(defun resize-window-up ()
  (interactive)
  (let* ((edges (window-edges (selected-window)))
         (end-y (cadddr edges)))
    (if (< end-y (frame-height))
        (shrink-window 1)
      (enlarge-window 1))))

;; ウィンドウが上のほうにあれば縦に拡大し、下のほうにあれば縦に縮小する
(defun resize-window-down ()
  (interactive)
  (let* ((edges (window-edges (selected-window)))
         (end-y (cadddr edges)))
    (if (< end-y (frame-height))
        (enlarge-window 1)
      (shrink-window 1))))

;; ウィンドウが左のほうにあれば横に拡大し、右のほうにあれば横に縮小する
(defun resize-window-right ()
  (interactive)
  (let* ((edges (window-edges (selected-window)))
         (end-x (caddr edges)))
    (if (< end-x (frame-width))
        (enlarge-window-horizontally 1)
      (shrink-window-horizontally 1))))

;; ウィンドウが左のほうにあれば横に縮小し、右のほうにあれば横に拡大する
(defun resize-window-left ()
  (interactive)
  (let* ((edges (window-edges (selected-window)))
         (end-x (caddr edges)))
    (if (< end-x (frame-width))
        (shrink-window-horizontally 1)
      (enlarge-window-horizontally 1))))

(global-set-key (kbd "<M-up>") 'resize-window-up)
(global-set-key (kbd "<M-down>") 'resize-window-down)
(global-set-key (kbd "<M-right>") 'resize-window-right)
(global-set-key (kbd "<M-left>") 'resize-window-left)

M-(矢印キー)でいい感じにウィンドウをリサイズしてくれます。
これでもうC-x ^とかC-x {みたいな頭のおかしいキーバインドに悩まされることもありません。