[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30. ウィンドウ/フレーム関連 ― 分割・サイズ変更 (2008/08/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=buffer"
"MeadowMemo/ウィンドウ/フレーム関連―分割・サイズ変更"へのコメント(無し)
検索全文Elisp


この章で紹介していること

Meadow は複数のファイルを一つのウィンドウで操作する MDI を採用していま す. Windows では EXCEL などが MDI の代表例です.

しかし,この MDI は前面に出ているファイルは 1 つか 2 つ程度なため,多数のファイ ルを開いた時にはファイルを切り替える必要があります.ここでは,ウィンドウの操作と 便利にする設定について紹介していきます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.1 ウィンドウとフレーム (2003/11/24)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=window%20frame"
"MeadowMemo/ウィンドウとフレーム"へのコメント(無し)
検索全文Elisp

Meadow を起動した時に表示される領域をウィンドウと呼びます.そして,各ウィンドウ はバッファを表示します.

一方,C-x 5 2で作成されるウィンドウはフレームと呼びます.フレームにはウィ ンドウが含まれ,各フレームでファイルの編集などができます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.2 ウィンドウの基本的な分割方法 (2003/05/30)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=split%20window"
"MeadowMemo/ウィンドウの基本的な分割方法"へのコメント(無し)
検索全文Elisp

何が問題なのか?

文章を作成する際などに,上下あるいは左右に分割して参照したいということがあります.

Meadow では簡単に上下,左右に分割することができます.

詳しい使い方は?

以下を参考に実際にやってみてください.

分割は連続してすることができます.例えば,C-x 2 C-x 2と 2 回連続して上下に分 割すると,まず上下に分割され,さらに,上がわのバッファがさらに半分に分割されます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.3 2 分割した画面を入れ替える (2003/11/18)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=swap%20screen"
"MeadowMemo/2分割した画面を入れ替える"へのコメント(無し)
検索全文Elisp

ネタ元:昔どこかの ML で手に入れたものです.

何が問題なのか?

上下に分割した際に,上下のバッファを入れ替えたくなる時があります.しかし,そのた めには上下それぞれバッファを切り替える必要があり面倒です.

何ができるのか?

上下あるいは左右のバッファを入れ替えることができます.

インストール方法は?

以下の設定を.emacs に追加します.

 
;;汎用機の SPF (mule みたいなやつ) には
;;画面を 2 分割したときの 上下を入れ替える swap screen
;;というのが PF 何番かにわりあてられていました。
(defun swap-screen()
  "Swap two screen,leaving cursor at current window."
  (interactive)
  (let ((thiswin (selected-window))
        (nextbuf (window-buffer (next-window))))
    (set-window-buffer (next-window) (window-buffer))
    (set-window-buffer thiswin nextbuf)))
(defun swap-screen-with-cursor()
  "Swap two screen,with cursor in same buffer."
  (interactive)
  (let ((thiswin (selected-window))
        (thisbuf (window-buffer)))
    (other-window 1)
    (set-window-buffer thiswin (window-buffer))
    (set-window-buffer (selected-window) thisbuf)))
(global-set-key [f2] 'swap-screen)
(global-set-key [S-f2] 'swap-screen-with-cursor)

詳しい使い方は?

上記の設定をしていれば,f2で入れ替えることができます.あるいは,M-x swap-screen でも入れ替えることができます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.4 横分割と縦分割を切り替える (2003/07/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=toggle%20division"
"MeadowMemo/横分割と縦分割を切り替える"へのコメント(無し)
検索全文Elisp

ネタ元:xyzzy のhttp://www3.ocn.ne.jp/~han/xyzzy/index.html

以下を.emacs に追加すると,C-x 2で上下 2 つに分けた状態とC-x 3で左右 2 つ に分けた状態をM-x window-toggle-divisionで切り替えることができます.

 
(defun window-toggle-division ()
  "ウィンドウ 2 分割時に、縦分割<->横分割"
  (interactive)
  (unless (= (count-windows 1) 2)
    (error "ウィンドウが 2 分割されていません。"))
  (let (before-height (other-buf (window-buffer (next-window))))
    (setq before-height (window-height))
    (delete-other-windows)

    (if (= (window-height) before-height)
        (split-window-vertically)
      (split-window-horizontally)
      )

    (switch-to-buffer-other-window other-buf)
    (other-window -1)))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.5 ウィンドウ間を簡単に移動 ― windmove (2003/11/06)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=windmove"
"MeadowMemo/ウィンドウ間を簡単に移動―windmove"へのコメント(無し)
検索全文Elisp

Meadow のバージョンによっては附属していないかもしれません.

要約

ウィンドウを分割した時, Shift+ カーソルキーだけで,分割したバッファへカーソルを移 動できる.

何が問題なのか?

ウィンドウを 3 つや 4 つに分けた場合,どうやって移動しますか?

普通は,C-x oを何回か入力して,順番に移動するのではないでしょうか.これは, 結構面倒です.

何ができるのか?

windmove を使うと,上のバッファに移動したければ,Shift+ 上カーソルキーとする だけで移動できます.

インストール方法

Meadow に付属しています.

設定方法

.emacs に以下を追加します.

 
(windmove-default-keybindings)

詳しい使い方

これで,ウィンドウをC-x 2などで分割した後で,下のウィンドウへ行きたいと思っ たら,Shift+ 下カーソル を入力します.右のウィンドウなら,Shift+ 右カー ソル になります.

コメント

デフォルトでは,一番上にあるバッファにカーソルがある状態で,Shift+ 上カーソ ルキーとしても,意味がありません.

しかし,

 
(setq windmove-wrap-around t)

と設定しておくと,一番下にあるバッファにカーソルが移動します.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.6 ウィンドウの分割情報を保存したい (2004/01/24)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=screen%20elisp"
"MeadowMemo/ウィンドウの分割情報を保存したい"へのコメント(無し)
検索全文Elisp

お勧め度:★★★★★.ウィンドウの分割を頻繁にする人には欠かせないものです.中で もお勧めは, windows.el .ウィンドウ情報の保存や読み込みが便利です.ウィンドウの 切り替えだけでいいなら,どれを選んでも大差ないと思います.

ウィンドウを 3 つに分割した画面

のようにウィンドウを分割して編集した状態から

ウィンドウを分割していない画面

のように分割していない状態へ移行することはよくあります.

しかし,このような操作をすると,元の状態に戻るためには,またウィンドウの分割をや り直す必要があります.

そこで,ある分割状態と別の分割状態を簡単に切り替えることのできる Elisp を紹介しま す.

紹介するのは 4 つ, windows , elscreen , escreen , winring です.

まずは簡単に特徴を紹介します.

windows
elscreen
escreen
winring

以下では,いくつかに分けられた状態を分割形態,その分割された画面をウィンドウと読んでます.

30.6.1 分割情報を保存 ― windows (2004/01/24)  
30.6.2 分割情報を保存 ― elscreen (2003/05/30)  
30.6.3 分割情報を保存 ― escreen (2003/05/30)  
30.6.4 分割情報を保存 ― winring (2003/10/12)  



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.6.1 分割情報を保存 ― windows (2004/01/24)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=windows%20screen"
"MeadowMemo/分割情報を保存―windows"へのコメント(無し)
検索全文Elisp

何ができるのか?

ウィンドウの分割形態の切り替えはもちろんのこと,分割形態の保存もできます.そのた め, Meadow を再起動しても以前の分割形態を呼び出すことができます.

インストール方法は?

windows をhttp://www.gentei.org/~yuuji/software/ からダウンロードし,ロー ドパスの通ったところへ置きます.

設定方法は?

以下を,.emacs に追加します.

 
;; キーバインドを変更.
;; デフォルトは C-c C-w
;; 変更しない場合」は,以下の 3 行を削除する
(setq win:switch-prefix "\C-z")
(define-key global-map win:switch-prefix nil)
(define-key global-map "\C-z1" 'win-switch-to-window)
(require 'windows)
;; 新規にフレームを作らない
(setq win:use-frame nil)
(win:startup-with-window)
(define-key ctl-x-map "C" 'see-you-again)

詳しい使い方は?

以下,説明の注意事項.

以下の説明では,上記のキーバインドの設定はしていないものとしています.

さらに,デフォルトのキーは C-c C-w なのですが,これは短縮での入力が可能に なっています.つまり,例えば C-c C-w 1C-c 1 としてもいいのです. 以下では,短縮での表記を基本としています.

つまり,C-cC-c C-w でも可能ですので,必要に応じて読み換えてくだ さい.

この短縮入力は

 
(setq win:quick-selection nil)

でオフにできます.

説明の注意事項,終わり

上記の設定を入れて, Meadow を起動するとモードラインに [1] と出ます.これは, 「今, 1 番の分割状態にいる」ということを意味しています.

ここで,ウィンドウを分割して,作業をします.そして,メールを読みたいなと思ったら, 今の分割形態を壊さないように,まずウィンドウを新規に作成します.その方法は簡単. C-c 2としましょう.すると,モードラインに以下のような表示が出ます.

[2] is nil. C) reate D) up P) reserve F) indfile B) uff X) M-x k) KeyFunc&exit N) o:

