-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmodes.texi
3362 lines (2988 loc) · 164 KB
/
modes.texi
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
@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998 Free Software Foundation, Inc.
@c See the file elisp.texi for copying conditions.
@setfilename ../info/modes
@node Modes, Documentation, Keymaps, Top
@c @chapter Major and Minor Modes
@chapter メジャーモードとマイナモード
@c @cindex mode
@cindex モード
@c A @dfn{mode} is a set of definitions that customize Emacs and can be
@c turned on and off while you edit. There are two varieties of modes:
@c @dfn{major modes}, which are mutually exclusive and used for editing
@c particular kinds of text, and @dfn{minor modes}, which provide features
@c that users can enable individually.
@dfn{モード}(mode)とは、Emacsをカスタマイズする定義の集まりであり、
読者は編集中にそれをオン/オフできます。
モードには2種類あります。
@dfn{メジャーモード}(major mode)は、互いに排他的で、
特定種類のテキストの編集に使います。
@dfn{マイナモード}(minor mode)は、
ユーザーがそれぞれを独立にオンにできる機能を提供します。
@c This chapter describes how to write both major and minor modes, how to
@c indicate them in the mode line, and how they run hooks supplied by the
@c user. For related topics such as keymaps and syntax tables, see
@c @ref{Keymaps}, and @ref{Syntax Tables}.
本章では、メジャーモードやマイナモードの書き方、
それらをモード行に表示する方法、
ユーザーが指定したフックをモードがどのように実行するかについて述べます。
キーマップや構文テーブルなどの関連事項については、
@ref{Keymaps}や@ref{Syntax Tables}を参照してください。
@menu
* Major Modes:: Defining major modes.
* Minor Modes:: Defining minor modes.
* Mode Line Format:: Customizing the text that appears in the mode line.
* Imenu:: How a mode can provide a menu
of definitions in the buffer.
* Font Lock Mode:: How modes can highlight text according to syntax.
* Hooks:: How to use hooks; how to write code that provides hooks.
@end menu
@node Major Modes
@c @section Major Modes
@section メジャーモード
@c @cindex major mode
@c @cindex Fundamental mode
@cindex メジャーモード
@cindex 基本(fundamental)モード
@c Major modes specialize Emacs for editing particular kinds of text.
@c Each buffer has only one major mode at a time.
メジャーモードは、特定種類のテキストの編集向けにEmacsを特化します。
各バッファには、ある時点では1つのメジャーモードしかありません。
@c The least specialized major mode is called @dfn{Fundamental mode}.
@c This mode has no mode-specific definitions or variable settings, so each
@c Emacs command behaves in its default manner, and each option is in its
@c default state. All other major modes redefine various keys and options.
@c For example, Lisp Interaction mode provides special key bindings for
@c @kbd{C-j} (@code{eval-print-last-sexp}), @key{TAB}
@c (@code{lisp-indent-line}), and other keys.
もっとも特化されていないメジャーモードは、
@dfn{基本(fundamental)モード}です。
このモードには、モードに固有な定義や変数の設定がありません。
そのため、Emacsの各コマンドはデフォルトのふるまいをし、
各オプションもデフォルトの状態です。
他のすべてのメジャーモードでは、さまざまなキーやオプションを再定義します。
たとえば、lisp対話モードでは、
@kbd{C-j}(@code{eval-print-last-sexp})や
@key{TAB}(@code{lisp-indent-line})など他のキーに対しても
特別なキーバインディングがあります。
@c When you need to write several editing commands to help you perform a
@c specialized editing task, creating a new major mode is usually a good
@c idea. In practice, writing a major mode is easy (in contrast to
@c writing a minor mode, which is often difficult).
読者の特別な編集作業を補佐するために一群の編集コマンドを書く必要がある場合、
新たなメジャーモードを作ることは一般にはよいことです。
実際、メジャーモードを書くことは
(マイナモードを書くことはしばしば難しくなるが、
それに対比すれば)簡単です。
@c If the new mode is similar to an old one, it is often unwise to modify
@c the old one to serve two purposes, since it may become harder to use and
@c maintain. Instead, copy and rename an existing major mode definition
@c and alter the copy---or define a @dfn{derived mode} (@pxref{Derived
@c Modes}). For example, Rmail Edit mode, which is in
@c @file{emacs/lisp/rmailedit.el}, is a major mode that is very similar to
@c Text mode except that it provides three additional commands. Its
@c definition is distinct from that of Text mode, but was derived from it.
新たなモードが既存のモードに類似していても、
既存のモードを2つの目的を果たすように修正するのは
賢いことではありません。
そのようにすると、使い難く保守し難くなるからです。
そのかわりに、既存のメジャーモードの定義をコピーし名前変えてから、
コピーを変更します。
あるいは、@dfn{派生モード} (derived mode)
(@pxref{Derived Modes})を定義します。
たとえば、@file{emacs/lisp/rmailedit.el}にあるrmail編集モードは、
テキスト(text)モードに非常によく似たメジャーモードですが、
追加コマンドが3つあります。
そのような定義がテキスト(text)モードとの違いになるのですが、
rmail編集モードはテキスト(text)モードから派生したものです。
@c Rmail Edit mode offers an example of changing the major mode
@c temporarily for a buffer, so it can be edited in a different way (with
@c ordinary Emacs commands rather than Rmail commands). In such cases, the
@c temporary major mode usually has a command to switch back to the
@c buffer's usual mode (Rmail mode, in this case). You might be tempted to
@c present the temporary redefinitions inside a recursive edit and restore
@c the usual ones when the user exits; but this is a bad idea because it
@c constrains the user's options when it is done in more than one buffer:
@c recursive edits must be exited most-recently-entered first. Using an
@c alternative major mode avoids this limitation. @xref{Recursive
@c Editing}.
rmail編集モードは、バッファのメジャーモードを一時的に変更して
バッファを別の方法(rmailのコマンドではなく
Emacsの普通のコマンド)で編集できるようにする例題です。
そのような場合、一時的なメジャーモードには、普通、
バッファの通常のモード(この場合にはrmailモード)に戻る
コマンドがあります。
読者は、再帰編集の中で一時的に再定義し、
ユーザーが再帰編集を抜けるともとに戻す方法に魅了されるかもしれません。
しかし、これを複数のバッファで行うと、
再帰編集はもっとも最近に入った再帰からまず抜けるので、
ユーザーの選択に制約を課すことになり悪い方法です。
別のメジャーモードを使えばこのような制約を回避できます。
@xref{Recursive Editing}。
@c The standard GNU Emacs Lisp library directory contains the code for
@c several major modes, in files such as @file{text-mode.el},
@c @file{texinfo.el}, @file{lisp-mode.el}, @file{c-mode.el}, and
@c @file{rmail.el}. You can study these libraries to see how modes are
@c written. Text mode is perhaps the simplest major mode aside from
@c Fundamental mode. Rmail mode is a complicated and specialized mode.
標準のGNU Emacs Lispのライブラリのディレクトリには、
@file{text-mode.el}、@file{texinfo.el}、@file{lisp-mode.el}、
@file{c-mode.el}、@file{rmail.el}などのファイルに
いくつかのメジャーモードのコードが収めてあります。
モードの書き方を理解するためにこれらのライブラリを調べられます。
テキスト(text)モードは、基本(fundamental)モードについで、
もっとも単純なメジャーモードです。
rmailモードは複雑な特化されたモードです。
@menu
* Major Mode Conventions:: Coding conventions for keymaps, etc.
* Example Major Modes:: Text mode and Lisp modes.
* Auto Major Mode:: How Emacs chooses the major mode automatically.
* Mode Help:: Finding out how to use a mode.
* Derived Modes:: Defining a new major mode based on another major
mode.
@end menu
@node Major Mode Conventions
@c @subsection Major Mode Conventions
@subsection メジャーモードの慣習
@c The code for existing major modes follows various coding conventions,
@c including conventions for local keymap and syntax table initialization,
@c global names, and hooks. Please follow these conventions when you
@c define a new major mode:
既存のメジャーモードのコードでは、
ローカルキーマップや構文テーブルの初期化、グローバルな名前、フックなどの
さまざまなコーディング上の慣習を踏襲しています。
読者が新たなメジャーモードを定義するときには、
これらの慣習に従ってください。
@itemize @bullet
@item
@c Define a command whose name ends in @samp{-mode}, with no arguments,
@c that switches to the new mode in the current buffer. This command
@c should set up the keymap, syntax table, and buffer-local variables in an
@c existing buffer, without changing the buffer's contents.
カレントバッファにおいて新しいモードに切り替える
引数なしのコマンドを定義し、その名前は@samp{-mode}で終ること。
このコマンドが、キーマップ、構文テーブル、
既存バッファにバッファローカルな変数を設定するが、
バッファの内容は変更しないこと。
@item
@c Write a documentation string for this command that describes the
@c special commands available in this mode. @kbd{C-h m}
@c (@code{describe-mode}) in your mode will display this string.
このモードで使える特別なコマンドに関して記述した
このコマンドに対する説明文字列を書く。
読者のモードで@kbd{C-h m}(@code{describe-mode})を使うと、
この説明文字列を表示する。
@c The documentation string may include the special documentation
@c substrings, @samp{\[@var{command}]}, @samp{\@{@var{keymap}@}}, and
@c @samp{\<@var{keymap}>}, that enable the documentation to adapt
@c automatically to the user's own key bindings. @xref{Keys in
@c Documentation}.
説明文字列では、@samp{\[@var{command}]}、@samp{\@{@var{keymap}@}}、
@samp{\<@var{keymap}>}の特別な書き方を使え、
これらはユーザー独自のキーバインディングに自動的に置き換えられる。
@pxref{Keys in Documentation}。
@item
@c The major mode command should start by calling
@c @code{kill-all-local-variables}. This is what gets rid of the
@c buffer-local variables of the major mode previously in effect.
メジャーモードコマンドは、
@code{kill-all-local-variables}の呼び出しから始めること。
それ以前に有効であったメジャーモードのバッファローカルな変数に
対処するためである。
@item
@c The major mode command should set the variable @code{major-mode} to the
@c major mode command symbol. This is how @code{describe-mode} discovers
@c which documentation to print.
メジャーモードコマンドは、
変数@code{major-mode}にメジャーモードコマンドのシンボルを設定すること。
これにより、@code{describe-mode}が表示すべき説明文を捜し出す。
@item
@c The major mode command should set the variable @code{mode-name} to the
@c ``pretty'' name of the mode, as a string. This string appears in the
@c mode line.
メジャーモードコマンドは、
変数@code{mode-name}にモードの『愛称』を文字列として設定すること。
この文字列がモード行に現れる。
@item
@c @cindex functions in modes
@cindex モードの関数群
@cindex 関数群、モード
@c Since all global names are in the same name space, all the global
@c variables, constants, and functions that are part of the mode should
@c have names that start with the major mode name (or with an abbreviation
@c of it if the name is long). @xref{Coding Conventions}.
すべてのグローバルな名前は同一の名前空間にあるので、
モードの構成要素であるすべてのグローバル変数、定数、関数は、
メジャーモード名(名前が長ければ、その省略)で始まること。
@pxref{Coding Conventions}。
@item
@c @cindex keymaps in modes
@cindex モードのキーマップ
@cindex キーマップ、モード
@c The major mode should usually have its own keymap, which is used as the
@c local keymap in all buffers in that mode. The major mode command should
@c call @code{use-local-map} to install this local map. @xref{Active
@c Keymaps}, for more information.
メジャーモードには、通常、それ独自のキーマップがあるはずで、
当該モードのすべてのバッファでローカルキーマップとして使われる。
メジャーモードコマンドは、@code{use-local-map}を呼び出して、
そのローカルキーマップを設定すること。
詳しくは、@pxref{Active Keymaps}。
@c This keymap should be stored permanently in a global variable named
@c @code{@var{modename}-mode-map}. Normally the library that defines the
@c mode sets this variable.
このキーマップは、@code{@var{modename}-mode-map}という名前の
グローバル変数に恒久的に保持すること。
通常、モードを定義するライブラリでこの変数に設定する。
@c @xref{Tips for Defining}, for advice about how to write the code to set
@c up the mode's keymap variable.
モードのキーマップ変数に設定するコードの書き方に関する助言については
@pxref{Tips for Defining}。
@item
@c The key sequences bound in a major mode keymap should usually start with
@c @kbd{C-c}, followed by a control character, a digit, or @kbd{@{},
@c @kbd{@}}, @kbd{<}, @kbd{>}, @kbd{:} or @kbd{;}. The other punctuation
@c characters are reserved for minor modes, and ordinary letters are
@c reserved for users.
メジャーモードのキーマップでバインドされたキー列は、
通常、@kbd{C-c}で始まり、コントロール文字、数字文字、@kbd{@{}、
@kbd{@}}、@kbd{<}、@kbd{>}、@kbd{:}、@kbd{;}のいずれかが続くようにする。
その他の句読点文字はマイナモード向けに予約されている。
また、通常の英文字はユーザー向けに予約されている。
@c It is reasonable for a major mode to rebind a key sequence with a
@c standard meaning, if it implements a command that does ``the same job''
@c in a way that fits the major mode better. For example, a major mode for
@c editing a programming language might redefine @kbd{C-M-a} to ``move to
@c the beginning of a function'' in a way that works better for that
@c language.
メジャーモードにおいては、そのモードによく適合した形で
『同じ仕事』を行うコマンドであるならば、
標準的な意味を持つキー列に当該コマンドを再バインドしても合理的である。
たとえば、プログラム言語編集用のメジャーモードでは、
@kbd{C-M-a}を当該言語にうまく適合した方法で
『関数の先頭へ移動する』コマンドに再定義する。
@c Major modes such as Dired or Rmail that do not allow self-insertion of
@c text can reasonably redefine letters and other printing characters as
@c editing commands. Dired and Rmail both do this.
テキスト挿入を許さないdiredやrmailなどのメジャーモードでは、
英文字や他の印字文字を編集コマンドとして再定義するのも合理的である。
diredもrmailもこうしている。
@item
@c @cindex syntax tables in modes
@cindex モードの構文テーブル
@cindex 構文テーブル、モード
@c The mode may have its own syntax table or may share one with other
@c related modes. If it has its own syntax table, it should store this in
@c a variable named @code{@var{modename}-mode-syntax-table}. @xref{Syntax
@c Tables}.
モードでは、独自の構文テーブルを用意するか、
他の関連するモードと構文テーブルを共有する。
独自の構文テーブルを用意する場合には、
@code{@var{modename}-mode-syntax-table}という名前の変数に保持すること。
@pxref{Syntax Tables}。
@item
@c If the mode handles a language that has a syntax for comments, it should
@c set the variables that define the comment syntax. @xref{Options for
@c Comments,, Options Controlling Comments, emacs, The GNU Emacs Manual}.
コメントを書ける言語を扱うモードでは、
コメントの構文を定義する変数に設定すること。
@pxref{Options for Comments,, コメントを制御するオプション, emacs,
GNU Emacs マニュアル}。
@item
@c @cindex abbrev tables in modes
@cindex モードの略語表
@cindex 略語表、モード
@c The mode may have its own abbrev table or may share one with other
@c related modes. If it has its own abbrev table, it should store this in
@c a variable named @code{@var{modename}-mode-abbrev-table}. @xref{Abbrev
@c Tables}.
モードでは、独自の略語表を用意するか、
他の関連するモードと略語表を共有する。
独自の略語表を用意する場合には、
@code{@var{modename}-mode-abbrev-table}という名前の変数に保持すること。
@pxref{Abbrev Tables}。
@item
@c The mode should specify how to do highlighting for Font Lock mode, by
@c setting up a buffer-local value for the variable
@c @code{font-lock-defaults} (@pxref{Font Lock Mode}).
モードでは、
バッファローカルな変数@code{font-lock-defaults}
(@pxref{Font Lock Mode})に設定して、
フォントロック(font-lock)モードに対して強調表示の方法を指定すること。
@item
@c The mode should specify how Imenu should find the definitions or
@c sections of a buffer, by setting up a buffer-local value for the
@c variable @code{imenu-generic-expression} or
@c @code{imenu-create-index-function} (@pxref{Imenu}).
モードでは、
バッファローカルな変数@code{imenu-generic-expression}か
@code{imenu-create-index-function}(@pxref{Imenu})に設定して、
iメニューがどのようにバッファ内の定義や節を探すべきかを指定すること。
@item
@c Use @code{defvar} or @code{defcustom} to set mode-related variables, so
@c that they are not reinitialized if they already have a value. (Such
@c reinitialization could discard customizations made by the user.)
モードに関連する変数の設定には@code{defvar}か@code{defcustom}を使い、
それらに値が設定されている場合には再初期化しないようにする。
(再初期化するとユーザーのカスタマイズを廃棄してしまう。)
@item
@c @cindex buffer-local variables in modes
@cindex モードのバッファローカルな変数
@cindex バッファローカルな変数、モード
@c To make a buffer-local binding for an Emacs customization variable, use
@c @code{make-local-variable} in the major mode command, not
@c @code{make-variable-buffer-local}. The latter function would make the
@c variable local to every buffer in which it is subsequently set, which
@c would affect buffers that do not use this mode. It is undesirable for a
@c mode to have such global effects. @xref{Buffer-Local Variables}.
Emacsのカスタマイズ変数に対するバッファローカルな束縛は、
メジャーモードコマンドにおいて
@code{make-variable-buffer-local}ではなく
@code{make-local-variable}で行う。
前者の関数は、すべてのバッファにおいてそれ以降に設定される当該変数を
バッファローカルにしてしまい、
このモードを使わないバッファにも影響する。
モードにそのような大局的な効果があるのは望ましくない。
@pxref{Buffer-Local Variables}。
@c It's OK to use @code{make-variable-buffer-local}, if you wish, for a
@c variable used only within a single Lisp package.
単一のLispパッケージ内のみにおいて使われる変数に対しては、
必要ならば、@code{make-variable-buffer-local}を使ってもよい。
@item
@c @cindex mode hook
@c @cindex major mode hook
@cindex モードフック
@cindex メジャーモードフック
@c Each major mode should have a @dfn{mode hook} named
@c @code{@var{modename}-mode-hook}. The major mode command should run that
@c hook, with @code{run-hooks}, as the very last thing it
@c does. @xref{Hooks}.
各メジャーモードには、
@code{@var{modename}-mode-hook}という名前の
@dfn{モードフック}(mode hook)があること。
モードコマンドは、最後に@code{run-hooks}を用いてフックを実行すること。
@pxref{Hooks}。
@item
@c The major mode command may also run the hooks of some more basic modes.
@c For example, @code{indented-text-mode} runs @code{text-mode-hook} as
@c well as @code{indented-text-mode-hook}. It may run these other hooks
@c immediately before the mode's own hook (that is, after everything else),
@c or it may run them earlier.
メジャーモードコマンドは、より基本的なモードのフックを実行してもよい。
たとえば、@code{indented-text-mode}は、
@code{indented-text-mode-hook}に加えて@code{text-mode-hook}も実行する。
自前のフックを実行する直前(つまり設定が終ったあと)
にこれらの他のフックを実行するか、より初期の段階で実行してもよい。
@item
@c If something special should be done if the user switches a buffer from
@c this mode to any other major mode, this mode can set up a buffer-local
@c value for @code{change-major-mode-hook} (@pxref{Creating Buffer-Local}).
ユーザーがバッファをこのモードから別のメジャーモードに切り替えたときに
特別なことを行う必要がある場合、
このモードでは、@code{change-major-mode-hook}(@pxref{Creating Buffer-Local})
のバッファローカルな値を設定しておく。
@item
@c If this mode is appropriate only for specially-prepared text, then the
@c major mode command symbol should have a property named @code{mode-class}
@c with value @code{special}, put on as follows:
このモードが特別に準備したテキストに対してのみ有効な場合には、
メジャーモードコマンドのシンボルには、
つぎのように属性@code{mode-class}に値@code{special}を設定しておくこと。
@c @cindex @code{mode-class} property
@cindex @code{mode-class}属性
@cindex 属性@code{mode-class}
@cindex @code{special}
@example
(put 'funny-mode 'mode-class 'special)
@end example
@noindent
@c This tells Emacs that new buffers created while the current buffer has
@c Funny mode should not inherit Funny mode. Modes such as Dired, Rmail,
@c and Buffer List use this feature.
これは、カレントバッファがfunnyモードのときに新たなバッファを
作成しても、新しいバッファではfunnyモードを継承しないようにEmacsに指示する。
dired、rmail、バッファ一覧などのモードではこの機能を使っている。
@item
@c If you want to make the new mode the default for files with certain
@c recognizable names, add an element to @code{auto-mode-alist} to select
@c the mode for those file names. If you define the mode command to
@c autoload, you should add this element in the same file that calls
@c @code{autoload}. Otherwise, it is sufficient to add the element in the
@c file that contains the mode definition. @xref{Auto Major Mode}.
新しいモードを識別可能な特定の名前のファイルに対するデフォルトにしたい
場合には、そのような名前のファイルに対して当該モードを選択するための
要素を@code{auto-mode-alist}に追加する。
モードコマンドを自動ロードと定義する場合、
@code{autoload}を呼び出している同じファイルに
そのような要素を追加しておくこと。
そうでなければ、モード定義を収めたファイルに当該要素を入れるだけで十分である。
@pxref{Auto Major Mode}。
@item
@c @cindex @file{.emacs} customization
@cindex @file{.emacs}のカスタマイズ
@cindex カスタマイズ、@file{.emacs}
@c In the documentation, you should provide a sample @code{autoload} form
@c and an example of how to add to @code{auto-mode-alist}, that users can
@c include in their @file{.emacs} files.
説明文には、ユーザーが個人のファイル@file{.emacs}に書けるように、
@code{autoload}の例、
@code{auto-mode-alist}への追加方法の例を記載すること。
@item
@c @cindex mode loading
@cindex モードのロード
@cindex ロード、モード
@c The top-level forms in the file defining the mode should be written so
@c that they may be evaluated more than once without adverse consequences.
@c Even if you never load the file more than once, someone else will.
モードを定義するファイルのトップレベルのフォームは、
それらを複数回評価しても不利な結果にならないように書いておくこと。
読者が当該ファイルを複数回ロードしなくても、誰かがやるかもしれない。
@end itemize
@node Example Major Modes
@c @subsection Major Mode Examples
@subsection メジャーモードの例
@c Text mode is perhaps the simplest mode besides Fundamental mode.
@c Here are excerpts from @file{text-mode.el} that illustrate many of
@c the conventions listed above:
基本(fundamental)モードを除くと、
テキスト(text)モードはもっとも単純なモードです。
上に述べた慣習の例示として、@file{text-mode.el}の抜粋をあげておきます。
@smallexample
@group
@c ;; @r{Create mode-specific tables.}
;; @r{モード固有の構文テーブルを作る}
(defvar text-mode-syntax-table nil
"Syntax table used while in text mode.")
@end group
@group
(if text-mode-syntax-table
@c () ; @r{Do not change the table if it is already set up.}
() ; @r{構文テーブルが既存ならば変更しない}
(setq text-mode-syntax-table (make-syntax-table))
(modify-syntax-entry ?\" ". " text-mode-syntax-table)
(modify-syntax-entry ?\\ ". " text-mode-syntax-table)
(modify-syntax-entry ?' "w " text-mode-syntax-table))
@end group
@group
(defvar text-mode-abbrev-table nil
"Abbrev table used while in text mode.")
(define-abbrev-table 'text-mode-abbrev-table ())
@end group
@group
@c (defvar text-mode-map nil) ; @r{Create a mode-specific keymap.}
(defvar text-mode-map nil) ; @r{モード固有のキーマップを作る}
(if text-mode-map
@c () ; @r{Do not change the keymap if it is already set up.}
() ; @r{キーマップが既存ならば変更しない}
(setq text-mode-map (make-sparse-keymap))
(define-key text-mode-map "\t" 'indent-relative)
(define-key text-mode-map "\es" 'center-line)
(define-key text-mode-map "\eS" 'center-paragraph))
@end group
@end smallexample
@c Here is the complete major mode function definition for Text mode:
つぎは、テキスト(text)モードのメジャーモード関数の完全な定義です。
@smallexample
@group
(defun text-mode ()
"Major mode for editing text intended for humans to read@enddots{}
Special commands: \\@{text-mode-map@}
@end group
@group
Turning on text-mode runs the hook `text-mode-hook'."
(interactive)
(kill-all-local-variables)
(use-local-map text-mode-map)
@end group
@group
(setq local-abbrev-table text-mode-abbrev-table)
(set-syntax-table text-mode-syntax-table)
@end group
@group
(make-local-variable 'paragraph-start)
(setq paragraph-start (concat "[ \t]*$\\|" page-delimiter))
(make-local-variable 'paragraph-separate)
(setq paragraph-separate paragraph-start)
@end group
@group
(setq mode-name "Text")
(setq major-mode 'text-mode)
@c (run-hooks 'text-mode-hook)) ; @r{Finally, this permits the user to}
@c ; @r{customize the mode with a hook.}
(run-hooks 'text-mode-hook)) ; @r{最後に、フックによるモードの}
; @r{カスタマイズをユーザーに許す}
@end group
@end smallexample
@cindex @file{lisp-mode.el}
@c The three Lisp modes (Lisp mode, Emacs Lisp mode, and Lisp
@c Interaction mode) have more features than Text mode and the code is
@c correspondingly more complicated. Here are excerpts from
@c @file{lisp-mode.el} that illustrate how these modes are written.
3つのlispモード(lispモード、emacs-lispモード、lisp対話モード)には、
テキスト(text)モードより多くの機能があり、
それに応じてコードもより複雑です。
これらのモードの書き方を例示する
@file{lisp-mode.el}からの抜粋をあげておきます。
@c @cindex syntax table example
@cindex 構文テーブルの例
@cindex 例、構文テーブル
@smallexample
@group
@c ;; @r{Create mode-specific table variables.}
;; @r{モード固有の構文テーブルを作成する}
(defvar lisp-mode-syntax-table nil "")
(defvar emacs-lisp-mode-syntax-table nil "")
(defvar lisp-mode-abbrev-table nil "")
@end group
@group
@c (if (not emacs-lisp-mode-syntax-table) ; @r{Do not change the table}
@c ; @r{if it is already set.}
(if (not emacs-lisp-mode-syntax-table) ; @r{構文テーブルが既存ならば}
; @r{変更しない}
(let ((i 0))
(setq emacs-lisp-mode-syntax-table (make-syntax-table))
@end group
@group
@c ;; @r{Set syntax of chars up to 0 to class of chars that are}
@c ;; @r{part of symbol names but not words.}
@c ;; @r{(The number 0 is @code{48} in the @sc{ASCII} character set.)}
;; @r{0までの文字に、単語構成文字ではないが}
;; @r{シンボル名構成文字であるクラスを設定する}
;; @r{(文字0は、@sc{ASCII}文字集合では@code{48})}
(while (< i ?0)
(modify-syntax-entry i "_ " emacs-lisp-mode-syntax-table)
(setq i (1+ i)))
@dots{}
@end group
@group
@c ;; @r{Set the syntax for other characters.}
;; @r{他の文字の構文を設定する}
(modify-syntax-entry ? " " emacs-lisp-mode-syntax-table)
(modify-syntax-entry ?\t " " emacs-lisp-mode-syntax-table)
@dots{}
@end group
@group
(modify-syntax-entry ?\( "() " emacs-lisp-mode-syntax-table)
(modify-syntax-entry ?\) ")( " emacs-lisp-mode-syntax-table)
@dots{}))
@c ;; @r{Create an abbrev table for lisp-mode.}
;; @r{lispモード向けの略語表を作る}
(define-abbrev-table 'lisp-mode-abbrev-table ())
@end group
@end smallexample
@c Much code is shared among the three Lisp modes. The following
@c function sets various variables; it is called by each of the major Lisp
@c mode functions:
3つのlispモードは多くのコードを共有しています。
つぎの関数はさまざまな変数に設定します。
lispモードの各メジャーモード関数が呼び出します。
@smallexample
@group
(defun lisp-mode-variables (lisp-syntax)
(cond (lisp-syntax
(set-syntax-table lisp-mode-syntax-table)))
(setq local-abbrev-table lisp-mode-abbrev-table)
@dots{}
@end group
@end smallexample
@c Functions such as @code{forward-paragraph} use the value of the
@c @code{paragraph-start} variable. Since Lisp code is different from
@c ordinary text, the @code{paragraph-start} variable needs to be set
@c specially to handle Lisp. Also, comments are indented in a special
@c fashion in Lisp and the Lisp modes need their own mode-specific
@c @code{comment-indent-function}. The code to set these variables is the
@c rest of @code{lisp-mode-variables}.
@code{forward-paragraph}などの関数は、
変数@code{paragraph-start}の値を使います。
Lispのコードは普通のテキストとは異なるので、
Lispを扱えるように変数@code{paragraph-start}を特別に設定する必要があります。
また、Lispではコメントの字下げは特殊な形なので、
各lispモードには独自のモード固有の@code{comment-indent-function}が必要です。
これらの変数に設定するコードが、
@code{lisp-mode-variables}の残りの部分です。
@smallexample
@group
(make-local-variable 'paragraph-start)
(setq paragraph-start (concat page-delimiter "\\|$" ))
(make-local-variable 'paragraph-separate)
(setq paragraph-separate paragraph-start)
@dots{}
@end group
@group
(make-local-variable 'comment-indent-function)
(setq comment-indent-function 'lisp-comment-indent))
@end group
@end smallexample
@c Each of the different Lisp modes has a slightly different keymap. For
@c example, Lisp mode binds @kbd{C-c C-z} to @code{run-lisp}, but the other
@c Lisp modes do not. However, all Lisp modes have some commands in
@c common. The following code sets up the common commands:
各lispモードでは、キーマップが多少異なります。
たとえば、lispモードでは@kbd{C-c C-z}を@code{run-lisp}にバインドしますが、
他のlispモードではそうしません。
つぎのコードは、共通するコマンドを設定します。
@smallexample
@group
(defvar shared-lisp-mode-map ()
"Keymap for commands shared by all sorts of Lisp modes.")
(if shared-lisp-mode-map
()
(setq shared-lisp-mode-map (make-sparse-keymap))
(define-key shared-lisp-mode-map "\e\C-q" 'indent-sexp)
(define-key shared-lisp-mode-map "\177"
'backward-delete-char-untabify))
@end group
@end smallexample
@noindent
@c And here is the code to set up the keymap for Lisp mode:
つぎはlispモード向けのキーマップを設定するコードです。
@smallexample
@group
(defvar lisp-mode-map ()
"Keymap for ordinary Lisp mode@enddots{}")
(if lisp-mode-map
()
(setq lisp-mode-map (make-sparse-keymap))
(set-keymap-parent lisp-mode-map shared-lisp-mode-map)
(define-key lisp-mode-map "\e\C-x" 'lisp-eval-defun)
(define-key lisp-mode-map "\C-c\C-z" 'run-lisp))
@end group
@end smallexample
@c Finally, here is the complete major mode function definition for
@c Emacs Lisp mode.
最後に、emacs-lispモードのメジャーモード関数の完全な定義を示します。
@smallexample
@group
(defun lisp-mode ()
"Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp.
Commands:
Delete converts tabs to spaces as it moves back.
Blank lines separate paragraphs. Semicolons start comments.
\\@{lisp-mode-map@}
Note that `run-lisp' may be used either to start an inferior Lisp job
or to switch back to an existing one.
@end group
@group
Entry to this mode calls the value of `lisp-mode-hook'
if that value is non-nil."
(interactive)
(kill-all-local-variables)
@end group
@group
@c (use-local-map lisp-mode-map) ; @r{Select the mode's keymap.}
@c (setq major-mode 'lisp-mode) ; @r{This is how @code{describe-mode}}
@c ; @r{finds out what to describe.}
@c (setq mode-name "Lisp") ; @r{This goes into the mode line.}
@c (lisp-mode-variables t) ; @r{This defines various variables.}
(use-local-map lisp-mode-map) ; @r{モードのキーマップを選択する}
(setq major-mode 'lisp-mode) ; @r{これにより@code{describe-mode}は}
; @r{説明文を探し出せる}
(setq mode-name "Lisp") ; @r{モード行に表示される}
(lisp-mode-variables t) ; @r{さまざまな変数を定義する}
@end group
@group
(setq imenu-case-fold-search t)
(set-syntax-table lisp-mode-syntax-table)
@c (run-hooks 'lisp-mode-hook)) ; @r{This permits the user to use a}
@c ; @r{hook to customize the mode.}
(run-hooks 'lisp-mode-hook)) ; @r{フックによるモードの}
; @r{カスタマイズをユーザーに許す}
@end group
@end smallexample
@node Auto Major Mode
@c @subsection How Emacs Chooses a Major Mode
@subsection メジャーモードの選択方法
@c Based on information in the file name or in the file itself, Emacs
@c automatically selects a major mode for the new buffer when a file is
@c visited. It also processes local variables specified in the file text.
Emacsは、ファイル名やファイル自体の情報をもとに、
当該ファイルを訪問するときの新しいバッファに対する
メジャーモードを自動的に選択します。
また、ファイル内のテキストで指定されたローカル変数も処理します。
@c @deffn Command fundamental-mode
@deffn コマンド fundamental-mode
@c Fundamental mode is a major mode that is not specialized for anything
@c in particular. Other major modes are defined in effect by comparison
@c with this one---their definitions say what to change, starting from
@c Fundamental mode. The @code{fundamental-mode} function does @emph{not}
@c run any hooks; you're not supposed to customize it. (If you want Emacs
@c to behave differently in Fundamental mode, change the @emph{global}
@c state of Emacs.)
基本(fundamental)モードは、特化してないメジャーモードである。
他のメジャーモードは、実質的には、このモードとの対比で定義されている。
つまり、基本(fundamental)モードから始めて、
それらのメジャーモードではなにを変更するかを定義している。
関数@code{fundamental-mode}はフックを実行@emph{しない}ため、
読者はカスタマイズできない。
(Emacsの基本(fundamental)モードのふるまいを変えたければ、
Emacsの@emph{大局的な}状態を変える必要がある。)
@end deffn
@c @deffn Command normal-mode &optional find-file
@deffn コマンド normal-mode &optional find-file
@c This function establishes the proper major mode and buffer-local variable
@c bindings for the current buffer. First it calls @code{set-auto-mode},
@c then it runs @code{hack-local-variables} to parse, and bind or
@c evaluate as appropriate, the file's local variables.
この関数は、カレントバッファに対して
適切なメジャーモードとバッファローカルな変数を確立する。
この関数はまず@code{set-auto-mode}を呼び出し、
続いて、ファイルのローカル変数を必要に応じて解析、束縛、評価するために
@code{hack-local-variables}を実行する。
@c If the @var{find-file} argument to @code{normal-mode} is non-@code{nil},
@c @code{normal-mode} assumes that the @code{find-file} function is calling
@c it. In this case, it may process a local variables list at the end of
@c the file and in the @samp{-*-} line. The variable
@c @code{enable-local-variables} controls whether to do so. @xref{File
@c variables, , Local Variables in Files, emacs, The GNU Emacs Manual}, for
@c the syntax of the local variables section of a file.
@code{normal-mode}に対する引数@var{find-file}が@code{nil}以外であると、
@code{normal-mode}は@code{find-file}から呼び出されたと仮定する。
その場合、ファイルの末尾や@samp{-*-}の形式の行にある
ローカル変数リストを処理することもある。
変数@code{enable-local-variables}は、この処理を行うかどうかを制御する。
ファイル内でのローカル変数リストの構文については、
@xref{File Variables,, ファイルにローカルな変数, emacs, GNU Emacs マニュアル}。
@c If you run @code{normal-mode} interactively, the argument
@c @var{find-file} is normally @code{nil}. In this case,
@c @code{normal-mode} unconditionally processes any local variables list.
読者が対話的に@code{normal-mode}を実行すると
引数@var{find-file}は通常@code{nil}である。
その場合、@code{normal-mode}は、ローカル変数リストを無条件に処理する。
@c @cindex file mode specification error
@cindex ファイルモード指定のエラー
@c @code{normal-mode} uses @code{condition-case} around the call to the
@c major mode function, so errors are caught and reported as a @samp{File
@c mode specification error}, followed by the original error message.
@code{normal-mode}は、メジャーモード関数を呼び出す周りでは
@code{condition-case}を使うので、エラーを補足して
@samp{File mode specification error}にもとのエラーメッセージを続けて
エラーを報告する。
@end deffn
@defopt enable-local-variables
@c This variable controls processing of local variables lists in files
@c being visited. A value of @code{t} means process the local variables
@c lists unconditionally; @code{nil} means ignore them; anything else means
@c ask the user what to do for each file. The default value is @code{t}.
この変数は、訪問したファイル内のローカル変数リストを処理するかどうかを
制御する。
値@code{t}は、ローカル変数リストを無条件に処理することを意味する。
@code{nil}は、それらを無視することを意味する。
それ以外の値であると、各ファイルごとにユーザーに問い合わせる。
デフォルト値は@code{t}である。
@end defopt
@defvar ignored-local-variables
@c This variable holds a list of variables that should not be
@c set by a file's local variables list. Any value specified
@c for one of these variables is ignored.
この変数は、ファイルのローカル変数リストで設定してはならない
変数のリストを保持する。
それらの変数に対して指定した値は無視される。
@end defvar
@c In addition to this list, any variable whose name has a non-@code{nil}
@c @code{risky-local-variable} property is also ignored.
このリストに加えて、
属性@code{risky-local-variable}が@code{nil}以外の値である変数も無視されます。
@defopt enable-local-eval
@c This variable controls processing of @samp{Eval:} in local variables
@c lists in files being visited. A value of @code{t} means process them
@c unconditionally; @code{nil} means ignore them; anything else means ask
@c the user what to do for each file. The default value is @code{maybe}.
この変数は、訪問したファイル内のローカル変数リストの@samp{Eval:}を
処理するかどうかを制御する。
値@code{t}は、それらを無条件に処理することを意味する。
@code{nil}は、それらを無視することを意味する。
それ以外の値であると、各ファイルごとにユーザーに問い合わせる。
デフォルト値は@code{maybe}である。
@end defopt
@defun set-auto-mode
@c @cindex visited file mode
@cindex 訪問したファイルのモード
@cindex モード、訪問したファイル
@c This function selects the major mode that is appropriate for the
@c current buffer. It may base its decision on the value of the @w{@samp{-*-}}
@c line, on the visited file name (using @code{auto-mode-alist}), on the
@c @w{@samp{#!}} line (using @code{interpreter-mode-alist}), or on the
@c file's local variables list. However, this function does not look for
@c the @samp{mode:} local variable near the end of a file; the
@c @code{hack-local-variables} function does that. @xref{Choosing Modes, ,
@c How Major Modes are Chosen, emacs, The GNU Emacs Manual}.
この関数は、カレントバッファに対して適切なメジャーモードを選択する。
@w{@samp{-*-}}行の値、
(@code{auto-mode-alist}を使って)訪問したファイルの名前、
(@code{interpreter-mode-alist}を使って)@w{@samp{#!}}行、
ファイルのローカル変数リストをもとに決定する。
しかし、この関数はファイルの末尾付近にある
ローカル変数@samp{mode:}は調べないが、
関数@code{hack-local-variables}は調べる。
@xref{Choosing Modes,, メジャーモードの選択方式, emacs,
GNU Emacs マニュアル}。
@end defun
@defopt default-major-mode
@c This variable holds the default major mode for new buffers. The
@c standard value is @code{fundamental-mode}.
この変数は、新たなバッファに対するデフォルトのメジャーモードを保持する。
標準値は@code{fundamental-mode}である。
@c If the value of @code{default-major-mode} is @code{nil}, Emacs uses
@c the (previously) current buffer's major mode for the major mode of a new
@c buffer. However, if that major mode symbol has a @code{mode-class}
@c property with value @code{special}, then it is not used for new buffers;
@c Fundamental mode is used instead. The modes that have this property are
@c those such as Dired and Rmail that are useful only with text that has
@c been specially prepared.
@code{default-major-mode}の値が@code{nil}であると、
Emacsは(以前の)カレントバッファのメジャーモードを
新たなバッファのメジャーモードとする。
しかし、メジャーモードコマンドのシンボルの属性@code{mode-class}の
値が@code{special}であると、新たなバッファのメジャーモードにはせず、
かわりに基本(fundamental)モードを使う。
この属性を持つモードは、
特別に準備したテキストに対してのみ有用であるdiredやrmailなどである。
@end defopt
@defun set-buffer-major-mode buffer
@c This function sets the major mode of @var{buffer} to the value of
@c @code{default-major-mode}. If that variable is @code{nil}, it uses
@c the current buffer's major mode (if that is suitable).
この関数はバッファ@var{buffer}のメジャーモードを
@code{default-major-mode}の値とする。
この変数が@code{nil}であると、
(適切ならば)カレントバッファのメジャーモードを使う。
@c The low-level primitives for creating buffers do not use this function,
@c but medium-level commands such as @code{switch-to-buffer} and
@c @code{find-file-noselect} use it whenever they create buffers.
バッファを作成する低レベルの基本関数ではこの関数を使わないが、
@code{switch-to-buffer}や@code{find-file-noselect}などの
中レベルのコマンドではバッファを作成するときにこのコマンドを使う。
@end defun
@defvar initial-major-mode
@cindex @samp{*scratch*}
@c The value of this variable determines the major mode of the initial
@c @samp{*scratch*} buffer. The value should be a symbol that is a major
@c mode command. The default value is @code{lisp-interaction-mode}.
この変数の値は、最初のバッファ@samp{*scratch*}のメジャーモードを決定する。
値は、メジャーモードコマンドのシンボルであること。
デフォルト値は、@code{lisp-interaction-mode}である。
@end defvar
@defvar auto-mode-alist
@c This variable contains an association list of file name patterns
@c (regular expressions; @pxref{Regular Expressions}) and corresponding
@c major mode commands. Usually, the file name patterns test for suffixes,
@c such as @samp{.el} and @samp{.c}, but this need not be the case. An
@c ordinary element of the alist looks like @code{(@var{regexp} .
@c @var{mode-function})}.
この変数は、ファイル名のパターン(正規表現、@pxref{Regular Expressions})と
対応するメジャーモードの連想リストを保持する。
通常、ファイル名パターンでは@samp{.el}や@samp{.c}などの接尾辞を調べるが、
そうでなくてもよい。
連想リストの通常の要素は
@code{(@var{regexp} . @var{mode-function})}の形である。
@c For example,
たとえばつぎのとおり。
@smallexample
@group
(("\\`/tmp/fol/" . text-mode)
("\\.texinfo\\'" . texinfo-mode)
("\\.texi\\'" . texinfo-mode)
@end group
@group
("\\.el\\'" . emacs-lisp-mode)
("\\.c\\'" . c-mode)
("\\.h\\'" . c-mode)
@dots{})
@end group
@end smallexample
@c When you visit a file whose expanded file name (@pxref{File Name
@c Expansion}) matches a @var{regexp}, @code{set-auto-mode} calls the
@c corresponding @var{mode-function}. This feature enables Emacs to select
@c the proper major mode for most files.
展開したファイル名(@pxref{File Name Expansion})が@var{regexp}に一致する
ファイルを訪問すると、
@code{set-auto-mode}は対応する@var{mode-function}を呼び出す。
この機能により、Emacsはほとんどのファイルに対して
適切なメジャーモードを選択する。
@c If an element of @code{auto-mode-alist} has the form @code{(@var{regexp}
@c @var{function} t)}, then after calling @var{function}, Emacs searches
@c @code{auto-mode-alist} again for a match against the portion of the file
@c name that did not match before. This feature is useful for
@c uncompression packages: an entry of the form @code{("\\.gz\\'"
@c @var{function} t)} can uncompress the file and then put the uncompressed
@c file in the proper mode according to the name sans @samp{.gz}.