Поваренная Книга Vim

Оригинал: dw-ap.blogspot.com, DW's journal
Перевод: DW.

автор : Steve Oualline


перевод : DW


Это страница Поваренной Книги Vim. Она содержит короткие
рецепты как сделать много простых и не простых вещей в Vim.
Для начала ознакомления вы уже должны знать основы Vim, однако
каждая команда детально объясняется.

Каждый набор инструкций является завершенным. Чувствуйте себя как
дома и выбирайте именно то что вам нужно.

Содержание


Перестановка символов
Интерактивная
замена одного слова другим

Интерактивная
замена одного слова другим (метод командной строки)

Замена
одного слова другим одной командой

Перемещение
текста (в стиле Vi)

Перемещение
текста (Визуальный режим)

Копирование
участка текста из одного файла в другой

Копирование
участка текста из одного файла в другой (Визуальный Метод)


Сортировка участка текста (Перемещение текста
(в стиле Vi)

Сортировка
участка текста (Визуальный Метод)

Работа с
Make-файлом и другими SOB файлами

Форматирование
параграфа

Поиск процедуры в программе на Си

Рисование комментариев
Чтение
man страницы

Удаление символа возврата каретки
из MS-DOS файла

Обрезание пробелов в конце
строки

Упс, я оставил файл защищенным от
записи

Замена "Последний, Первый"
на "Первый Последний"

Как
редактировать все файлы содержащие заданное слово

Как
редактировать все файлы содержащие заданное слово используя
встроенный grep



Перестановка символов


Если вы быстро печатаете, ваши пальцы могут легко обогнать ваш
разум. Часто люди путают местами символы. Например "the"
превращается в "teh".

Для перестановки двух символов, к примеру "e" и "h",
поместите курсор на "e" и наберите xp.

Команда "x" удаляет символ ("e") и "p"
вставляет его после курсора (который теперь находится над "h".)



Интерактивная замена одного слова другим (метод командной строки)


Предположим, вы хотите заменить в тексте каждое слово "идиот"
словом "менеджер". Но вы хотите иметь возможность
предпросмотра до замены.


Для этого нужно:


1.

1G

Перейти в начало документа

2.

/идиот

Найти первое вхождение слова "идиот"

3.

cwменеджер

Заменить слово (cw) на менеджер

4.

n

Повторить последний поиск (найти следующего идиота.)

5.

.

Повторить последнее редактирование (заменить слово на
"менеджер"
(Если вы не хотите менять слово,
пропустите этот шаг


Повторяйте шаги 4 и 5 пока не замените все вхождения




Интерактивная замена
одного слова другим (метод командной строки)


Предположим, вы хотите заменить в тексте каждое слово "идиот"
словом "менеджер". Но вы хотите иметь возможность
предпросмотра до замены.


Выполните команду :

:%s/\<идиот\>/менеджер/gc


Эта команда будет производить замену и останавливаться после каждого
изменения, чтобы дать вам возможность подтвердить его. Ввод "y"
означает принятие, а "n" - отказ от изменения.

Команда состоит из :










:


Вход в командный режим


%


Выполнить эту команду на всех строках (% - синоним "от
первой до последней строки".)


s


Сокращенная форма команды :substitute.


/\<идиот\>/


Это выражение определяет текст, над которым предполагается
поколдовать. \</b0> отмечает начало слова и \> - его
конец.


/менеджер/


Подставляемый текст


gc


Флаги



g

Глобально -- Заменяет каждое вхождение, не используя "с
начала и до конце" на каждой строке

c

Подтверждение -- Спрашивать перед каждой заменой





Замена одного слова другим одной
командой


Предположим, вы хотите заменить в тексте каждое слово "идиот"
словом "менеджер". И нет необходимости в подтверждении, так
как все идиоты - менеджеры.

Используйте команду :

:%s/\<идиот\>/менеджер/g


Команда состоит из :










:


Вход в командный режим


%


Выполнить эту команду на всех строках (% - синоним "от
первой до последней строки".)


s


Сокращенная форма команды :substitute.


/\<идиот\>/


Это выражение определяет текст, над которым предполагается
поколдовать. \</b0> отмечает начало слова и \> - его
конец.


/менеджер/


Подставляемый текст


g


Глобальный флаг -- Этот флаг говорит Vim заменить
каждое вхождение на лини, то есть не только первое.






Перемещение текста (в стиле Vi)


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

Выполните следующие действия :










Команды

Разъяснение

1.

 

Переместите курсор на верх участка, который вы хотите
переместить.

2.

ma

Поместите здесь метку "a". (Vim не выдает
сообщения о выполнении этой команды. Другими словами, экран не
изменится.)

3.

 

Переместите курсор внизу участка, который вы хотите
переместить.

4.

d'a

Удалите метку "a". Это поместит удаленный текст в
буфер.

5.

 

Переместите курсор на строку, где следует находиться тексту.
Текст будет на следующей строке.

6.

p

Вставить текст под курсором.




Перемещение текста (Визуальный
способ).


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

Выполните следующие действия :









Команды

Разъяснение

1.

 

Переместите курсор на верх участка, который вы хотите
переместить.

2.

v

Войдите в визуальный режим. (Если вы хотите переместить только
полные линии, используйте команду V, которая
включает визуальный строчный режим.

3.

 

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

4.

d

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

5.

 

Переместите курсор на строку, где следует находиться тексту.
Текст будет на следующей строке.

6.

p

Вставить текст под курсором.




Копирование участка текста из одного
файла в другой (В стиле Vi Style)


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

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












Команды

Разъяснение

1.

 

Откройте для редактирования файл, содержащий текст, который вы
хотите скопировать.

2.

 

Перейдите к верхней строке копируемого участка.

3.

ma

Поставить на строку метку "a".

4.

 

Перейдите к нижней строке копируемого участка.

5.

y'a

Скопировать (y) текст с текущей позиции до
отметки "a" ('a)

6.

:split второй-файл

Открыть другое окно, содержащее второй файл. (Файл, в который
должен быть скопирован текст.)

7.

 

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

8.

p

Вставить текст после курсора.




Копирование участка текста из
одного файла в другой (Визуальный Метод)


Есть несоклько способов копировать текст из одного файла в
другой. В этом разделе мы используем более новый, визуальный режим. В
предыдущем разделе описан старый Vi-Стиль.

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












Команды

Разъяснение

1.

 

Откройте для редактирования файл, содержащий текст для
копирования.

2.

 

Перейдите к верхней строке копируемого участка.

3.

v

Войти в визуальный режим. Если вы хотите копировать текст
целыми строками, используйте V для включения
Визуального Строчного Режима

4.

 

Перейдите на верхнюю стоку копируемого текста. Текст будет
подсвечен.

5.

y

Копировать (y) текст.

6.

:split второй-файл

Открыть другое окно, содержащее второй файл. (Файл, в который
должен быть скопирован текст.)

7.

 

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

8.

p

Вставить текст после курсора.


Сортировка участка текста (Перемещение
текста (в стиле Vi)


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

Пример : version.o
pch.o
getopt.o
util.o
getopt1.o
inp.o
patch.o
backupfile.o


Этот список мило бы выглядел в алфавитном порядке. Или по меньшей
мере в последовательности ASCII. Для сортировки по алфавиту введите
следующие команды:








Команды

Разъяснение

1.

 

Переместите курсор на первую сортируемую строку.

2.

ma

Отметить первую строку как a.

3.

 

Перейти вниз сортируемого текста.

4.

!'asort

Команда ! указывает Vim пропустить текст
через UNIX команду. 'a указывает редактору что
обработать нужно участок с текущей строки и до метки a.
Сортировку выполняет команда sort.


Результат:

        backupfile.o
getopt.o
getopt1.o
inp.o
patch.o
pch.o
util.o
version.o


Предупреждение


На практике в большинстве Мэйкфайлов (файл, используемый UNIX
для контроля компиляции) больше похож на:

OBJS = \
version.o \
pch.o \
getopt.o \
util.o \
getopt1.o \
inp.o \
patch.o \
backupfile.o


Заметьте, что обратный слеш (\) использован для индикации конца
строки. После сортировки получается:

OBJS = \
backupfile.o
getopt.o \
getopt1.o \
inp.o \
patch.o \
pch.o \
util.o \
version.o \


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

OBJS = \
backupfile.o \
getopt.o \
getopt1.o \
inp.o \
patch.o \
pch.o \
util.o \
version.o



Сортировка участка текста
(Визуальный Метод)


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

Пример :

        version.o       
pch.o
getopt.o
util.o
getopt1.o
inp.o
patch.o
backupfile.o


Этот список мило бы выглядел в алфавитном порядке. Или по меньшей
мере в последовательности ASCII. Для сортировки по алфавиту введите
следующие команды:








Команды

Разъяснение

1.

Переместите курсор на первую сортируемую строку.

2.

V

Войти в строчный визуальный режим

3.

Перейти вниз сортируемого текста.

4.

!sort

Команда ! указывает Vim обработать
подчеркнутый текст командой UNIX. Обрабатывает текст команда sort.


Предупреждение


Смотрите секцию предупреждение о
сортировке
для короткого ознакомления с проблемами при
использовании этой команды.

Работа с Make-файлом и другими SOB файлами


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

К примеру, это корректно :

        prog: prog.c
cc -g -o prog prog.c


А это - нет:

        prog: prog.c
cc -g -o prog prog.c


С первого взгляда может показаться, что оба примера одинаковы. Но
присмотритесь получше. Строка "cc" в первом случае
начинается с таба. Вторая - с восьми пробелов. (На экране не видно
отличия межде пробелами и табом! Вам необходима более качественная
видеокарта.)

Так как их отличить, если и на экране (или печатной странице)
они выглядят одинаково.

Никак. Вы думаете это немного несправедливо. Особенно когда
make работает с одни, но не работает с другим. Но кто угодно может
сказать что UNIX справедлив.

К счастью в Vim есть режим показывающий что именно находится в
вашем файле. Команда

        :set list


переведет вас в этот режим. Когда экран установлен в "list
mode", отображаются все символы. Табуляции выглядят как "^I"
и конец строки обозначен как $. Таким образом, два наши примера
выглядят как:

        prog: prog.c$
^Icc -g -o prog prog.c$


и

        prog: prog.c$
cc -g -o prog prog.c$


Теперь можно легко разобрать которая строка содержит таб.



Форматирование параграфа


Редактор Vim не является текстовым процессором. Парень, это не
текстовый процессор. Есть куча вещей, которые можно лучше получаются
при редактировании текста.

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

        :set wrapmargin=70


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

Это позволит вводить текст гораздо проще. Но не решает проблем
редактирования. Если вы введете абзац и затем решите удалить половину
слова в первой строке, Vim не переформатирует текст.

Вы может форсировать
переформатирование командами:







Команды

Разъяснение

1.

 

Перейдите в начало абзаца.

2.

gq}

"!" указывает Vim передать через программный
канал участок текста для фильтрации. } указывает
Vim что передается одни абзац.

3.

fmt -70

UNIX команда fmt - примитивный форматировщик. Она
выполняет пословесную обработку достаточную для текстовой
документации. -70 указывает fmt форматировать строки по 70
символов на строку.


Поиск процедуры в программе на Си


Vim был разработан программистами для программистов. Вы можете
использовать его для нахождения процедуры внутри набора программных
файлов на C или C++.

Но сначала вым нужно сгенерировать таблицу файлов , называемый
"tags" файлом. (Этот файл по грубому называется tags.)
Команда ctags генерирует эти файловые таблицы.

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

        $ ctags *.c


Для C++ используйте команду:

        $ ctags *.cpp


Если вы используете отличное от .cpp расширение для ваших C++
файлов, используйте его вместо .cpp.

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

        $ vim -t write_file


Предположим вы просматриваете процедуру write_file которая
вызывает процедуру setup_data и вы хотите ее просмотреть. Чтобы
перейти к этой функции, поместите курсор в начале выражения
setup_data и нажмите Ctrl+]. Это укажет Vim перейти к объявлению этой
процедуры. Это перемещение произойдет даже если Vim для этого
понадобится перейти на другой файл.

Примечание :


Если отредактировали текущий файл и
не сохранили его, Vim выведет предупреждение и проигнорирует команду
Ctrl+].



Рисование комментариев


Мне нравится помещать большую закомментированную секцию перед
каждой процедурой. К примеру:

        /*******************************************************
* Программа -- Решает -- Решает все мировые проблемы. *
* Все. На раз. Это будет великая *
* программа когда я ее закончу. *
*******************************************************/


Рисование этих секций - по меньшей мере скучное занятие. Но у Vim
есть замечательная возможность, называемая "сокращения",
которая значительно упрощает дело.

Сначала вам нужно создать инициализационный файл Vim,
называемый ~/.vimrc. (Сперва этот файл может выглядеть как
инициализационный файл ex. Это так. Фактически команда Vim является
режимом редактора ex .)

Файл ~/.vimrc должен содержать строки:

        :ab #b /************************************************
:ab #e ************************************************/


Эти команды определяют набор сокращений Vim. Что такое сокращение
Vim? Это выражение, которое заменяет другое выражение. Когда Vim
увидит сокращение, он расширите его до полного выражения. В этой
секции мы определили сокращение #b, которое
расширяется в начальную линию комментария. Сокращение #e
делает тоже самое.

Итак, чтобы создать закомментированную секцию наберите #b. На
экране окажется:

        /************************************************


Введите комментарии, включая символы "*" в конце и
начале. Закончите комментарий вводом #e. Это введет
конечную стору комментария.

Примечание :


Эта страница была написана в Vim. Как же мы вводили #b и #e?
Легко, набирая #bb и удаляя символ. (Нельзя написать #b, ведь в таком
случае он будет расширен.)

Еще несколько полезных комманд, которые может захотеть
программист ввести в ~/.exrc:

        :set autoindent
:set autowrite
:ab #d #define
:ab #i #include
:ab #b /************************************************
:ab #e ************************************************/
:ab #l /*----------------------------------------------*/
:set sw=4


Настройка автоматического отступа (autoindent) указывает Vim в
новой строке делать такой же отступ как и в предыдущей. Очень
полезная вещь для написания программ. Настройка автоматической записи
указывает Vim писать в старый файл при переключении между файлами.

Аббревиатуры #d, #i и #l
определяют полезные для программистов выражения.

В заключение, набор команд sw=4 указывает
ширину сдвига (число символов перемещаемых командой сдвига (<
и >>)).

Это очень полезно при использовании 4 пробелов при отступе в
ваших программах на C или C++ . (Обучение в Rice University показало
что это лучший размер для отступа.)



Чтение man страницы


Вы можете использовать редактор Vim для просмотра текстовых
файлов. Один из самых полезных способов - просмотр man страниц. Для
этого применяется конвейер из трех команд.

Первая - man для взятия страницы. Следующая - ul, переводящая
эскейп коды подчеркивания и выделения текста в что-то читабельное и
наконец Vim для просмотра файла.

Итак, наши команды это:

$ man тема | ul -i | vim -


Man-страница будет сгенерирована и затем отображена в окне Vim.
Теперь вы можете ваши обычные команды редактирования для просмотра
текста.



Удаление символа возврата каретки из MS-DOS
файла


Если вы когда-нибудь пытались редактировать MS-DOS файл, то
заметили что каждая линия заканчивается символом ^M.
Причиной тому служит веселенький способ обращения MS-DOS к концу
строки. (Для понимания некоторых аспектов этой проблемы см. Историю
EOL
.

Для удаления символов ^M из MS-DOS файла введите команду:

        :1,$s/{Ctrl+V}{Ctrl+M}//{Enter}


Двоеточие в начале команды (:) указывает Vim войти
в ex режим. Все команды ex начинаются с указания диапазона строк, в
данном случае с первой (1) по последнюю ($). Слеш The slash указывает
начало "заменяемого текста". {Ctrl+V}
указывает Vim обращаться к следующему символу как к регулярному даже
в случае если он является специфичным. Следующий символ - это
{Ctrl+M}. (Он был бы обращением к {Enter}
без {Ctrl+V}.) Следующий слеш заканчивает выражение
"заменяемый текст". Следующее выражение является
"заменяющим текстом" отграниченным слешами. В данном случае
это пустота (//).



Обрезание пробелов в конце строки


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


        :1,$s/[ ]*$//


Двоеточие (:) указывает Vim войти в режим команд ex. Все команды
ex начинаются с указания диапазона строк, в данном случае весь файл
(с 1 до последней строки: $).

Первый набор слешей отграничивает "заменяемый текст".
Квадратные скобки содержат возможные варианты совпадения. Так [
]
указывает совпадение пробела или табуляции. Звездочка (*)
означает что предыдущее совпадение (пробел или табуляция) могут
повторяться любое число раз. Знак доллара ($
указывает на конец строки.

Итак, [ ]*$ указывает Vim просмотреть любое
количество пробелов или табуляций находящихся в конце строки.

Затем найденное заменяется текстом между слешами. Так как этот
текст - пустышка, то пробелы и табуляция фактически удаляются.



Упс, я оставил файл защищенным от записи


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

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

    file.txt    File is read only


и Vim не выходит.

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

Весь фокус в запуске :shell команды. Эта
команда выводит вас из Vim запуском командного процессора (shell) под
Vim


Теперь вы можете разрешить запись файла:

 
$ chmod u+w файл.txt


и выйти из командного процессора, возвратившись в Vim

        $ exit


В конце вам нужно заставить Vim записать файл используя команду:

        :w!


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

Примечание :


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

Сокращая прибывание в :shell сессии вы
избегаете большинства проблем.



Замена "Последний, Первый" на
"Первый Последний"


Имеется список имен в виде:

        Последний, Первый


Как привести это к виду:

        Первый Последний


Осуществить это можно с помощью такой команды:

    :1,$s/\([^,]*\), \(.*$\)/\2 \1/


Двоеточие (:) указывает Vim что выражение является
командой в стиле ex.

Диапазоном строк для этой команды является весь файл, что
задано диапазоном 1,$.

s (замена) указывает Vim производить строчную
замену.

Старый текст представлен сложным регулярным выражением.
Ограничители \( ... \) используются для указания
редактирору, что отмечает регулярное выражение, которое должно быть
интерпретировано специально.

Текст в первых \( ... \) определен как \1
в заменяющем тексте. Второй участок текста внутри \( ... \)
определен для \2 и так далее.

В данном случае первым регулярным выражением является любая
группа символов в которой нет запятой. [^,]
обозначает "что угодно кроме запятой", * определяет набор
(ноль или более символов).

Второе выражение подставляет что угодно: .* до
конца строки: $.

Результатом этой подстановки в том, что первое слово в строке
определяется как \1 и второе как \2.
Эти значения используются в конце команды для перестановки слова.

Схема, приведенная ниже, показывает отношение между строками
ограниченными маркерами \( \) и \1,
\2.

        :1,$s/\([^,]*\), \(.*$\)/\2 \1/
^^ ^^ ^^ ^^^ ^ ^
|| || || ||| | +----- Строка подставляемая
|| || || ||| | первым \( \)
|| || || ||| +--------- Строка подставляемая
|| || || ||| вторым \( \)
|| || || ||+----------- Разделение слешами
|| || || || старых/новых строк
|| || ++---++------------ Вторая \( \)
++-----++--------------------- Первая \( \)


Следующая схема раскрывает смысл различных частей регулярного
выражения в примере.

        :1,$s/\([^,]*\), \(.*$\)/\2 \1/
^^^^^ ^^ ^^^
||||| || ||+--- Конец строки
||||| || |+---- Повторяется 0 или более раз
||||| || +----- Любой символ
||||| || +++--- Любой повторный символ
||||| || до символа конца строки
||||| |+-------- Символ пробела
||||| +--------- Символ запятой
||||+------------ Повторяется 0 или более раз
|||+------------- Закрывает [] выражение
||+-------------- Символ запятой
|+--------------- Сравнение любого за исключением
| следующего символа
+---------------- Начало набора совпадений
++++------------- Совпадает все кроме запятой
+------------ Повторяется 0 или более раз
+--------- Пока не будет встречена запятая



Как редактировать все файлы содержащие
заданное слово


Для этого потребуется fgrep и специальный консольный символ
обратного апостроф (`).

Чтобы редактировать все файлы програм на C в которых есть
выражение уровень_отступа выполните команду:

    $ vim `fgrep -l уровень_отступа *.c`


fgrep -l уровень_отступа *.c ищет во всех файлах,
чье название закачивается на .c слово и выводит их список.

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


Затем для этих файлов запускается редактор Vim . Далее для
перемещения между файлами могут быть использованы команды :n{Enter}
и :rew{Enter}.

Как редактировать все файлы
содержащие заданное слово используя встроенный grep


Запустите Vim.

Выполните команду :

    :grep >слово</i0> >список_файлов


Будет найдено первое вхождение слово в данных файлах и установлен
курсор на данную строку. Вы можете использовать команду :cn
для поиска следующего вхождения.