ARCHIVE  ENTRY  COMMENT  TRACKBACK  CATEGORY  RECOMMEND  LINK  PROFILE  OTHERS
<< August 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>
<< anythingで未保存の変更をブラウズ | main | .emacsとかを整理するのに便利かもしれないプラグイン >>
2016.02.25 Thursday

スポンサーサイト

一定期間更新がないため広告を表示しています

2012.12.20 Thursday

emacsで賢いウィンドウ分割

帰りの電車で書いてたネタ。

split-window-horizontallyとかを連打したとき、

|-------|-------| 50% 50%

|---|---|-------| 25% 25% 50%

|-|-|---|-------| 12.5% 12.5% 25% 50%

|||-|---|-------| 6.25% 6.25% 12.5% 25% 50%



って分割されてくのが気に食わない。そんなちっさいウィンドウ使わないし。

というわけでこんなの書いてみた。

  1. (defun split-window-horizontally-n (n)
  2.   (cond
  3.    ;; do not split
  4.    ((< n 2)
  5.     nil)
  6.    ;; (n/2) | (n/2)
  7.    ((= (mod n 2) 0)
  8.     (split-window-horizontally)
  9.     (next-multiframe-window)
  10.     (split-window-horizontally-n (/ n 2))
  11.     (previous-multiframe-window)
  12.     (split-window-horizontally-n (/ n 2)))
  13.    ;; (n-1) | 1
  14.    (t
  15.     (split-window-horizontally (- (window-width) (/ (window-width) n)))
  16.     (split-window-horizontally-n (1- n)))
  17.    ))

  18. (defun split-window-vertically-n (n)
  19.   (cond
  20.    ;; do not split
  21.    ((< n 2)
  22.     nil)
  23.    ;; (n/2) | (n/2)
  24.    ((= (mod n 2) 0)
  25.     (split-window-vertically)
  26.     (next-multiframe-window)
  27.     (split-window-vertically-n (/ n 2))
  28.     (previous-multiframe-window)
  29.     (split-window-vertically-n (/ n 2)))
  30.    ;; (n-1) | 1
  31.    (t
  32.     (split-window-vertically (- (window-height) (/ (window-height) n)))
  33.     (split-window-vertically-n (1- n)))
  34.    ))

  35. (defun delete-window-n (n)
  36.   (if (> n 0)
  37.       (progn
  38.         (delete-window)
  39.         (delete-window-n (1- n)))))

  40. (defun smart-split-widow-horizontally ()
  41.   (interactive)
  42.   (cond
  43.    ( (eq last-command 'smart-split-widow-horizontally-4)
  44.      (delete-window-n 3)
  45.      (setq this-command 'smart-split-widow-horizontally-5) )
  46.    ( (eq last-command 'smart-split-widow-horizontally-3)
  47.      (delete-window-n 2)
  48.      (split-window-horizontally-n 4)
  49.      (setq this-command 'smart-split-widow-horizontally-4) )
  50.    ( (eq last-command 'smart-split-widow-horizontally-2)
  51.      (delete-window-n 2)
  52.      (split-window-horizontally-n 2)
  53.      (split-window-horizontally-n 2)
  54.      (setq this-command 'smart-split-widow-horizontally-3) )
  55.    ( (eq last-command 'smart-split-widow-horizontally-1)
  56.      (delete-window-n 1)
  57.      (split-window-horizontally-n 3)
  58.      (setq this-command 'smart-split-widow-horizontally-2) )
  59.    ( t
  60.      (split-window-horizontally-n 2)
  61.      (setq this-command 'smart-split-widow-horizontally-1) )
  62.    ))

  63. (defun smart-split-widow-vertically ()
  64.   (interactive)
  65.   (cond
  66.    ( (eq last-command 'smart-split-widow-vertically-2)
  67.      (delete-window-n 2)
  68.      (setq this-command 'smart-split-widow-vertically-3) )
  69.    ( (eq last-command 'smart-split-widow-vertically-1)
  70.      (delete-window-n 1)
  71.      (split-window-vertically-n 3)
  72.      (setq this-command 'smart-split-widow-vertically-2) )
  73.    ( t
  74.      (split-window-vertically-n 2)
  75.      (setq this-command 'smart-split-widow-vertically-1) )
  76.    ))

smart-split-window-horizontallyとかを連打すると、ウィンドウが

|-------|-------| 50% 50%

|----|-----|----| 33.3% 33.3% 33.3%

|---|---|-------| 25% 25% 50%

|---|---|---|---| 25% 25% 25% 25%

|---------------| 100%

|-------|-------| 50% 50%



こんな感じで分割されます。split-window-xxxx-nが冗長に見えるけど、丸めの都合でこの方が綺麗に分割されるっぽい。

久々に再帰関数を書きたくなったのです。
2016.02.25 Thursday

スポンサーサイト

コメント
(balance-windows) というのがあります
  • m*chito
  • 2012.12.22 Saturday 02:13
(balance-windows)してしまうと画面全体がバランスされてしまうのですよねー。
これを普通の画面分割の代わりにしてしまうと、偏った分割をしたいとき(たとえば、ウィンドウのうち1つはかなり行の長さが短い、とか)に困ってしまうのでこんな感じにしてみました。
  • zk_phi
  • 2012.12.22 Saturday 09:45
コメントする








 
Powered by
30days Album
PR