-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtutor-sc.txt
1054 lines (681 loc) · 40.7 KB
/
tutor-sc.txt
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
===============================================================================
欢 迎 来 到 E m a c s E v i l 中 文 教 程
* * *
版本 2.2
===============================================================================
太长不看:按 C-j (CTRL+j) 以直接跳至第 1 讲。
本教程大约花费 40 分钟。
* * *
Evil 是一个强大的 Vim 模拟,具有很多功能,
多到很难在这样的一个教程中解释。
此教程仅描述足够范围的功能,
使你可以轻松使用 Evil 加强的 Emacs 作为一个全用途的编辑器,
顺便掌握 Vim 类编辑器(及其他软件)共有的基本操作方法。
完成本教程的大致时间是 32-40 分钟。
请牢记,此教程是实践式的。
这意味着你需要真的执行操作以正确地学习它们。
若你只读不用,你会忘记那些操作!
不用担心文件被修改,这里就是专门给你练习用的。
现在,确保你的大写锁定没有打开,然后
按 j 键足够多次来移动光标,直到
第 1 讲第 1 节的内容完全充满屏幕。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 1 讲第 1 节:移动光标
1. 首先,想像着键盘上的 hjkl 被扭曲成这样:
k
h l
j
2. 据上面所示的方位(k上 j下 h左 l右),
按 h,j,k,l 键在屏幕上到处移动光标,直到你感到适应。
3. 按住 j,直到光标快速移动。
---> 现在你知道怎么移动到下一节了
移动至第 1 讲第 2 节。
注:也可使用方向键(上下左右键),
但只要你习惯了用 hjkl 移动,
由于它就在标准指法的右手下面,它会快得多。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 1 讲第 2 节:按键表示
在 Emacs 中有如下几种组合键:
C- 表示 Ctrl,
M- 表示 Meta(或称为 Alt),
s- 表示 super(或称为徽标键),
S- 表示 Shift(但一般用大写字母表示,因为输入大写字母
时需要按住 Shift,例如 C-J 表示 Ctrl+Shift+j )。
---> 在本教程中,C-j 和 C-k 被用于快速导航。
试着用它们在各节之间切换。
在 Emacs 中:
RET 即 <Return> ,回车键,此键也常被标注为 <Enter> 。
DEL 即删除键,但它并不是删除右侧字符的 delete,而是退格键 backspace。
现在移动至下一节。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 1 讲第 3 节:普通状态
Evil 的基本思想是,在各状态(state)间按需灵活切换,
顺序组合式地完成各种编辑操作。
其中,最重要的状态是普通状态(normal state),
你之前学习 hjkl 移动光标的方法时,也处于此状态。
1.1) 现在按 C-v 2k。
2) 你可能不知道这是什么意思,
没关系,现在按 <ESC> 来回到普通状态。
2. 再重复一次第 1 步,但这次使用 C-[ 代替 <ESC> 。
说明:C-[ 在 Evil 与 Vim 中均等效于 <ESC> 。
推荐一直使用 C-[ 代替 <ESC> ,但之后不会再提示。
请牢记,几乎所有的 Evil 状态(包括普通状态本身)
都可以用一个或多个 <ESC> 来将你带回普通状态,
这在你不知道自己处于什么状态、陷入困惑时很有用处。
上文“几乎所有”的例外情况即 emacs 状态,
此状态的作用是暂时“关闭”Evil 并完全使用 Emacs 的原生键位。
在 emacs 状态下,使用 <ESC> 不会将你带回普通状态。
你可以使用 C-z 来回切换 emacs 状态。
此外,你可能还需要 C-g,它是 Emacs 的原生键位。
在“脱困”这件事上,C-g 有时可以替代 ESC,
有时则能做到 ESC 做不到的事
(比如当你运行一个死循环命令导致 Emacs 卡住时)。
|
| “状态”在 Vim 中原本称为“模式”(mode),
| 但 Emacs 中也有“模式”(主模式和辅模式)。
| 这两种“模式”的功能与用法完全不同,
| 所以 Evil 才改称为了“状态”以避免混淆。
|
4. 现在移动至本讲小结。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 1 讲 小结
1. 移动光标的方法是使用方向键或 hjkl 键。
k (上)
h (左) l (右)
j (下)
2. 组合键:
C- 表示 Ctrl,
M- 表示 Meta,
s- 表示 super,
S- 表示 Shift。
3. RET 即 <Return> ,回车键。
DEL 即删除键(对应键盘上的退格键 backspace)。
4. 按 <ESC> 或 C-[ 会使你要么处于普通状态,
要么取消一个不想要的、未完成的操作或命令。
C-g 也有类似的脱困能力。
现在移动至第 2 讲。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 2 讲第 1 节:Emacs 的退出
1. 在执行下面任何一步之前,先完整阅读此步骤的内容!!
1) 按 <ESC> 键,这样可以确保你处于普通状态。
2) 输入此命令来退出 Emacs:
:qa! <Return>
3) 在退出之后,回到 Emacs 并恢复你的教程会话。
方法和你进入此教程的方法一致。
比如,你可以先打开 Emacs,再键入 M-x evil-tutor-sc-start 。
或者,若你之前是在终端里通过 eviltutor 命令进入的,则这次也一样。
2. 若你自信已经记住了这些步骤,执行第 1 步。
说明:当你在普通状态下输入 : 之后,会进入命令状态(command state)。
之后输入的 q 代表退出(quit)编辑器,
a 代表适用于所有(all)文件,
! 代表不保存而直接退出。
若你想保存,可以先写入(write)改动再退出。其操作为:
:wqa <Return>
提示:你注意到括号里单词的首字母了吗?
很多时候,它恰好对应着操作指令,如 quit(退出)对应 :q 。
这会帮你更好地理解与记忆。
(当然,并不总是如此,比如删除单个字符的 x。)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 2 讲第 2 节:文本编辑 - 删除
** 处于普通状态下,按 x 来删除光标下的字符。 **
1. 将光标移动到下面以“--->”开头的行。
2. 为了修复错误,
1) 将光标移动到要删除的字符上。
2) 按 x 键来删除不需要的字符。
3. 重复第 2 步,直到句子变得正确。
---> 那头奶奶奶牛跃跃过了了月亮亮亮。
5. 如果这一行已经变得正确了,移动至下一讲。
提示:在你进行此教程时,不应死记硬背,而是通过实践来学习。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 2 讲第 3 节:文本编辑 - 插入
** 在普通状态下,按 i 键来插入(insert)文本。 **
1. 将光标移动到下面第一个以“--->”开头的行。
2. 为了使第一行与第二行相同,
1) 将光标移动到想要插入文本的那个位置
之后的第一个字符上。
2) 按 i 键进入插入(insert)状态,再输入必要文字。
3) 当所有错误都被修复,按 <ESC> 键以回到普通状态。
3. 重复第 2 步以更正此句子。
---> There is text misng this .
---> There is some text missing from this line.
(译:此行有某些消失的文本。)
5. 当你已经适应了插入文本的操作,移动至下面的小结。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 2 讲 小结
1. 要退出 Emacs,键入 <ESC> :qa! <Return> 以丢弃所有改动。
或键入 <ESC> :wqa <Return> 以保存所有改动。
2. 在普通状态下要删除光标下的字符,按 x 键。
3. 在普通状态下,要在光标之前插入文本,
按 i 键,输入所需文本,再按 <ESC> 键。
现在从第 3 讲继续。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 3 讲第 1 节:操作符 - 删除
** 按 dw 以删除(delete)到一个单词(word)的末尾。 **
1. 按 <ESC> 以确保你处于普通状态。
2. 将光标移动到下面以“--->”开头的行。
3. 将光标移动到第一个需要被删除的单词的开头。
4. 按 dw 让这个单词消失。
注:字母 dw 在你打出它们时,将显示在屏幕的最后一行上。
若你进行了某些错误的输入,按 u 然后重来。
---> 这里 有 一个 一些 单词 有趣的 不属于 纸张 这个 句子。
5. 重复第 3~4 步,直到此句子已修正,
然后移动到第 2 节。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 3 讲第 2 节:操作符的更多用法
** 按 d$ 以删除到行尾。 **
1. 按 <ESC> 以确保你处于普通状态。
2. 将光标移动到下面以“--->”开头的行。
3. 将光标移至行内正确部分的结尾(在第一个句号之后)。
4. 按 d$ 以删除到行尾。
注:其实直接用 D(注意这里是大写,所以要按 Shift+d )更加方便。
---> 有人将这行句子的末尾输入了两次。输入了两次。
5. 移动至下一节来了解发生了什么。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 3 讲第 3 节:操作符与动作
实际上,d 是一类特殊的操作之一,称为操作符(operator),
它作用于用动作(motion)表示的对象上,格式如下:
[数字] d 动作 或者 d [数字] 动作
注:“[数字]”的方括号表示可选。
其中:
数字 - 执行操作的重复次数(默认为 1)。
d - 操作符“删除”。
动作 - 操作符的施加对象(解释如下)。
动作之所以能代表对象,是因为它从光标出发进行了特定移动,从而“划分”出对象。
动作也由按键表示。一份简单的动作列表如下:
w - 从光标到单词(word)末尾。(dw 包括词后空格。)
e - 从光标到单词末位(end)字符上。(de 不包括词后空格。)
$ - 从光标到行尾。
|
| 与它们相逆的动作:
| b - 反向找到单词开头(begin)。
| ge - 反向找到单词末尾(goto end)。
| 0 - 反向找到本行开头。
| ^ - 反向找到本行第一个非空格、非制表符的开头。
|
| 另外还有 B、W、E、gE ,作为对应动作的大写版本,
| 它们划分的单词(WORD)范围也更大。
|
注:为加深理解,请在普通状态下仅输入动作,而不输入操作,
比如只按 w 。这会如动作列表中所说的那样移动光标。
注:进一步地,你可能会想到,
我们一开始就学习的 hjkl 移动方式,莫非也是动作吗?
答案是,是的!你现在就可以搭配操作符来试试效果,
比如将光标移至下面的第一行并按 d2j:
1) 这是第一行,待删除。
2) 这是第二行,待删除。
3) 这是第三行,待删除。
4) 这是第四行,应保留。
现在移动至下一节。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 3 讲第 4 节:一种特殊的操作符语法
** 按 dd 以删除整行。 **
考虑到整行删除的常用性,Vi 的设计者(进而是 Vim 与 Evil 的)决定
一次按两个 d 来删除一行会更容易。
1. 将光标移至下列短语的第 2 行。
2. 按 dd 以删除此行。
3. 现在移至第 4 行。
4. 按 2dd 来删除这两行。
(“数字-操作符-动作”,这里 dd 既是操作符,也暗含动作“整行”)
1) 玫红火艳,
2) 泥趣无边,
3) 香堇紫然。
4) 吾有车驾。
5) 钟报时刻,
6) 饴甜似蜜,
7) 亦复如君。
注:虽然含义不同,2dd 与 dj 的效果是一致的。
现在移动至下一节。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 3 讲第 5 节:撤销(undo)
** 按 u 撤销上一个操作 **
1. 将光标移动到下面以“--->”开头的行内的第一个错误上。
2. 按 x 删除第一个不想要的字符。
3. 现在按 u 来撤销上一个被执行的操作。
4. 这次,使用 x 修复行内的所有错误。
5. 现在,按 u 几次,来撤销刚才的所有操作。
6. 现在按几次 C-r(按住 Ctrl 再按一下 R)来
执行重做(redo)操作(“撤销前面的撤销”)。
注:目前 Evil 已经取消对 undo-tree 的强制依赖,
这意味着,若你想要执行重做操作,则在 Emacs 的配置中,
你需要在加载 evil 之前妥善设置 evil-undo-system 的变量值,
例如: (setq evil-undo-system 'undo-redo)
---> 修修复这行的错误并并并用撤销来重置它它它们。
7. 这是很有用的操作。现在移动至本讲总结。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 3 讲 小结
1. 在普通状态下,一个操作符的格式是:
[数字] 操作符 动作 或者 操作符 [数字] 动作
其中:
数字 - 执行操作的重复次数。
操作符 - 一类特殊的操作,比如 d 代表删除。
动作 - 操作符施加的对象。
2. 目前已经学到的动作:
h 左
l 右
j 下
k 上
w 至单词末尾(反向动作: b )
e 至单词末位字符(反向动作: ge )
$ 至行尾(反向动作: 0 或 ^ )
3. 在上述基础上,可进行各种删除操作。
比如,从光标删除至单词末尾:dw
从光标删除至行尾:d$
4. 删除整行:dd
这是一种特殊的操作符使用方法,不指定额外动作。
5. 要撤销之前的动作:u
要“撤销之前的撤销”(即重做):C-r
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 4 讲第 1 节:放置(put)操作
** 按 p 以将上一次删除的放置(put)在光标之后。 **
** 按 P 以将上一次删除的放置(put)在光标之前。 **
1. 将光标移至下面一组文字的第一行。
2. 1) 按 dd 以删除此行。
说明:现在可以告诉你:
使用操作符 d 删除的内容,实际上并不是完全消失了!
而是会被保存至 Emacs 的移除环(kill ring,有点类似于剪贴板)的首位。
2) 将光标移至想要放置此行的位置的上面一行,
按 p 放置移除环首位的内容,即刚才删掉的那一行。
(或者,你也可以将光标移至想要放置此行的位置的上面一行,再按 P)
3. 重复第 2 步,直到所有行都被放置为正确的顺序。
d) 君亦能习乎?
b) 香堇蓝紫然。
c) 智由学中得,
a) 玫红火艳艳,
注:除操作符 d 以外,会将内容保存到移除环首位的,
还有用于直接删除的 x,以及
后面会学到的操作符 y、c 等等。
|
| 既然是移除“环”,而不是普通的剪贴板,区别体现在哪里呢?
| 作为拓展,你可以试着在粘贴后,按几次 C-n 或 C-p,
| 这样被粘贴的部分就会切换成“环”中之前或之后的元素。
|
| 另一个拓展是“寄存器”(register)。
| 在涉及到剪贴板的操作之前,加 "<寄存器> 来指定寄存器。
| 比如,先按 "mx ,就会将光标下的字符同时剪切到寄存器 m 与移除环中;
| 再按 yy,此时移除环的首位会变成当前行的内容,但寄存器 m 的内容仍未变化。
| 此时只要按 "mp ,就会将寄存器 m(而不是移除环的首位)的内容粘贴出来。
|
| <寄存器> 可以是字母、数字及部分字符。
| 在 Vim 中就用寄存器 + 表示系统剪贴板,需要指定它来与系统剪贴板互动。
| 不过在 Emacs 中,移除环的首位默认已经与系统剪贴板互通了,不必那样做。
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 4 讲第 2 节:替换(replace)操作
** 按 r 和某个字符来替换(replace)光标下的字符。 **
1. 将光标移动到下面第一个以“--->”开头的行。
2. 1) 将光标置于第一个错误上。
2) 按 r 然后再按对应的字符以修正错误。
3. 重复第 2 步直到第一行被修正。
---> Whan this lime was tuoed in, someone presswd some wrojg keys!
---> When this line was typed in, someone pressed some wrong keys!
(译:当这行被输入时,有人按了某些错误的按键!)
4. 现在移动至第 3 节。
注:记住,你应当通过使用来学习,而不是仅靠记忆。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 4 讲第 3 节:操作符 - 更改(change)
** 按 ce 来更改(change)某个单词的部分或全部。 **
1. 将光标移动到下面第一个以“--->”开头的行。
2. 将光标置于 lubw 的 u 上。
3. 1) 按 ce ,再修补单词(在此情形下,输入“ine”)。
2) 按 <ESC> 并移至下一处错误(即应当被更改的部分的第一个字符)上。
4. 重复第 3 步,直到第一句与第二句相同。
---> This lubw has a few wptfd that mrrf changing usf the change command.
---> This line has a few words that need changing using the change command.
(译:这行有一些单词需要使用更改操作来更改。)
注意 ce 不仅替换了单词,也使你进入了插入状态。
** 讨论 **
在上面的例子中,实际上 cw 与 ce 的效果是一致的,而 dw 与 de 却不同。
你可能会感到疑惑:同一操作符不同动作的效果为什么有时会一致呢?
这就需要你从 w 即 word 的语义上进行理解了:
cw 是 change word,而 dw 是 delete word。
举一个实际的例子,假设你需要对下面两句进行单词的删改:
---> 1) The car is running.
---> 2) She car is running.
若你将光标分别放置在各句的字符 c 上,
再对 1) 输入 cw man,对 2) 输入 dw ,
那么在 Vim(进而是 Evil)原本的设计下,你会得到:
---> 1) The man is running.
---> 2) She is running.
很自然,是不是?
但是,假如你这次进行相同的操作,却改用另一种设计,
其中 cw 是连同空格一起修改的,而 dw 不会修改空格,那么你会得到:
---> 1) The manis running.
---> 2) She is running.
可见,第一句少了空格,第二句多了空格。
更有意思的是,cw 和 ce 也并不总是效果一致:
dw 和 cw 都可以删改连续空格,
de 和 ce 却会连同空格之后的单词一起删掉。
现在请你试试修复下面两行(记住你可以随时按 u 撤销):
---> 只用 dw 来移除 这一行的 多余空格。
---> 只用 de 来移除这一行的多余空格 空格格,以及字符 符。
总之,即使我们不应当说“这绝对百分之百亿是最好的方案”,
上述例子也应当能让你直观地理解到这种设计的恰到好处。
|
| cl 的效果相当于默认配置下的 s;
| 但是,在某些配置中,s 可能会被更实用的功能占用,
| 此时 cl 就变成了原来的 s 的一个实用替代。
|
现在移动至第 4 节。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 4 讲第 4 节:操作符的更多用法,但是以 c 为例
** 作为操作符,更改是要与动作一起使用的。 **
1. c 作为操作符“更改”,也满足操作符语法:
[数字] c 动作 或 c [数字] 动作
2. 可用的动作也是相同的,比如 w(单词,word)、$(至行尾)等。
3. 移动到下面第一个以“--->”开头的行。
4. 将光标移至第一处错误上。
5. 按 c$ 以使得行内的剩余部分与第二行相同,并按 <ESC> 。
注:其实直接用 C(注意这里是大写,所以要按 Shift+c)更加方便。
---> The end of this line needs some help to make it like the second.
---> The end of this line needs to be corrected using the c$ command.
(译:这行的末尾需要使用 c$ 操作来修正。)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 4 讲 小结
1. 为了重新放置被删除的文本(实际上是移除环 kill ring 的首位),
按 p,这会将被删除的文本放置(put)在光标之后。
(若被删的是某一行,它会出现在光标的下一行)。
按 P,这会将被删除的文本放置(put)在光标之前。
(若被删的是某一行,它会出现在光标的上一行)。
2. 要替换(replace)光标下的一个字符,
按 r,再按要替换原字符的新字符。
3. 更改(change)操作允许你更改指定的动作,从光标至动作某尾。
例如,按 cw 更改从光标之后的整个单词(change word),
c$ 从光标至行尾进行更改。
4. 新的操作符: c ,代表“更改”。
现在进入下一讲。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 5 讲第 1 节:缓冲区(buffer)
** 输入 :ls 打开缓冲区列表以供查看与切换。 **
Emacs 把每个编辑中的文件都放在“缓冲区(buffer)”。
每编辑一个文件,Emacs 就在其内部开辟一个缓冲区。
1. 执行下面任何一步之前,先完整阅读此步骤内容!!
1) 输入 :ls ,这会列出当前所有缓冲区的列表。
2) 按 j 与 k 来上下移动光标,再用 <Return> 切换到光标所指的缓冲区。
2. 重复几次第 1 步,
尝试随便访问若干个缓冲区,最后再返回本教程所在的缓冲区。
注:特殊缓冲区会用星号 * 标记,它们并不对应任何编辑中的文件。
例如,缓冲区列表本身,就是一种特殊缓冲区。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 5 讲第 2 节:缓冲区内的快速移动
** 按 gg 以移动(goto)至一个缓冲区的开头。
按 G 以移动至一个缓冲区的结尾。 **
1. 在执行下面任何一步之前,先完整阅读本步骤内容!!
1) 为了之后能回来,记住你现在所在的行号(即第几行)。
说明:在 Emacs 底部的状态栏一般会给出行号
(在移动光标时你可以观察到它的变化);
Emacs 也可被配置为在侧边显示每行的行号;
但是,如果你依然不确定当前行号——
好吧,你可以输入 :nu 。
2) 按 G 以移至缓冲区的结尾。
3) 按 gg 以移至缓冲区的开头。
4) 输入 :<行号> ,其中行号是你在第 1. 1) 步记住的,再按 <Return>,
这将使你回到你在第 1. 2) 步之前所处的行。
2. 如果你已经有了做这个的信心,执行第 1 步。
注: :<行号> 可以将你带到指定的行;
实际上 <行号>gg 与 <行号>G 一样可以。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 5 讲第 3 节:搜索命令
** 按 / 再加某个短语来搜索这个短语。 **
1. 在普通状态下按 / 。注意 / 和光标都会出现在屏幕底部(类似于命令状态)。
2. 现在输入 errroor 再按 <Return> 。这是你要搜索的单词。
3. 为了再次搜索相同单词,按 n 。
为了反向搜索相同单词,按 N 。
4. 如果你想向上搜索一个单词,使用 ? 而不是 / 。
---> 当搜索到达了缓冲区的末尾,它将从开头继续。
"errroor" 不是拼写 error 的正确方法;errroor 是一个 error Error。
注:evil 默认为全小写的搜索忽略大小写;
若你需要大小写敏感,可在末尾加 \C ,例如 /error\C
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 5 讲第 4 节:匹配括号(parentheses)搜索动作
** 输入 % 以查找匹配的“)”、“]”或“}” **
1. 将光标移动到下面以“--->”开头的行内的任一括号如“(”、“[”、“{”上。
2. 现在输入 % 字符。
3. 现在光标应当位于匹配的括号上。
4. 输入 % 来将光标移动回第一个括号上(通过匹配)。
---> 这 ( 是一个测试行,具有 (、[、] 和 {、} 在其中。))
5. 注意,这也是一种动作,所以你可以搭配操作符,
比如在某个括号上依次输入 y%jp 。
注:这在调试一个程序中的未匹配括号时非常有用(包括 elisp)!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 5 讲第 5 节:查找(find)或移到(to)字符动作
** 利用 f F t T 来到达指定字符。 **
本节将介绍四种行内搜索的动作:f<字符> F<字符> t<字符> T<字符> 。
1. 将光标移动到下面以“--->”开头的行的开头。
---> An apple is a good friend to your daily health. Okay, maybe.
(译:苹果是你每日健康的好朋友。好吧,可能是。)
2. 输入 fa ,你会发现光标移动到了它之后行内的第一个“a”即 apple 上。
3. f<字符> 是一种动作,你应该还记得,动作可以搭配数字。
比如现在输入 3fa ,
你会发现光标移动到了它之后行内的第三个“a”即 health 上。
4. 现在,你可以将 f 换成 F(数字和目标也可以换,比如 2Fa 、4Fe 等),
再试几次。你会发现移动的方向反过来了。
5. 同理,现在换成 t 试几次。
你会发现它和 f 类似,但是移动的位置刚好离目标差一个字符。
6. 同理,再换成 T 试几次,它的方向和 t 同理也是相反的。
注:这四种动作当然也是可以搭配操作符的,比如,
将光标移至下面第一行的第二个 I 上,输入 c2fc 或 c3tc ,然后修正句子:
---> IIIIt iiiisssss sooo cccold, isn't it?
---> It was so cold, isn't it?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 5 讲第 6 节:批量替换的一种方法
** 输入 :s/old/new/g 以将“old”替换(substitute)为“new”。 **
1. 将光标移动到下面以“--->”开头的行。
2. 输入 :s/thee/the <Return>
注意,此命令仅更改行内第一个匹配的对象。
3. 现在输入 :s/thee/the/g ,其中 g 表示在行内全局(global)范围内适用。
此命令更改行内所有匹配的对象。
---> thee best time to see thee flowers is in thee spring.
(译:赏花的最佳时机是春天。)
4. 为了更改两行之间的所有字符串,
输入 :#,#s/old/new/g ,其中 #,# 是这两行的行号。
输入 :%s/old/new/g 以更改整个缓冲区内的所有匹配对象。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 5 讲 小结
1. 输入 :ls 打开缓冲区列表以供查看与切换。
2. gg 移动至缓冲区的开头,
G 移动至缓冲区的结尾,
: 后加一个行号再按 <Return> 移动到对应行。
注:直接输入行号后按 gg 或 G 亦可。例如 32G 移动至第 32 行。
3. 输入 / 后跟一个短语,来向下搜索此短语。
输入 ? 后跟一个短语,来向上搜索此短语。
在一次搜索之后,输入 n 同方向查找下一处,
输入 N 反方向查找下一处。
4. 新的动作:
输入 % ,当光标在某个括号“(”“)”“[”“]”“{”“}”上时,
定位它匹配的另一个。
5. 新的动作:利用 f F t T 后加字符,可以到达此字符附近。
6. 为了将行内第一个 old 替换为 new,输入 :s/old/new
为了将行内的所有 old 替换为 new,输入 :s/old/new/g
为了将两行 # 之间所有 old 替换为 new,输入 :#,#s/old/new/g
为了将文件中内所有 old 替换为 new,输入 :%s/old/new/g
为了每次询问是否确认,添加“c”,即 :%s/old/new/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 6 讲第 1 节:怎样执行一个外部命令
** 输入 :! 后跟一个外部命令来执行此命令。 **
1. 输入我们已经熟悉的 : ,将光标置于屏幕底部。
这使你进入命令状态,可以输入一个命令(记住我们之前已多次使用过
这个,比如移动到缓冲区中对应的行号。)
2. 现在输入 ! (英文感叹号)字符。这允许你执行任何外部 shell 命令。
3. 作为一个例子,在 ! 之后输入 ls ,再按 <Return>。
这将向你展示你的目录的一个列表,正如你在 shell 提示符中的那样。
如果 ls 没有用,可以使用 :!dir (在 Windows 上)。
---> 注:几乎所有外部命令都可以这样执行。
---> 注:所有 : 命令都必须用 <Return> 确认执行,之后不再提示。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 6 讲第 2 节:再谈写入(write)文件,及编辑(edit)文件
** 为了保存对文件的更改,输入 :w 文件名 **
1. 输入 :!ls 或 :!dir 以得到你的目录的一个列表。
你已经知道你必须在之后按 <Return>。
2. 选择一个尚不存在的文件名,比如 TEST。
3. 现在输入 :w TEST (其中 TEST 是你选择的文件名)。
4. 这将以名字 TEST 写入(或者说“另存为”)整个文件。
为了验证这点,再次输入 :!ls 或 :!dir 来查看你的目录。
5. 现在输入 :e TE ,其中 TE 指 TEST 的前一部分。
再按 C-d 或 <TAB> 来进行补全:
你会发现输入区附近出现了一个全部以 TE 开头的补全列表,
或者 TEST 直接被补全(如果可以补全的选项是唯一的)。
注:这种补全在命令状态下是通用的,请多多利用。之后不会再提示。
此外,Emacs 也可被配置为
在自动补全的列表中使用 C-n 与 C-p 来上下移动选择,
再使用 RET 确认。
6. 利用上一步的补全来完成命令的完整输入,使其变成 :e TEST ,
然后按回车来编辑(edit)或者说打开这个名为 TEST 的新文件。
它的内容正是本教程的工作文件在你保存之前的最后的样子。
你可以对此新文件进行任意编辑,并且也可以输入 :w 以保存,
而不影响本教程的工作文件。
7. 现在输入 :bd! 来不加确认地删除(delete)
用于打开此新文件的缓冲区(buffer),
这会自动回到本教程的工作文件的缓冲区。
(如果没有,你应当知道怎么切换。)
8. 现在,在磁盘上删除此新文件,为此输入:
在(类)Unix 上: :!rm TEST
在 Windows 上: :!del TEST
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 6 讲第 3 节:一个选择性的写入命令
** 为了保存文件的一部分,输入 v 动作 :w 文件名 **
1. 再次,输入 :!ls 或 :!dir 以获得你的目录的一个列表,
并选择一个适当的文件名比如 TEST。
2. 按 C-k 以将光标移动至此节的第一行,按 V(注意大写);
3. 按 C-j 以将光标移动至此节的最后一行,现在你选中了一个区域。
4. 按 :
此时在屏幕底部,你可以看到 :'<,'>
再输入 w TEST ,其中 TEST 是你的文件名。
这样,命令就变成了 :'<,'>w TEST 。按回车确认。
于是你就保存了选中区域到指定文件 TEST 中。
5. 再次,使用 :!ls 或 :!dir 以查看文件确实在那里。
(但现在不要删除它。)
注:按 v 进入可视状态
( V 则是以行为单位的可视状态,C-v 是矩形可视状态),
此时你可以移动光标来选中一个区域,之后使用操作符做一些操作,
比如用 d 删除文本。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 6 讲第 4 节:取出(retrieving)与合并(merging)文件
** 为了插入一个文件的内容,输入 :r 文件名 **
1. 输入 :!ls 或 :!dir 来确保你的 TEST 文件从之前至现在依然存在。
2. 将光标置于这一节的顶部。
注:在执行第 3 步后,你将看到第 6 讲第 3 节。
在这之后向下移动至本节!
3. 现在取出(retrieve)你的 TEST 文件,为此使用命令 :r TEST 。
注:你取出的文件的开头被置于光标之前位于的地方。
4. 为了检验一个文件被取出,移回光标并注意现在已经有了
两份第 6 讲第 3 节的副本,包括原本的和文件版的。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 6 讲 小结
1. :!命令 执行一个外部命令。
一些有用的例子:
:!ls 或 :!dir - 显示一个目录列表
:!rm 或 :!del FILENAME - 删除以 FILENAME 为名的文件
2. :w FILENAME 将当前缓冲区以文件名 FILENAME 写入到磁盘中。
3. :e FILENAME 将把磁盘中的文件 FILENAME 打开到当前缓冲区中。
若此文件尚不存在,则相当于创建新文件
(但也要写入后才会出现在磁盘中)。
4. 在命令状态下可以用 C-d 或 <TAB> 补全。
5. 用 v 进入可视状态后,选中指定区域,再输入 :w FILENAME
可将此区域保存到文件 FILENAME 中。
也可对此区域使用操作符,如 d 删除区域。
( V 是以行为单位的可视状态,C-v 是矩形可视状态。)
6. :r FILENAME 取回磁盘文件 FILENAME 并将其插入
当前缓冲区的光标位置之后。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 7 讲第 1 节:打开(open)操作
** 按 o 以在光标下方打开一行,并使你处于插入状态。 **
1. 将光标移动到下面以“--->”开头的行。
2. 按 o 以在光标下方打开一行,并使你处于插入状态。
3. 现在复制以“--->”开头的行,并按 <ESC> 以退出插入状态。
---> 在按 o 之后可以看到,光标被置于打开的行,并进入插入状态。
4. 为了在光标上方打开一行,直接按大写 O 而不是小写 o 。
在下面的行试验这个。
---> 在此行上方打开一行,为此将光标移至此行并按 O 。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 7 讲第 2 节:附加(append)操作
** 按 a 以在光标之后插入操作。 **
1. 通过在普通状态下按 $ ,将光标移动到下面
第一个以“--->”开头的行的末尾。
2. 按 a 来在光标之后附加(append)文本。
(大写 A 附加到行末。)
注:如果你不使用 A 而是像之前一样使用 i 来达成
附加到行末的目标,不是不行,但会相当麻烦。
3. 现在补完第一行。也要注意,附加和插入一样会进入
插入状态,不同处仅在于插入点相对光标的位置。
---> This line will allow you to practice
---> This line will allow you to practice appending text to the end of a line.
(译:这一行允许你练习在某一行的末尾附加文本。)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 7 讲第 3 节:另一个版本的替换(replace)
** 按大写的 R 来替换多于一个的字符。 **
1. 将光标移动到下面第一个以“--->”开头的行。
2. 将光标移动到下面与以“--->”开头的第二行不同的
第一个单词(即“last”)的开头。
3. 现在按 R 来替换第一行的剩余文本,
通过在旧文本上输入,使得第一行与第二行相同。
---> To make the first line the same as the last on this page use the keys.
---> To make the first line the same as the second, type R and the new text.
(译:为了使第一行与第二行一致,输入 R 以及新的文本。)
4. 注意当你按 <ESC> 以退出时,任何未改变的文本仍然保留。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 7 讲第 4 节:复制与粘贴文本
** 使用 y 来复制文本,再用 p 来粘贴它 **
1. 将光标移动到下面第一个以“--->”开头的行,并置于"a)"后面。
2. 用 v 进入可视状态,再将光标移动至“第”上。
3. 按 y 来拉取(yank;实际上就是复制)高亮文本。
4. 将光标移至下一行的末尾: j$
5. 按 p 来放置(put;实际上就是粘贴)文本。然后输入“ 2 ”再按 <ESC>。
6. 使用可视状态来选取“项。”,用 y 复制它,用 j$ 移动至下一行行末,
再用 p 粘贴文本。
---> a) 这是第 1 项。
b)
注:你也可以将 y 作为一个操作符:
yw 复制一个单词,yy 复制一整行。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第 7 讲 小结
1. 按 o 以在光标下方打开一行,并将光标置于打开的这一行,进入插入状态。
按 O 以在光标上方打开一行,并将光标置于打开的这一行,进入插入状态。
2. 按 a 以在光标所在字符后面插入文本。
按 A 以在行末附加文本。
3. 按 R 进入替换(replace)状态,直到按 <ESC> 以退出。
4. 新的操作符: y ,可以拉取(yank,即复制)文本到移除环的首位,
而不会像 d 那样让文本消失。
5. p 放置(put,即粘贴)文本。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
结语