РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ VIM - Брам Мооленаар

Разделение экрана

Разделение экрана позволяет показывать одновременно несколько файлов, просматривать несколько фрагментов одного и того же файла и искать отличия в файлах.

08.1    Разделение экрана
08.2    Разделение экрана с загрузкой другого файла
08.3    Размер окна
08.4    Разделение по вертикали
08.5    Перемещение окон
08.6    Выполнение команд во всех окнах
08.7    Просмотр разночтений при помощи vimdiff
08.8    Разное

Следующая глава: Использование графического интерфейса
Предыдущая глава: Редактирование нескольких файлов
Содержание: Руководство пользователя Vim


08.1 Разделение экрана

Самый простой способ открыть новое окно, это выполнить следующую команду:

:split

Эта команда делит экран на два окна и помещает курсор в верхнее окно:

+----------------------------------+
|/* файл one.c */            |
|~                   |
|~                   |
|one.c=============================|
|/* файл one.c */           |
|~                   |
|one.c=============================|
|                   |
+----------------------------------+

Вы видите два окна, в каждом из которых открыт один и тот же файл. Строкой "====" на иллюстрации показана строка состояния, в которой выводится информация об окне, расположенном сверху (в самом Vim статусная строка как правило отображается в инверсном видеорежиме).

Наличие двух окон позволяет просматривать одновременно две разные части одного и того же файла. Например, удобно, если в верхнем окне показаны определения для переменных в программе, а в нижнем вы работаете с самим кодом программы.

Для перемещения между окнами можно использовать команду CTRL-W w. Например, если вы находитесь в верхнем окне, то CTRL-W w перемещает курсор в нижнее окно. Если вы находитесь в нижнем окне, то курсор перемещается по команде CTRL-W w в верхнее. (Тех же результатов можно получить и при помощи команды CTRL-W CTRL-W, если вы решите отпустить кнопку CTRL позднее).

ЗАКРЫТИЕ ОКНА

Для закрытия окна используйте команду

:close

На самом деле можно применять любую команду, которая прекращает работу над файлом, например ":quit" или "ZZ". Однако, ":close" предохраняет вас от выхода из редактора в том случае, если вы закроете последнее окно.

ЗАКРЫТИЕ ВСЕХ ОСТАЛЬНЫХ ОКОН

Если вы открыли несколько окон и хотите теперь сосредоточиться на одном из них, то будет полезна следующая команда:

:only

С её помощью можно закрыть все окна, кроме текущего. Однако, если в одном из окон есть несохранённые изменения, то вы увидите сообщение об ошибке и это окно не будет закрыто.


08.2 Разделение экрана с загрузкой другого файла

Следующая команда позволяет открыть второе окно и загрузить в него для редактирования указанный файл:

:split two.c

Если вы перед этим редактировали файл one.c, то результат будет выглядеть так:

+----------------------------------+
|/* файл two.c */            |
|~                   |
|~                   |
|two.c=============================|
|/* файл one.c */           |
|~                   |
|one.c=============================|
|                   |
+----------------------------------+

Для того, чтобы открыть новое пустое окно, используйте команду:

:new

Вы можете повторять команды ":split" и ":new", чтобы открыть столько окон, сколько потребуется.


08.3 Размер окна

Команда ":split" может принимать числовой аргумент-приставку. Если перед командой указано число, то оно сообщает высоту нового окна. Например, следующая команда открывает окно высотой в три строки и открывает в нём для редактирования файл alpha.c:

:3split alpha.c

Высоту уже существующих окон можно менять различными способами. Так, если у вас есть мышь, то  достаточно просто потянуть за статусную строку, разделяющую два окна, вверх или вниз. Кроме того, можно пользоваться клавиатурными командами.

Для увеличения размера окна:

CTRL-W +

Для уменьшения размера окна:

CTRL-W -

Обе команды могут принимать числовой аргумент, указывающий на сколько именно строк необходимо изменить размер окна. Так, команда "4 CTRL-W +" увеличит высоту окна на 4 строки.

Чтобы установить высоту окна в определённое количество строк, используйте следующую команду:

{height}CTRL-W _

(Подчеркивание _ вводится при помощи кнопки - с нажатой кнопкой Shift).

Команда CTRL-W _ без числового аргумента сделает увеличит окно до максимально возможной высоты.

ИСПОЛЬЗОВАНИЕ МЫШИ

Многие вещи в Vim можно делать гораздо быстрее при помощи клавиатуры. К сожалению, изменение размеров окна не относится к числу таких операций, поскольку требует довольно много нажатий на кнопки. Использование мыши для изменения высоты окна намного эффективнее, для этого достаточно просто потянуть за строку состояния вверх или вниз.

