-
Notifications
You must be signed in to change notification settings - Fork 15
/
windows.el
2516 lines (2420 loc) · 94.2 KB
/
windows.el
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;;; -*- Emacs-Lisp -*-
;;; Window manager for GNU Emacs.
;;; $Id: windows.el,v 2.47 2009/10/17 01:49:05 yuuji Exp $
;;; (c) 1993-2009 by HIROSE Yuuji [[email protected]]
;;; Last modified Sat Oct 17 10:44:41 2009 on firestorm
;;; Window manager for GNU Emacs
;;;
;;;[What is Windows?]
;;;
;;; You can divide the screen of GNU Emacs as many as you like.
;;; Since efficiency of implementation or so depends much on the
;;; style of window division, you may have your own style of
;;; partitioning. But if you switch the mode to e-mail mode or
;;; NetNews mode, they break your favorite style.
;;;
;;; Windows.el enables you to have multiple favorite window
;;; configurations at the same time, and switch them. Furthermore,
;;; it can save all window configurations and some global or
;;; buffer-local variables into a file and restore them correctly.
;;;
;;; **For Emacs 19 or later**
;;;
;;; This package provides the `named(numbered) frame' that can be
;;; selected directly with their name. With revive.el, all frames'
;;; displaying buffers, window configurations and size can be saved
;;; and restored.
;;;
;;;[Installation]
;;;
;;; Put windows.el into the directory load-path indicates, and put
;;; the following expressions into your ~/.emacs.
;;;
;;; (require 'windows)
;;; (win:startup-with-window)
;;; (define-key ctl-x-map "C" 'see-you-again)
;;;
;;;[Hack]
;;;
;;; If your are thinking of creating patch for windows.el, please
;;; don't forget to consider about compatibility of various emacsen.
;;;
;;; * Do not rely on other package. e.g., 'when relies on
;;; 'cl package.
;;; * Test your patch on as old/new emacs as you can have.
;;;
;;; Anyway, feel free to hack. I'll make a glue for various emacsen
;;; upon your patches if you can't test.
;;;
;;;[Key Bindings]
;;;
;;; The default prefix key stroke for Windows is `C-c C-w'. If it
;;; causes you some troubles, see the section `Customizations'.
;;; Here are the default key bindings.
;;;
;;; C-c C-w 1 Switch to window 1 (Q)
;;; C-c C-w 2 Switch to window 2 (Q)
;;; :
;;; C-c C-w 9 Switch to window 9 (Q)
;;; C-c C-w 0 Swap windows with the buffer 0 (Q)
;;; (Select unallocated frame(Emacs 19))
;;; C-c C-w SPC Switch to window previously shown (Q)
;;; C-c C-w C-n Switch to next window
;;; C-c C-w C-p Switch to previous window
;;; C-c C-w ! Delete current window (Q)
;;; C-c C-w C-w Window operation menu
;;; C-c C-w C-r Resume menu
;;; C-c C-w C-l Local resume menu
;;; C-c C-w C-s Switch task
;;; C-c C-w = Show window list (Q)
;;;
;;; The key strokes to select windows from 1 to 9 must be
;;; frequently used, so the alternative key strokes `C-c [Num.]' are
;;; available by default (And any function with (Q)mark can be
;;; invoked without C-w). To disable these quick key strokes, set
;;; the variable win:quick-selection to `nil' in your ~/.emacs.
;;;
;;;[Description]
;;;(for Emacs19 or later)
;;;
;;; Windows.el manages maximum 10 (or more if you configure)
;;; frames. The first frame is `window#1'. If you want to create a
;;; new frame as `window#2', type `C-c C-w 2'. You can create or
;;; switch numbered frames as many as you want. Unlike standard
;;; Emacs's frame selection (`C-x 5 o'), windows.el enables you to
;;; go to the desired frame directly.
;;;
;;; For detailed frame management, read the section `Other
;;; functions'. In that section, the term `window' is used to refer
;;; the frame.
;;;
;;;[Description]
;;;(for Emacs18 or emacs -nw)
;;;
;;; Windows.el has 10 window buffers, from 0 to 9. But you can
;;; use the buffer from 1 to 9, the buffer 0 is reserved for the
;;; most recently used window (This is not true for the frame
;;; environment of Emacs 19).
;;;
;;; If you have wrote `win:startup-with-window' in your .emacs,
;;; the initial window configuration is memorized in the buffer 1.
;;; Otherwise you have to memorize it by typing `C-c C-w 1'.
;;; Anyway, say you are editing some program in buffer 1.
;;;
;;; After a while, a mail has arrived. You may wish to assign a
;;; mail mode configuration to the buffer 2. Type `C-c C-w 2' to
;;; create the buffer 2, and you will see the `window creation
;;; menu':
;;;
;;; C)reate D)uplicate P)reserve F)indfile B)uff X)M-x k)KeyFunc&exit N)o:
;;;
;;; in the minibuffer. Since you don't need the current window
;;; configuration (programming configuration) to read mails, type
;;; `c', stands for Create, to create the new window configuration.
;;; Then, after invoke the mail reader, current window configuration
;;; will turn to mail oriented one. (Of course you can directly call
;;; e-mail mode by typing `x' at the window creation menu.) When you
;;; finish to read your mail, you can return to programming
;;; configuration with `C-c C-w 1'.
;;;
;;; Let's read the NetNews. M-x gnus... O.K.! You've read. You
;;; may have typed `q' to quit gnus until yesterday. But you don't
;;; have to do it from today. You can go back to programming
;;; immediately by typing `C-c C-w 1'! Oops, you have not created
;;; the new configuration buffer yet. So the window you see is
;;; still the window 1. If you switch the window to another, you'll
;;; lose the configuration in the buffer 1. In this case, type `p'
;;; (stands for Preserve) at the window creation menu after typing
;;; `C-c C-w 3'(%1). Windows.el doesn't update the buffer 1 and
;;; saves the current window configuration of the NetNews into the
;;; buffer 3.
;;; **On Emacs-19, you can't preserve the buffer contents unless you
;;; have saved it into the resume file described below.
;;;
;;; Then, type `C-c C-w 2' to read the mail, type `C-c C-w 3' when
;;; you are tired with programming. `C-c C-w SPC' is very
;;; convenient when you want to exchange two configurations.
;;;
;;; If you forget what windows are allocated to the buffers, type
;;; `C-c C-w =' to display the configuration buffer names and their
;;; corresponding editing buffer names in the menu buffer. The
;;; entry preceded by `*' is the selected buffer and the entry with
;;; `+' is the buffer previously selected(that is, the buffer `C-c
;;; C-w SPC' will select). In this buffer, you can move cursor with
;;; `n' or `p', and select that window with SPC. Type `?' for more
;;; information.
;;;
;;; (%1)
;;; At a point of this time, while window configuration buffer holds
;;; the programming environment, the screen of GNUS is displayed.
;;; And, notice that `p'(Preserve) at the window creation menu
;;; doesn't work when the Windows uses `frame' as window unit on
;;; Emacs 19.
;;;
;;;[Other functions]
;;;
;;; Typing `C-c C-w C-w' displays the menu as follows.
;;;
;;; N)ext P)rev R)ecent D)elete K)ill S)ave2buf L)oad-from-buf A)save-As
;;;
;;; In this menu, `n', `p' is for switching window to the next or
;;; previous, `r' is for recovering the window recently seen before
;;; the window switching operation(%2), `d' is for deleting current
;;; window. `k' is same as `d' except closing all visible file(s).
;;; And type `s' to save the current window configuration into the
;;; corresponding buffer, `a' to save the current window
;;; configuration into specified buffer. Note that `s' and `l' is
;;; unavailable on frame environment.
;;;
;;; (%2)
;;; When using frame on Emacs 19, it is impossible to store a frame
;;; recently seen, so `r' (win-recent-window) selects a frame that
;;; is not allocated to Windows instead, if any (equivalent to `C-c
;;; C-w 0').
;;;
;;; When you create the new window, you see the window creation
;;; menu which ask you how to handle the current configuration
;;; buffer and what configuration the new window must be. The
;;; entries of the prompt stand for the followings.
;;;
;;; Create After saving the current window
;;; configuration into the current buffer,
;;; create a newly allocated window.
;;; Duplicate After saving the current window
;;; configuration into the current buffer,
;;; create the new window with the same
;;; configuration as the current one.
;;; Preserve Without updating the current buffer,
;;; use the current window configuration
;;; as the new window. This function is not
;;; available on Emacs 19 with frame.
;;; Findfile Find-file on new window.
;;; Buff Switch to buffer on new window.
;;; M-x Call a command on new window.
;;; No Cease window creation.
;;;
;;;[Resume]
;;;
;;; Windows.el can resume your environment with a help of
;;; `revive.el'. You can see the menu by typing `C-c C-w C-r'.
;;;
;;; A)save-all R)estore-all S)ave-this L)oad-this N)Load# ~)read-~
;;;
;;; Type `a' to save all window configurations into a file, and type
;;; `r' to restore configurations saved in that file. `s' to save
;;; the current window configuration, `l' to load current window
;;; from file, `n' to load a window specified by a number. And use
;;; `~' when you type `a' instead of `r' by mistake. And it is much
;;; more convenient to kill emacs with `C-x C'. If you want to
;;; resume that context, call `resume-windows' (or C-c C-w C-r r)
;;; just after starting Emacs.
;;;
;;;[Local resume]
;;;
;;; If you want to have many sets of window configurations, type
;;; `C-c C-w C-l' to specify the directory where another
;;; configuration file is to resid, and operate in the same way as
;;; you do in resume menu described above. You can change sets of
;;; configurations directory by directory.
;;;
;;; By the way, most of tasks are being done in a certain
;;; directory. If you have a couple of or more jobs to do at once,
;;; the function `win-switch-task' is very useful to switch your
;;; tasks. It saves the current set of window configurations into
;;; current configuration file, flushes buffers, and reads the next
;;; set of window configurations for the next task from another
;;; configuration file.
;;;
;;;[Customizations]
;;;
;;; To change the prefix key stroke to `C-c w' for example,
;;; put the following expressions into your ~/.emacs.
;;;
;;; (setq win:switch-prefix "\C-cw")
;;; (define-key global-map win:switch-prefix nil)
;;; (define-key global-map "\C-cw1" 'win-switch-to-window)
;;;
;;; And you can also change the key stroke of window selection to
;;; `a' to `z' other than `1' to `9'.
;;;
;;; (setq win:switch-prefix "\C-cw")
;;; (define-key global-map win:switch-prefix nil)
;;; (define-key global-map "\C-cwb" 'win-switch-to-window)
;;; (setq win:base-key ?`) ;; '`' is before 'a'
;;; (setq win:max-configs 27) ;; '`' to 'z' are 27 chars.
;;; (setq win:quick-selection nil) ;; Not assign `C-c LETTER'
;;;
;;; Notice that '`' is the previous character of 'a' in ASCII code,
;;; and that C-c w ` is bound to swap the configuration in the
;;; buffer '`' and the current buffer.
;;;
;;; If you don't use `frame' even on Emacs 19 with X Window. Set
;;; win:use-frame to nil in ~/.emacs.
;;;
;;; If you hate raising of frames at win-save-all-configurations,
;;; set win:no-raise-at-save to t.
;;;
;;;[For frame users]
;;;
;;; When you start to use windows.el, you may create a new frame
;;; with old operation `C-x 5 f' or so. Frames created with
;;; standard frame operation are not marked in the windows ring. To
;;; incorporate sucn an orphan frame into windows ring, type `C-c
;;; C-w C-w' and select `A)save-as' from the menu. And if you want
;;; to switch to orphan frames, type `C-c C-w 0', which switches
;;; frame to isolated frames and rotate them.
;;;
;;; By default, windows.el name a frame title (bar) as follows.
;;;
;;; Emacs[1]:*scartch*
;;;
;;; This causes frame title always representing the frame number.
;;; So you can switch to any of them with key operation of your
;;; window manager, `fvwm' for example:
;;; --- .fvwmrc ---
;;; key 1 A C Warp "" Emacs[1]
;;; key 2 A C Warp "" Emacs[2]
;;; :
;;; key 9 A C Warp "" Emacs[9]
;;;
;;; If you use fvwm2
;;; AddToFunc DeiconifyFocusAndWarp "I" Iconify -1
;;; + "I" FocusAndWarp $0 $1
;;;
;;; Key 1 A C Next [Emacs?1?:*] DeiconifyFocusAndWarp
;;; :
;;; Key 9 A C Next [Emacs?9?:*] DeiconifyFocusAndWarp
;;; #(fvwm2 can't escape [ and ], so cause matches with them by ?s.)
;;;
;;; Thus C-1, C-2, ..., C-9 directly select window frame `Emacs[1]'
;;; through `Emacs[9]'.
;;; In this hook, two variables `frame' and `index', which have
;;; frame object, frame number respectively, are available.
;;;
;;;[Bugs]
;;;
;;; This program was inspired from `screen', the window manager
;;; for VT100 emulation terminal, and operations are fundamentally
;;; based on it. But there is no compatibility.
;;;
;;; When restoring frames of Emacs 19, the order of frame
;;; allocation is not restored, that is, its order depends on the
;;; frame where win-load-all-configurations is called. No frame
;;; positions are not recovered neither.
;;;
;;;[Copying]
;;;
;;; This program is distributed as a free software. The author is
;;; not responsible for any possible defects caused by this
;;; software.
;;;
;;; Comments and bug reports are welcome. Don't hesitated to
;;; report. My possible e-mail address is following.
;;;
;;;
;;; Japanese Document follows:
;;;
;;; GNU Emacs 用編集画面マネージャ [windows]
;;;
;;;【できる事】
;;;
;;; GNU Emacs では縦横任意の数だけウィンドウを分割して作業をする事
;;; ができます。プログラムを開発する時などのウィンドウ分割は効率に大
;;; きく影響するので、人によって好みの分割形態を持っている事でしょう。
;;; しかしその途中で、メイルやニュースを読むとその分割形態を壊されて
;;; しまいます。正しい手順でメイルリーダモードを終われば良いのですが、
;;; それだとまたメイルが来た時に再びメイルリーダモードを起動しなけれ
;;; ばなりません。
;;; windows.el をロードすると、好みのウィンドウ分割形態を複数持ち、
;;; それらを切替えながら Emacs を使う事ができます。さらに、その分割
;;; 形態の全てをファイルにセーブし、いつでもそれらを復元することがで
;;; きます。
;;;
;;; Emacs 19(Mule2) 以降では、同様の操作体系で frame を単位として
;;; ウィンドウ切替え操作を行います。さらに分割形態復元時にはフレーム
;;; のサイズと位置も忠実に再現します。フレームの嫌いな人は変数の設定
;;; によりフレームを使わないウィンドウの切り替えで利用することもでき
;;; ます。
;;;
;;;【準備】
;;;
;;; windows.el を load-path の通ったディレクトリに入れてください。
;;; そして以下の行を .emacs に入れてください。
;;;
;;; (require 'windows)
;;; (define-key global-map "\C-xC" 'see-you-again)
;;; (win:startup-with-window)
;;;
;;;
;;;【キー定義】
;;;
;;; デフォルトのプリフィクスキーは C-c C-w です。これでは不都合な
;;; 場合は『キーカスタマイズ』の項を参照してください。標準状態のキー
;;; バインドは以下のようになっています。
;;;
;;; C-c C-w 1 分割状態 1 へ (Q)
;;; C-c C-w 2 分割状態 2 へ (Q)
;;; :
;;; C-c C-w 9 分割状態 9 へ (Q)
;;; C-c C-w 0 直前の分割状態へ(バッファ0と交換) (Q)
;;; C-c C-w SPC 分割状態1~nのうち、直前用いたものへ (Q)
;;; C-c C-w n 次の分割状態へ(C-c SPC)
;;; C-c C-w p 前の分割状態へ
;;; C-c C-w ! 現在のウィンドウを破棄 (Q)
;;; C-c C-w - ちょっと前のウィンドウ状態を復活(Q)
;;; C-c C-w C-w ウィンドウ操作メニュー
;;; C-c C-w C-r リジュームメニュー
;;; C-c C-w C-l ローカルリジュームメニュー
;;; C-c C-w C-s タスク切替え
;;; C-c C-w = 分割状態保存バッファ一覧表示 (Q)
;;;
;;; 1 番から 9 番までのウィンドウ選択は非常に頻繁に用いられるので、
;;; 「C-c 番号」でも切り替えができるようになっています(その他Qマーク
;;; の付いているキーバインド全ては C-w を打たなくてもよい)。これを無
;;; 効にするためには、~/.emacs などで変数 win:quick-selection を nil
;;; にセットしてください。
;;;
;;;【説明】
;;;
;;; windows.el には0から9までの10個のバッファが用意されています。
;;; このうちユーザが好みの分割状態を保存させるために使えるのは1~9
;;; で、0番は自動的に直前の分割状態をセーブするために使われます
;;; (Emacs-19以降ではwindowsに割り当てられていないframeへのジャンプ)。
;;;
;;; win:startup-with-window を .emacs に書いている場合は起動時の編
;;; 集状態がそのまま1番のバッファに格納されています。そうでない場合
;;; は何か C-c C-w 1 を押して最初の編集状態を1番のバッファに記憶させ
;;; ます。
;;;
;;; さて、1番に現状を保存した状態で、メイルを読みましょう。メイル
;;; は2番のウィンドウに割り当てます。C-c C-w 2 を押すと今度は
;;;
;;; C)reate D)uplicate P)reserve F)indfile B)uff X)M-x N)o:
;;;
;;; と出て来ます(これをウィンドウ生成メニューと呼ぶことにします)。メ
;;; イルを読むためには現在の分割状態は必要ありませんから、Create の
;;; c を押して新規ウィンドウを作成します。そこでメイルリーダを起動す
;;; ると、ウィンドウの分割状態がメイル専用になります(もちろんメニュー
;;; でxを押して直接メイルリーダを起動してもかまいません)。読み終わっ
;;; たら C-c C-w 1 を押すと、1番のバッファに保存されている、最初のプ
;;; ログラム編集状態に切り替わります。これでプログラム作成に直ちに戻
;;; れます。
;;;
;;; 今度はニュースを読みましょう。M-x gnus ・・・。はい読み終わり
;;; ました。いままでは q で終了していましたが、今日からは違います。
;;; C-c C-w 1 で復帰できるのです。はい、C-c C-w 1。おっと、新規ウィ
;;; ンドウを作成するのを忘れていたので、まだ1番のウィンドウにいたの
;;; でした。このまま(%1)ではせっかく1番に保存したプログラム編集状態
;;; が消えてしまいます。そんな時は、C-c C-w 3 を押してウィンドウ生成
;;; メニューが出たところで、Preserve の p を押してください。1番のバッ
;;; ファの内容は更新せずに、現状のウィンドウ状態を3番のバッファに保
;;; 存します。
;;; **Mule2ではリジューム(後述)ファイルに現在の状態がセーブされていな
;;; い限り、分割状態を復旧することができません。
;;;
;;; あとはメイルが来たら C-c C-w 2 を、プログラムに飽きたら C-c
;;; C-w 3 を押して一日を過ごしましょう。メイルとニュースだけを読み続
;;; ける場合のように二つの状態を行ったり来たりする場合は C-c C-w SPC
;;; が便利です。
;;;
;;; 「あれ、メイルはいま何番のウィンドウだ?」と分からなくなったら、
;;; C-c C-w = を押しましょう。ミニバッファに番号と、対応するバッファ
;;; 名がメニューバッファに表示されます。このうち、 バッファ名の頭に*
;;; が付いているものが現在選択しているバッファで、 +が付いているもの
;;; が直前に選択していたバッファです(つまり C-c C-w SPC の行き先)。
;;; メニューバッファでは、 n や p を押して切替えたいウィンドウの位置
;;; まで移り、 SPC でそのウィンドウに切替えることができます。また d,
;;; k, s, l を押すと行頭に D, K, S, L マークが付きます。ここで x を
;;; 押すとマークを付けたバッファに対し、それぞれ「削除」、「表示され
;;; ているバッファも含めて削除(kill)」、「状態をファイルにセーブ」、
;;; 「状態をファイルからロード」を行います。詳しくは、メニューバッファ
;;; で ? を押してください。
;;;
;;; (%1)
;;; この状態ではバッファにプログラム編集状態が保存され、ウィンドウに
;;; GNUSの画面が表示されている。なお、Preserve は Emacs 19 でframeを
;;; 切替え単位とする場合には利用できないので注意して下さい。
;;;
;;;【その他細かい機能】
;;;
;;; C-c C-w C-w を押すと以下のようなメニューが出て来ます。
;;;
;;; N)ext P)rev R)ecent D)elete K)ill S)ave2buf L)oad-from-buf A)save-As
;;;
;;; n, p はそれぞれ一つ前/次のバッファの選択します。r はウィンドウ切
;;; り替えする直前に表示していた画面へ復帰します(%2)。d は現在選択し
;;; ている番号のバッファを消去します。k は d と同じですが、現在見え
;;; ているファイルも同時にクローズします。l は間違えて C-x 1 してし
;;; まった時などに、バッファにセーブされているウィンドウ状態を強制的
;;; に読み直す時に使います。s は現在見ている状態を強制的に対応するバッ
;;; ファにセーブする為に使い、a はセーブするバッファ番号を別途指定す
;;; る時に使います。
;;;
;;; (%2)
;;; Emacs 19 の frame 機能でウィンドウ切替えを行う場合、直前の状態を
;;; 保存する事はできないため、r を押した場合(関数win-recent-window)
;;; windows 用に割り当てられていない frame があればそれに表示を切替
;;; えます(C-c C-w 0 と同じ)。
;;;
;;; 新規ウィンドウ作成時に、現在のバッファ内容の更新と、新ウィンド
;;; ウの状態を指示するためにウィンドウ生成メニューが出ます。これらの
;;; 意味は以下のようになっています。
;;;
;;; Create 現画面を現バッファに保存後、新規ウィンド
;;; ウを生成
;;; Duplicate 現画面を現バッファに保存後、現画面と同じ
;;; ウィンドウを生成
;;; Preserve 現バッファは更新せず、現画面を新規ウィン
;;; ドウとして登録
;;; Findfile 新規ウィンドウで find-file を行なう
;;; Buff 新規ウィンドウで switch-to-buffer を行なう
;;; M-x 新規ウィンドウでコマンド実行
;;; No 新規ウィンドウ生成を中止
;;;
;;;【リジューム】
;;;
;;; revive.el と組み合わせて使うことにより、リジューム機能が有効で
;;; す。C-c C-w C-r を押すと以下のメニューが現れます。
;;;
;;; A)save-all R)estore-all S)ave-this L)oad-this N)Load# ~)read-~
;;;
;;; ここで a を押すと現在の全てのウィンドウの情報をファイルにセーブ
;;; することができます。r を押すとファイルにセーブしたものをロードす
;;; ることができます。s,l を押すと現在選択しているウィンドウ状態をそ
;;; れぞれ セーブ/ロード します。n はファイルから数字で指定したウィ
;;; ンドウ状態をロードします。また Emacs 起動直後に r を押すところを
;;; 間違えて a を押してしまった場合などは ~ を利用してください。
;;;
;;; このメニューからセーブするよりも「C-x C」で Emacs を終了し、次
;;; 回 Emacs を起動した直後に resume-windows (または C-c C-w C-r r)
;;; を起動することで直ちに以前の状態に戻ることができるのでこちらの方
;;; が便利な使い方といえましょう。
;;;
;;;【ローカルリジューム】
;;;
;;; リジュームでは全てのウィンドウ情報をファイルにセーブしますが、
;;; そのファイルをさらに複数持ち、それぞれを切り替えて使うことができ
;;; ます。「C-c C-w C-l」をタイプし情報ファイルをセーブ/ロードするデ
;;; ィレクトリを入力した後、通常のリジュームメニューの操作を行ないま
;;; す。
;;;
;;; ところで、多くの仕事はその仕事特有のディレクトリをベースに行わ
;;; れます。この性質を利用して、一度に複数個の仕事をこなす場合などに、
;;; 関数 win-switch-task を使うと仕事の切替えをスムーズに行うことが
;;; できます。この関数を呼ぶと現在の環境を現在の情報ファイルに保存す
;;; るか確認後、次の仕事を行っているディレクトリの入力を促します。
;;;
;;;【カスタマイズ】
;;;
;;; プリフィクスキーを例えば C-c w に変更する時は .emacs に次のよ
;;; うな記述をいれます。
;;;
;;; (setq win:switch-prefix "\C-cw")
;;; (define-key global-map win:switch-prefix nil)
;;; (define-key global-map "\C-cw1" 'win-switch-to-window)
;;;
;;; ウィンドウの選択を1~9ではなくて、a~zにすることもできます。
;;;
;;; (setq win:switch-prefix "\C-cw")
;;; (define-key global-map win:switch-prefix nil)
;;; (define-key global-map "\C-cwa" 'win-switch-to-window)
;;; (setq win:base-key ?`) ;; ` は「直前の状態」
;;; (setq win:max-configs 27) ;; ` ~ z は27文字
;;; (setq win:quick-selection nil) ;; C-c英字 に割り当てない
;;;
;;; ここで ` はアスキーコードで a の一つ前にあることに注意してくださ
;;; い。C-c C-w ` は直前状態保存用バッファと、カレントウィンドウの内
;;; 容の交換に割り当てられます。
;;;
;;; windows の動作を調整する以下の変数があります。
;;;
;;; win:switch-prefix windows.el 操作用のprefixキー
;;; win:menu-key-stroke window生成menuのキー(prefixキーに続けて)
;;; win:resume-key-stroke resume menu のキー (〃)
;;; win:resume-local-key-stroke local resume menu のキー (〃)
;;; win:switch-task-key-stroke switch task menu のキー (〃)
;;; win:quick-selection C-c 数字 などでwindow選択できる
;;; win:mode-line-format window番号を示す mode-line format
;;; win:configuration-file resume file のパス名
;;; win:make-backup-files resume file のバックアップを取るか
;;; win:buffer-depth-per-win window毎にbuffer-listの上位何個を記憶するか
;;; nilの時はbuffer-list優先順位を保存しない
;;; win:inhibit-switch-in-minibuffer
;;; ミニバッファではwindow切り替えしない
;;; win:memorize-winconf-timing
;;; C-c C-w - で復帰すべきウィンドウ状態を保
;;; 存するタイミングを指定する 'save (ファイ
;;; ル保存時)または 'change (バッファ修正時)
;;;
;;; -- 以下 mule2 以降でフレームを利用する場合のみ有効 --
;;; win:no-raise-at-save 全windowのセーブ時にフレームをraiseするか
;;; win:frame-parameters-to-save-private
;;; frame parameter のうちセーブしたいパラメー
;;; タ(win:frame-parameters-to-save-default
;;; の値以外のものを設定する)
;;; win:auto-position フレーム新規作成時に
;;; nil なら手動で位置を確定
;;; 'absolute なら絶対座標を計算して配置
;;; 'relative なら現フレームとの相対位置で配置
;;; win:new-frame-offset-x 新規フレーム自動配置時のX座標のオフセット
;;; win:new-frame-offset-y 新規フレーム自動配置時のY座標のオフセット
;;; win:resumed-frame-offset-x フレームリジューム時のX座標のオフセット
;;; fvwmのデフォルトの BoundaryWidth を使う
;;; 時はこの変数の値を3にしておくと良い。
;;; win:resumed-frame-offset-y フレームリジューム時のY座標のオフセット
;;; win:mouse-position フレーム移動時のマウスカーソルの座標
;;; '(x y) というリストで指定
;;; win:frame-title-function 各フレームのタイトルを決定する関数
;;; フレーム番号が引数として渡される。
;;; この値をnilにするとタイトルはいじらない。
;;; win:title-with-buffer-name
;;; フレームタイトルにバッファ名を付加するか
;;;
;;;【バグ】
;;;
;;; ウィンドウを切替えると言うアイデアは screen コマンドに基づいて
;;; いますが、操作体系はかなり違います。
;;;
;;;【通な使い方】
;;;
;;; windows.el 2.11 以降では、frameに
;;;
;;; mule[1]:*scratch*
;;;
;;; のようなタイトルを付けます。これを利用すると、ウィンドウマネージャ
;;; から一撃で目的のframeに飛ぶことが出来るようになります。fvwm2を使っ
;;; ているときは、
;;;
;;; AddToFunc DeiconifyFocusAndWarp "I" Iconify -1
;;; + "I" FocusAndWarp $0 $1
;;;
;;; Key 1 A C Next [mule?1?:*] DeiconifyFocusAndWarp
;;; :
;;; Key 9 A C Next [mule?9?:*] DeiconifyFocusAndWarp
;;;
;;; のように ~/.fvwm2rc に書くことで、C-1 ~ C-9 を押すことで目的フ
;;; レームに飛ぶことが出来るようになります(詳しくはウィンドウマネー
;;; ジャのマニュアルを見てください)。
;;;
;;;【あとがき】
;;;
;;; 似たようなの他にもありそう。 とおもいつつ fj.editor.emacs に投
;;; 稿したところ screens.el というまさに screen コマンド互換のものが
;;; ありました。 また wicos.el という後継版が出ているようですが…(多
;;; くは語るまい)…。windows.el では、 (全)ウィンドウ状態の保存/復元
;;; が可能なので、ただちに前回の編集環境を取り戻すことができます。そ
;;; れゆえ論文にインプリメントにと忙しい時期には欠かせないユーティリ
;;; ティとなるでしょう。
;;;
;;;
;;;【謝辞】
;;;
;;; このプログラムを作るきっかけと適切なコメントを下さった、ASCII-
;;; NETのたりゃー佐々木さん、 Emacs-19 でミニバッファを分離させている
;;; 時の挙動に関するデバッグに協力下さったfujixerox.co.jpの廣瀬陽一さ
;;; ん、メニューによるウィンドウ切り替えを提案してくださった(株) 東芝
;;; の小林勉さん、XEmacs関係の動作報告などを下さった中島幹夫さん、各
;;; ウィンドウに名前をつける機能などのパッチを下さった早稲田大学の西
;;; 本さん、Mew(5以降)を win:use-frame がnilで使うときの不具合に関す
;;; る助言を下さった増田さん、Emacs22以降 -nw のときに同一バッファを
;;; 別ウィンドウに出している場合に current-window-configuration がポ
;;; イントを復帰できない問題の回避策と複数の *shell* バッファを復帰可
;;; 能とするパッチを下さった千葉大学の桜井貴文さんに感謝致します。
;;;
;;;【取り扱い】
;;;
;;; このプログラムは、フリーソフトウェアとして配布いたします。この
;;; プログラムを使用して生じたいかなる結果に対しても作者は一切の責任
;;; を負わないものといたしますが、コメントやバグレポートは大いに歓迎
;;; いたします。お気軽にご連絡下さい。連絡は以下のアドレスまでお願い
;;; いたします(2008/6現在)。
;;;
;; Code
;;;
;; ---------- Customizable variables
(defvar win:max-configs 10
"*Number of window configurations to hold")
(defvar win:base-key ?0
"*Base of window buffer name")
(if (> win:max-configs 27) (error "win:max-configs too large!"))
(defvar win:switch-prefix "\C-c\C-w"
"*Prefix key stroke to switch windows")
(defvar win:menu-key-stroke "\C-w"
"*Key assignment of win-menu")
(defvar win:resume-key-stroke "\C-r"
"*Key assignment of win-resume-menu")
(defvar win:resume-local-key-stroke "\C-l"
"*Key assignment of win-resume-local-menu")
(defvar win:switch-task-key-stroke "\C-s"
"*Key assignment of win-switch-task")
(defvar win:quick-selection t
"*Non-nil enables a short cut for window selection;
Not only with `C-c C-w 1' but also with `C-c 1'.")
(defvar win:mode-line-format "[%c%s%s]"
"*Format of mode line that shows the selected window number")
;;Variables for resume
(defvar win:configuration-file
(if (eq system-type 'ms-dos) "~/_windows" "~/.windows")
"*File to save window configurations")
(defvar win:local-config-file win:configuration-file
"*Default local configuration file")
(defvar win:make-backup-files t
"*Create a backup of window configuration file or not")
(defvar win:config-loaded nil
"Flag if some configuration file is loaded or not")
;;Variables for Emacs 19
(defvar win:no-raise-at-save nil
"*Non-nil inhibits win-save-all-configurations from raising each frame.")
;(Rev.1.4)
(defvar win:frame-parameters-to-save-default
(delq nil
(list
'top 'left 'minibuffer 'vertical-scroll-bars
(if (string< "19.27" emacs-version) 'menu-bar-lines)
(if (featurep 'mule) 'line-space)
;; These parameters below should go to
;; win:frame-parameters-to-save-private
;; 'cursor-type 'auto-lower 'auto-raise 'cursor-color 'mouse-color
;; 'background-color 'foreground-color 'font
))
"Which frame parameters to save; Do not modify this variable.")
(defvar win:frame-parameters-to-save-private nil
"*User defined list of frame parameters to save;
You don't have to include neither 'heght nor 'width in this list
because they are automatically saved in other method.")
(defvar win:auto-position 'absolute
"*Non-nil automatically positions the newly created frame;
There are two methods of auto positioning,
'absolute for this variable puts the new frame by calculating its absolute
coordinates.
'relative for this variable puts the new frame relative to currently
selected frame.")
(defvar win:new-frame-offset-x 50
"*X-Offset of new frame to currently selected frame; See win:auto-position.")
(defvar win:new-frame-offset-y 10
"*Y-Offset of new frame to currently selected frame; See win:auto-position.")
(defvar win:allocate-frame-hook nil
"*Hook running at allocating new frame")
(defvar win:resumed-frame-offset-x 0
"*X-Offset of resumed frame to compensate the window manager's border")
(defvar win:resumed-frame-offset-y 0
"*Y-Offset of resumed frame to compensate the window manager's border")
(defvar win:mouse-position '(0 -5)
"*Mouse position list (X Y) in *pixel* at window selection")
(defvar win:title-with-buffer-name t
"*T means naming frame title with buffer name")
(defvar win:wipe-also-frames nil
"*T means wipe all frames but one when wipe-windows.")
(defvar win:need-uptodate-frame-title t
"*Set this to nil to disable frequent rewriting of frame title.")
(defvar win:buffer-depth-per-win 5
"*Default depth of buffer stack per window.
If nil, do not preserve buffer-list priority")
(defvar win:names-maxl 20 "*Title length in window list")
(defvar win:inhibit-switch-in-minibuffer nil
"*Non-nil inhibits window switching in minibuffer window")
;;Variables for XEmacs
(defvar win:frame-title-function
'(lambda (index)
(format (if (featurep 'mule) "mule[%d]" "emacs[%d]") index))
"*Window title creation function.
One argument of frame number should be taken.")
;;; ---------- Internal work variables
(defvar win:configs (make-vector win:max-configs nil)
"Array of window configurations; 0th always has previous configuration.")
(defvar win:names (make-vector win:max-configs ""))
(defvar win:names-prefix (make-vector win:max-configs ""))
(defvar win:sizes (make-vector win:max-configs nil))
(defvar win:buflists (make-vector win:max-configs nil))
(let ((i 0))
(while (< i win:max-configs)
(aset win:buflists i (make-vector win:buffer-depth-per-win nil))
(setq i (1+ i))))
(defvar win:current-config 0 "Current window buffer number")
(defvar win:last-config 0 "Buffer number for a window previously seen")
(defvar win:switch-map nil "Key map for window switcher")
(defvar win:switch-menu-map nil "Keymap used in window selection menu")
;; for XEmacs
(defvar win:xemacs-p (string-match "XEmacs" emacs-version))
(defvar win:XEmacs-remake-initial-frame win:xemacs-p
"*Non-nil delets initial frame and rebuild same frame with name mule[1]")
(defun win:remake-frame ()
(if win:XEmacs-remake-initial-frame
(let ((old (selected-frame)))
(prog1
(make-frame
(cons
(cons 'name "mule[1]")
(mapcar '(lambda (s)
(cons s (frame-property old s)))
'(top left height width))))
(delete-frame old)))))
;; for Nemacs(Emacs-18)
(if (fboundp 'add-hook)
nil
(defun win:add-hook (hook funcs &optional append local)
"Append funcs to hook's value keeping its uniquness."
;;Derived from add-hook.el by Daniel LaLiberte.
(if (boundp hook)
(let ((value (symbol-value hook)))
(if (and (listp value) (not (eq (car value) 'lambda)))
(and (not (memq funcs value))
(set hook
(append value (list funcs))))
(and (not (eq funcs value))
(set hook
(list value funcs)))))
(set hook funcs)))
(fset 'add-hook 'win:add-hook))
(defun win:make-frame (index &optional prop)
"Wrapper function for make-frame;
INDEX is a window number. Optional second argument PROP is passed to
make-frame function."
(if win:frame-title-function
(setq prop
(cons (cons 'name (funcall win:frame-title-function index)) prop)))
(if win:xemacs-p
(make-frame (alist-to-plist prop))
(let ((frame (make-frame prop)) (count 100))
;;(modify-frame-parameters frame prop)
(if (string-match "^2[01]\\." emacs-version)
(progn
(while (and (> count 0) (not (frame-visible-p frame)))
(setq count (1- count))
(sit-for (string-to-number "0.1")))
;;Emacs 20 becomes not to support top/left for initial parameter.
(modify-frame-parameters frame prop)))
frame)))
;; for Emacs-19
(defvar win:use-frame
(and (string< "18" (substring emacs-version 0 2)) window-system)
"*Non-nil means switch windows with frame.")
(and (fboundp 'eval-when-compile)
(eval-when-compile (require 'revive)))
(if win:switch-map nil
(setq win:switch-map (make-sparse-keymap)
win:switch-menu-map (make-keymap))
(suppress-keymap win:switch-menu-map)
(define-key global-map win:switch-prefix nil)
(define-key global-map win:switch-prefix win:switch-map)
(let ((key win:base-key) (max (+ win:base-key win:max-configs)))
(while (< key max)
(define-key win:switch-map (char-to-string key) 'win-switch-to-window)
(setq key (1+ key))) ;`key' increasing
(if (and win:quick-selection (> (length win:switch-prefix) 1))
(let ((prefix (substring win:switch-prefix 0 1)))
(while (>= key win:base-key)
(setq key (1- key))
(define-key global-map
(concat prefix (char-to-string key))
'win-switch-to-window))
(define-key global-map (concat prefix "=") 'win-switch-menu)
(define-key global-map (concat prefix " ") 'win-toggle-window)
(define-key global-map (concat prefix "!")
'win-delete-current-window)
(define-key global-map (concat prefix "-")
'win-recover-recent-winconf)))
(setq key win:base-key)
(while (< key max)
(define-key win:switch-menu-map (char-to-string key)
'win-switch-menu-select-directly)
(setq key (1+ key))))
(define-key win:switch-map "=" 'win-switch-menu)
(define-key win:switch-map win:menu-key-stroke 'win-menu)
(define-key win:switch-map win:resume-key-stroke 'win-resume-menu)
(define-key win:switch-map win:resume-local-key-stroke 'win-resume-local)
(define-key win:switch-map win:switch-task-key-stroke 'win-switch-task)
(define-key win:switch-map " " 'win-toggle-window)
(define-key win:switch-map "\C-n" 'win-next-window)
(define-key win:switch-map "n" 'win-next-window)
(define-key win:switch-map "\C-p" 'win-prev-window)
(define-key win:switch-map "p" 'win-prev-window)
(define-key win:switch-map "-" 'win-recover-recent-winconf)
(define-key win:switch-map "!" 'win-delete-current-window)
;; Key map of window selection menu.
(define-key win:switch-menu-map "n" 'next-line)
(define-key win:switch-menu-map "p" 'previous-line)
(define-key win:switch-menu-map "\C-m" 'win-switch-menu-select)
(define-key win:switch-menu-map " " 'win-switch-menu-select)
(define-key win:switch-menu-map "f" 'win-switch-menu-select)
(define-key win:switch-menu-map "s" 'win-switch-menu-mark-job)
(define-key win:switch-menu-map "l" 'win-switch-menu-mark-job)
(define-key win:switch-menu-map "d" 'win-switch-menu-mark-job)
(define-key win:switch-menu-map "k" 'win-switch-menu-mark-job)
(define-key win:switch-menu-map "u" 'win-switch-menu-unmark-job)
(define-key win:switch-menu-map "e" 'win-switch-menu-edit-name-prefix)
(define-key win:switch-menu-map "x" 'win-switch-menu-execute-job)
(define-key win:switch-menu-map "q" 'win-switch-menu-quit)
(define-key win:switch-menu-map "?" 'describe-mode)
;;Next lines prevent accidents
(mapcar
(function
(lambda (func)
(mapcar (function (lambda (key)
(define-key win:switch-menu-map key "")))
(where-is-internal func))))
'(switch-to-buffer other-window other-frame kill-buffer save-buffer))
(define-key win:switch-menu-map win:switch-prefix "")
(define-key win:switch-menu-map (substring win:switch-prefix 0 1) "")
(run-hooks 'windows-keymap-setup-hook)
)
;; define menu-bar
(if (or (null (fboundp 'make-frame))
(or (not (boundp 'window-system)) (not window-system)))
nil ;Emacs 18 or emacs -nw
(cond
(win:xemacs-p
(defvar win:xemacs-resume-menu
'("Resume menu"
["Save all" (win-resume-menu nil ?a) t]
["Resume" (win-resume-menu nil ?r) t]
["Save this window" (win-resume-menu nil ?s) t]
["Load this window" (win-resume-menu nil ?l) t]
["Load from backup file" (win-resume-menu nil ?~) t]
["Wipe" (win-resume-menu nil ?w) t]))
(defvar win:xemacs-top-menu
'("Windows"
; :filter windows-menu-filter
["Next window frame" win-next-window t]
["Preious window frame" win-prev-window t]
["Switch task" win-switch-task t]
["local" win-resume-local t]
["--" nil nil]
["See you! (Revivable)" see-you-again t]
["Revive!" resume-windows t]))
(add-submenu nil win:xemacs-top-menu "Edit")
(add-submenu '("Windows") win:xemacs-resume-menu)
(set-menubar current-menubar)
(set-menubar-dirty-flag) )
(t ;GNU Emacs-19 or later
(defvar win:menu-bar-buffer-map (make-sparse-keymap "Windows"))
(defvar win:menu-bar-file-map (make-sparse-keymap "Windows resume menu"))
(fset 'win:update-menu-bar
(function
(lambda ()
(define-key-after (lookup-key global-map [menu-bar buffer])
[windows] (cons "Windows" win:menu-bar-buffer-map) [frames]))))
(define-key win:menu-bar-buffer-map [resume]
(cons "Resume menu" (make-sparse-keymap "Resume menu")))
(mapcar
(function
(lambda (bind)
(define-key win:menu-bar-buffer-map (vector 'resume (car bind))
(cons (nth 1 bind)
(list 'lambda nil '(interactive)
(list 'win-resume-menu nil (nth 2 bind)))))))
(nreverse
'((save-all "Save all" ?a)
(resume "Resume" ?r)
(save "Save this window" ?s)
(load "Load this window" ?l)
(back "Load from backup file" ?~)
(wipe "Wipe" ?w))))
(mapcar
(function
(lambda (bind)
(define-key win:menu-bar-buffer-map (vector (car bind)) (cdr bind))))
(nreverse
'((next "Next window frame" . win-next-window)
(prev "Previous window frame" . win-prev-window)
(delete "Delete current window frame" . win-delete-current-window)
;;(load "Load all configuration" . win-load-all-configurations)
;;(save "Save all configuration" . win-save-all-configurations)
(switch "Switch task" . win-switch-task)
;(resume "Resume menu" . win-resume-menu)
(local "Local resume" . win-resume-local)
)))
(define-key-after
(or (lookup-key global-map [menu-bar file])
(lookup-key global-map [menu-bar files]))
[see-you] (cons "See you!(revivable)" 'see-you-again)
'kill-buffer)
(define-key-after
(or (lookup-key global-map [menu-bar file])
(lookup-key global-map [menu-bar files]))
[revive] (cons "Revive!" 'resume-windows)
'see-you)
(add-hook 'menu-bar-update-hook 'win:update-menu-bar t))))
(defun win:No-of-windows ()
(let ((i 1) (num 0))
(while (< i win:max-configs)
(if (aref win:configs i) (setq num (1+ num)))
(setq i (1+ i)))
num))
(defun win:free-window-min ()
"Search a window which is not displayed currently nor previously."
(let ((i 1) num)
(catch 'free
(while (< i win:max-configs)
(if (and (aref win:configs i)
(/= i win:current-config)
(/= i win:last-config))
(throw 'free i))
(setq i (1+ i)))
(throw 'free win:last-config))))
(defun win:delete-window (n &optional killbufmsg force)
"Delete Nth entry of window configuration buffer."
(if (= n 0) (error "Can't delete window %c" win:base-key))
(if (and (<= (win:No-of-windows) 1) ;;if there's 1 window and it is
(aref win:configs n)) ;;currently selected window
(error "Can't delete sole window"))
(if (or force
(y-or-n-p (format "Erase %sconfiguration of %c{%s}?"
(if killbufmsg "buffer and " "")
(+ n win:base-key) (aref win:names n))))
(progn
(cond
(win:use-frame (delete-frame (aref win:configs n)))
;; no use-frame
((and (fboundp 'delete-frame) (null window-system)
(string< "20" emacs-version))
(save-window-excursion
(win:set-window-configuration (aref win:configs n))
(delete-frame (selected-frame)))))
(aset win:configs n nil)
(aset win:names-prefix n "")
(if (= n win:current-config)
(let ((free (win:free-window-min)))
(setq win:current-config win:last-config
win:last-config free)