ここで,cを入力すると,ウィンドウが作られ,そのウィンドウへ移動します.そ して,そこで,メールを読んだり,ファイルを読んだりできます.

終わったら,C-c 1として,戻ります.すると,以前の分割が戻ります.また,メー ルを読みたいと思ったらC-c 2で移動します.

こんな風に,C-c 1C-c 2でウィンドウの切り替えができます.もちろん, 1 〜 9 までどの番号でも使うことができます.こんな風に 2 つの状態を切り替える時には, C-c SPCが便利です.これで,直前に用いたウィンドウへ移動できます.

他にはC-c C-w nC-c C-w pで前後のウィンドウへ移動,C-c ! で 現在のウィンドウを破棄,C-c C-w C-w でメニューの表示,C-c =でウィン ドウ一覧を表示がよく使う機能です.

ついでに,存在しないウィンドウへ移動した時に出てくるメニュー

[2] is nil. C) reate D) up P) reserve F) indfile B) uff X) M-x k) KeyFunc&exit N) o:

は,

ということができます.すべて小文字で入力しても可能です.

C-c C-w C-wでのメニューは

N) ext P) rv R) ecent D) el recoV) er K) ill S) ave2buf L) oad-from-buf saveA) s sW) ap

さて,ここまでで,とりあえず Meadow 起動後のウィンドウ操作はできますね.