ОПЦИИ

Опция 'winheight' может указывать на минимальную желательную высоту окна, а 'winminheight' на абсолютную минимальную высоту.

Аналогично, имеется опция 'winwidth' для минимальной желательной ширины окна и 'winminwidth' для абсолютной минимальной ширины.

Опция 'equalalways', будучи включённой, заставляет Vim перекраивать размеры окон при их открытии или закрытии так, чтобы они были равными.


08.4 Разделение по вертикали

Команда ":split" создаёт новое окно над текущим. Чтобы разместить новое окно слева от текущего, используйте команду

:vsplit

или

:vsplit two.c

Результат выполнения выглядит примерно так:    

+--------------------------------------+
|/* файл two.c */   |/* файл one.c */  |
|~            |~                |
|~             |~                |
|~             |~                |
|two.c===============one.c=============|
|                        |
+--------------------------------------+

Колонка | между окнами будет в отображаться в инверсном видеорежиме и называется вертикальным разделителем.

Имеется также команда ":vnew", которая делит текущее окно по вертикали и создаёт новое окно для нового файла. Другой способ достижения того же эффекта:

:vertical new

Вообще, команду ":vertical" можно вставлять перед любой командой, которая разделяет экран и заставляет текущее окно делиться по вертикали, а не по горизонтали. Если выполнение такой команды не приводит к разделению окна, то она работает так, как если бы команда ":vertical" не использовалась.

ПЕРЕМЕЩЕНИЕ МЕЖДУ ОКНАМИ

Поскольку окна можно делить по вертикали и горизонтали в любом порядке, то вы можете создавать любое расположение окон. Для перемещения между окнами используйте следующие команды:

CTRL-W h перейти в окно слева
CTRL-W j перейти в окно внизу
CTRL-W k перейти в окно наверху
CTRL-W l перейти в окно справа
CTRL-W t перейти в ВЕРХНЕЕ окно
CTRL-W b перейти в НИЖНЕЕ окно

Как видите, используются те же символы, что и для перемещения курсора в тексте. Если вам так нравится, то можно пользоваться и кнопками перемещения курсора.

Более подробный список команд для перемещения между окнами: |Q_wi|.


08.5 Перемещение окон

Представьте, что вы разделили экран на несколько окон и теперь хотели бы поменять их расположение. Например, если ваш экран выглядит так:

+----------------------------------+
|/* файл two.c */            |
|~                   |
|~                    |
|two.c=============================|
|/* файл three.c */            |
|~                   |
|~                   |
|three.c===========================|
|/* файл one.c */            |
|~                   |
|one.c=============================|
|                   |
+----------------------------------+

то, наверное, нижнее окно было бы лучше поместить наверху. Для этого перейдите в это окно при помощи команды CTRL-W w и наберите

CTRL-W K

Все очень просто, не правда ли? k используется для перемещения курсора в верхнее окно, а K для перемещения окна в верхнюю часть экрана.

Если вы используете вертикальное разделение, то команда CTRL-W K перенесёт текущее окно в верхнюю часть экрана и развернёт его по всей ширине экрана. Например, если ваш экран разбит таким образом:

+-------------------------------------------+
|/* two.c */  |/* three.c */  |/* one.c */  |
|~          |~           |~        |
|~           |~           |~         |
|~          |~           |~        |
|~          |~           |~        |
|~          |~           |~        |
|two.c=========three.c=========one.c========|
|                         |
+-------------------------------------------+

то используя CTRL-W K в среднем окне (three.c) приведёт к следующему результату:

+-------------------------------------------+
|/* three.c */                    |
|~                        |
|~                        |
|three.c====================================|
|/* two.c */           |/* one.c */         |
|~               |~             |
|two.c==================one.c===============|
|                        |
+-------------------------------------------+

Три похожих команды используют аналогичную мнемонику:

CTRL-W H поместить текущее окно в левой части экрана
CTRL-W J поместить текущее окно в нижней части экрана               
CTRL-W L поместить текущее окно в правой части экрана

08.6 Выполнение команд во всех окнах

Если у вас открыто несколько окон и вы хотите выйти из Vim, то вам придётся закрывать каждое окно отдельно. Более быстрый способ заключается в использовании команды:

:qall

что значит "quit all", выйти отовсюду. Конечно, если в каком-то окне содержатся несохранённые изменения, то Vim откажется выходить, но поместит курсор в окно с несохранёнными изменениями и выдаст сообщение об ошибке. Тогда вам потребуется либо использовать команду ":write" для сохранения изменений, либо команду ":quit!" для выхода без сохранения.

