[xyzzy:02372] save-winconf
- Subject: [xyzzy:02372] save-winconf
- From: Seiya Suda <seiya.suda@xxxxxxxxxxx>
- X-mailer: Denshin 8 Go V321.2b5
こんちは。須田っす。
亀井さんか、どなたか、次の、特に横長の窓が3つ並んでるときの
不都合を正してもらえませんか?
-------------------------------------------------------------------------
;;; -*- Mode: Lisp; Package: EDITOR -*-
;;;
;;; Is this file part of xyzzy?
;;;
;;; save-winconf.l version 1.02
;;; Code
(provide "save-winconf")
(in-package "editor")
(export '(*current-winconf* save-winconf restore-winconf))
(defvar *current-winconf* nil)
;;; window についてのデータをリストで得る
(defun window-data-list ()
"window の data の list を返す"
(let (wins data wb wl wc)
(walk-windows #'(lambda (win)
(setq wb (window-buffer win))
(setq wl (window-lines win))
(setq wc (window-columns win))
(setq data (list wb wl wc))
(push data wins)))
wins))
;;; save
(defun save-winconf ()
(interactive)
(when (yes-or-no-p "キャレットが一番左上の画面にありますか?")
(setq *current-winconf* (window-data-list))))
;;; restore
(defun restore-winconf ()
(interactive)
(when *current-winconf*
(delete-other-windows)
(let ((n (length *current-winconf*)) ;; 窓数
(h (- (screen-height) 2)) ;; 1画面時窓高
(w (screen-width))) ;; 1画面時窓幅
;; 窓1つ
(cond ((= n 1)
(let ((first (nth 0 *current-winconf*)))
(switch-to-buffer (car first))))
;; 窓2つ
((= n 2)
(let ((first (nth 0 *current-winconf*))
(second (nth 1 *current-winconf*)))
(if (or (= (nth 1 first) h)
(= (nth 1 first) (+ h 1)))
(progn
(split-window-vertically)
(switch-to-buffer (car first))
(adjust-win-width (nth 2 first))
(other-window)
(switch-to-buffer (car second)))
(progn
(split-window)
(switch-to-buffer (car first))
(adjust-win-height (nth 1 first))
(other-window)
(switch-to-buffer (car second))))))
;; 窓3つ
((= n 3)
(let ((first (nth 0 *current-winconf*))
(second (nth 1 *current-winconf*))
(third (nth 2 *current-winconf*)))
(cond ((or (= (nth 1 first) h)
(= (nth 1 first) (+ h 1)))
(split-window-vertically)
(switch-to-buffer (car first))
(adjust-win-width (nth 2 first))
(other-window)
(cond ((= (nth 1 second) h) ;;┌┬┬┐
(split-window-vertically) ;;││││
(switch-to-buffer (car third)) ;;└┴┴┘
#| (adjust-win-width (nth 2 second)) |#
(other-window)
(switch-to-buffer (car second))
(adjust-win-width (nth 2 second))) ;; third?
(t (split-window) ;;┌┬─┐
(switch-to-buffer (car third)) ;;│├─┤
(other-window) ;;└┴─┘
(switch-to-buffer (car second))
(adjust-win-height (nth 1 second)))))
((= (nth 2 second) w)
(switch-to-buffer (car first)) ;;┌──┐
(split-window-horizontally) ;;├──┤
(adjust-win-height (nth 1 first)) ;;├──┤
(other-window) ;;└──┘
(switch-to-buffer (car third))
(split-window-horizontally)
(other-window)
(switch-to-buffer (car second))
(adjust-win-height (nth 1 third))) ;; わからん
(t (switch-to-buffer (car first))
(split-window-vertically)
(adjust-win-width (nth 2 first)) ;;┌─┬┐
(split-window-horizontally) ;;├─┤│
(adjust-win-height (nth 1 first)) ;;└─┴┘
(next-window (selected-window))
(switch-to-buffer (car second))
(other-window)
(switch-to-buffer (car third))))))
(t (message "できません"))))))
;;; 現在の窓幅を arg にする
(defun adjust-win-width (arg)
(cond ((< (window-columns) arg)
(enlarge-window-horizontally (- arg (window-columns))))
((> (window-columns) arg)
(shrink-window-horizontally (- (window-columns) arg)))))
;;; 現在の窓丈を arg にする
(defun adjust-win-height (arg)
(cond ((< (window-lines) arg)
(enlarge-window (- arg (window-lines))))
((> (window-lines) arg)
(shrink-window (- (window-lines) arg)))))
;;; walk-windows emacs の関連ファイルより
(defun walk-windows (proc)
"窓を巡回しながら proc を呼ぶ"
(let* ((walk-windows-start (selected-window))
(walk-windows-current walk-windows-start))
(while (progn
(setq walk-windows-current
(next-window walk-windows-current))
(funcall proc walk-windows-current)
(not (eq walk-windows-current walk-windows-start))))))
--------
須田誠也(suda seiya)
seiya.suda@xxxxxxxxxxx
http://member.nifty.ne.jp/seiya-suda/