次はその状態を保存する機能です. revive.el がロードパス上にあれば,設定は不要で す.

基本的な使い方は, Meadow の終了時にC-x Cとします.これで,~/.windows に全ウィ ンドウの状態を保存した後で,終了してくれます.

その後, Meadow を起動後にM-x resume-windowsとします.これで,その設定を読み 込んでくれます.ウィンドウ状態だけでなく,開いていたバッファもすべて開いてくれま すし,カーソル位置も復元されます.これをリジューム機能といいます.

ただし,「 *migemo*」のようにスペースで始まるバッファは保存されません.そのため, migemo 起動後にウィンドウの読み込みを行うと,「 *migemo*」がないというエラーにな ります.

このようなことを避けるための方法はいくつかあります.

1 つ目は, windows に保存させる方法です. windows が保存しないバッファは

 
(setq revive:ignore-buffer-pattern "^ \\*")

のように設定できますので,これを編集します.バッファがあればいいだけのものなら,これでうまくいきます.

2 つ目は, windows.el を改造することです. windows はウィンドウ情報を読み込む時に,全 バッファを kill しています.それは,関数「 wipe-windows 」内にあります.

その中の

 
  (mapcar (function kill-buffer) (buffer-list))

を, migemo なら,

 
  (mapcar (function kill-buffer) (revive:buffer-list))

としておけばうまくいきます.

3 つ目は,バッファを kill させないようにすることです.

必要に応じて,選択してください.

ただ,これだと Meadow を終了しないことには保存できません.そこで,C-c C-w C-rとします.すると,以下のようなリジュームメニューが出ます.

A) save-all R) esume-all S) ave-this L) oad-this N) Load# ~) read-~ W) ipe

これで,保存できますが,これでは常に~/.windows に保存されてしまい,不便です.そ こで,タスク切り替えがあります.

タスク切り替えとは,「ある作業で使うディレクトリは通常決まっている.それなら,そ こに.windows を保存すれば,タスク毎にウィンドウを切り替えられる」というものです.

方法は,C-c C-w C-sとします.そうすると,

Save current window configuration into buffer[c:/home/.windows]? (y or n)

とモードラインに出ます. y で保存, n で保存しません.その後,ディレクトリを指定 すれば,そこにある.windows が読み込まれます.これで,複数のタスクを切り替えられ ます.

指定したフォルダにウィンドウ情報を保存するには,C-c C-w C-lとして,ディレ クトリを指定します.後は,上で紹介したものがモードラインに出ますので,保存であれ ば「 a 」を入力すればいいでしょう.これで,任意のフォルダに保存,読み込み,切り 替えができます.

さて,ここまで,ウィンドウ情報の保存と言ってきましたが,実は windows が保存する のはウィンドウ情報だけではありません.グローバル変数やローカル変数も保存できます. デフォルトでは

 
(defvar revive:save-variables-global-default
  '(truncate-partial-width-windows
    make-backup-files version-control
    visible-bell)
  "Default list of global variables to save.")

(defvar revive:save-variables-local-default
  '(buffer-read-only
    truncate-lines fill-column fill-prefix case-fold-search default-directory)
  "Default list of the local variables to save.")

となってます.これを変更するには,以下の変数を利用します.追加したいものがあれば, 同じように追加しておくと,保存してくれます.

 
(setq revive:save-variables-global-private nil)
(setq revive:save-variables-local-private nil)

最後に,デフォルトでは 1-9 までのウィンドウを作ることができます.しかし, 3 番に 何があったかというのは覚えにくいです.

そこで,設定を少し変更して,以下のようにします.こうしておくと,数字ではなくアル ファベットでウィンドウを作ることができます.

