-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathVim-galore — по-русски.htm
More file actions
2975 lines (2973 loc) · 217 KB
/
Copy pathVim-galore — по-русски.htm
File metadata and controls
2975 lines (2973 loc) · 217 KB
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
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Vim-galore — по-русски</title>
<style>
body {
font-family: Tahoma, Helvetica, sans-serif;
font-size: 14px;
/*color: #333;*/
background: #fff;
}
h1,
h2,
h3,
h4,
h5,
h6 {
line-height: 1em;
}
code,
kbd,
pre {
font-family: "Lucida Console", Courier, monospace;
background: #e7e7e7;
}
code,
kbd {
padding: 1px 5px;
}
pre {
padding: 5px;
overflow-x: auto;
word-wrap: normal;
}
pre code {
padding: 0;
}
blockquote {
border-left: 5px solid #e7e7e7;
margin: 1em 0;
padding-left: 10px;
}
hr {
border: 0;
border-top: 1px solid #e7e7e7;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
table thead {
border-bottom: 2px solid #e7e7e7;
}
table td,
table th {
padding: 6px 13px;
border: 1px solid #e7e7e7;
}
table th {
font-weight: 700;
}
li p {
margin: .5em 0;
}
</style>
<p>
<a href="https://web.archive.org/web/20230605025202/http://givi.olnd.ru/index.shtml">Курилка</a>
</p>
<div align="center">
<a href="https://github.com/mhinz/vim-galore"><img src="data:image/png;base64,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" alt="vim-galore logo"></a>
<p style="margin: 0; color: #A9A6A6; font-family: 'Lucida Console', Consolas, monospace; font-size: 20px; letter-spacing: .1em;">
Всё, что нужно знать о Vim
</p>
<p>
Перевод с английского © <a href="https://web.archive.org/web/20230605025202/http://givi.olnd.ru/index.shtml">Гиви Хакеридзе</a>.
Оригинал: <a href="https://github.com/mhinz/vim-galore">https://github.com/mhinz/vim-galore</a>.<br>
См. также
<a href="https://web.archive.org/web/20230605025202/http://givi.olnd.ru/vim-galore/grok-vi.html">Ваша проблема с Vim заключается в том, что вы не въехали в vi</a>,
<a href="https://web.archive.org/web/20230605025202/http://givi.olnd.ru/vim-galore/vim-for-php-programmers-ru.html">Vim для (PHP-)программистов</a>.
</p>
</div>
<h3><a href="#intro-1">Введение</a></h3>
<ul>
<li><a href="#what-is-vim">Что есть Vim?</a></li>
<li><a href="#the-vim-philosophy">Философия Vim</a></li>
<li><a href="#first-steps">Первые шаги</a></li>
<li><a href="#minimal-vimrc">Минимальный vimrc</a></li>
<li><a href="#what-kind-of-vim-am-i-running">Какой именно Vim у меня работает?</a></li>
<li><a href="#cheatsheets">Читшиты (шпаргалки)</a></li>
</ul>
<h3><a href="#basics-1">Основные составляющие</a></h3>
<ul>
<li><a href="#buffers-windows-tabs">Буферы, окна, табы</a></li>
<li><a href="#active-loaded-listed-named-buffers">Активные, загруженные, списковые, именованные буферы</a></li>
<li><a href="#argument-list">Список аргументов</a></li>
<li><a href="#mappings">Мапинги</a></li>
<li><a href="#mapleader">Мап-лидер</a></li>
<li><a href="#registers">Регистры</a></li>
<li><a href="#ranges">Диапазоны</a></li>
<li><a href="#marks">Метки</a></li>
<li><a href="#completion">Автозавершение</a></li>
<li><a href="#motions-operators-text-objects">Перемещения, операторы, текстовые объекты</a></li>
<li><a href="#autocmds">Автокоманды</a></li>
<li><a href="#changelist-jumplist">Список изменений, список прыжков</a></li>
<li><a href="#undo-tree">Дерево отмены</a></li>
<li><a href="#quickfix-and-location-lists">Списки quickfix и местоположений</a></li>
<li><a href="#macros">Макро</a></li>
<li><a href="#colorschemes">Цветовые схемы</a></li>
<li><a href="#folding">Свёртка</a></li>
<li><a href="#sessions">Сессии</a></li>
<li><a href="#locality">Локальность</a></li>
</ul>
<h4><a href="#usage-1">Использование</a></h4>
<ul>
<li><a href="#getting-help-offline">Получение справки офлайн</a></li>
<li><a href="#getting-help-offline-alternative">Получение справки офлайн (альтернатива)</a></li>
<li><a href="#getting-help-online">Получение справки онлайн</a></li>
<li><a href="#autocmds-in-practice">Автокоманды на практике</a>
<ul>
<li><a href="#user-events">Пользовательские события</a></li>
<li><a href="#nested-autocmds">Вложенные автокоманды</a></li>
</ul>
</li>
<li><a href="#clipboard">Буфер обмена</a>
<ul>
<li><a href="#clipboard-usage-windows-osx">Использование буфера обмена (Windows, macOS)</a></li>
<li><a href="#clipboard-usage-linux-bsd-">Использование буфера обмена (Linux, BSD...)</a></li>
</ul>
</li>
<li><a href="#restore-cursor-position-when-opening-file">Восстановление позиции курсора при повторном открытии файла</a></li>
<li><a href="#temporary-files">Временные файлы</a>
<ul>
<li><a href="#backup-files">Файлы резервной копии</a></li>
<li><a href="#swap-files">Своп-файлы</a></li>
<li><a href="#undo-files">Файлы отмены</a></li>
<li><a href="#viminfo-files">Файлы viminfo</a></li>
<li><a href="#example-configuration-for-temporary-files">Пример конфигурации временных файлов</a></li>
</ul>
</li>
<li><a href="#editing-remote-files">Редактирование файлов на удалённом компьютере</a></li>
<li><a href="#managing-plugins">Управление плагинами</a></li>
<li><a href="#block-insert">Блочная вставка</a></li>
<li><a href="#running-external-programs-and-using-filters">Запуск внешних программ и использование фильтров</a></li>
<li><a href="#cscope">Cscope</a></li>
<li><a href="#matchit">MatchIt</a></li>
<li><a href="#true-colors">Полноцветная палитра</a></li>
</ul>
<h3><a href="#tips-1">Полезные советы</a></h3>
<ul>
<li><a href="#go-to-other-end-of-selected-text">Переход к другому концу выделенного текста</a></li>
<li><a href="#saner-behavior-of-n-and-n">Разумное поведение n и N</a></li>
<li><a href="#saner-command-line-history">Более умная история командной строки</a></li>
<li><a href="#saner-ctrl-l">Улучшите CTRL-L</a></li>
<li><a href="#disable-audible-and-visual-bells">Выключите аудио и визуальные звонки</a></li>
<li><a href="#quickly-move-current-line">Быстрое перемещение текущей строки</a></li>
<li><a href="#quickly-add-empty-lines">Быстрое добавление пустых строк</a></li>
<li><a href="#quickly-edit-your-macros">Быстрое редактирование макро</a></li>
<li><a href="#quickly-jump-to-header-or-source-file">Быстрый прыжок к заголовочному файлу или исходнику</a></li>
<li><a href="#quickly-change-font-size-in-gui">Быстрая смена размера шрифта в GUI</a></li>
<li><a href="#change-cursor-style-dependent-on-mode">Изменение стиля курсора в зависимости от режима</a></li>
<li><a href="#dont-lose-selection-when-shifting-sidewards">Не теряйте выделение при сдвиге в сторону</a></li>
<li><a href="#reload-a-file-on-saving">Перезагрузка файла при сохранении</a></li>
<li><a href="#smarter-cursorline">Более умная линия курсора</a></li>
<li><a href="#faster-keyword-completion">Более быстрое дополнение ключевых слов</a></li>
<li><a href="#cosmetic-changes-to-colorschemes">Косметические изменения в цветовых схемах</a></li>
</ul>
<h3><a href="#commands-1">Команды</a></h3>
<ul>
<li><a href="#global">:global и :vglobal</a> - Выполнение команды во всех соответствующих условию строках.</li>
<li><a href="#normal-and-execute">:normal и :execute</a> - Команда мечты скриптинга.</li>
<li><a href="#redir-and-execute">:redir и execute()</a> - Захват вывода команд.</li>
</ul>
<h3><a href="#debugging-1">Решение проблем</a></h3>
<ul>
<li><a href="#general-tips">Общие рекомендации</a></li>
<li><a href="#verbosity">Подробность сообщений</a></li>
<li><a href="#profiling-startup-time">Профилирование времени запуска</a></li>
<li><a href="#profiling-at-runtime">Профилирование во время работы</a></li>
<li><a href="#debugging-vim-scripts">Отладка скриптов Vim</a></li>
<li><a href="#debugging-syntax-files">Отладка файлов синтаксиса</a></li>
</ul>
<h3><a href="#miscellaneous-1">Разное</a></h3>
<ul>
<li><a href="#additional-resources">Дополнительные источники</a></li>
<li><a href="#vim-distributions">Дистрибутивы Vim</a></li>
<li><a href="#standard-plugins">Стандартные плагины</a></li>
<li><a href="#map-capslock-to-control">Переназначьте CapsLock на Control</a></li>
<li><a href="#generating-html-from-buffer">Создание HTML из текста в буфере</a></li>
<li><a href="#easter-eggs">Пасхальные яйца</a></li>
<li><a href="#why-hjkl-for-navigation">Почему для перемещения используются клавиши hjkl?</a></li>
</ul>
<h3><a href="#common-problems-1">Распространённые проблемы</a></h3>
<ul>
<li><a href="#editing-small-files-is-slow">Замедленное редактирование небольших файлов</a></li>
<li><a href="#editing-huge-files-is-slow">Замедленное редактирование очень больших файлов</a></li>
<li><a href="#bracketed-paste-or-why-do-i-have-to-set-paste-all-the-time">Вставка в скобках (или почему мне всё время приходится переустанавливать 'paste'?)</a></li>
<li><a href="#delays-when-using-escape-key-in-terminal">Задержки в терминале при использовании клавиши escape</a></li>
<li><a href="#function-search-undo">Сброс поиска в функции</a></li>
</ul>
<h3><a href="#technical-quirks-1">Технические особенности</a></h3>
<ul>
<li><a href="#newline-used-for-nul">Вместо NUL используется символ новой строки</a></li>
</ul>
<h3><a href="#terminology-1">Терминология</a></h3>
<ul>
<li><a href="#vim-script-vimscript-viml">Vim script? Vimscript? VimL?</a></li>
</ul>
<h3><a href="https://github.com/mhinz/vim-galore/blob/master/PLUGINS.md#colorschemes-1">Список цветовых схем</a></h3>
<h3><a href="https://github.com/mhinz/vim-galore/blob/master/PLUGINS.md">Список плагинов</a></h3>
<br>
<h1 id="intro-1">Введение</h1>
<h2 id="what-is-vim">Что есть Vim?</h2>
<p><a href="http://www.vim.org/">Vim</a> это — текстовый редактор с длинной чередой предков,
которая начинается с <a href="https://en.wikipedia.org/wiki/QED_(text_editor)">qed</a>.
Его выпустил в 1991 году Брэм Мооленаар
(<a href="https://en.wikipedia.org/wiki/Bram_Moolenaar">Bram Moolenaar</a>).</p>
<p>Адрес проекта в Интернет: <a href="http://www.vim.org/index.php">vim.org</a>.</p>
<p>Получение Vim: Используйте ваш любимый менеджер пакетов или посетите
<a href="http://www.vim.org/download.php">страницу загрузки</a> на vim.org.</p>
<p>Участвовать в обсуждении и задавать вопросы лучше всего через рассылку
<a href="https://groups.google.com/forum/#!forum/vim_use">vim_use</a> или на IRC-канале
(<a href="https://freenode.net/">Freenode</a>) <code>#vim</code>.</p>
<p>Разработка находится на <a href="https://github.com/vim/vim">Github</a>, а её обсуждение —
в списке рассылки <a href="https://groups.google.com/forum/#!forum/vim_dev">vim_dev</a>.</p>
<p>Прочитайте
<a href="http://www.viemu.com/a-why-vi-vim.html">Why, oh WHY, do those #?@! nutheads use vi?</a>,
чтобы узнать об основных заблуждениях относительно Vim
(<a href="https://habr.com/post/307084/">перевод на русский</a>).</p>
<h2 id="the-vim-philosophy">Философия Vim</h2>
<p>Vim придерживается философии модального редактирования. Это означает, что у него
есть несколько режимов, и значения клавиш меняются в зависимости от режима. Вы
перемещаетесь по файлу в <em>нормальном режиме</em>, вставляете текст в <em>режиме вставки</em>,
выделяете строки в <em>визуальном режиме</em>, выполняете команды в <em>режиме командной
строки</em>, и т.д. Поначалу это может показаться сложным, но имеет огромное преимущество:
вам не нужно калечить свои пальцы, нажимая несколько клавиш сразу, вы просто нажимаете
их одну за другой. Чем чаще задача встречается, тем меньше понадобится нажатий.</p>
<p>Другая концепция, которая хорошо проявляет при модальном редактировании, это —
операторы и перемещения.
<em>Оператор</em> начинает некое действие, например, изменение, удаление или выделение текста.
Затем при помощи <em>перемещения</em> вы указываете область текста, с которой вы хотите
работать.
Чтобы изменить всё, что находится между скобками, используйте <code>ci(</code> (читайте это как
<em>change inner
parentheses</em> — изменить внутри скобок). Чтобы удалить целый параграф текста,
используйте <code>dap</code> (<em>delete
around paragraph</em> — удалить вокруг параграфа).</p>
<p>Глядя на то, как работают продвинутые пользователи Vim, можно заметить, что они как бы
разговаривают на
<em>языке Vim</em> или похожи на пианиста, играющего на своём инструменте. Сложные
операции производятся небольшим количеством нажатий клавиш. Более того, они вообще
не думают о клавишах, т.к. об этом позаботилась
<a href="https://en.wikipedia.org/wiki/Muscle_memory">мышечная память</a>.
Это уменьшает <a href="https://en.wikipedia.org/wiki/Cognitive_load">умственную нагрузку</a>,
помогая сосредоточиться на основной задаче.</p>
<h2 id="first-steps">Первые шаги</h2>
<p>Vim поступает с интерактивным учебником, при помощи которого можно научиться основным
вещам, которые вам необходимо знать. Его можно запустить командой в оболочке
(добавьте параметр <code>ru</code>, чтобы читать учебник на русском — <em>пер.</em>):</p>
<pre><code>$ vimtutor [ru]
</code></pre>
<p>Не откладывайте, даже если он покажется вам скучным, и пройдите упражнения.
Редакторы или IDE, которые вы использовали ранее, скорее всего, были немодальными,
поэтому
работать, переключая режимы, поначалу будет казаться очень неудобным, но чем больше
использовать Vim, тем сильнее он закрепится в
<a href="https://en.wikipedia.org/wiki/Muscle_memory">мышечной памяти</a>.</p>
<p>Vim основан на <a href="https://en.wikipedia.org/wiki/Stevie_(text_editor)">Stevie</a>, клоне
<a href="https://ru.wikipedia.org/wiki/Vi">vi</a>, и поддерживает два режима работы:
«совместимый» и «несовместимый». Использование Vim в режиме
совместимости означает использование для настроек умолчаний vi, а не Vim.
Пока вы не создадите пользовательский vimrc или запускаете Vim командой <code>vim -N</code>,
подразумевается режим совместимости!
Не используйте Vim в режиме совместимости.
Просто не делайте этого.</p>
<p>Далее:</p>
<ol>
<li>Создайте свой <a href="#minimal-vimrc">vimrc</a>.</li>
<li>Первые недели держите наготове <a href="#cheatsheets">читшиты (шпаргалки)</a>.</li>
<li>Прочитайте секцию <a href="#basics-1">Основные составляющие</a>, чтобы узнать об
имеющихся возможностях.</li>
<li>Учитесь по мере необходимости!
Изучение Vim невозможно закончить (как ремонт — <em>пер</em>.).
Если вы столкнулись с проблемой, просто загляните в Интернет.
Будьте уверены, ваша проблема уже решена.
Vim имеет прекрасную документацию, и знание навигации по ней — обязательно:
<a href="#getting-help-offline">Получение справки офлайн</a>.</li>
<li>Посмотрите <a href="#additional-resources">дополнительные ресурсы</a>.</li>
</ol>
<p>И ещё один совет:
Пожалуйста, научитесь использовать Vim правильно, прежде чем начать добавлять
разрекламированные <a href="#managing-plugins">плагины</a>, которые лишь воплощают функциональность,
которая изначально есть в Vim.</p>
<h2 id="minimal-vimrc">Минимальный vimrc</h2>
<p>Пользовательский vimrc можно сохранить как <code>~/.vimrc</code> или в целях лучшей изоляции
как <code>~/.vim/vimrc</code>.
В последнем случае будет проще поместить всю конфигурацию в систему контроля версий
и загрузить её, скажем, на Github.</p>
<p>В сети можно найти много «минимальных vimrc», и, может быть, моя версия
не настолько минимальна, как могла бы быть, но в ней есть хороший набор разумных
настроек, с которого, я думаю, будет полезно начать.</p>
<p>В конце концов, вам нужно прочитать про все упомянутые настройки и сделать выбор
для себя. :-)</p>
<p>Итак, он — здесь: <a href="https://github.com/mhinz/vim-galore/blob/master/static/minimal-vimrc.vim">минимальный vimrc</a>.</p>
<p>Если вам интересно, то здесь —
<a href="https://github.com/mhinz/dotfiles/blob/master/.vim/vimrc">мой vimrc</a>.</p>
<p><strong>СОВЕТ</strong>:
Большинство авторов плагинов поддерживают не по одному плагину и дополнительно публикуют
свои vimrc на Github (часто в репозитории с названием «vim-config» или
«dotfiles»), поэтому, найдя интересный плагин, посмотрите также страницу
автора на Github и пробегитесь по репозиториям.</p>
<h2 id="what-kind-of-vim-am-i-running">Какой именно Vim у меня работает?</h2>
<p>Команда <code>:version</code> даёт всю необходимую информацию о том, как была скомпилирована
версия Vim, работающая в данный момент.</p>
<p>В первой строке выводится время компиляции и версия двоичного файла, например,
7.4. Одна из следующих строк содержит что-то вроде <code>Included patches: 1-1051</code>,
это — номер патча (правки). Таким образом, полная версия Vim —
7.4.1051.</p>
<p>Далее следует строка вроде <code>Tiny version without GUI</code>
(малая версия без GUI)
или <code>Huge version with GUI</code>
(огромная версия с GUI).
Отсюда можно узнать включена ли поддержка графического
интерфейса (GUI), например, для запуска <code>gvim</code> в оболочке или командой <code>:gui</code> в Vim,
запущенном в эмуляторе терминала.
Другая важная часть — слова <code>Tiny</code> (малая) или <code>Huge</code> (огромная).
Vim может быть скомпилирован с различным набором функциональностей: <code>tiny</code> (малый),
<code>small</code> (небольшой), <code>normal</code> (нормальный), <code>big</code> (большой) и <code>huge</code> (огромный).</p>
<p>Основная часть вывода команды <code>:version</code> занимает список функциональностей.
<code>+clipboard</code> говорит, что при компиляции была включена функциональность работы
с буфером обмена, а <code>-clipboard</code> — что она не была включена.</p>
<p>Часть функциональности можно включить только во время компиляции. Например,
для того, чтобы работала команда <code>:prof</code>, нужен Vim с установленным набором
<code>huge</code>, т.к. этот набор включает функциональность <code>+profile</code>.</p>
<p>Если это не ваш случай, и вы устанавливали Vim при помощи менеджера пакетов,
попробуйте установить пакет <code>vim-x</code>, <code>vim-x11</code>, <code>vim-gtk</code>, <code>vim-gnome</code> или похожий,
т.к. эти пакеты обычно идут с включенным набором huge.</p>
<p>Проверить версию или наличие функциональности можно и программно:</p>
<pre><code class="language-vim">" Сделать что-то, если версия Vim не меньше 7.4.42 и включена фунциональность +profile.
if (v:version > 704 || v:version == 704 && has('patch42')) && has('profile')
" сделать что-то
endif
</code></pre>
<p>Справка:</p>
<pre><code>:h :version
:h feature-list
:h +feature-list
:h has-patch
</code></pre>
<h2 id="cheatsheets">Читшиты (шпаргалки)</h2>
<ul>
<li><a href="http://people.csail.mit.edu/vgod/vim/vim-cheat-sheet-en.png">http://people.csail.mit.edu/vgod/vim/vim-cheat-sheet-en.png</a></li>
<li><a href="https://cdn.shopify.com/s/files/1/0165/4168/files/preview.png">https://cdn.shopify.com/s/files/1/0165/4168/files/preview.png</a></li>
<li><a href="http://michael.peopleofhonoronly.com/vim/vim_cheat_sheet_for_programmers_screen.png">http://michael.peopleofhonoronly.com/vim/vim_cheat_sheet_for_programmers_screen.png</a></li>
<li><a href="http://www.rosipov.com/images/posts/vim-movement-commands-cheatsheet.png">http://www.rosipov.com/images/posts/vim-movement-commands-cheatsheet.png</a></li>
</ul>
<p>Или быстро откройте читшит прямо в Vim: <a href="https://github.com/lifepillar/vim-cheat40">vim-cheat40</a>.</p>
<h1 id="basics-1">Основные составляющие</h1>
<h2 id="buffers-windows-tabs">Буферы, окна, табы</h2>
<p>Vim — текстовый редактор.
Текст, который виден на экране, является частью <strong>буфера</strong>.
Каждый файл открывается в своём собственном буфере.
Плагины отображают свою работу в своих собственных буферах. И т.д.</p>
<p>Буферы имеют много атрибутов, например, можно ли изменять текст в буфере,
или связан ли буфер с неким файлом, и его нужно синхронизировать при сохранении.</p>
<p><strong>Окна</strong> — область <em>просмотра</em> буфера. Окна используются, если необходимо
просматривать сразу несколько файлов или один в разных местах.</p>
<p>И, пожалуйста, не называйте их <em>разбиениями</em>. Можно разбить окно на два, но это
не сделает их <em>разбиениями</em>.</p>
<p>Окна можно разделить вертикально или горизонтально, можно изменять их высоту или
ширину. Т.е. расположить их так, как вам нужно.</p>
<p><strong>Страница с вкладкой</strong> (или просто таб) это — коллекция окон. Таким образом,
если нужно иметь несколько раскладок окон, используйте табы.</p>
<p>В общем, если запустить Vim без аргументов, у вас будет один таб, в котором будет
одно окно с одним буфером.</p>
<p>Кстати говоря, список буферов — глобален, и у вас есть доступ к любому буферу
из любого таба.</p>
<h2 id="active-loaded-listed-named-buffers">Активные, загруженные, списковые, именованные буферы</h2>
<p>Запустите Vim примерно так: <code>vim file1</code>. Содержимое файла будет загружено в буфер.
Теперь у вас есть <strong>загруженный буфер</strong>. Содержимое буфера синхронизируется с
диском (пишется обратно в файл) только при сохранении его в Vim.</p>
<p>Т.к. содержимое буфера показано в окне, то этот буфер ещё и <strong>активный буфер</strong>.
Теперь, если загрузить другой файл командой <code>:e file2</code>, <code>file1</code> станет <strong>скрытым
буфером</strong>, а <code>file2</code> — активным.</p>
<p>Оба буфера также — <strong>списковые</strong>, потому что они будут показаны в выводе
команды <code>:ls</code>. Буферы плагинов или справки часто помечены как несписковые, т.к.
это не обычные файлы, которые вы обычно редактируете в текстовом редакторе.
И списковые и несписковые буферы вместе можно посмотреть командой <code>:ls!</code>.</p>
<p><strong>Неименованные буферы</strong>, также часто используемые плагинами, это — буферы,
которые не ассоциированы с именем файла. Например, <code>:enew</code> создаст неименованный
пустой буфер. Добавьте некий текст и запишите его на диск командой <code>:w /tmp/foo</code>,
и он станет именованным буфером.</p>
<h2 id="argument-list">Список аргументов</h2>
<p><a href="#buffers-windows-tabs">Глобальный список буферов</a> — вещь, специфичная для Vim.
До него, в vi, использовался список аргументов, который в Vim тоже есть.</p>
<p>Каждое имя файла, переданное Vim в командной строке оболочки, запоминается в списке
аргументов. Таких списков может быть несколько: по умолчанию все аргументы
помещаются в глобальный список аргументов, но при помощи команды <code>:arglocal</code>
можно создать новый список аргументов, который будет локальным для данного окна.</p>
<p>Просмотреть текущий список аргументов можно при помощи команды <code>:args</code>.
Переключиться между файлами в списке — при помощи <code>:next</code>, <code>:previous</code>,
<code>:first</code>, <code>:last</code> и др. Изменить — при помощи <code>:argadd</code>, <code>:argdelete</code>
или <code>:args</code> со списком файлов.</p>
<p>Какой список использовать для работы с файлами, буферов или аргументов,
— дело вкуса. По моему мнению, большинство использует исключительно
список буферов.</p>
<p>И, тем не менее, есть один важный приём с использованием списка аргументов:
пакетная обработка при помощи <code>:argdo</code>! Вот пример простой переработки кода:</p>
<pre><code class="language-vim">:args **/*.[ch]
:argdo %s/foo/bar/ge | update
</code></pre>
<p>Эта команда заменяет все вхождения «foo» на «bar» во всех
исходных и заголовочных файлах на C в текущем каталоге и ниже.</p>
<p>Справка: <code>:h argument-list</code></p>
<h2 id="mappings">Мапинги</h2>
<p>(«Отображения», «переназначение клавиш» —
слишком длинно — <em>прим. пер.</em>)</p>
<p>С помощью команд семейства <code>:map</code> можно определять мапинги клавиш. Каждая команда
из этого семейства определяет мапинги для определённого набора режимов.
Технически говоря, у Vim-а 12 режимов, для 6 из которых можно использовать мапинг.
Кроме того, некоторые команды действуют для нескольких режимов.</p>
<table>
<thead>
<tr>
<th>Рекурсивный</th>
<th>Не рекурсивный</th>
<th>Отмена</th>
<th>Режимы</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>:map</code></td>
<td><code>:noremap</code></td>
<td><code>:unmap</code></td>
<td>нормальный, визуальный, ожидание-оператора</td>
</tr>
<tr>
<td><code>:nmap</code></td>
<td><code>:nnoremap</code></td>
<td><code>:nunmap</code></td>
<td>нормальный</td>
</tr>
<tr>
<td><code>:xmap</code></td>
<td><code>:xnoremap</code></td>
<td><code>:xunmap</code></td>
<td>визуальный</td>
</tr>
<tr>
<td><code>:cmap</code></td>
<td><code>:cnoremap</code></td>
<td><code>:cunmap</code></td>
<td>командная-строка</td>
</tr>
<tr>
<td><code>:omap</code></td>
<td><code>:onoremap</code></td>
<td><code>:ounmap</code></td>
<td>ожидание-оператора</td>
</tr>
<tr>
<td><code>:imap</code></td>
<td><code>:inoremap</code></td>
<td><code>:iunmap</code></td>
<td>вставка</td>
</tr>
</tbody>
</table>
<p>Например, эта команда определяет мапинг только для нормального режима:</p>
<pre><code class="language-vim">:nmap <space> :echo "foo"<cr>
</code></pre>
<p>Отменим мапинг при помощи <code>:nunmap <space></code>.</p>
<p>Чтобы узнать о некоторых более редко используемых режимах (и их комбинациях),
см. <code>:h map-modes</code>.</p>
<p>Дальше — больше. Есть одна проблема, которая может смутить новичков:
<code>:nmap</code> — рекурсивна! Т.е. правая часть команды также участвует в мапинге.</p>
<p>Допустим, был определён мапинг, который просто печатает «Foo»:</p>
<pre><code class="language-vim">:nmap b :echo "Foo"<cr>
</code></pre>
<p>Но, что если мы замапим умолчальное поведение <code>b</code> (переход на одно слово влево) на
другую клавишу?</p>
<pre><code class="language-vim">:nmap a b
</code></pre>
<p>Нажимая <kbd>a</kbd>, мы ожидаем перехода к началу предыдущего слова, но
вместо этого в командной строке печатается «Foo»! Это происходит потому,
что до этого правая часть уже была переназначена на <code>:echo "Foo"<cr></code>.</p>
<p>Правильный способ решить эту проблему — использовать <em>нерекурсивный</em> мапинг:</p>
<pre><code class="language-vim">:nnoremap a b
</code></pre>
<p>Правило: Всегда используйте нерекурсивное переназначение за исключением случаев,
когда рекурсия действительно нужна.</p>
<p>Проверяйте мапинги, запуская команду, не передавая ей правой стороны. И для
примера, <code>:nmap</code> показывает все мапинги для нормального режима, а <code>:nmap <Leader></code> — для мапингов, которые начинаются мап-лидера.</p>
<p>Если захотите запретить стандартные мапинги, переназначьте их на специальный
символ <code><nop></code>, например, <code>:noremap <left> <nop></code>.</p>
<p>Справка:</p>
<pre><code>:h key-notation
:h mapping
:h 05.3
</code></pre>
<h2 id="mapleader">Мап-лидер</h2>
<p>Мап-лидер это — просто заглушка, которая может использоваться для создания
дополнительных мапингов, по умолчанию он назначен на <code>\</code>.</p>
<pre><code class="language-vim">nnoremap <leader>h :helpgrep<space>
</code></pre>
<p>Такой мапинг вызывается командой <code>\h</code>. Если вместо этого вы хотите использовать
<code><space>h</code>:</p>
<pre><code class="language-vim">let mapleader = ' '
nnoremap <leader>h :helpgrep<space>
</code></pre>
<p>Кроме того, есть <code><LocalLeader></code>, напарник <code><Leader></code>, который предназначен
для мапингов локальных для буфера, например, для использования в плагинах для
конкретных типов файлов. По умолчанию он тоже назначен на <code>\</code>.</p>
<p><strong>NB</strong>: Изменяйте мап-лидеры до остальных мапингов! При назначении мапинга
с мап-лидером действует текущее значение <code><Leader></code>, которое не изменяется
впоследствии при изменении самого мап-лидера. <code>:nmap <Leader></code> покажет
мапинги нормального режима с лидером, который установлен
в данный момент. Поэтому дважды проверяйте ваши мапинги.</p>
<p>См. также <code>:h mapleader</code> и <code>:h maplocalleader</code>.</p>
<h2 id="registers">Регистры</h2>
<p>Регистры это — ячейки, в которых сохраняется текст. Копирование в регистр
называется <strong>yanking</strong> (вытаскивание, выдёргивание; далее будет употребляться
«копирование» — <em>прим. пер.</em>), а извлечение из регистра —
<strong>pasting</strong> (вставка).</p>
<p>У Vim-а есть следующие регистры:</p>
<table>
<thead>
<tr>
<th>Тип</th>
<th>Символ</th>
<th>Кем заполняется?</th>
<th>Только для чтения?</th>
<th>Содержит текст откуда?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Безымянный</td>
<td><code>"</code></td>
<td>vim</td>
<td>[ ]</td>
<td>Последнее копирование или удаление. (<code>d</code>, <code>c</code>, <code>s</code>, <code>x</code>, <code>y</code>)</td>
</tr>
<tr>
<td>Нумерованный</td>
<td><code>0</code> to <code>9</code></td>
<td>vim</td>
<td>[ ]</td>
<td>Регистр <code>0</code>: последнее копирование. Регистр <code>1</code>: последнее удаление. Регистр <code>2</code>: предыдущее перед последним удалением. И т.д. Представляйте регистры <code>1</code>-<code>9</code> как <a href="https://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)">очередь</a> с 9 элементами только для чтения.</td>
</tr>
<tr>
<td>Малое удаление</td>
<td><code>-</code></td>
<td>vim</td>
<td>[ ]</td>
<td>Последнее удаление, которое захватило меньше одной строки.</td>
</tr>
<tr>
<td>Именованный</td>
<td><code>a</code> to <code>z</code>, <code>A</code> to <code>Z</code></td>
<td>пользователь</td>
<td>[ ]</td>
<td>Копирование в регистр <code>a</code> замещает его текст. Копирование в регистр <code>A</code> добавляет текст в регистр <code>a</code>.</td>
</tr>
<tr>
<td>Только для чтения</td>
<td><code>:</code>, <code>.</code>, <code>%</code></td>
<td>vim</td>
<td>[x]</td>
<td><code>:</code>: последняя команда, <code>.</code>: последний вставленный текст, <code>%</code>: имя текущего файла.</td>
</tr>
<tr>
<td>Альтернативный буфер</td>
<td><code>#</code></td>
<td>vim</td>
<td>[ ]</td>
<td>Обычно — имя буфера, который просматривался ранее в этом окне. См. <code>:h alternate-file</code></td>
</tr>
<tr>
<td>Вычисление выражения</td>
<td><code>=</code></td>
<td>пользователь</td>
<td>[ ]</td>
<td>Результат вычисления выражения VimL. Например, если в режиме вставки набрать: <code><c-r>=5+5<cr></code>, то в этом буфере окажется «10».</td>
</tr>
<tr>
<td>Выделение</td>
<td><code>+</code>, <code>*</code></td>
<td>vim</td>
<td>[ ]</td>
<td><code>*</code> и <code>+</code> — регистры <a href="#clipboard">буфера обмена</a>.</td>
</tr>
<tr>
<td>Сброс</td>
<td><code>~</code></td>
<td>vim</td>
<td>[x]</td>
<td>Результат последней операции «drag'n'drop».</td>
</tr>
<tr>
<td>Чёрная дыра</td>
<td><code>_</code></td>
<td>vim</td>
<td>[ ]</td>
<td>Предназначен для того, чтобы не влиять неявно на другие регистры. Например, <code>"_dd</code> удаляет текущую строку, не изменяя регистры <code>"</code>, <code>1</code>, <code>+</code>, <code>*</code>.</td>
</tr>
<tr>
<td>Последний шаблон поиска</td>
<td><code>/</code></td>
<td>vim</td>
<td>[ ]</td>
<td>Последний шаблон, который использовался с <code>/</code>, <code>?</code>, <code>:global</code> и т.д.</td>
</tr>
</tbody>
</table>
<p>Пользователь может изменить любой регистр, который не «только для чтения»:</p>
<pre><code class="language-vim">:let @/ = 'register'
</code></pre>
<p>После этой команды <kbd>n</kbd> переместит курсор к следующему вхождению
«register».</p>
<p>Есть некоторое количество исключений, когда регистры заполняются неявно, поэтому
не забудьте прочитать <code>:h registers</code>.</p>
<p>Копируйте при помощи <code>y</code> и вставляйте при помощи <code>p</code>/<code>P</code>, но помните, что Vim
различает посимвольное и построчное визуальное выделение. См. <code>:h linewise</code>.</p>
<p><strong>Пример: построчно</strong></p>
<p><code>yy</code> (или просто <code>Y</code>) скопирует текущую строку. Переместите курсор в другое место и
используйте <code>p</code>, чтобы вставить скопированное под текущей строкой или <code>P</code>,
чтобы над.</p>
<p><strong>Пример: посимвольно</strong></p>
<p>Скопируйте первое слово в строке при помощи <code>0yw</code>, переместите курсор в другое
место, вставьте скопированное после курсора в текущей строке при помощи <code>p</code> или
перед ним при помощи <code>P</code>.</p>
<p><strong>Пример: явное указание регистра</strong></p>
<p><code>"aY</code> копирует текущую строку в регистр <code>a</code>. Перейдите на другую строку.
<code>"AY</code> добавит эту строку в регистр <code>a</code>.</p>
<p>Предлагаю немного поиграться со всеми этими регистрами, постоянно сверяясь
с <code>:reg</code>, чтобы видеть что на самом деле происходит.</p>
<p><strong>Забавный факт</strong>: В Emacs «yanking» соответствует вставке (или
<em>повторная вставка ранее прибитого текста</em>, ориг. — <em>reinserting previously
killed text</em>), а не копированию.</p>
<h2 id="ranges">Диапазоны</h2>
<p>Диапазоны достаточно просты для понимания, но многие вимеры не полностью осознают
весь их потенциал.</p>
<ul>
<li>Многие команды принимают диапазоны в качестве параметра.</li>
<li>Адрес указывает на некую строку.</li>
<li>Диапазон это — единичный адрес или пара адресов, разделённых либо
<code>,</code>, либо <code>;</code>.</li>
<li>Диапазоны говорят команде, на какие строки воздействовать.</li>
<li>Большинство команд по умолчанию работают только с текущей строкой.
Заметным исключением из этого являются <code>:write</code> и <code>:global</code>, которые
воздействуют на все строки.</li>
</ul>
<p>Использование диапазонов достаточно интуитивно, поэтому вот несколько примеров
(<code>:d</code> используется в качестве сокращения <code>:delete</code>):</p>
<table>
<thead>
<tr>
<th>Команда</th>
<th>Строки, на которые воздействует</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>:d</code></td>
<td>Текущая строка.</td>
</tr>
<tr>
<td><code>:.d</code></td>
<td>Текущая строка.</td>
</tr>
<tr>
<td><code>:1d</code></td>
<td>Первая строка.</td>
</tr>
<tr>
<td><code>:$d</code></td>
<td>Последняя строка.</td>
</tr>
<tr>
<td><code>:1,$d</code></td>
<td>Все строки.</td>
</tr>
<tr>
<td><code>:%d</code></td>
<td>Все строки (синтаксический сахар для <code>1,$</code>).</td>
</tr>
<tr>
<td><code>:.,5d</code></td>
<td>С текущей строки по 5.</td>
</tr>
<tr>
<td><code>:,5d</code></td>
<td>Также с текущей строки по 5.</td>
</tr>
<tr>
<td><code>:,+3d</code></td>
<td>Текущая строка и следующие 3.</td>
</tr>
<tr>
<td><code>:1,+3d</code></td>
<td>От первой строки до текущей + 3.</td>
</tr>
<tr>
<td><code>:,-3d</code></td>
<td>Текущая строка и предыдущие 3. (Vim сделает запрос, потому что это перевёрнутый диапазон.)</td>
</tr>
<tr>
<td><code>:3,'xdelete</code></td>
<td>С 3 строки до строки, помеченной <a href="#marks">меткой</a> <code>x</code>.</td>
</tr>
<tr>
<td><code>:/^foo/,$delete</code></td>
<td>Со строки, начинающейся с «foo» до конца.</td>
</tr>
<tr>
<td><code>:/^foo/+1,$delete</code></td>
<td>Со строки, следующей за строкой, которая начинается с «foo», до конца.</td>
</tr>
</tbody>
</table>
<p>Заметьте, что в качестве разделителя вместо <code>,</code> можно использовать <code>;</code>. Разница
заключается в том, что в случае <code>от,до</code> <em>до</em> будет относительно текущей строки,
а при использовании <code>от;до</code> <em>до</em> будет относительно <em>от</em>! Допустим, мы находимся
на строке 5, <code>:1,+1d</code> удалит строки с 1 по 6, а <code>:1;+1d</code> удалит только строки
1 и 2.</p>
<p>Адресу <code>/</code> может предшествовать другой адрес. Это позволяет составлять <em>стек</em>
шаблонов, например:</p>
<pre><code class="language-vim">:/foo//bar//quux/d
</code></pre>
<p>Эта команда удалит первую строку, содержащую «quux» после первой
строки, содержащей «bar», которая находится после первой строки,
содержащей «foo», которая находится после текущей строки.
(Как «<em>В доме, который построил Джек</em>» — <em>пер.</em>)</p>
<p>Иногда Vim вставляет диапазон в начале командной строки автоматически. Например,
начните визуальное выделение строк при помощи <code>V</code>, выделите несколько строк и
наберите <code>:</code>. Командная строка будет начинаться диапазоном <code>'<,'></code>, что означает,
что команда будет использовать ранее выделенные строки в качестве диапазона.
(Поэтому иногда можно встретить мапинги вроде <code>:vnoremap foo :<c-u>command</code>.
Здесь <code><c-u></code> используется для удаления диапазона, потому что Vim сообщит об ошибке
при передаче диапазона команде, которая его не использует.)</p>
<p>Другой пример — использование <code>!!</code> в нормальном режиме. Эта команда
заполнит командную строку символами <code>:.!</code>. Если это дополнить именем внешней
программы, то её вывод заменит текущую строку. Таким приёмом можно заменить
текущий абзац выводом команды <em>ls</em>, используя команду <code>:?^$?+1,/^$/-1!ls</code>.
Фантастика!</p>
<p>Справка:</p>
<pre><code>:h cmdline-ranges
:h 10.3
</code></pre>
<h2 id="marks">Метки</h2>
<p>Метки используются для запоминания позиции в файле — номера строки и колонки.</p>
<table>
<thead>
<tr>
<th>Метки</th>
<th>Кем устанавливаются</th>
<th>Использование</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>a</code> - <code>z</code></td>
<td>Пользователь</td>
<td>Локальные для файла, т.е. имеют смысл только в одном файле. Прыжок к
метке в нижнем регистре означает прыжок внутри текущего файла.</td>
</tr>
<tr>
<td><code>A</code> - <code>Z</code></td>
<td>Пользователь</td>
<td>Глобальные, т.е. имеют смысл на уровне нескольких файлов. Другое название — <em>файловые метки</em>. Прыжок к файловой метке может переключить на другой буфер.</td>
</tr>
<tr>
<td><code>0</code> - <code>9</code></td>
<td>viminfo</td>
<td><code>0</code> — позиция во время последней записи файла viminfo. На практике это означает момент последнего завершения процесса Vim. <code>1</code> — позиция во время второго с краю завершения процесса Vim. И т.д.</td>
</tr>
</tbody>
</table>
<p>Поместите <code>'</code>/<code>g'</code> или <code>`</code>/<code>g`</code> перед меткой, чтобы переместиться
к метке.</p>
<p>Используйте <code>mm</code>, чтобы запомнить позицию в метке «m». Переместитесь
в другое место в файле и прыгните обратно при помощи <code>'m</code> (первый непробельный
символ) или <code>`m</code> (с точностью до колонки). Метки в нижнем регистре
запоминаются при выходе из Vim, если вы скажете об этом вашему файлу viminfo,
см. <code>:h viminfo-'</code>.</p>
<p>Чтобы запомнить позицию в файловой метке «M», используйте <code>mM</code>.
Переключитесь на другой буфер и вернитесь при помощи <code>'M</code> или <code>`M</code>.</p>
<p>Другие перемещения:</p>
<table>
<thead>
<tr>
<th>Перемещение</th>
<th>Прыжок к...</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>'[</code>, <code>`[</code></td>
<td>Первая строка или символ ранее изменённого или скопированного текста.</td>
</tr>
<tr>
<td><code>']</code>, <code>`]</code></td>
<td>Последняя строка или символ ранее изменённого или скопированного текста.</td>
</tr>
<tr>
<td><code>'<</code>, <code>`<</code></td>
<td>Начальная строка или символ последнего визуального выделения.</td>
</tr>
<tr>
<td><code>'></code>, <code>`></code></td>
<td>Конечная строка или символ последнего визуального выделения.</td>
</tr>
<tr>
<td><code>''</code>, <code>``</code></td>
<td>Позиция до последнего прыжка.</td>
</tr>
<tr>
<td><code>'"</code>, <code>`"</code></td>
<td>Позиция в момент последнего выхода из текущего буфера.</td>
</tr>
<tr>
<td><code>'^</code>, <code>`^</code></td>
<td>Позиция, где закончилась последняя вставка.</td>
</tr>
<tr>
<td><code>'.</code>, <code>`.</code></td>
<td>Позиция, где производились последние изменения.</td>
</tr>
<tr>
<td><code>'(</code>, <code>`(</code></td>
<td>Начало текущего предложения.</td>
</tr>
<tr>
<td><code>')</code>, <code>`)</code></td>
<td>Конец текущего предложения.</td>
</tr>
<tr>
<td><code>'{</code>, <code>`{</code></td>
<td>Начало текущего параграфа.</td>
</tr>
<tr>
<td><code>'}</code>, <code>`}</code></td>
<td>Конец текущего параграфа.</td>
</tr>
</tbody>
</table>
<p>Метки можно использовать в <a href="#ranges">диапазонах</a>. Возможно, раньше вы уже
видели такое и были удивлены: после визуального выделения текста и нажатия
<code>:</code> командная строка начинается с <code>:'<,'></code>, что означает, что последующая
команда получит диапазон, обозначенный выделением.</p>
<p>Для просмотра списка меток используйте <code>:marks</code>.
Подробности см. <code>:h mark-motions</code>.</p>
<h2 id="completion">Автозавершение</h2>
<p>В режиме вставки Vim предоставляет множество видов автозавершения.
При наличии нескольких совпадений всплывающее меню позволит выбрать то,
что вам нужно.</p>
<p>Типичные виды автозавершения это — теги, функции, импортированные из
модулей или библиотек, имена файлов, словарь или просто слова из текущего
буфера.</p>
<p>Для всех видов автозавершения назначены сочетания клавиш, и все они
начинаются с <code><c-x></code> (помните, что использовать их необходимо в режиме
вставки).</p>
<table>
<thead>
<tr>
<th>Мапинг</th>
<th>Вид</th>
<th>Соответствующая тема справки</th>
</tr>
</thead>
<tbody>
<tr>
<td><code><c-x><c-l></code></td>
<td>целые строки</td>
<td><code>:h i^x^l</code></td>
</tr>
<tr>
<td><code><c-x><c-n></code></td>
<td>ключевые слова из текущего файла</td>
<td><code>:h i^x^n</code></td>
</tr>
<tr>
<td><code><c-x><c-k></code></td>
<td>ключевые слова согласно опции <code>'dictionary'</code></td>
<td><code>:h i^x^k</code></td>
</tr>
<tr>
<td><code><c-x><c-t></code></td>
<td>ключевые слова согласно опции <code>'thesaurus'</code></td>
<td><code>:h i^x^t</code></td>
</tr>
<tr>
<td><code><c-x><c-i></code></td>
<td>ключевые слова из текущего и включенных файлов</td>
<td><code>:h i^x^i</code></td>
</tr>
<tr>
<td><code><c-x><c-]></code></td>
<td>теги</td>
<td><code>:h i^x^]</code></td>
</tr>
<tr>
<td><code><c-x><c-f></code></td>
<td>имена файлов</td>
<td><code>:h i^x^f</code></td>
</tr>
<tr>
<td><code><c-x><c-d></code></td>
<td>определения и макро</td>
<td><code>:h i^x^d</code></td>
</tr>
<tr>
<td><code><c-x><c-v></code></td>
<td>команды Vim</td>
<td><code>:h i^x^v</code></td>
</tr>
<tr>
<td><code><c-x><c-u></code></td>
<td>определённое пользователем (как указано в опции <code>'completefunc'</code>)</td>
<td><code>:h i^x^u</code></td>
</tr>
<tr>
<td><code><c-x><c-o></code></td>
<td>omni-завершение (как указано в опции <code>'omnifunc'</code>)</td>
<td><code>:h i^x^o</code></td>
</tr>
<tr>
<td><code><c-x>s</code></td>
<td>предложения проверки орфографии</td>
<td><code>:h i^Xs</code></td>
</tr>
</tbody>
</table>
<p>Людей может смутить разница между автозавершением, определённым пользователем,
и omni, но технически они делают одно дело. Они используют функцию, которая
исследует текущую позицию и возвращает список предложений для завершения.
Автозавершение определённое пользователем, соответствует его персональным
задачам. (Сюрприз!) И может быть всем, чем угодно. Omni-завершение предназначено
для целей специфичных для типа файла, например, для завершения членов структур
или методов класса, и часто устанавливается плагинами для типа файла.</p>
<p>Vim позволяет производить автозавершение сразу нескольких видов согласно
установка опции <code>'complete'</code>. По умолчанию эта опция содержит достаточно много,
поэтому вы можете укоротить её по своему вкусу. Вызывается такое автозавершение
нажатием <code><c-n></code> (next, следующий) или <code><c-p></code> (previous, предыдущий), эти же
клавиши используются для выбора пунктов во всплывающем меню. Дополнительно
см. <code>:h i^n</code> и <code>:h 'complete'</code>.</p>
<p>Просмотрите <code>:h 'completeopt'</code>, чтобы настроить поведение всплывающего окна.
Настройки по умолчанию достаточно разумны, но я предпочитаю добавлять туда
«noselect».</p>
<p>Справка:</p>
<pre><code>:h ins-completion
:h popupmenu-keys
:h new-omni-completion
</code></pre>
<h2 id="motions-operators-text-objects">Перемещения, операторы, текстовые объекты</h2>
<p><strong>Перемещение</strong> сдвигает курсор. Всем известны <code>h</code>/<code>j</code>/<code>k</code>/<code>l</code>.
Или <code>w</code> и <code>b</code>. Даже <code>/</code> — перемещение. Перед ними можно указать счётчик.
<code>2?the<cr></code> перепрыгнет ко второму предыдущему вхождению «the».</p>
<p>См. <code>:h navigation</code> и всё, что ниже, обо всех доступных перемещениях.</p>
<p><strong>Операторы</strong> воздействуют на регион текста, например,
<code>d</code>, <code>~</code>, <code>gU</code>, <code>></code>. Их можно использовать в двух контекстах, в нормальном
или визуальном режиме. В нормальном режиме сначала идёт оператор, за которым
следует перемещение, например, <code>>j</code>. В визуальном режиме оператор просто
воздействует на выделение, например, <code>Vjd</code>.</p>
<p>Как и перемещениям, операторам тоже можно указывать счётчик, например, <code>2gUw</code>
приведёт к верхнему регистру остаток текущего слова и следующее за ним.
Т.к. и перемещения, и операторы принимают счётчики, <code>2gU2w</code> работает так же,
как два вызова <code>gU2w</code>.</p>
<p>См. <code>:h operator</code> обо всех доступных операторах. Используйте <code>:set tildeop</code>,
чтобы <code>~</code> работала как оператор.</p>
<p><strong>Текстовые объекты</strong> воздействуют на окружающее пространство в
противоположность перемещениям, которые действуют только в одном направлении.
На самом деле, они действуют на объекты, например, на целое слово, целое
предложение, на всё, что внутри скобок и т.д.</p>
<p>Текстовые объекты нельзя использовать для перемещения курсора в нормальном
режиме, т.к. даже самые многоопытные курсоры не могут прыгать в двух направлениях
одновременно. Хотя это работает в визуальном режиме, потому что одна сторона
объекта уже выбрана, и курсор просто прыгает к другой стороне.</p>
<p>Текстовые объекты начинаются либо с <code>i</code> (представляйте как <em>inner</em> —
внутри), либо с <code>a</code> (<em>around</em> — вокруг), за которым следует символ,
обозначающий объект. С <code>i</code> он действует на сам объект, а с <code>a</code> — на
объект и последующее пробельное пространство (пропуск). Например, <code>diw</code> удаляет
текущее слово, а <code>ci(</code> изменяет всё, что находится внутри скобок.</p>
<p>Текстовые объекты принимают счётчик. Допустим, имеем <code>((( )))</code>, и курсор
находится между самыми внутренними скобками, тогда <code>d2a(</code> удалит 2 внутренние
пары скобок и всё, что находилось между ними.</p>
<p>См. <code>:h text-objects</code> обо всех доступных текстовых объектах.</p>
<h2 id="autocmds">Автокоманды</h2>
<p>В Vim после многих событий, например, сохранения буфера или запуска Vim,
есть возможность произвести некие действия, которые называются <em>автокоманды</em>.</p>
<p>Vim очень широко использует автокоманды. Вы мне не верите?
Посмотрите вывод команды <code>:au</code>, но не пугайтесь её вывода. Это все
те автокоманды, которые готовы к действию прямо сейчас!</p>
<p>См. <code>:h {event}</code> с обзором всех доступных событий и <code>:h autocmd-events-abc</code>,
где содержится больше деталей.</p>
<p>Типичный пример — настройка для конкретного типа файла:</p>
<pre><code class="language-vim">autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#
</code></pre>
<p>Но каким образом буфер вообще узнает, что он содержит код Ruby?