Для сохранения изменений во всех окнах можно использовать команду

:wall

что значит "write all", записать всё. Однако, на самом деле эта команда запишет изменения только в тех окнах, где они действительно не сохранены.

Наконец, имеется команда, сохраняющая изменения во всех окнах, где это требуется, и затем выполняющая выход изо всех окон. Выглядит она так:

:wqall

Несложно догадаться, что это команда является сочетанием команд ":wall" и ":qall".

Кроме того, есть и команда, которая заставляет редактор выйти изо всех окон, не обращая внимание на несохранённые изменения:

:qall!

Будьте осторожны, эту команду нельзя отменить!

ОТКРЫТИЕ КАЖДОГО ФАЙЛА В СТРОКЕ АРГУМЕНТОВ В СВОЁМ ОКНЕ

Чтобы Vim открывал каждый файл в строке аргументов в отдельном окне, используйте при запуске ключ "-o":

vim -o one.txt two.txt three.txt

Результат будет выглядеть так:

+-------------------------------+
|файл one.txt             |
|~                 |
|one.txt========================|
|файл two.txt             |
|~                |
|two.txt========================|
|файл three.txt             |
|~                 |
|three.txt======================|
|                |
+-------------------------------+

Ключ "-O" приводит к аналогичным результатам, но окна будут разделены по вертикали.

Команда ":all" в самом Vim приведёт к открытию окна для каждого из заданных в списке аргументов файлов. ":vertical all" делает то же самое с вертикальным разделением окон.


08.7 Просмотр разночтений при помощи vimdiff

Существует специальный способ запуска Vim, при котором редактор переходит в режим для наглядного отображение различий между двумя файлами. Возьмём, для примера файл "main.c" и добавим в одну из его строк несколько символов. Теперь, сохраним этот файл с включённой опцией 'backup', чтобы у нас была также и предыдущая версия файла "main.c~".

Наберите в оболочке (не в Vim) следующую команду:

vimdiff main.c~ main.c

Vim откроет два окна, разделённых по вертикали. Вы увидите только строку, в которую добавили символы, плюс еще несколько строк сверху и снизу от этой строки:

 VV              VV
+-----------------------------------------+
|+ +--123 стр.: /* a |+ +--123 стр.: /* a |  <- складка
|  текст         |  текст             |
|  текст         |  текст             |
|  текст         |  текст             |
|  текст         |  изменённый текст  |  <- изменённая строка
|  текст         |  текст             |
|  текст         |  ------------------|  <- удалённая строка
|  текст         |  текст             |
|  текст          |  текст          |
|  текст         |  текст          |
|+ +--432 стр.: текст|+ +--432 стр.: текст|  <- складка
|  ~             |  ~          |
|  ~             |  ~          |
|main.c~==============main.c==============|
|                       |
+-----------------------------------------+

(Эта иллюстрация не отражает подсветку; попробуйте команду vimdiff, чтобы увидеть результат её работы в самом лучшем виде.)

Строки, которые повторяются в обоих файлах, были сложены в одну строку, которая называется складкой. В данном случае, это закрытая складка. На иллюстрации складки отмечены текстом "<- складка". Иными словами, строка со складкой вверху экрана заменяет собой 123 строки текста, которые совершенно идентичны в обоих файлах.

Строка, отмеченная на иллюстрации как "<- изменённая строка" в vimdiff выделяется подсветкой, причём добавленный текст выделен другим цветом. Таким образом, легко можно увидеть отличия между файлами.

Удалённая строка в окне main.c показана с помощью "---", обратите внимание на иллюстрацию, где показана "<- удалённая строка". В действительности этих символов в файле нет, но vimdiff заполняет их строкой из символов "---", чтобы в обоих окнах было равное количество строк.

КОЛОНКА СКЛАДКИ

Каждое окно имеет специальную колонку слева, цвет фона которой должен несколько отличаться от цвета фона окна. На иллюстрации сверху эта колонка отмечена символами "VV". Обратите внимание, что в этой колонке, напротив каждой закрытой складки имеется символ "+". Попробуйте нажать на этот "+" левой кнопкой мыши -- складка откроется и вы увидите текст, который она содержит.

Теперь в колонке складки отображается символ "-", поскольку складка открыта. Если нажать на этот "-", то складка закроется.

Само собой, для этого требуется мышь, но можно также использовать и клавиатурные команды: "zo" открывает складку, а "zc" закрывает.

РАБОТА С ИЗМЕНЕНИЯМИ ФАЙЛОВ В VIM

Режим просмотра изменений diff можно включить и находясь в самом Vim. Отредактируйте файл "main.c", затем разделите экран с включенным отображением различий:

:edit main.c
:vertical diffsplit main.c~

Команда ":vertical" используется для вертикального разделения. Если вы опустите ":vertical", то разделение экрана произойдёт по горизонтали.

Если у вас имеется файл-заплатка, также называемый файл diff, то можно использовать ещё и третий способ перехода в режим diff. Для этого откройте файл, к которому применяется заплатка, а затем подскажите Vim имя файла-заплатки:

:edit main.c
:vertical diffpatch main.c.diff

ПРЕДУПРЕЖДЕНИЕ: Файл-заплатка должен включать изменения только для того файла, который вы редактируете. В противном случае вы можете нарваться на массу сообщений об ошибках и некоторые файлы могут быть изменены совершенно неожиданно. Наложение заплатки будет произведено только к копии файла, который редактируется в Vim. Сам файл останется без изменений, если, конечно, вы не надумаете сохранить эти изменения.

СИНХРОНИЗАЦИЯ ПРОКРУТКИ

Если в файлах содержится несколько изменений, то вы можете пользоваться прокруткой в обычном порядке. Vim будет пытаться синхронизировать прокрутку в обоих окнах, чтобы вы могли видеть отличия.

Если вам по каким-либо причинам нужно временно отключить такое поведение, то используйте команду

:set noscrollbind
ПЕРЕХОД К ИЗМЕНЕНИЯМ

В том случае, если вы держите складки открытыми, может быть сложно сразу найти  место в файле, где содержатся отличия. Для прыжка к позиции следующего изменения воспользуйтесь командой

]c

Или, для перемещения в обратном направлении:

[c

Кроме того, можно пользоваться числом-приставкой для перемещения сразу на несколько позиций.

УСТРАНЕНИЕ ОТЛИЧИЙ

Для устранения различий между файлами можно переносить текст из одного окна в другое, удаляя отличающиеся строки, или, наоборот, внося новые. Vim не во всех случаях отображает подсветку в соответствии с текущим состоянием. Для обновления подсветки пользуйтесь командой

:diffupdate

Текст можно свободно перемещать между окнами отличающихся файлов. Возьмём предыдущий пример с файлами "main.c" и "main.c~". Переместите курсор в левом окне к строке, которая была удалена в правом и введите команду:

dp

Теперь, отличие между файлами исчезло, потому что текст из текущего окна был вставлен в соседнее. "dp" это сокращение для "diff put".

Также можно провести и обратную операцию. Подведите курсор в правом окне к изменённой строке и введите команду:

do

Теперь различие будет устранено, поскольку мы заменили отличающийся фрагмент фрагментом из другого окна. "do" это сокращение для "diff obtain", "забрать отличия из другого окна". "dg" наверное было бы лучшей командой, но ей назначена совсем другая операция ("dgg" удаляет текст от текущей позиции до первой строки). Обратите внимание, что поскольку между двумя окнами не осталось различий, то Vim автоматически помещает весь текст в обоих окнах в одну большую складку.

Дополнительную информацию о режиме diff см. |vimdiff|.


08.8 Разное

Опция 'laststatus' может использоваться для указания, в каких случаях в последнем окне отображается строка состояния:

0 никогда
1 только если экран разделён на несколько окон           
2 всегда

Многие команды, которые вызывают переход к редактированию другого файла, имеют вариант, приводящий к разделению экрана. Для команд командной строки эти варианты начинаются с "s". Например, ":tag" вызывает прыжок к метке, а ":stag" разделяет экран на два окна и переходит к метке в новом окне.

Для команд Обычного режима используется приставка CTRL-W. Если CTRL-^ вызывает переход к соседнему файлу из списке аргументов, то CTRL-W CTRL-^ разделяет экран и открывает соседний файл в новом окне.

Опция 'splitbelow' позволяет назначить появление новых окон внизу текущего окна, а опция 'splitright' вызывает появление новых окон при вертикальном разделении справа от текущего окна.

Кроме того, при разделении окна вы можете добавить команду-приставку для указания, где должно появиться новое окно:

:leftabove {команда} слева или вверху от текущего окна
:aboveleft {команда} то же
:rightbelow {команда} справа или снизу от текущего окна                        
:belowright {команда} то же
:topleft {команда} вверху или слева окна Vim
:botright {команда} внизу или справа окна Vim

Следующая глава: Использование графического интерфейса
Авторские права: см. Авторские права