そのため,例えばメイルをC-z mで読み,C-z sでプログラムを書いたりといっ た風に使うことができます.こちらの方が覚えやすいし,便利でしょう.

 
(setq win:switch-prefix "\C-z")
(define-key global-map win:switch-prefix nil)
(setq win:base-key ?`) ;; ` は「直前の状態」
(setq win:max-configs 27) ;; ` 〜 z は 27 文字
(setq win:quick-selection nil) ;; C-c 英字 に割り当てない

(require 'windows)
(setq win:use-frame nil)
(win:startup-with-window)
(define-key ctl-x-map "C" 'see-you-again)

うまく動かない

 
(setq win:switch-prefix "\C-z")
(define-key global-map win:switch-prefix nil)

という設定を入れて,

 
(global-set-key (kbd "C-z C-z")
                 'iconify-or-deiconify-frame)

ということをしようとしてもうまくいきません.

 
(defun mmemo-set-keybind ()
  (global-set-key (kbd "C-z C-z")
                  'iconify-or-deiconify-frame))
(add-hook 'after-init-hook 'mmemo-set-keybind)

として逃げてます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.6.2 分割情報を保存 ― elscreen (2003/05/30)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=elscreen%20screen"
"MeadowMemo/分割情報を保存―elscreen"へのコメント(2007/12/28)
検索全文Elisp

何ができるのか?

elscreen を使うと,ウィンドウの分割形態の切り替えができます.設定によりタブでの切 り替えもできます.

インストール方法は?

elscreen からダウン ロードし,ロードパスの通ったところへ置きます.

設定方法は?

以下を.emacs に追加します.

 
(load "elscreen" "ElScreen" t)

これで,利用できます.

詳しい使い方は?

機能は以下.

windows のような保存機能はありません.

機能拡張 Elisp

インストール方法は?

また,ウィンドウの一覧をタブ表示することも可能です.そのためには, elscreen-tab をよろずや からダ ウンロードし,ロードパスの通ったところへ置きます.

設定方法は?

以下を.emacs に追加します.

 
(require 'elscreen-tab)

これで,タブが表示されます.タブをクリックすれば,ウィンドウの切り替えも可能です.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.6.3 分割情報を保存 ― escreen (2003/05/30)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=escreen%20screen"
"MeadowMemo/分割情報を保存―escreen"へのコメント(2007/12/28)
検索全文Elisp

インストール方法は?

elscreen と似たような機能を持つのが escreen です.使うためには, http://www.splode.com/~friedman/software/emacs-lisp/からダウンロードし, ロードパスの通ったところへ置きます.

設定方法は?

以下を.emacs に追加します.

 
;; デフォルトは C-\ なので,入力メソッド切り替えと衝突する
(setq escreen-prefix-char "\C-z")
(load "escreen")
(escreen-install)

詳しい使い方は?

これで,モードラインに「 S0 」のようにウィンドウ番号が表示されます.

主な機能は,

です.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.6.4 分割情報を保存 ― winring (2003/10/12)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=winring"
"MeadowMemo/分割情報を保存―winring"へのコメント(無し)
検索全文Elisp

要約

ウィンドウの分割状態を保存し,その状態を切り替えることができる.また,キーも C-x 7 jと馴染みやすい.

何ができるのか?

ウィンドウの分割状態を保存し,切り替えることができます.動作もシンプルですし,馴 染みやすいと思います.

また,分割状態は名前で管理されるので,切り替え時に選択しやすいのも利点です.

インストール方法

winring.elをダウンロードし, ロードパスの通ったところへ置きます.

設定方法

以下を.emacs に追加します.

 
(require 'winring)
(winring-initialize)

詳しい使い方

まず Meadow を起動すると,起動時の分割状態を「 001 」という名前で記憶します.

起動後にC-x 7 nとすると,ウィンドウの分割情報を指定した名前で新規に作成し ます.その後で,C-x 7 jとし,名前を指定すると,その分割状態を呼び出すことが できます.もちろん,補完できますので簡単に切り替えることができます.

ただし,デフォルトではウィンドウの分割状態が 7 を超えると古いものから削除されます.

カスタマイズ

以下を参考に設定します.

 
;; 保存する分割状態の最大数を指定
(setq winring-ring-size 10)
;; 分割状態を新規に作成時に名前を尋ねない
;; 名前は順番に数字になる
(setq winring-prompt-on-create nil)
;; 現在の分割状態の名前をモードラインに表示する
(setq winring-show-names t)



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.7 ウィンドウ分割を Undo/Redo ― winner (2003/10/21)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=winner"
"MeadowMemo/ウィンドウ分割をUndo/Redo―winner"へのコメント(無し)
検索全文Elisp

何が問題なのか?

ウィンドウを分割していくと,一つ前の分割状態に戻したい時があります.しかし,その ためには,最初から分割し直す必要があります.

何ができるのか?

Meadow では,普通のテキストの変更は元に戻すことができます.元に戻すことができる のは,テキストの変更だけではありません.

ウィンドウの分割も元に戻すことができます.

そのために, winner.el を使います.

インストール方法は?

標準で附属しています.

設定方法は?

必要ありません.

詳しい使い方は?

使うには,M-x winner-mode とします.そうすると,モードラインに「 Win 」と 出ます.この状態で,ウィンドウを分割すると,その情報が記憶されます.そして,その 後で,C-x 左カーソル を入力すると,ウィンドウ分割を元に戻すことができます.

また,元に戻した後で,C-x 右カーソル とすると, Redo もできます.ただし, 一つ前の状態にしか戻すことはできません.

30.7.1 ウィンドウの分割を Undo/Redpo ― winhist (2003/10/21)  



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.7.1 ウィンドウの分割を Undo/Redpo ― winhist (2003/10/21)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=winhist"
"MeadowMemo/ウィンドウの分割をUndo/Redpo―winhist"へのコメント(無し)
検索全文Elisp
要約

ウィンドウ分割を何回でも Undo/Redo できる

何が問題なのか?

winner-mode では直前に Undo をしていないと, Redo をしてもエラーになってしまいます. このため, Redo を何回も行うことができません.

何ができるのか?

ウィンドウ分割を何回でも Undo/Redo できます.

インストール方法

winhist.elをダウンロードしてロード パスの通ったところへ置きます.

設定方法

以下を.emacs に追加します.

 
(require 'winhist)
(winhist-mode 1)

必要に応じてキーバインドも追加しておきます.

 
(global-set-key "\M-B" 'winhist-backward)
(global-set-key "\M-F" 'winhist-forward)

詳しい使い方

M-x winhist-backwardM-x winhist-forwardでウィンドウ分割を Undo/Redo できます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.8 ウィンドウの分割をアニメーションする ― windzoom (2008/08/22)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=windzoom"
"MeadowMemo/ウィンドウの分割をアニメーションする―windzoom"へのコメント(無し)
検索全文Elisp

何が問題なのか?

C-x 2C-x 3での分割は単に分割するだけで,少し味気ないと思いませんか?

何ができるのか?

windzoom を使うと,分割時にアニメーションするようになります.

例えば,C-x 2とすると,下の方からモードラインが「ミョーン」と移動してきま す.

インストール方法は?

http://heimat.jp/~nakaji/elips/20030502/4956.htmlの Elisp 部分をコピーして, windzoom.el としてロードパスの通ったところへ保存します.

設定方法は?

以下を.emacs に追加します.

 
(require 'windzoom)

詳しい使い方は?

普通に分割したり,分割を取り消したりするとアニメーションするようになります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.9 フレームをキーボードで移動/サイズ変更 (2004/01/17)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=window%20resize"
"MeadowMemo/フレームをキーボードで移動/サイズ変更"へのコメント(無し)
検索全文Elisp

要約

キーボードだけで,フレームを移動,最大化,サイズ変更する方法

何が問題なのか?

Meadow 起動後にサイズを変更したくなる時があります.しかし,その度にマウスで変更す るのも面倒です.

何ができるのか?

Meadow のフレームをキーボードで移動させたり,サイズを変更することができます.

紹介しているものは?

オリジナルと適当に変更したものを紹介します.

30.9.1 フレームの移動,サイズ変更 (2003/11/18)  
30.9.2 フレームの移動,最大化,リサイズ (2003/07/12)  
30.9.3 フレームを移動させる (2004/01/17)  
30.9.4 最大化/通常サイズを切り替える (2003/10/26)  



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.9.1 フレームの移動,サイズ変更 (2003/11/18)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=window%20resize%20original"
"MeadowMemo/フレームの移動,サイズ変更"へのコメント(無し)
検索全文Elisp

ネタ元:http://ya.sakura.ne.jp/~shinm/meadowbbs/msg01744.html

Meadow bbs にあったものを少し修正したものです.ほぼオリジナルのままです.

設定は以下を.emacs に追加します.

これで,M-x my-window-ctrlとすると,ミニバッファに

locate[120:100] size[130x50] display[1400x1050]

のように現在の情報が表示されます.この状態で,C-p を入力すると,フレーム が上へ移動します.何度もC-pを入力すると,その回数だけ上へ移動していきます. ミニバッファに現在情報が出ている間は移動できる状態になっています.これから抜けて, 編集を行いたい場合には,qとします.

他に使うことのできる機能は以下の通りです.

 
(defun my-window-ctrl ()
   "Window size and position control."
   (interactive)
   (let* ((rlist (frame-parameters (selected-frame)))
          (tMargin (cdr (assoc 'top rlist)))
          (lMargin (cdr (assoc 'left rlist)))
          (displaywidth (x-display-pixel-width))
          (displayheight (x-display-pixel-height))
          (fObj (selected-frame))
          (nCHeight (frame-height))
          (nCWidth (frame-width))
          endFlg
          c)
     (catch 'endFlg
       (while t
         (message "locate[%d:%d] size[%dx%d] display[%dx%d]"
                  lMargin tMargin nCWidth nCHeight
                  displaywidth displayheight)
         (set-mouse-position
          (if (featurep 'meadow)
              (selected-frame) (selected-window)) nCWidth 0)
         (setq c (read-char))
         (cond ((= c ?f)
                (set-frame-width fObj (setq nCWidth (+ nCWidth 2))))
               ((= c ?b)
                (set-frame-width fObj (setq nCWidth (- nCWidth 2))))
               ((= c ?n)
                (set-frame-height fObj (setq nCHeight (+ nCHeight 2))))
               ((= c ?p)
                (set-frame-height fObj (setq nCHeight (- nCHeight 2))))
               ((= c 6)
                (modify-frame-parameters
                 nil (list (cons 'left (setq lMargin (+ lMargin 20))))))
               ((= c 2)
                (modify-frame-parameters
                 nil (list (cons 'left (setq lMargin (- lMargin 20))))))
               ((= c 14)
                (modify-frame-parameters
                 nil (list (cons 'top (setq tMargin (+ tMargin 20))))))
               ((= c 16)
                (modify-frame-parameters
                 nil (list (cons 'top (setq tMargin (- tMargin 20))))))
               ((= c 1)
                (modify-frame-parameters
                 nil (list (cons 'left (setq lMargin 0)))))
               ((= c 5)
                (modify-frame-parameters
                 nil
                 (list
                  (cons 'left
                        (setq lMargin
                              (- displaywidth (frame-pixel-width)))))))
               ((= c ?q) (message "quit") (throw 'endFlg t)))))))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.9.2 フレームの移動,最大化,リサイズ (2003/07/12)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=window%20resize%20my"
"MeadowMemo/フレームの移動,最大化,リサイズ"へのコメント(無し)
検索全文Elisp

これはオリジナルをもとに改造したものです.オリジナル の機能に加えて,以下の機能があります.

設定の前に

まず,手動で右上の最大化ボタンを押し,最大化します.

その状態で,以下を*scratch*バッファに書き,各行の最後で,C-jを入力します.

(frame-height)
(frame-width)

そうすると,例えば

(frame-height)
59

(frame-width)
171

のようになります.この数字を記録しておいてください.

設定方法

以下を.emacs に追加します.ただし,中ほどにある 2 箇所の数字 (要変更とあるところ) は 上で得た値に変更しておきます.

 
(defun my-window-ctrl ()
  "Window size and position control."
  (interactive)
  (let* ((rlist (frame-parameters (selected-frame)))
         (tMargin (if (integerp (cdr (assoc 'top rlist)))
                      (cdr (assoc 'top rlist)) 0))
         (lMargin (if (integerp (cdr (assoc 'left rlist)))
                      (cdr (assoc 'left rlist)) 0))
         (displaywidth (x-display-pixel-width))
         (displayheight (x-display-pixel-height))
         (fObj (selected-frame))
         (nCHeight (frame-height))
         (nCWidth (frame-width))
         (ilist initial-frame-alist)
         (tMarginD (if (assoc 'top ilist)
                       (cdr (assoc 'top ilist)) tMargin))
         (lMarginD (if (assoc 'left ilist)
                       (cdr (assoc 'left ilist)) lMargin))
         (nCHeightD (if (assoc 'height ilist)
                        (cdr (assoc 'height ilist)) nCHeight))
         (nCWidthD (if (assoc 'width ilist)
                       (cdr (assoc 'width ilist)) nCWidth))
         endFlg
         c)
    (catch 'endFlg
      (while t
        (message "locate[%d:%d] size[%dx%d] display[%dx%d]"
                 lMargin tMargin nCWidth nCHeight
                 displaywidth displayheight)
        (set-mouse-position
         (if (featurep 'meadow)
             (selected-frame)
           (selected-window))
         nCWidth 0)
        (condition-case err
            (setq c (read-key-sequence nil))
          (error
           (throw 'endFlg t)))
        (cond ((or (equal c "f") (equal c [S-right]))
               ;;enlarge horizontally
               (set-frame-width fObj (setq nCWidth (+ nCWidth 2))))
              ((or (equal c "b") (equal c [S-left]))
               ;;shrink horizontally
               (set-frame-width fObj (setq nCWidth (- nCWidth 2))))
              ((or (equal c "n") (equal c [S-down]))
               ;;enlarge vertically
               (set-frame-height fObj (setq nCHeight (+ nCHeight 2))))
              ((or (equal c "p") (equal c [S-up]))
               ;;shrink vertically
               (set-frame-height fObj (setq nCHeight (- nCHeight 2))))
              ((or (equal c "\C-f") (equal c [right]))
               ;;move right
               (modify-frame-parameters
                nil (list (cons 'left (setq lMargin (+ lMargin 20))))))
              ((or (equal c "\C-b") (equal c [left]))
               ;;move left
               (modify-frame-parameters
                nil (list (cons 'left (setq lMargin (- lMargin 20))))))
              ((or (equal c "\C-n") (equal c [down]))
               ;;move down
               (modify-frame-parameters
                nil (list (cons 'top (setq tMargin (+ tMargin 20))))))
              ((or (equal c "\C-p") (equal c [up]))
               ;;move up
               (modify-frame-parameters
                nil (list (cons 'top (setq tMargin (- tMargin 20))))))
              ((or (equal c "\C-a") (equal c [home]))
               ;;move left end
               (modify-frame-parameters
                nil (list (cons 'left (setq lMargin 0)))))
              ((or (equal c "\C-e") (equal c [end]))
               ;;move left hand
               (modify-frame-parameters
                nil (list
                     (cons 'left
                           (setq lMargin
                                 (-
                                  (- displaywidth (frame-pixel-width))
                                  10) ;; 少し右端を空ける
                                 )))))
              ((or (equal c "\C-x") (equal c "x"))
               ;;maximize
               (modify-frame-parameters
                nil (list (cons 'left (setq lMargin 0))))
               (modify-frame-parameters
                nil (list (cons 'top (setq tMargin 0))))
               (set-frame-width
                ;; フレーム最大化時に (frame-width) で得た値
                fObj (setq nCWidth 154)) ;; 要変更
               ;; 環境によっては,以下でもうまくいくかも
               ;; fObj (setq nCWidth (/ displaywidth (frame-char-width))))
               (set-frame-height
                ;; フレーム最大化時に (frame-height) で得た値
                fObj (setq nCHeight 34)) ;; 要変更
               ;; 環境によっては,以下でもうまくいくかも
               ;; (- (/ displayheight (frame-char-height)) 8)))
               )
              ((or (equal c "\C-d") (equal c "d"));;default size
               (modify-frame-parameters
                nil (list (cons 'left (setq lMargin lMarginD))))
               (modify-frame-parameters
                nil (list (cons 'top (setq tMargin tMarginD))))
               (set-frame-width fObj (setq nCWidth nCWidthD))
               (set-frame-height fObj (setq nCHeight nCHeightD))
               )
              ((or (equal c "\C-i") (equal c "i"));;initial size
               (modify-frame-parameters
                nil (list (cons 'left (setq lMargin 0))))
               (modify-frame-parameters
                nil (list (cons 'top (setq tMargin 0))))
               (set-frame-width fObj (setq nCWidth 80))
               (set-frame-height fObj (setq nCHeight 32))
               )
              ((equal c "w");;write out
               (insert (concat
                        "'(width . " (int-to-string nCWidth) ")\n"
                        "'(height . " (int-to-string nCHeight) ")\n"
                        "'(top . " (int-to-string tMargin) ")\n"
                        "'(left . " (int-to-string lMargin) ")\n"))
               (throw 'endFlg t))
              ((or (equal c "\C-z") (equal c "z"))
               (iconify-or-deiconify-frame)
               (throw 'endFlg t))
              ((equal c "q") (message "quit") (throw 'endFlg t))
              ;; デフォルトは終了
              (t (message "quit") (throw 'endFlg t))
              )))))

(global-set-key "\C-z" 'my-window-ctrl)



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.9.3 フレームを移動させる (2004/01/17)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=window%20resize%20move"
"MeadowMemo/フレームを移動させる"へのコメント(無し)
検索全文Elisp

ネタ元:http://ko.meadowy.net/~shirai/diary/20030120.html#p02

これは移動のみが可能なものです.

上記と違うのは個々の機能を個別のキーバインドに割り当てられる点です.

 
(defvar my-move-frame-distance 15) ;; 移動量

(defun my-move-frame (&optional vertical horizon)
  "vertical, horizon の数だけ Frame を動かす"
  (when window-system
    (let* ((meadowy (featurep 'meadow))
           (top (frame-parameter (selected-frame) 'top))
           (left (frame-parameter (selected-frame) 'left))
           (mpos (if meadowy
                     (cdr (mouse-position))
                   (cdr (mouse-pixel-position))))
           (hoff (* (or horizon 0) my-move-frame-distance))
           (voff (* (or vertical 0) my-move-frame-distance)))
      (set-frame-position (selected-frame) (+ left hoff) (+ top voff))
      (if meadowy
          (set-mouse-position (selected-frame) (car mpos) (cdr mpos))
        (set-mouse-pixel-position (selected-frame)
                                  (+ (car mpos) hoff)
                                  (+ (cdr mpos) voff))))))

(defun my-move-frame-up ()
  "Frame を上に動かす"
  (interactive)
  (my-move-frame -1 0))

(defun my-move-frame-down ()
  "Frame を下に動かす"
  (interactive)
  (my-move-frame 1 0))

(defun my-move-frame-left ()
  "Frame を左に動かす"
  (interactive)
  (my-move-frame 0 -1))

(defun my-move-frame-right ()
  "Frame を右に動かす"
  (interactive)
  (my-move-frame 0 1))

(define-key global-map [?\C-\M-1] 'my-move-frame-left)
(define-key global-map [?\C-\M-2] 'my-move-frame-down)
(define-key global-map [?\C-\M-3] 'my-move-frame-up)
(define-key global-map [?\C-\M-4] 'my-move-frame-right)



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.9.4 最大化/通常サイズを切り替える (2003/10/26)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=window%20resize%20toggle"
"MeadowMemo/最大化/通常サイズを切り替える"へのコメント(無し)
検索全文Elisp

ネタ元:Meadow-users-ml X-ML-COUNT: 4638 , 4639

最大化と通常サイズを切り替えることができます. Windows の機能と同じようなことがキー ボードだけできます.

設定の前に

以下のことは最新の Meadow では不要です.

まず,手動で右上の最大化ボタンを押し,最大化します.

その状態で,以下を*scratch*バッファに書き,各行の最後で,C-jを入力します.

(frame-height)
(frame-width)

そうすると,例えば

(frame-height)
59

(frame-width)
171

のようになります.この数字を記録しておいてください.

設定を行う

以下を.emacs に追加します.

最新の Meadow であればこのままで最大化できるはずです.

古い Meadow の場合には, 2 箇所の数字は準備で出た数字に書き変えてください.これで, M-x my-toggle-frame-sizeとすると,最大化と通常サイズを切り替えることができ ます.

最大化時にミニバッファが隠れてしまうようであれば,「 (frame-height) 」を評価した時 の値を少し小さくして設定します.

 
;;; フレームサイズをトグルで切り替え
(setq my-frame-max-flag nil)

(defun my-toggle-frame-size ()
  (interactive)
  (if my-frame-max-flag
      (progn
        (setq my-frame-max-flag nil)
        (if (functionp 'w32-restore-frame)
            (w32-restore-frame)
          (set-frame-configuration my-last-frame-conf)
          (message "not MAX.") (sit-for 2)
          ))
    (setq my-frame-max-flag t)
    (if (functionp 'w32-maximize-frame)
        (w32-maximize-frame)
      (setq my-last-frame-conf (current-frame-configuration))
      (set-frame-position (selected-frame) 0 0)
      ;; フレーム最大化時に (frame-height) で得た値
      (set-frame-height (selected-frame) 59)
      ;; フレーム最大化時に (frame-width) で得た値
      (set-frame-width (selected-frame) 171)
      (message "to MAX.") (sit-for 2)
    )))

これを利用すると最大化したい時だけ最大化して,通常時には普通のサイズで使うという こともできます.例えば, ediff では二つのバッファを比較して表示するため,大きくし て見易くしたいものです.

そんな時には以下を.emacs に追加します.これで, ediff を実行すると最大化され, qで終了すると元のサイズに戻ります.

 
;; ediff 立ち上げ時に、画面を最大化
(add-hook 'ediff-before-setup-hook 'my-toggle-frame-size)
;; ediff 終了時に、画面を元に戻す
(add-hook 'ediff-quit-hook 'my-toggle-frame-size)



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

30.10 終了時のフレームサイズを記憶する (2008/03/14)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=save%20framesize"
"MeadowMemo/終了時のフレームサイズを記憶する"へのコメント(2007/12/28)
検索全文Elisp
要約

終了時のフレームサイズを記憶させ,次回起動時に前回終了時と同じサイズで起動できる.

何が問題なのか?

Meadow のフレームサイズを設定するのはなかなか面倒なものです.

しかも,設定後フレームサイズを変えたいと思っても,そのたびに設定を変更しなければ なりません.

設定を変更しないと,次回起動時には無駄になってしまうからです.

何ができるのか?

フレームのサイズを記憶し,次回起動時に同じサイズで表示することができます.

これにより,適当にマウスでサイズを変えて,再起動しても同じサイズで起動することが できます.毎回,設定を直す必要はなくなるのです.

設定方法

以下を.emacs に追加します.

 
(defun my-window-size-save ()
  (let* ((rlist (frame-parameters (selected-frame)))
         (ilist initial-frame-alist)
         (nCHeight (frame-height))
         (nCWidth (frame-width))
         (tMargin (if (integerp (cdr (assoc 'top rlist)))
                      (cdr (assoc 'top rlist)) 0))
         (lMargin (if (integerp (cdr (assoc 'left rlist)))
                      (cdr (assoc 'left rlist)) 0))
         buf
         (file "~/.framesize.el"))
    (if (get-file-buffer (expand-file-name file))
        (setq buf (get-file-buffer (expand-file-name file)))
      (setq buf (find-file-noselect file)))
    (set-buffer buf)
    (erase-buffer)
    (insert (concat
             ;; 初期値をいじるよりも modify-frame-parameters
             ;; で変えるだけの方がいい?
             "(delete 'width initial-frame-alist)\n"
             "(delete 'height initial-frame-alist)\n"
             "(delete 'top initial-frame-alist)\n"
             "(delete 'left initial-frame-alist)\n"
             "(setq initial-frame-alist (append (list\n"
             "'(width . " (int-to-string nCWidth) ")\n"
             "'(height . " (int-to-string nCHeight) ")\n"
             "'(top . " (int-to-string tMargin) ")\n"
             "'(left . " (int-to-string lMargin) "))\n"
             "initial-frame-alist))\n"
             ;;"(setq default-frame-alist initial-frame-alist)"
             ))
    (save-buffer)
    ))

(defun my-window-size-load ()
  (let* ((file "~/.framesize.el"))
    (if (file-exists-p file)
        (load file))))

(my-window-size-load)

;; Call the function above at C-x C-c.
(defadvice save-buffers-kill-emacs
  (before save-frame-size activate)
  (my-window-size-save))

詳しい使い方

普通に使うだけです.特に何もしなくても,終了時のサイズを保存し,起動時にはそのサ イズ・位置に変更してくれます.

フレームサイズに関する設定があれば,不要ですので,削除しておいた方がいいかもしれ ません.


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]