-
Notifications
You must be signed in to change notification settings - Fork 26
/
41-操作系统接口.texi
2586 lines (1815 loc) · 113 KB
/
41-操作系统接口.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
\input texinfo @c -*- texinfo -*-
@c %**start of header
@setfilename 41-操作系统接口.info
@settitle
@documentencoding UTF-8
@documentlanguage en
@c %**end of header
@finalout
@titlepage
@title
@author zunrong
@end titlepage
@contents
@ifnottex
@node Top
@top
@end ifnottex
@menu
* 41 操作系统接口::
@detailmenu
--- The Detailed Node Listing ---
41 操作系统接口
* 41.1 启动 Emacs: 411 启动 Emacs.
* 41.2 退出 Emacs: 412 退出 Emacs.
* 41.3 操作系统环境: 413 操作系统环境.
* 41.4 用户识别: 414 用户识别.
* 41.5 时间: 415 时间.
* 41.6 时区规则: 416 时区规则.
* 41.7 时间转换: 417 时间转换.
* 41.8 解析和格式化时间: 418 解析和格式化时间.
* 41.9 处理器运行时间: 419 处理器运行时间.
* 41.10 时间计算: 4110 时间计算.
* 41.11 延迟执行的定时器: 4111 延迟执行的定时器.
* 41.12 空闲定时器: 4112 空闲定时器.
* 41.13 终端输入: 4113 终端输入.
* 41.14 终端输出: 4114 终端输出.
* 41.15 声音输出: 4115 声音输出.
* 41.16 X11 Keysyms 上的操作: 4116 X11 Keysyms 上的操作.
* 41.17 批处理模式: 4117 批处理模式.
* 41.18 会话管理: 4118 会话管理.
* 41.19 桌面通知: 4119 桌面通知.
* 41.20 文件更改通知: 4120 文件更改通知.
* 41.21 动态加载的库: 4121 动态加载的库.
* 41.22 安全考虑: 4122 安全考虑.
41.1 启动 Emacs
* 41.1.1 小结:启动时的动作顺序: 4111 小结:启动时的动作顺序.
* 41.1.2 初始化文件: 4112 初始化文件.
* 41.1.3 终端特定初始化: 4113 终端特定初始化.
* 41.1.4 命令行参数: 4114 命令行参数.
41.2 退出 Emacs
* 41.2.1 杀死 Emacs: 4121 杀死 Emacs.
* 41.2.2 挂起 Emacs: 4122 挂起 Emacs.
41.13 终端输入
* 41.13.1 输入模式: 41131 输入模式.
* 41.13.2 录音输入: 41132 录音输入.
@end detailmenu
@end menu
@node 41 操作系统接口
@chapter 41 操作系统接口
本章是关于 Emacs 的启动和退出,在操作系统环境中访问值,以及终端输入、输出。
有关相关信息,请参阅构建 Emacs。有关终端和屏幕的其他操作系统状态信息,请参阅 Emacs 显示。
@menu
* 41.1 启动 Emacs: 411 启动 Emacs.
* 41.2 退出 Emacs: 412 退出 Emacs.
* 41.3 操作系统环境: 413 操作系统环境.
* 41.4 用户识别: 414 用户识别.
* 41.5 时间: 415 时间.
* 41.6 时区规则: 416 时区规则.
* 41.7 时间转换: 417 时间转换.
* 41.8 解析和格式化时间: 418 解析和格式化时间.
* 41.9 处理器运行时间: 419 处理器运行时间.
* 41.10 时间计算: 4110 时间计算.
* 41.11 延迟执行的定时器: 4111 延迟执行的定时器.
* 41.12 空闲定时器: 4112 空闲定时器.
* 41.13 终端输入: 4113 终端输入.
* 41.14 终端输出: 4114 终端输出.
* 41.15 声音输出: 4115 声音输出.
* 41.16 X11 Keysyms 上的操作: 4116 X11 Keysyms 上的操作.
* 41.17 批处理模式: 4117 批处理模式.
* 41.18 会话管理: 4118 会话管理.
* 41.19 桌面通知: 4119 桌面通知.
* 41.20 文件更改通知: 4120 文件更改通知.
* 41.21 动态加载的库: 4121 动态加载的库.
* 41.22 安全考虑: 4122 安全考虑.
@end menu
@node 411 启动 Emacs
@section 41.1 启动 Emacs
本节描述 Emacs 在启动时会做什么,以及如何自定义这些操作。
@menu
* 41.1.1 小结:启动时的动作顺序: 4111 小结:启动时的动作顺序.
* 41.1.2 初始化文件: 4112 初始化文件.
* 41.1.3 终端特定初始化: 4113 终端特定初始化.
* 41.1.4 命令行参数: 4114 命令行参数.
@end menu
@node 4111 小结:启动时的动作顺序
@subsection 41.1.1 小结:启动时的动作顺序
当 Emacs 启动时,它会执行以下操作(参见 startup.el 中的 normal-top-level ):
@enumerate
@item
它通过在列表中的每个目录中运行名为 subdirs.el 的文件,将子目录添加到加载路径。通常,此文件会将目录的子目录添加到列表中,然后依次扫描这些子目录。subdirs.el 文件通常在安装 Emacs 时自动生成。
@item
它加载它在加载路径目录中找到的任何 leim-list.el。该文件用于注册输入法。仅搜索您可能创建的任何个人 leim-list.el 文件; 它会跳过包含标准 Emacs 库的目录(这些应该只包含一个 leim-list.el 文件,该文件被编译成 Emacs 可执行文件)。
@item
它将变量 before-init-time 设置为 current-time 的值(请参阅时间)。它还将 after-init-time 设置为 nil,这向 Lisp 程序发出 Emacs 正在初始化的信号。
@item
如果 LANG 等环境变量要求,它设置语言环境和终端编码系统。
@item
它对命令行参数进行一些基本的解析。
@item
它加载您的早期初始化文件(请参阅 GNU Emacs 手册中的早期初始化文件)。如果指定了选项 @code{-q} 、 @code{-Q} 或 @code{--batch} ,则不会执行此操作。如果指定了 '-u' 选项,Emacs 会在该用户的主目录中查找 init 文件。
@item
它调用函数 package-activate-all 来激活任何已安装的可选 Emacs Lisp 包。请参阅包装基础知识。但是,当 package-enable-at-startup 为 nil 或使用选项 @code{-q} 、 @code{-Q} 或 @code{--batch} 之一启动时,Emacs 不会激活包。要在后一种情况下激活包,应该显式调用 package-activate-all(例如,通过 @code{--funcall} 选项)。
@item
如果不在批处理模式下运行,它会初始化变量 initial-window-system 指定的窗口系统(参见 initial-window-system)。初始化函数 window-system-initialization 是一个通用函数(请参阅通用函数),其实际实现对于每个支持的窗口系统都不同。如果initial-window-system的值为windowsystem,那么初始化函数的适当实现定义在文件term/windowsystem-win.el中。该文件在构建时应该已经编译到 Emacs 可执行文件中。
@item
它在初始化钩子之前运行正常的钩子。
@item
如果合适,它会创建一个图形框架。作为创建图形框架的一部分,它通过为该窗口系统调用 window-system-initialization 函数来为图形框架初始化由 initial-frame-alist 和 default-frame-alist 指定的窗口系统(请参阅初始帧参数) . 这不是在批处理(非交互)或守护程序模式下完成的。
@item
它初始化初始帧的面,并在需要时设置菜单栏和工具栏。如果支持图形框架,即使当前框架不是图形框架,它也会设置工具栏,因为稍后可能会创建图形框架。
@item
它使用 custom-reevaluate-setting 重新初始化列表 custom-delayed-init-variables 的成员。这些是任何预加载的用户选项,其默认值取决于运行时而不是构建时上下文。请参阅自定义初始化延迟。
@item
它会加载库站点启动(如果存在)。如果指定了选项 @code{-Q} 或 @code{--no-site-file} ,则不会这样做。
@item
它加载您的初始化文件(请参阅初始化文件)。如果指定了选项 @code{-q} 、 @code{-Q} 或 @code{--batch} ,则不会执行此操作。如果指定了 '-u' 选项,Emacs 会在该用户的主目录中查找 init 文件。
@item
它加载库默认值(如果存在)。如果 inhibitor-default-init 为非 nil,或者指定了选项 @code{-q} 、 @code{-Q} 或 @code{--batch} ,则不会执行此操作。
@item
它从 abbrev-file-name 指定的文件加载您的缩写,如果该文件存在并且可以读取(请参阅 abbrev-file-name)。如果指定了选项 @code{--batch} ,则不会这样做。
@item
它将变量 after-init-time 设置为 current-time 的值。这个变量之前被设置为 nil; 将其设置为当前时间表示初始化阶段结束,并与 before-init-time 一起提供对所用时间的测量。
@item
它在初始化钩子之后运行正常的钩子。
@item
如果缓冲区 @strong{scratch} 存在并且仍处于基本模式(默认情况下应该如此),它会根据 initial-major-mode 设置其主要模式。
@item
如果在文本终端上启动,它会加载特定于终端的 Lisp 库(请参阅特定于终端的初始化),并运行挂钩 tty-setup-hook。这不是在 --batch 模式下完成的,如果 term-file-prefix 为 nil 也不会。
@item
它会显示初始回声区域消息,除非您使用禁止启动回声区域消息抑制了该消息。
@item
它处理之前未处理的任何命令行选项。
@item
如果指定了 --batch 选项,它现在退出。
@item
如果 @strong{scratch} 缓冲区存在并且为空,它会将 (substitute-command-keys initial-scratch-message) 插入该缓冲区。
@item
如果 initial-buffer-choice 是一个字符串,它会访问具有该名称的文件(或目录)。如果它是一个函数,它会调用不带参数的函数并选择它返回的缓冲区。如果一个文件作为命令行参数给出,则访问该文件并将其缓冲区显示在 initial-buffer-choice 旁边。如果给出了多个文件,则访问所有文件并且 @strong{Buffer List} 缓冲区显示在 initial-buffer-choice 旁边。
@item
它运行 emacs-startup-hook。
@item
它调用 frame-notice-user-settings,它根据 init 文件指定的任何内容修改所选框架的参数。
@item
它运行窗口设置挂钩。这个钩子和 emacs-startup-hook 的唯一区别是这个钩子是在前面提到的对帧参数的修改之后运行的。
@item
它显示启动屏幕,这是一个特殊的缓冲区,包含有关 copyleft 和基本 Emacs 使用的信息。如果 inhibitor-startup-screen 或 initial-buffer-choice 不为零,或者指定了 @code{--no-splash} 或 @code{-Q} 命令行选项,则不会执行此操作。
@item
如果请求了一个守护进程,它会调用 server-start。(在 POSIX 系统上,如果请求后台守护程序,它会从控制终端分离。)请参阅 The GNU Emacs Manual 中的 Emacs Server。
@item
如果由 X 会话管理器启动,它会调用 emacs-session-restore 将前一个会话的 ID 作为参数传递给它。请参阅会话管理。
@end enumerate
以下选项会影响启动顺序的某些方面。
@lisp
User Option: inhibit-startup-screen ¶
@end lisp
此变量,如果非零,禁止启动屏幕。在这种情况下,Emacs 通常会显示 @strong{scratch} 缓冲区; 但请参阅下面的初始缓冲区选择。
不要在新用户的 init 文件中设置此变量,或者以影响多个用户的方式设置此变量,因为这会阻止新用户接收有关 copyleft 和基本 Emacs 使用的信息。
禁止启动消息和禁止启动屏幕是此变量的别名。
@lisp
User Option: initial-buffer-choice ¶
@end lisp
如果非零,此变量是一个字符串,它指定 Emacs 在启动后显示的文件或目录,而不是启动屏幕。如果它的值是一个函数,Emacs 调用该函数,该函数必须返回一个缓冲区,然后显示该缓冲区。如果它的值为 t,Emacs 将显示 @strong{scratch} 缓冲区。
@lisp
User Option: inhibit-startup-echo-area-message ¶
@end lisp
此变量控制启动回显区域消息的显示。您可以通过将此表单的文本添加到您的 init 文件来抑制启动回显区域消息:
@lisp
(setq inhibit-startup-echo-area-message
"your-login-name")
@end lisp
Emacs 在你的 init 文件中显式检查如上所示的表达式; 您的登录名必须作为 Lisp 字符串常量出现在表达式中。您还可以使用自定义界面。将 inhibitor-startup-echo-area-message 设置为相同值的其他方法不会禁止启动消息。这样,如果您愿意,您可以轻松地为自己禁止消息,但不假思索地复制您的 init 文件不会禁止其他人的消息。
@lisp
User Option: initial-scratch-message ¶
@end lisp
这个变量,如果非零,应该是一个字符串,当 Emacs 启动时,它被当作文档插入到 @strong{scratch} 缓冲区中。如果为 nil,则 @strong{scratch} 缓冲区为空。
以下命令行选项会影响启动顺序的某些方面。请参阅 GNU Emacs 手册中的初始选项。
@lisp
--no-splash
@end lisp
不要显示启动画面。
@lisp
--batch
@end lisp
在没有交互式终端的情况下运行。请参阅批处理模式。
@lisp
--daemon
@end lisp
@lisp
--bg-daemon
@end lisp
@lisp
--fg-daemon
@end lisp
不要初始化任何显示; 只需启动一个服务器。( @code{后台} 守护程序自动在后台运行。)
@lisp
--no-init-file
@end lisp
@lisp
-q
@end lisp
不要加载初始化文件或默认库。
@lisp
--no-site-file
@end lisp
不要加载站点启动库。
@lisp
--quick
@end lisp
@lisp
-Q
@end lisp
相当于'-q --no-site-file --no-splash'。
@node 4112 初始化文件
@subsection 41.1.2 初始化文件
当您启动 Emacs 时,它通常会尝试加载您的 init 文件。这可以是主目录中名为 .emacs 或 .emacs.el 的文件,或者是主目录中名为 .emacs.d 的子目录中名为 init.el 的文件。
命令行开关 @code{-q} 、 @code{-Q} 和 @code{-u} 控制是否以及在哪里找到初始化文件; '-q'(和更强的'-Q')表示不加载init文件,而'-u user'表示加载用户的init文件而不是你的。请参阅 GNU Emacs 手册中的输入 Emacs。如果两个选项都没有指定,Emacs 使用 LOGNAME 环境变量,或者 USER(大多数系统)或 USERNAME(MS 系统)变量来查找你的主目录,从而找到你的 init 文件; 这样,即使你有 su'd,Emacs 仍然会加载你自己的 init 文件。但是,如果没有这些环境变量,Emacs 会使用您的用户 ID 来查找您的主目录。
Emacs 还尝试加载第二个 init 文件,称为 early init 文件(如果存在)。这是 ~/.emacs.d 目录中名为 early-init.el 的文件。early init 文件和常规 init 文件的区别在于,early init 文件在启动过程中加载得更早,因此您可以使用它来自定义一些在加载常规 init 文件之前初始化的东西。例如,您可以通过设置 package-load-list 或 package-enable-at-startup 等变量来自定义初始化包系统的过程。请参阅 GNU Emacs 手册中的软件包安装。
Emacs 安装可能有一个默认的 init 文件,它是一个名为 default.el 的 Lisp 库。Emacs 通过库的标准搜索路径找到这个文件(参见程序如何加载)。Emacs 发行版不附带此文件; 它用于本地定制。如果默认的 init 文件存在,它会在您启动 Emacs 时加载。但是你自己的个人初始化文件,如果有的话,首先被加载; 如果它将禁止默认初始化设置为非零值,则 Emacs 不会随后加载 default.el 文件。在批处理模式下,或者如果您指定 @code{-q} (或 @code{-Q} ),Emacs 既不会加载您的个人 init 文件,也不会加载默认的 init 文件。
站点定制的另一个文件是 site-start.el。Emacs 在用户的 init 文件之前加载它。您可以使用选项 @code{--no-site-file} 来禁止加载此文件。
用户选项:站点运行文件¶
此变量指定要在用户的 init 文件之前加载的站点自定义文件。它的正常值为 @code{site-start} 。您可以真正改变它的唯一方法是在转储 Emacs 之前这样做。
有关如何在 .emacs 文件中进行各种常用自定义的示例,请参阅 GNU Emacs 手册中的初始化文件示例。
@lisp
User Option: site-run-file ¶
@end lisp
如果这个变量不是 nil,它会阻止 Emacs 加载默认的初始化库文件。默认值为无。
@lisp
User Option: inhibit-default-init ¶
@end lisp
在加载所有初始化文件(site-start.el、您的初始化文件和 default.el)之前,这个正常的钩子会运行一次。(真正改变它的唯一方法是在转储 Emacs 之前。)
@lisp
Variable: before-init-hook ¶
@end lisp
这个正常的钩子运行一次,在加载所有初始化文件(site-start.el、你的初始化文件和 default.el)之后,在加载特定于终端的库(如果在文本终端上启动)和处理命令行操作参数。
@lisp
Variable: after-init-hook ¶
@end lisp
这个普通的钩子在处理命令行参数之后运行一次。在批处理模式下,Emacs 不会运行这个钩子。
@lisp
Variable: emacs-startup-hook ¶
@end lisp
这个普通的钩子与 emacs-startup-hook 非常相似。唯一的区别是它在设置帧参数之后运行稍晚一些。请参阅窗口设置挂钩。
@lisp
Variable: window-setup-hook ¶
@end lisp
此变量保存用户初始化文件的绝对文件名。如果实际加载的 init 文件是编译文件,如 .emacs.elc,则该值是指对应的源文件。
@lisp
Variable: user-init-file ¶
@end lisp
此变量保存 Emacs 默认目录的名称。如果该目录存在并且 ~/.emacs.d/ 和 ~/.emacs 不存在,则默认为 @{XDG@math{_CONFIG}@math{_HOME}-'~/.config'@} 代表环境变量 XDG@math{_CONFIG}@math{_HOME} 的值(如果设置了该变量),否则代表 ~/.config。请参阅 GNU Emacs 手册中的 Emacs 如何找到您的初始化文件。
@node 4113 终端特定初始化
@subsection 41.1.3 终端特定初始化
每个终端类型都可以有自己的 Lisp 库,当在该类型的终端上运行时,Emacs 会加载该库。库的名称是通过连接变量 term-file-prefix 的值和终端类型(由环境变量 TERM 指定)构成的。通常,term-file-prefix 的值为 @code{term/} ; 不建议更改此设置。如果在 term-file-aliases 关联列表中存在与 TERM 匹配的条目,Emacs 将使用关联的值代替 TERM。Emacs 通过搜索加载路径目录并尝试使用 @code{.elc} 和 @code{.el} 后缀以正常方式查找文件。
终端特定库的通常作用是启用特殊键来发送 Emacs 可以识别的序列。如果 Termcap 或 Terminfo 条目未指定所有终端的功能键,则可能还需要设置或添加到 input-decode-map。请参阅终端输入。
当终端类型的名称包含连字符或下划线,并且没有找到名称与终端名称相同的库时,Emacs 会从终端名称中删除最后一个连字符或下划线及其后面的所有内容,然后重试。重复这个过程,直到 Emacs 找到匹配的库,或者直到名称中不再有连字符或下划线(即,没有终端特定的库)。例如,如果终端名称是 'xterm-256color' 并且没有 term/xterm-256color.el 库,Emacs 会尝试加载 term/xterm.el。如有必要,终端库可以评估 (getenv "TERM") 以找到终端类型的全名。
您的 init 文件可以通过将变量 term-file-prefix 设置为 nil 来阻止加载特定于终端的库。
您还可以使用 tty-setup-hook 来安排覆盖终端特定库的一些操作。这是 Emacs 在初始化一个新的文本终端后运行的一个普通钩子。您可以使用此挂钩为没有自己的库的终端定义初始化。请参阅挂钩。
@lisp
User Option: term-file-prefix ¶
@end lisp
如果这个变量的值不是 nil,Emacs 会加载一个终端特定的初始化文件,如下所示:
@lisp
(load (concat term-file-prefix (getenv "TERM")))
@end lisp
如果您不想加载终端初始化文件,您可以在初始化文件中将 term-file-prefix 变量设置为 nil。
在 MS-DOS 上,Emacs 将 TERM 环境变量设置为 @code{内部} 。
@lisp
User Option: term-file-aliases ¶
@end lisp
此变量是将终端类型映射到它们的别名的关联列表。例如,形式为 ("vt102" . "vt100") 的元素意味着将类型为 @code{vt102} 的终端视为 @code{vt100} 类型的终端。
@lisp
Variable: tty-setup-hook ¶
@end lisp
这个变量是 Emacs 在初始化一个新的文本终端后运行的一个普通的钩子。(这适用于 Emacs 在非窗口模式下启动以及建立 tty emacsclient 连接时。)该钩子在加载您的 init 文件(如果适用)和特定于终端的 Lisp 文件后运行,因此您可以使用它来调整该文件所做的定义。
有关相关功能,请参阅 window-setup-hook。
@node 4114 命令行参数
@subsection 41.1.4 命令行参数
当您启动 Emacs 时,您可以使用命令行参数来请求各种操作。请注意,使用 Emacs 的推荐方法是在登录后只启动一次,然后在同一个 Emacs 会话中进行所有编辑(请参阅 The GNU Emacs Manual 中的 Entering Emacs)。出于这个原因,您可能不会经常使用命令行参数。尽管如此,在从会话脚本调用 Emacs 或调试 Emacs 时,它们还是很有用的。本节描述 Emacs 如何处理命令行参数。
@lisp
Function: command-line ¶
@end lisp
该函数解析调用 Emacs 的命令行,对其进行处理,并且(除其他外)加载用户的 init 文件并显示启动消息。
@lisp
Variable: command-line-processed ¶
@end lisp
一旦处理了命令行,此变量的值就是 t。
如果您通过调用 dump-emacs(请参阅 Building Emacs)来转储 Emacs,您可能希望首先将此变量设置为 nil,以便使新转储的 Emacs 处理其新的命令行参数。
@lisp
Variable: command-switch-alist ¶
@end lisp
此变量是用户定义的命令行选项和相关处理函数的列表。默认情况下它是空的,但您可以根据需要添加元素。
命令行选项是命令行上的一个参数,其形式为:
@lisp
-option
@end lisp
command-switch-alist 的元素如下所示:
@lisp
(option . handler-function)
@end lisp
CAR 选项是一个字符串,是命令行选项的名称(包括初始连字符)。调用处理函数来处理选项,并接收选项名称作为其唯一参数。
在某些情况下,该选项在命令行中后跟一个参数。在这些情况下,处理函数可以在变量 command-line-args-left 中找到所有剩余的命令行参数(见下文)。(命令行参数的完整列表在命令行参数中。)
请注意,command-switch-alist 的处理不会专门处理选项中的等号。也就是说,如果命令行上有类似 --name=value 的选项,那么只有 car 字面为 --name=value 的 command-switch-alist 成员才会匹配此选项。如果要解析此类选项,则需要改用命令行函数(见下文)。
命令行参数由 startup.el 文件中的 command-line-1 函数解析。另请参阅 GNU Emacs 手册中的 Emacs 调用的命令行参数。
@lisp
Variable: command-line-args ¶
@end lisp
这个变量的值是传递给 Emacs 的命令行参数列表。
@lisp
Variable: command-line-args-left ¶
@end lisp
此变量的值是尚未处理的命令行参数列表。
@lisp
Variable: command-line-functions ¶
@end lisp
此变量的值是用于处理无法识别的命令行参数的函数列表。每次要处理的下一个参数没有特殊含义时,都会按照出现的顺序调用此列表中的函数,直到其中一个返回非零值。
这些函数在没有参数的情况下被调用。他们可以通过此时临时绑定的变量 argi 访问正在考虑的命令行参数。其余参数(不包括当前参数)在变量 command-line-args-left 中。
当一个函数识别并处理 argi 中的参数时,它应该返回一个非零值来表示它已经处理了该参数。如果它还处理了以下一些参数,则可以通过从 command-line-args-left 中删除它们来表明这一点。
如果所有这些函数都返回 nil,则将参数视为要访问的文件名。
@node 412 退出 Emacs
@section 41.2 退出 Emacs
有两种方法可以退出 Emacs:您可以终止 Emacs 作业,它会永久退出,或者您可以暂停它,这允许您稍后重新进入 Emacs 进程。(在图形环境中,您当然可以简单地切换到另一个应用程序而无需对 Emacs 做任何特殊操作,然后在需要时切换回 Emacs。)
@menu
* 41.2.1 杀死 Emacs: 4121 杀死 Emacs.
* 41.2.2 挂起 Emacs: 4122 挂起 Emacs.
@end menu
@node 4121 杀死 Emacs
@subsection 41.2.1 杀死 Emacs
杀死 Emacs 意味着结束 Emacs 进程的执行。如果您从终端启动 Emacs,父进程通常会恢复控制。杀死 Emacs 的低级原语是 kill-emacs。
@lisp
Command: kill-emacs &optional exit-data ¶
@end lisp
该命令调用 hook kill-emacs-hook,然后退出 Emacs 进程并杀死它。
如果 exit-data 是一个整数,则用作 Emacs 进程的退出状态。(这主要在批处理操作中很有用;请参阅批处理模式。)
如果 exit-data 是一个字符串,它的内容将被填充到终端输入缓冲区中,以便 shell(或接下来读取输入的任何程序)可以读取它们。
如果 exit-data 既不是整数也不是字符串,或者被省略,这意味着使用(系统特定的)退出状态,表明程序成功终止。
kill-emacs 函数通常通过更高级别的命令 Cx Cc (save-buffers-kill-terminal) 调用。请参阅 GNU Emacs 手册中的退出。如果 Emacs 接收到 SIGTERM 或 SIGHUP 操作系统信号(例如,当控制终端断开连接时),或者如果它在批处理模式下运行时接收到 SIGINT 信号(请参阅批处理模式),它也会自动调用。
@lisp
Variable: kill-emacs-hook ¶
@end lisp
这个普通的钩子在杀死 Emacs 之前由 kill-emacs 运行。
因为 kill-emacs 可以在用户交互不可能的情况下被调用(例如,当终端断开时),这个钩子上的函数不应该尝试与用户交互。如果您想在 Emacs 关闭时与用户交互,请使用 kill-emacs-query-functions,如下所述。
当 Emacs 被杀死时,Emacs 进程中的所有信息,除了已保存的文件,都将丢失。因为无意中杀死 Emacs 会丢失大量工作,所以 save-buffers-kill-terminal 命令会查询以确认您是否有需要保存的缓冲区或正在运行的子进程。它还运行异常的钩子kill-emacs-query-functions:
@lisp
User Option: kill-emacs-query-functions ¶
@end lisp
当 save-buffers-kill-terminal 杀死 Emacs 时,它会在询问标准问题之后和调用 kill-emacs 之前调用此钩子中的函数。这些函数按出现的顺序调用,没有参数。每个功能都可以要求用户进行额外确认。如果其中任何一个返回 nil,则 save-buffers-kill-emacs 不会杀死 Emacs,并且不会运行此钩子中的其余函数。直接调用 kill-emacs 不会运行这个钩子。
@node 4122 挂起 Emacs
@subsection 41.2.2 挂起 Emacs
在文本终端上,可以暂停 Emacs,这意味着暂时停止 Emacs 并将控制权返回给其上级进程,通常是 shell。这允许您稍后在相同的 Emacs 进程中恢复编辑,使用相同的缓冲区、相同的终止环、相同的撤消历史记录等。要恢复 Emacs,请在父 shell 中使用适当的命令——很可能是 fg。
挂起仅适用于启动 Emacs 会话的终端设备。我们称该设备为会话的控制终端。如果控制终端是图形终端,则不允许挂起。挂起通常与图形环境无关,因为您可以简单地切换到另一个应用程序,而无需对 Emacs 做任何特殊的事情。
某些操作系统(没有 SIGTSTP 或 MS-DOS 的操作系统)不支持暂停作业; 在这些系统上,挂起实际上会临时创建一个新的 shell 作为 Emacs 的子进程。然后您将退出 shell 以返回 Emacs。
@lisp
Command: suspend-emacs &optional string ¶
@end lisp
此函数停止 Emacs 并将控制权返回给上级进程。如果并且当上级进程恢复 Emacs 时,suspend-emacs 将 nil 返回给其在 Lisp 中的调用者。
该功能仅在 Emacs 会话的控制终端上有效; 要放弃对其他 tty 设备的控制,请使用 suspend-tty(见下文)。如果 Emacs 会话使用多个终端,则必须在挂起 Emacs 之前删除所有其他终端上的帧,否则此函数会发出错误信号。请参阅多个终端。
如果 string 不是 nil,它的字符被发送到 Emacs 的上层 shell,作为终端输入读取。string 中的字符不被上级 shell 回显; 只显示结果。
在挂起之前,suspend-emacs 运行正常的挂起钩子。用户恢复 Emacs 后,suspend-emacs 运行正常的 hooksuspend-resume-hook。请参阅挂钩。
恢复后的下一次重新显示将重绘整个屏幕,除非变量 no-redraw-on-reenter 为非零。请参阅刷新屏幕。
以下是如何使用这些钩子的示例:
@lisp
(add-hook 'suspend-hook
(lambda () (or (y-or-n-p "Really suspend?")
(error "Suspend canceled"))))
(add-hook 'suspend-resume-hook (lambda () (message "Resumed!")
(sit-for 2)))
@end lisp
以下是您在评估时会看到的内容 (suspend-emacs "pwd"):
@lisp
---------- Buffer: Minibuffer ----------
Really suspend? y
---------- Buffer: Minibuffer ----------
---------- Parent Shell ----------
bash$ /home/username
bash$ fg
---------- Echo Area ----------
Resumed!
@end lisp
请注意,Emacs 挂起后不会回显 @code{pwd} 。但它是由 shell 读取和执行的。
@lisp
Variable: suspend-hook ¶
@end lisp
这个变量是 Emacs 在挂起之前运行的普通钩子。
@lisp
Variable: suspend-resume-hook ¶
@end lisp
此变量是 Emacs 在暂停后恢复时运行的正常钩子。
@lisp
Function: suspend-tty &optional tty ¶
@end lisp
如果 tty 指定 Emacs 使用的终端设备,此函数将放弃该设备并将其恢复到之前的状态。使用该设备的帧继续存在,但不会更新,并且 Emacs 不会从它们读取输入。tty 可以是终端对象、框架(表示该框架的终端)或 nil(表示所选框架的终端)。请参阅多个终端。
如果 tty 已经挂起,这个函数什么也不做。
该函数运行 hook 挂起 tty 函数,将终端对象作为参数传递给每个函数。
@lisp
Function: resume-tty &optional tty ¶
@end lisp
该函数恢复之前挂起的终端设备tty; 其中 tty 具有与 suspend-tty 相同的可能值。
此函数重新打开终端设备,重新初始化它,并使用该终端的选定帧重新绘制它。然后它运行钩子 resume-tty-functions,将终端对象作为参数传递给每个函数。
如果同一设备已被另一个 Emacs 终端使用,则此函数会发出错误信号。如果 tty 没有挂起,这个函数什么也不做。
@lisp
Function: controlling-tty-p &optional tty ¶
@end lisp
如果 tty 是 Emacs 会话的控制终端,则此函数返回非 nil; tty 可以是终端对象、框架(表示该框架的终端)或 nil(表示所选框架的终端)。
@lisp
Command: suspend-frame ¶
@end lisp
此命令暂停一帧。对于 GUI 框架,它调用 iconify-frame(参见框架的可见性); 对于文本终端上的框架,它调用suspend-emacs 或suspend-tty,这取决于框架是否显示在控制终端设备上。
@node 413 操作系统环境
@section 41.3 操作系统环境
Emacs 通过各种函数提供对操作系统环境中变量的访问。这些变量包括系统名称、用户的 UID 等。
@lisp
Variable: system-configuration ¶
@end lisp
此变量以字符串形式保存系统硬件/软件配置的标准 GNU 配置名称。例如,64 位 GNU/Linux 系统的典型值为 '"x86@math{_64}-unknown-linux-gnu"'。
@lisp
Variable: system-type ¶
@end lisp
这个变量的值是一个符号,表示 Emacs 正在运行的操作系统的类型。可能的值是:
@lisp
aix
@end lisp
IBM 的 AIX。
@lisp
berkeley-unix
@end lisp
伯克利 BSD 及其变体。
@lisp
cygwin
@end lisp
Cygwin,MS-Windows 之上的 POSIX 层。
@lisp
darwin
@end lisp
达尔文 (macOS)。
@lisp
gnu
@end lisp
GNU 系统(使用 GNU 内核,由 HURD 和 Mach 组成)。
@lisp
gnu/linux
@end lisp
GNU/Linux 系统——即使用 Linux 内核的变体 GNU 系统。(这些系统就是人们常说的 @code{Linux} ,但实际上 Linux 只是内核,而不是整个系统。)
@lisp
gnu/kfreebsd
@end lisp
具有 FreeBSD 内核的 GNU(基于 glibc)系统。
@lisp
hpux
@end lisp
惠普 HPUX 操作系统。
@lisp
nacl
@end lisp
Google Native Client (NaCl) 沙盒系统。
@lisp
ms-dos
@end lisp
微软的 DOS。使用 DJGPP 为 MS-DOS 编译的 Emacs 将系统类型绑定到 ms-dos,即使您在 MS-Windows 上运行它也是如此。
@lisp
usg-unix-v
@end lisp
AT&T Unix System V@.
@lisp
windows-nt
@end lisp
Microsoft Windows NT、9X 及更高版本。system-type 的值始终为 windows-nt,例如,即使在 Windows 10 上也是如此。
除非绝对必要,否则我们不希望添加新符号来进行更精细的区分! 事实上,我们希望在未来消除其中的一些替代方案。如果您需要比系统类型允许的更精细的区分,您可以测试系统配置,例如,针对正则表达式。
@lisp
Function: system-name ¶
@end lisp
此函数以字符串形式返回您正在运行的机器的名称。
@lisp
User Option: mail-host-address ¶
@end lisp
如果此变量不为 nil,则使用它代替 system-name 来生成电子邮件地址。例如,在构造用户邮件地址的默认值时使用。请参阅用户标识。
@lisp
Command: getenv var &optional frame ¶
@end lisp
此函数以字符串形式返回环境变量 var 的值。var 应该是一个字符串。如果环境中未定义 var,则 getenv 返回 nil。如果设置了 var 但为 null,则返回 '""'。在 Emacs 中,环境变量及其值的列表保存在变量 process-environment 中。
@lisp
(getenv "USER")
⇒ "lewis"
@end lisp
shell 命令 printenv 打印全部或部分环境:
@lisp
bash$ printenv
PATH=/usr/local/bin:/usr/bin:/bin
USER=lewis
TERM=xterm
SHELL=/bin/bash
HOME=/home/lewis
…
@end lisp
@lisp
Command: setenv variable &optional value substitute ¶
@end lisp
此命令将名为 variable 的环境变量的值设置为 value。变量应该是一个字符串。在内部,Emacs Lisp 可以处理任何字符串。但是,通常变量应该是有效的外壳标识符,即字母、数字和下划线的序列,以字母或下划线开头。否则,如果 Emacs 的子进程尝试访问变量的值,可能会出现错误。如果 value 被省略或 nil (或者,交互地,使用前缀参数), setenv 从环境中删除变量。否则,值应该是一个字符串。
如果可选参数替代非零,Emacs 调用函数替代环境变量来扩展任何环境变量的值。
setenv 通过修改进程环境来工作; 将该变量与 let 绑定也是合理的做法。
setenv 返回变量的新值,如果从环境中删除变量,则返回 nil。
@lisp
Macro: with-environment-variables variables body… ¶
@end lisp
该宏在执行body时临时根据变量设置环境变量。表单完成后将恢复以前的值。参数变量应该是格式为 (var value) 的字符串对列表,其中 var 是环境变量的名称,value 是该变量的值。
@lisp
(with-environment-variables (("LANG" "C")
("LANGUAGE" "en_US:en"))
(call-process "ls" nil t))
@end lisp
@lisp
Variable: process-environment ¶
@end lisp
该变量是一个字符串列表,每个字符串描述一个环境变量。函数 getenv 和 setenv 通过这个变量工作。
@lisp
process-environment
⇒ ("PATH=/usr/local/bin:/usr/bin:/bin"
"USER=lewis"
"TERM=xterm"
"SHELL=/bin/bash"
"HOME=/home/lewis"
…)
@end lisp
如果 process-environment 包含多个指定相同环境变量的元素,则这些元素中的第一个指定变量,而其他元素将被忽略。
@lisp
Variable: initial-environment ¶
@end lisp
此变量保存 Emacs 启动时从其父进程继承的环境变量列表。
@lisp
Variable: path-separator ¶
@end lisp
此变量包含一个字符串,该字符串表示搜索路径中的哪个字符分隔目录(如在环境变量中找到的那样)。对于 Unix 和 GNU 系统,它的值是 @code{:} ,而 @code{;} 用于 MS 系统。
@lisp
Function: path-separator ¶
@end lisp
此函数返回变量路径分隔符的连接局部值。那是 ~ ;~ 对于 MS 系统和本地默认目录, @code{:} 对于 Unix 和 GNU 系统,或远程默认目录。
@lisp
Function: parse-colon-path path ¶
@end lisp
此函数采用搜索路径字符串(例如 PATH 环境变量的值),并在分隔符处将其拆分,返回目录列表。此列表中的 nil 表示当前目录。虽然函数的名称是 @code{冒号} ,但它实际上使用了变量路径分隔符的值。
@lisp
(parse-colon-path ":/foo:/bar")
⇒ (nil "/foo/" "/bar/")
@end lisp
@lisp
Variable: invocation-name ¶
@end lisp
此变量保存调用 Emacs 的程序名称。该值是一个字符串,并且不包括目录名称。
@lisp
Variable: invocation-directory ¶
@end lisp
此变量保存 Emacs 可执行文件在运行时所在的目录,如果无法确定该目录,则为 nil。
@lisp
Variable: installation-directory ¶
@end lisp
如果非零,这是一个目录,可以在其中查找 lib-src 和 etc 子目录。在已安装的 Emacs 中,它通常为 nil。当 Emacs 无法在其标准安装位置找到这些目录,但可以在与包含 Emacs 可执行文件的目录(即调用目录)相关的目录中找到它们时,它是非零的。
@lisp
Function: load-average &optional use-float ¶
@end lisp
此函数以列表的形式返回当前 1 分钟、5 分钟和 15 分钟的系统负载平均值。平均负载表示试图在系统上运行的进程数。
默认情况下,这些值是系统负载平均值的 100 倍的整数,但如果 use-float 不为零,则它们将作为浮点数返回,而不乘以 100。
如果无法获得负载平均值,则此函数会发出错误信号。在某些平台上,访问平均负载需要将 Emacs 安装为 setuid 或 setgid,以便它可以读取内核信息,这通常是不可取的。
如果 1 分钟负载平均值可用,但 5 或 15 分钟平均值不可用,则此函数返回包含可用平均值的缩短列表。
@lisp
(load-average)
⇒ (169 48 36)
(load-average t)
⇒ (1.69 0.48 0.36)
@end lisp
shell 命令 uptime 返回类似的信息。
@lisp
Function: emacs-pid ¶
@end lisp
此函数以整数形式返回 Emacs 进程的进程 ID。
@lisp
Variable: tty-erase-char ¶
@end lisp
此变量保存在 Emacs 启动之前在系统终端驱动程序中选择的擦除字符。
@lisp
Variable: null-device ¶
@end lisp
此变量保存系统空设备。对于 Unix 和 GNU 系统,其值为 @code{/dev/null} ,对于 MS 系统,其值为 @code{NUL} 。
@lisp
Function: null-device ¶
@end lisp
此函数返回变量 null-device 的连接本地值。对于 MS 系统和本地默认目录是 @code{NUL} ,对于 Unix 和 GNU 系统是 @code{/dev/null} ,或者是远程默认目录。
@node 414 用户识别
@section 41.4 用户识别
@lisp
Variable: init-file-user ¶
@end lisp
这个变量表示 Emacs 应该使用哪个用户的 init 文件——如果没有,则为 nil。"" 代表最初登录的用户。该值反映了命令行选项,例如 @code{-q} 或 @code{-u 用户} 。
加载自定义文件或任何其他类型的用户配置文件的 Lisp 包在决定在哪里找到它时应该遵循这个变量。他们应该加载在这个变量中找到的用户名的配置文件。如果 init-file-user 为 nil,意味着使用了 @code{-q} 、 @code{-Q} 或 @code{-batch} 选项,则 Lisp 包不应加载任何自定义文件或用户配置文件。
@lisp
User Option: user-mail-address ¶
@end lisp
这包含使用 Emacs 的用户的电子邮件地址。
@lisp
Function: user-login-name &optional uid ¶
@end lisp
此函数返回用户登录的名称。它使用环境变量 LOGNAME 或 USER(如果已设置)。否则,该值基于有效 UID,而不是真实 UID。
如果指定 uid(一个数字),则结果是对应于 uid 的用户名,如果没有这样的用户,则返回 nil。
@lisp
Function: user-real-login-name ¶
@end lisp
该函数返回 Emacs 的真实 UID 对应的用户名。这将忽略有效的 UID,以及环境变量 LOGNAME 和 USER。
@lisp
Function: user-full-name &optional uid ¶
@end lisp
此函数返回登录用户的全名,或者环境变量 NAME 的值(如果已设置)。
如果 Emacs 进程的用户 ID 不对应于任何已知用户(并且未设置 NAME),则结果为 @code{未知} 。
如果 uid 不是 nil,那么它应该是一个数字(一个用户 ID)或一个字符串(一个登录名)。然后 user-full-name 返回与该用户 ID 或登录名对应的全名。如果您指定未定义的用户 ID 或登录名,则返回 nil。
符号 user-login-name、user-real-login-name 和 user-full-name 是变量和函数。这些函数返回与变量相同的值。这些变量允许您通过告诉函数返回什么来伪造 Emacs。这些变量对于构造框架标题也很有用(请参阅框架标题)。
@lisp
Function: user-real-uid ¶
@end lisp
此函数返回用户的真实 UID。
@lisp
Function: user-uid ¶
@end lisp
该函数返回用户的有效 UID。
@lisp
Function: group-gid ¶
@end lisp
该函数返回 Emacs 进程的有效 GID。
@lisp
Function: group-real-gid ¶
@end lisp
该函数返回 Emacs 进程的真实 GID。
@lisp
Function: system-users ¶
@end lisp
此函数返回字符串列表,列出系统上的用户名。如果 Emacs 无法检索此信息,则返回值是一个仅包含 user-real-login-name 值的列表。
@lisp
Function: system-groups ¶
@end lisp
该函数返回一个字符串列表,列出系统上用户组的名称。如果 Emacs 无法检索此信息,则返回值为 nil。
@lisp
Function: group-name gid ¶
@end lisp
此函数返回与数字组 ID gid 对应的组名,如果没有这样的组,则返回 nil。
@node 415 时间
@section 41.5 时间
本节说明如何确定当前时间和时区。
当前时间和文件属性等许多函数返回计数秒数的 Lisp 时间戳值,并且可以通过从 1970-01-01 00:00:00 UTC 的纪元开始计数秒来表示绝对时间。
尽管传统上 Lisp 时间戳是整数对,但它们的形式已经发展,程序通常不应该依赖于当前的默认形式。如果您的程序需要特定的时间戳形式,您可以使用 time-convert 函数将其转换为所需的形式。请参阅时间转换。
目前有三种形式的 Lisp 时间戳,每一种都代表秒数:
一个整数。虽然这是最简单的形式,但它不能表示亚秒级时间戳。
一对整数(记号 .hz),其中 hz 为正数。这表示滴答/hz 秒,如果 hz 为 1,则与普通滴答时间相同。对于纳秒分辨率时钟,hz 的常见值为 1000000000。27
四个整数的列表(高低微 pico),其中 0≤low<65536、0≤micro<1000000 和 0≤pico<1000000。这表示使用以下公式的秒数:high * 2**16 + low + micro * 10**-6 + pico * 10**-12。在某些情况下,函数可能默认返回两个或三个元素的列表,省略的 micro 和 pico 组件默认为零。在所有当前机器上,pico 是 1000 的倍数,但随着更高分辨率时钟的可用,这可能会发生变化。
函数参数,例如,当前时间字符串的时间参数,接受更通用的时间值格式,可以是 Lisp 时间戳、当前时间的 nil、秒的单个浮点数或列表 ( high low micro) 或 (high low),它是一个截断的列表时间戳,缺少的元素被视为零。
时间值可以与日历和其他形式相互转换。其中一些转换依赖于限制可能时间值范围的操作系统功能,如果超出限制,则会发出错误信号,例如 @code{指定时间不可表示} 。例如,系统可能不支持 1970 年之前的年份、1901 年之前的年份或遥远的未来年份。您可以使用 format-time-string 将时间值转换为人类可读的字符串,使用 time-convert 将时间值转换为 Lisp 时间戳,并使用 decode-time 和 float-time 将其转换为其他形式。这些功能将在以下部分中描述。
@lisp
Function: current-time-string &optional time zone ¶
@end lisp
此函数将当前时间和日期作为人类可读的字符串返回。字符串的初始部分的格式没有变化,其中包含按顺序排列的星期几、月份、月份中的日期和时间:用于这些字段的字符数始终相同,尽管(除非无论语言环境如何,您都需要英文工作日或月份缩写)通常使用格式时间字符串比从当前时间字符串的输出中提取字段更方便,因为年份可能不完全是四位数字,以及其他信息可能有一天会在最后添加。
如果给定参数时间,则指定要格式化的时间,而不是当前时间。可选参数 zone 默认为当前时区规则。请参阅时区规则。操作系统限制时间和区域值的范围。
@lisp
(current-time-string)
⇒ "Fri Nov 1 15:59:49 2019"
@end lisp
@lisp
Function: current-time ¶
@end lisp
此函数以 Lisp 时间戳的形式返回当前时间。尽管时间戳在当前 Emacs 版本中采用(高低微 pico)形式,但计划在未来的 Emacs 版本中进行更改。您可以使用 time-convert 函数将时间戳转换为其他形式。请参阅时间转换。
@lisp
Function: float-time &optional time ¶
@end lisp
此函数将当前时间作为自纪元以来的浮点秒数返回。如果给定可选参数 time,则指定要转换的时间而不是当前时间。
警告:由于结果是浮点数,因此可能不准确。如果需要精确的时间戳,请勿使用此功能。例如,在典型系统上(浮点时间 '(1 . 10))显示为 '0.1' 但略大于 1/10。
time-to-seconds 是此函数的别名。
脚注
(27)
当前 hz 应该至少为 65536 以避免在将时间戳传递给标准函数时出现兼容性警告,因为以前版本的 Emacs 由于向后兼容性问题会以不同方式解释此类时间戳。这些警告旨在在未来的 Emacs 版本中删除。
@node 416 时区规则
@section 41.6 时区规则
默认时区由 TZ 环境变量确定。请参阅操作系统环境。例如,您可以使用 (setenv "TZ" "UTC0") 告诉 Emacs 默认为世界时。如果 TZ 不在环境中,Emacs 使用系统挂钟时间,这是一个依赖于平台的默认时区。
支持的 TZ 字符串集取决于系统。GNU 和许多其他系统支持 tzdata 数据库,例如,'"America/New@math{_York}"' 指定纽约市附近位置的时区和夏令时历史。GNU 和大多数其他系统支持 POSIX 样式的 TZ 字符串,例如,'"EST+5EDT,M4.1.0/2,M10.5.0/2"' 指定纽约从 1987 年到 2006 年使用的规则。所有系统都支持该字符串'"UTC0"' 表示世界时。
与本地时间相互转换的函数接受可选的时区规则参数,该参数指定转换的时区和夏令时历史。如果时区规则被省略或为零,则转换使用 Emacs 的默认时区。如果是 t,则转换使用世界时。如果是 wall,则转换使用系统挂钟时间。如果是字符串,则转换使用相当于将 TZ 设置为该字符串的时区规则。如果它是一个列表(偏移量缩写),其中偏移量是世界时间以东的整数秒数,而缩写是一个字符串,则转换使用具有给定偏移量和缩写的固定时区。整数偏移量被视为 (offset abbr),其中 abbr 是 POSIX 兼容平台上的数字缩写,在 MS-Windows 上未指定。
@lisp
Function: current-time-zone &optional time zone ¶
@end lisp
此函数返回一个描述用户所在时区的列表。
该值的形式为(偏移缩写)。这里的 offset 是一个整数,表示世界时间(格林威治以东)之前的秒数。负值表示格林威治以西。第二个元素 abbr 是一个字符串,它给出了时区的缩写,例如, @code{CST} 代表中国标准时间或美国中部标准时间。当夏令时开始或结束时,这两个元素都可以改变; 如果用户指定了不使用季节性时间调整的时区,则该值在时间上是恒定的。
如果操作系统没有提供计算该值所需的所有信息,则列表的未知元素为零。
如果给定参数时间,则指定要分析的时间值而不是当前时间。可选参数 zone 默认为当前时区规则。操作系统限制时间和区域值的范围。
@node 417 时间转换
@section 41.7 时间转换
这些函数将时间值(参见时间)转换为 Lisp 时间戳,或转换为日历信息,反之亦然。
许多 32 位操作系统仅限于在其秒组件中包含 32 位信息的系统时间; 这些系统通常只处理从 1901-12-13 20:45:52 到 2038-01-19 03:14:07 世界时的时间。但是,64 位和一些 32 位操作系统具有更大的秒组件,并且可以表示过去或未来的时间。