[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow は複数のファイルを一つのウィンドウで操作する MDI を採用していま す. Windows では EXCEL などが MDI の代表例です.
しかし,この MDI は前面に出ているファイルは 1 つか 2 つ程度なため,多数のファイ ルを開いた時にはファイルを切り替える必要があります.ここでは,ウィンドウの操作と 便利にする設定について紹介していきます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow を起動した時に表示される領域をウィンドウと呼びます.そして,各ウィンドウ はバッファを表示します.
一方,C-x 5 2で作成されるウィンドウはフレームと呼びます.フレームにはウィ ンドウが含まれ,各フレームでファイルの編集などができます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
文章を作成する際などに,上下あるいは左右に分割して参照したいということがあります.
Meadow では簡単に上下,左右に分割することができます.
以下を参考に実際にやってみてください.
分割は連続してすることができます.例えば,C-x 2 C-x 2と 2 回連続して上下に分 割すると,まず上下に分割され,さらに,上がわのバッファがさらに半分に分割されます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元:昔どこかの 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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元: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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
お勧め度:★★★★★.ウィンドウの分割を頻繁にする人には欠かせないものです.中で もお勧めは, windows.el .ウィンドウ情報の保存や読み込みが便利です.ウィンドウの 切り替えだけでいいなら,どれを選んでも大差ないと思います.
のようにウィンドウを分割して編集した状態から
のように分割していない状態へ移行することはよくあります.
しかし,このような操作をすると,元の状態に戻るためには,またウィンドウの分割をや り直す必要があります.
そこで,ある分割状態と別の分割状態を簡単に切り替えることのできる Elisp を紹介しま す.
紹介するのは 4 つ, 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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ウィンドウの分割形態の切り替えはもちろんのこと,分割形態の保存もできます.そのた め, 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 1 は C-c 1 としてもいいのです. 以下では,短縮での表記を基本としています.
つまり,C-c は C-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 1とC-c 2でウィンドウの切り替えができます.もちろん, 1 〜 9 までどの番号でも使うことができます.こんな風に 2 つの状態を切り替える時には, C-c SPCが便利です.これで,直前に用いたウィンドウへ移動できます.
他にはC-c C-w nやC-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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
elscreen を使うと,ウィンドウの分割形態の切り替えができます.設定によりタブでの切 り替えもできます.
elscreen からダウン ロードし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(load "elscreen" "ElScreen" t) |
これで,利用できます.
機能は以下.
windows のような保存機能はありません.
また,ウィンドウの一覧をタブ表示することも可能です.そのためには, elscreen-tab をよろずや からダ ウンロードし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(require 'elscreen-tab) |
これで,タブが表示されます.タブをクリックすれば,ウィンドウの切り替えも可能です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
elscreen と似たような機能を持つのが escreen です.使うためには, http://www.splode.com/~friedman/software/emacs-lisp/からダウンロードし, ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
;; デフォルトは C-\ なので,入力メソッド切り替えと衝突する (setq escreen-prefix-char "\C-z") (load "escreen") (escreen-install) |
これで,モードラインに「 S0 」のようにウィンドウ番号が表示されます.
主な機能は,
です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ウィンドウの分割状態を保存し,その状態を切り替えることができる.また,キーも 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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ウィンドウを分割していくと,一つ前の分割状態に戻したい時があります.しかし,その ためには,最初から分割し直す必要があります.
Meadow では,普通のテキストの変更は元に戻すことができます.元に戻すことができる のは,テキストの変更だけではありません.
ウィンドウの分割も元に戻すことができます.
そのために, winner.el を使います.
標準で附属しています.
必要ありません.
使うには,M-x winner-mode とします.そうすると,モードラインに「 Win 」と 出ます.この状態で,ウィンドウを分割すると,その情報が記憶されます.そして,その 後で,C-x 左カーソル を入力すると,ウィンドウ分割を元に戻すことができます.
また,元に戻した後で,C-x 右カーソル とすると, Redo もできます.ただし, 一つ前の状態にしか戻すことはできません.
30.7.1 ウィンドウの分割を Undo/Redpo ― winhist (2003/10/21)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ウィンドウ分割を何回でも 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-backwardとM-x winhist-forwardでウィンドウ分割を Undo/Redo できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
C-x 2やC-x 3での分割は単に分割するだけで,少し味気ないと思いませんか?
windzoom を使うと,分割時にアニメーションするようになります.
例えば,C-x 2とすると,下の方からモードラインが「ミョーン」と移動してきま す.
http://heimat.jp/~nakaji/elips/20030502/4956.htmlの Elisp 部分をコピーして, windzoom.el としてロードパスの通ったところへ保存します.
以下を.emacs に追加します.
(require 'windzoom) |
普通に分割したり,分割を取り消したりするとアニメーションするようになります.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
キーボードだけで,フレームを移動,最大化,サイズ変更する方法
Meadow 起動後にサイズを変更したくなる時があります.しかし,その度にマウスで変更す るのも面倒です.
Meadow のフレームをキーボードで移動させたり,サイズを変更することができます.
オリジナルと適当に変更したものを紹介します.
上下左右への移動とサイズの拡大,縮小をサポート.また,画面右端,左端への移動も可 能.
q で終了になるが,それ以外の文字を入力するとエラーになる.
オリジナルにxでの最大化,dでデフォルトサイズに戻す,zで最小化 を追加.また,wで initial-frame-alist を設定するための情報を出力できる.
さらに,関連しないキーを入力した時にも終了するようにした.
これは移動のみを可能にしたもの.上記 2 つがメニュー方式だったのに対し,これは上下 左右への移動をそれぞれ適当なキーに割り当てて使うことができる.
これはサイズ変更のみを可能にしたもの.トグル式で最大化と通常のサイズを切り替える ことができる.
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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元: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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
これはオリジナルをもとに改造したものです.オリジナル の機能に加えて,以下の機能があります.
'(width . 130) '(height . 50) '(top . 100) '(left . 120) |
こんな風.適当に思考錯誤して,それを initial-frame-alist に設定すれば,起動時のサ イズなどを簡単に設定できます.
まず,手動で右上の最大化ボタンを押し,最大化します.
その状態で,以下を*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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元: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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元: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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
終了時のフレームサイズを記憶させ,次回起動時に前回終了時と同じサイズで起動できる.
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)) |
普通に使うだけです.特に何もしなくても,終了時のサイズを保存し,起動時にはそのサ イズ・位置に変更してくれます.
フレームサイズに関する設定があれば,不要ですので,削除しておいた方がいいかもしれ ません.
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |