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

Уйти, чтобы вернуться

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

21.1    Прервать работу и вернуться назад
21.2    Выполнение команд оболочки
21.3    Сохранение информации о редактировании; viminfo
21.4    Сеансы
21.5    Виды
21.6    Режимная строка

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


21.1 Прервать работу и вернуться назад

Как и большинство программ Unix, Vim может временно прервать свою работу по команде CTRL-Z. Вы вернётесь обратно в оболочку, откуда запустили редактор. Теперь вы можете выполнять любые системные команды, пока не надоест, а затем вернуться в Vim с помощью команды "fg":

CTRL-Z
{любая последовательность команд оболочки}
fg

Как видите, за время вашего отсутствия в Vim ничего не изменилось, всё осталось так, как было.

Если команда CTRL-Z не работает, то попробуйте команду ":suspend". Только не забудьте вернуть Vim назад в активное состояние, иначе вы рискуете потерять сделанные раннее изменения!

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

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


21.2 Выполнение команд оболочки

Для выполнения одной команды оболочки прямо из Vim используйте ":!{команда}". Например, чтобы посмотреть содержимое каталога:

:!ls
:!dir

Первый пример для Unix, второй для MS-Windows.

Vim выполнит программу и после её вывода напечатает приглашение нажать <Enter>. Это позволяет вам посмотреть на вывод программы перед возвращением к редактированию текста.

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

:!{программа} выполнить {программу}
:r !{программа} выполнить {программу} и вставить результатвыполнения в текст
:w !{программа} выполнить {программу}, передав ей на вход текст из редактора
:[диапазон]!{программа} пропустить текст через {программу}

Обратите внимание, что диапазон перед "!{program}" существенно влияет на результат. Если без него программа просто выполняется в обычном порядке, то при указанном диапазоне отмеченный диапазоном текст будет пропущен через программу.

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

:shell

Это похоже на использование CTRL-Z для временной приостановки Vim. Разница лишь в том, что в данном случае запускается новая оболочка.

При использовании графического интерфейса программа будет пользоваться для ввода и вывода окном, в котором запущен Vim. Поскольку Vim не является эмулятором терминала, то могут возникнуть проблемы. Обратите внимание на опцию 'guipty', которая может помочь с ними справиться. Если и это не помогает, то запустите оболочку в новом окне терминала. Например так:

:!xterm&

21.3 Сохранение информации о редактировании; viminfo

В процессе редактирования у вас возникает целая коллекция: в регистрах сохраняется текст, отметки в различных файлах, история командной строки с искусно созданными командами. При выходе из Vim всё это оказывается утраченным. Но вы можете вернуть эту информацию назад!

Файл viminfo придуман для того, чтобы сохранять информацию о состоянии редактора:

  • История командной строки и шаблонов поиска
  • Текст в регистрах
  • Отметки для различных файлов
  • Список буферов
  • Общие переменные

Всякий раз, когда вы выходите из редактора, он сохраняет всю эту информацию в файл viminfo. При следующем запуске Vim читает файл viminfo и восстанавливает информацию.

Опция 'viminfo' по умолчанию настроена на восстановление довольно ограниченного набора информации. Вы можете заставить Vim запоминать намного больше. Это делается следующей командой:

:set viminfo=строка

Здесь "строка" указывает на то, что надо сохранять. Синтаксис этой строки следующий: символ опции, за которым следует аргумент. Пары опция/аргумент разделяются запятыми.

Попробуем написать свою строку для опции 'viminfo'. Во-первых, опция ' служит для указания количества файлов, для которых вы хотите сохранять отметки (a-z). Выберите для значения этой опции какое-нибудь круглое число, например 1000. Теперь ваша команда выглядит так: >

:set viminfo='1000

Опция f указывает на необходимость сохранения общих отметок (A-Z и 0-9). Если её значение равно 0, то они не будут сохраняться. По умолчанию (если опция f не указана) общие отметки сохраняются, можно также явно установить её значение в 1. Поскольку нам это пригодится, включим эту опцию в нашу команду:

:set viminfo='1000,f1

Опция < указывает на количество строк, которое сохраняется для каждого из регистров. Если её значение равно 0, то регистры вообще не сохраняются. Чтобы избежать добавления тысяч строк в файл viminfo, ограничим значение опции " в 500 строк:

:set viminfo='1000,f1,<500

Другие опции, которые вам могут пригодиться:

: количество строк истории командной строки.
@ количество строк истории строки ввода.
/ количество строк истории шаблонов поиска.
r указание на сменные носители информации, для которых отметки не будут сохраняться (опцию можно использовать несколько раз).
! глобальные переменные, начинающиеся с прописной буквы и не содержат строчных букв.
h выключать подсветку 'hlsearch' при запуске.
% список буферов (восстанавливается только при запуске Vim без списка файлов в строке аргументов).
c перекодировать текст с использованием 'encoding'.
n имя для файла viminfo (должно указываться в последнюю очередь).

Дополнительную информацию см. опцию 'viminfo' и |файл_viminfo|.

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

ВОЗВРАЩЕНИЕ К ПРЕЖНЕМУ СОСТОЯНИЮ

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

'0

и оказываетесь в том самом месте, на котором закончили редактирование!

Дело в том, что Vim создаёт отметку всякий раз при выходе. Последняя отметка называется '0. При этом та позиция, на которую указывала предыдущая отметка '0 становится отметкой '1, '1 становится отметкой '2 и т.д. Отметка '9 теряется.

Для получения представления о том, куда ведут отметки '0-'9 полезна команда ":marks".

ПЕРЕНОС ИНФОРМАЦИИ ИЗ ОДНОГО VIM В ДРУГОЙ

Команды ":wviminfo" и ":rviminfo" можно использовать для сохранения и восстановления информации на лету. Это может быть полезно для обмена информации о регистрах между двумя копиями Vim. Наберите в первом запущенном Vim:

:wviminfo! ~/tmp/viminfo

Теперь, во втором Vim наберите:

:rviminfo! ~/tmp/viminfo

Конечно, "w" означает "write", а "r" -- "read".

Символ ! используется в ":wviminfo" для того, чтобы насильно переписать существующий файл. Если ! не указывать, а файл уже существует, то в файл будет занесена лишь та информация, которая отсутствует.

В ":rviminfo" символ ! используется для указания на то, что нужно прочитать в Vim всю информацию, содержащуюся в файле, даже если это приведёт к потере уже существующей информации. Без ! будет прочитана только отсутствующая информация.

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


21.4 Сеансы

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

Сеансы в Vim содержат всю информацию о том, что вы редактируете. Сюда входит информация о списке файлов, раскрое окон в экране, глобальных переменных, опциях и другая информация (что именно должно сохраняться контролируется опцией 'sessionoptions', описанной ниже).

Сеанс сохраняется при помощи следующей команды:

:mksession vimbook.vim

Для последующего восстановления сеанса воспользуйтесь командой:

:source vimbook.vim

Для восстановления сеанса при запуске Vim можно пользоваться ключом -S:

vim -S vimbook.vim

Этот ключ указывает Vim, что при запуске надо прочитать определённый файл. 'S' означает "сеанс", "session". В действительности, с помощью этого ключа при запуске можно прочитать любой сценарий, так что 'S' можно расшифровывать и как "сценарий".

Открытые окна восстанавливаются в том же положении и с теми же размерами, как и раннее. То же касается и значений опций и привязок клавиш.

Опция 'sessionoptions' управляет информацией, которая сохраняется о сеансе. Её значение по умолчанию "blank,buffers,curdir,folds,help,options,winsize".

blank Сохранять пустые окна.
buffers Все буферы, а не только те, которые открыты в окнах.
curdir Текущий каталог.
folds Складки, в том числе созданные вручную.
help Окно справки.
options Все опции и привязки.
winsize Размеры окон.

Можете изменять этот набор по своему усмотрению. Для восстановления размера окна Vim используйте:

:set sessionoptions+=resize
СЕАНС ЗДЕСЬ, СЕАНС ТАМ

Очевидный пример использования сеансов -- работа над несколькими различными проектами. Предположим, вы храните файлы сеансов в каталоге "~/.vim". Сейчас вы работаете над "секретным" проектом и должны переключиться на "скучный" проект:

:wall
:mksession! ~/.vim/секрет.vim
:source ~/.vim/скука.vim

Сначала вы сохраняете все существующие изменения во всех окнах при помощи команды ":wall". Затем сохраняете текущий сеанс по команде ":mksession!", с переписывая предыдущий сеанс. В следующий раз вы сможете продолжить с того места, в котором был сохранён сеанс. Наконец, вы загружаете новый, "скучный" сеанс.

Если вы наоткрывали разных окон и перевернули раскрой экрана вверх дном, то можно вернуться к предыдущему сохранённому сеансу:

:source ~/.vim/boring.vim

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

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

Вот пример раскроя, которым можно пользоваться:

+----------------------------------------+
|        VIM - основной файл справки  |
|                     |
|Перемещение:  Используйте кнопки курсора|
|help.txt================================|
|проводник  |                 |
|каталог    |~                 |
|каталог    |~                 |
|файл       |~                 |
|файл       |~                 |
|файл       |~                 |
|файл       |~                 |
|~/=========|[Нет файла]=================|
|                     |
+----------------------------------------+

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

Из только что запущенного Vim такой раскрой создать можно так:

:help
CTRL-W w
:vertical split ~/

Вы можете изменить размеры окон по своему усмотрению. Затем сохраните сеанс при помощи команды:

:mksession ~/.vim/mine.vim

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

vim -S ~/.vim/mine.vim

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

UNIX И MS-WINDOWS

Некоторым людям приходится постоянно менять платформу и работать то на MS-Windows, то на Unix. Если это относится и к вам, то подумайте о добавлении "slash" и "unix" к 'sessionoptions'. В этом случае сеансы будут записываться в формате, который можно будет использовать в обеих системах. Вот команда, которую можно поместить прямо в файл vimrc:

:set sessionoptions+=unix,slash

Vim в этом случае будет использовать формат Unix, поскольку в MS-Windows Vim может читать и записывать файлы Unix, но Vim на Unix не может читать файлы сеансов в формате MS-Windows. Аналогично, MS-Windows Vim понимает файлы с разделителем / в полных путях к файлу, но Unix Vim не понимает \.

СЕАНСЫ И VIMINFO

В сеансах можно сохранять множество вещей, но в этот список не входят положение отметок в файле, содержимое регистров и история командной строки. Для этих элементов используется viminfo.

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

Однако, никто не мешает вам вручную сохранять viminfo вместе с файлами сеансов. Вот пример:

:mksession! ~/.vim/secret.vim
:wviminfo! ~/.vim/secret.viminfo

для восстановления введите:

:source ~/.vim/secret.vim
:rviminfo! ~/.vim/secret.viminfo

21.5 Виды

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

Вид можно использовать в тех случаях, когда вы хотите редактировать файл определённым специфическим образом. Например, у вас включены номера строк с помощью опции 'number' и вы создали несколько складок. Точно так же, как и в случае с сеансами, можно запомнить вид файла и восстановить его позднее. Более того, при сохранении сеанса сохраняется вид каждого окна.

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

:mkview

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

:loadview

Всё очень просто, не правда ли?

Теперь, если вы хотите посмотреть файл с выключенной опцией 'number', или со всеми складками в открытом состоянии, то можно установить все параметры окна так, как требуется, и сохранить вид с помощью команды:

:mkview 1

Для загрузки этого вида нужно будет набрать команду

:loadview 1

Между двумя видами файла можно переключаться используя ":loadview" с аргументом 1 и без аргумента.

Всего для одного файла можно сохранить до 10 видов, один без номера и девять с номерами от 1 до 9.

ВИД С ИМЕНЕМ

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

Например, для сохранения вида текущего файла используйте команду:

:mkview ~/.vim/main.vim

Восстановить такой сохранённый вид можно командой:

:source ~/.vim/main.vim

21.6 Режимная строка

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

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

Типичным примером является исходный текст программы на языке C, где отступы форматируются таким образом, что они кратны 4. Для этого требуется, чтобы значение опции 'shiftwidth' было равно 4. Такую настройку можно выполнить при помощи режимной строки:

/* vim:set shiftwidth=4: */ ~

Эту строку надо поместить в первых или последних пяти строках файла. При редактировании файла в будущем вы заметите, что 'shiftwidth' автоматически устанавливается равной 4. При редактировании другого файла значение опции будет автоматически возвращено в значение по умолчанию, равное 8.

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

Опция 'modelines' определяет, сколько строк в начале и конце файла просматривается на предмет содержания режимной строки. Чтобы просматривать 10 строк, введите:

:set modelines=10

Опция 'modeline' может использоваться для отключения режимной строки. Если вы работаете как пользователь root или не доверяете файлам, которые открываете в редакторе, то введите команду

:set nomodeline

Для режимной строки используется следующий формат:

любой текст vim:set {опция}={значение} ... : любой текст ~

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

Vim распознаёт режимную строку по подписи " vim:". Перед словом "vim" должен быть пробел, либо "vim" должен быть в начале строки. Использование чего-либо вроде "gvim:" работать не будет.

Между двоеточиями находится команда ":set". Команда работает точно так же, как если бы вы набирали :set в командной строке, за исключением того момента, что перед двоеточием надо вставлять символ обратной комой черты, иначе оно будет восприниматься как конец режимной строки.

Другой пример:

// vim:set textwidth=72 dir=c\:\tmp:  use c:\tmp here ~

Перед первым двоеточием имеется обратная косая черта, поэтому оно входит в текст команды ":set". Текст после второго двоеточия игнорируется, поэтому там можно поместить любой комментарий.

Подробнее см. |режимная_строка|.


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