перевод : 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. |
/\<идиот\>/ | Это выражение определяет текст, над которым предполагается |
/менеджер/ | Подставляемый текст |
gc | Флаги
|
Предположим, вы хотите заменить в тексте каждое слово "идиот"
словом "менеджер". И нет необходимости в подтверждении, так
как все идиоты - менеджеры.
Используйте команду :
:%s/\<идиот\>/менеджер/g
Команда состоит из :
: | Вход в командный режим |
% | Выполнить эту команду на всех строках (% - синоним "от |
s | Сокращенная форма команды :substitute. |
/\<идиот\>/ | Это выражение определяет текст, над которым предполагается |
/менеджер/ | Подставляемый текст |
g | Глобальный флаг -- Этот флаг говорит Vim заменить |
Предположим вы хотите переместить параграфы с верхней части теста
в нижнюю. Есть несколько способов сделать это. В этом примере мы
используем стиль Vi. В следующей части Перемещение
текста (Визуальный режим) мы делаем это, используя команды Vim.
Выполните следующие действия :
Команды | Разъяснение | |
1. |
| Переместите курсор на верх участка, который вы хотите |
2. | ma | Поместите здесь метку "a". (Vim не выдает |
3. |
| Переместите курсор внизу участка, который вы хотите |
4. | d'a | Удалите метку "a". Это поместит удаленный текст в |
5. |
| Переместите курсор на строку, где следует находиться тексту. |
6. | p | Вставить текст под курсором. |
Предположим вы хотите переместить параграфы с верхней части теста
в нижнюю. Есть несколько способов сделать это. В этом примере мы
используем стиль Vim. В предыдущей части Перемещение
текста (старый способ) мы делали это, используя команды Vi.
Выполните следующие действия :
Команды | Разъяснение | |
1. |
| Переместите курсор на верх участка, который вы хотите |
2. | v | Войдите в визуальный режим. (Если вы хотите переместить только |
3. |
| Переместите курсор внизу участка, который вы хотите |
4. | d | Выполняет визуальное удаление. Другими словами, удалить |
5. |
| Переместите курсор на строку, где следует находиться тексту. |
6. | p | Вставить текст под курсором. |
Есть несоклько способов копировать текст из одного файла в
другой. В этом разделе более традиционные команды Vi. В следующем
разделе Копирование с использованием
визуального режима, мы выполним те же операции использую
Визуальный режим.
Чтобы скопировать участок текста из
одного файла в другой, введите следующие команды:
Команды | Разъяснение | |
1. |
| Откройте для редактирования файл, содержащий текст, который вы |
2. |
| Перейдите к верхней строке копируемого участка. |
3. | ma | Поставить на строку метку "a". |
4. |
| Перейдите к нижней строке копируемого участка. |
5. | y'a | Скопировать (y) текст с текущей позиции до |
6. | :split второй-файл | Открыть другое окно, содержащее второй файл. (Файл, в который |
7. |
| Переместите курсор на строку куда должен быть скопирован текст. |
8. | p | Вставить текст после курсора. |
Есть несоклько способов копировать текст из одного файла в
другой. В этом разделе мы используем более новый, визуальный режим. В
предыдущем разделе описан старый Vi-Стиль.
Чтобы скопировать участок текста из
одного файла в другой, введите следующие команды:
Команды | Разъяснение | |
1. |
| Откройте для редактирования файл, содержащий текст для |
2. |
| Перейдите к верхней строке копируемого участка. |
3. | v | Войти в визуальный режим. Если вы хотите копировать текст |
4. |
| Перейдите на верхнюю стоку копируемого текста. Текст будет |
5. | y | Копировать (y) текст. |
6. | :split второй-файл | Открыть другое окно, содержащее второй файл. (Файл, в который |
7. |
| Переместите курсор на строку куда должен быть скопирован текст. |
8. | p | Вставить текст после курсора. |
Часто вы будете редактировать файл, содержащий список имен. К
примеру, список объектных файлов для компоновки в программу.
Пример : Команды Разъяснение 1. Переместите курсор на первую сортируемую строку. 2. ma Отметить первую строку как a. 3. Перейти вниз сортируемого текста. 4. !'asort Команда ! указывает Vim пропустить текст Результат: На практике в большинстве Мэйкфайлов (файл, используемый UNIX Часто вы будете редактировать файл, содержащий список имен. К Пример : Команды Разъяснение 1. Переместите курсор на первую сортируемую строку. 2. V Войти в строчный визуальный режим 3. Перейти вниз сортируемого текста. 4. !sort Команда ! указывает Vim обработать Смотрите секцию предупреждение о Одной их проблем с файловым форматом, используемым UNIX К примеру, это корректно : Так как их отличить, если и на экране (или печатной странице) Никак. Вы думаете это немного несправедливо. Особенно когда К счастью в Vim есть режим показывающий что именно находится в Редактор Vim не является текстовым процессором. Парень, это не Когда строка выходит за область печати, текстовый процессор Это позволит вводить текст гораздо проще. Но не решает проблем Вы может форсировать Команды Разъяснение 1. Перейдите в начало абзаца. 2. gq} "!" указывает Vim передать через программный 3. fmt -70 UNIX команда fmt - примитивный форматировщик. Она Vim был разработан программистами для программистов. Вы можете Но сначала вым нужно сгенерировать таблицу файлов , называемый Для генерации таблицы содержания всех программных файлов на C в Сгенерировав этот файл, укажите Vim что хотите редактировать Если отредактировали текущий файл и Мне нравится помещать большую закомментированную секцию перед Сначала вам нужно создать инициализационный файл Vim, Файл ~/.vimrc должен содержать строки: Итак, чтобы создать закомментированную секцию наберите #b. На Эта страница была написана в Vim. Как же мы вводили #b и #e? Еще несколько полезных комманд, которые может захотеть Аббревиатуры #d, #i и #l В заключение, набор команд sw=4 указывает Это очень полезно при использовании 4 пробелов при отступе в Вы можете использовать редактор Vim для просмотра текстовых Первая - man для взятия страницы. Следующая - ul, переводящая Итак, наши команды это: Если вы когда-нибудь пытались редактировать MS-DOS файл, то Для удаления символов ^M из MS-DOS файла введите команду: Некоторые люди считают пробелы и табуляцию в конце строки Первый набор слешей отграничивает "заменяемый текст". Итак, [ ]*$ указывает Vim просмотреть любое Затем найденное заменяется текстом между слешами. Так как этот Предположим вы редактируете файл и внесли много изменений. Это Редактор Vim позволяет вам редактировать защищенные от записи Так что же делать? Вы не хотите выбросить высе изменения, но Весь фокус в запуске :shell команды. Эта Теперь вы можете разрешить запись файла: Неплохо было бы находиться в режиме командного процессора Сокращая прибывание в :shell сессии вы Имеется список имен в виде: Диапазоном строк для этой команды является весь файл, что s (замена) указывает Vim производить строчную Старый текст представлен сложным регулярным выражением. Текст в первых \( ... \) определен как \1 В данном случае первым регулярным выражением является любая Второе выражение подставляет что угодно: .* до Результатом этой подстановки в том, что первое слово в строке Схема, приведенная ниже, показывает отношение между строками Для этого потребуется fgrep и специальный консольный символ Чтобы редактировать все файлы програм на C в которых есть Так как эта команда находится между символами (`) Затем для этих файлов запускается редактор Vim . Далее для Запустите Vim. Выполните команду : version.o
pch.o
getopt.o
util.o
getopt1.o
inp.o
patch.o
backupfile.o
Этот список мило бы выглядел в алфавитном порядке. Или по меньшей
мере в последовательности ASCII. Для сортировки по алфавиту введите
следующие команды:
через UNIX команду. 'a указывает редактору что
обработать нужно участок с текущей строки и до метки a.
Сортировку выполняет команда sort.
backupfile.o
getopt.o
getopt1.o
inp.o
patch.o
pch.o
util.o
version.o
Предупреждение
для контроля компиляции) больше похож на: 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. Для сортировки по алфавиту введите
следующие команды:
подчеркнутый текст командой UNIX. Обрабатывает текст команда sort.
Предупреждение
сортировке для короткого ознакомления с проблемами при
использовании этой команды. Работа с Make-файлом и другими SOB файлами
командой make является его крайняя сумасбродность. prog: prog.c
cc -g -o prog prog.c
А это - нет: prog: prog.c
cc -g -o prog prog.c
С первого взгляда может показаться, что оба примера одинаковы. Но
присмотритесь получше. Строка "cc" в первом случае
начинается с таба. Вторая - с восьми пробелов. (На экране не видно
отличия межде пробелами и табом! Вам необходима более качественная
видеокарта.)
они выглядят одинаково.
make работает с одни, но не работает с другим. Но кто угодно может
сказать что UNIX справедлив.
вашем файле. Команда :set list
переведет вас в этот режим. Когда экран установлен в "list
mode", отображаются все символы. Табуляции выглядят как "^I"
и конец строки обозначен как $. Таким образом, два наши примера
выглядят как: prog: prog.c$
^Icc -g -o prog prog.c$
и prog: prog.c$
cc -g -o prog prog.c$
Теперь можно легко разобрать которая строка содержит таб. Форматирование параграфа
текстовый процессор. Есть куча вещей, которые можно лучше получаются
при редактировании текста.
автоматически переходит на новую строку. Редактор Vim позволяет
делать строки настолько длинными, насколько вы того хотите. Командой: :set wrapmargin=70
вы указываете Vim автоматически переходить на новую строку при
длине текущей в 70 символов. (Вы можете задать какое угодно число
длины строки.)
редактирования. Если вы введете абзац и затем решите удалить половину
слова в первой строке, Vim не переформатирует текст.
переформатирование командами:
канал участок текста для фильтрации. } указывает
Vim что передается одни абзац.
выполняет пословесную обработку достаточную для текстовой
документации. -70 указывает fmt форматировать строки по 70
символов на строку.
Поиск процедуры в программе на Си
использовать его для нахождения процедуры внутри набора программных
файлов на C или C++.
"tags" файлом. (Этот файл по грубому называется tags.)
Команда ctags генерирует эти файловые таблицы.
текущей рабочей директории используйте следующие команды: $ ctags *.c
Для C++ используйте команду: $ ctags *.cpp
Если вы используете отличное от .cpp расширение для ваших C++
файлов, используйте его вместо .cpp.
процедуру и он определить местоположение этой процедуры и переместит
вас к ее содержимому. К примеру если вы хотите редактировать
процедуру write_file, используйте команду: $ vim -t write_file
Предположим вы просматриваете процедуру write_file которая
вызывает процедуру setup_data и вы хотите ее просмотреть. Чтобы
перейти к этой функции, поместите курсор в начале выражения
setup_data и нажмите Ctrl+]. Это укажет Vim перейти к объявлению этой
процедуры. Это перемещение произойдет даже если Vim для этого
понадобится перейти на другой файл. Примечание :
не сохранили его, Vim выведет предупреждение и проигнорирует команду
Ctrl+]. Рисование комментариев
каждой процедурой. К примеру: /*******************************************************
* Программа -- Решает -- Решает все мировые проблемы. *
* Все. На раз. Это будет великая *
* программа когда я ее закончу. *
*******************************************************/
Рисование этих секций - по меньшей мере скучное занятие. Но у Vim
есть замечательная возможность, называемая "сокращения",
которая значительно упрощает дело.
называемый ~/.vimrc. (Сперва этот файл может выглядеть как
инициализационный файл ex. Это так. Фактически команда Vim является
режимом редактора ex .) :ab #b /************************************************
:ab #e ************************************************/
Эти команды определяют набор сокращений Vim. Что такое сокращение
Vim? Это выражение, которое заменяет другое выражение. Когда Vim
увидит сокращение, он расширите его до полного выражения. В этой
секции мы определили сокращение #b, которое
расширяется в начальную линию комментария. Сокращение #e
делает тоже самое.
экране окажется: /************************************************
Введите комментарии, включая символы "*" в конце и
начале. Закончите комментарий вводом #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 писать в старый файл при переключении между файлами.
определяют полезные для программистов выражения.
ширину сдвига (число символов перемещаемых командой сдвига (<
и >>)).
ваших программах на C или C++ . (Обучение в Rice University показало
что это лучший размер для отступа.) Чтение man страницы
файлов. Один из самых полезных способов - просмотр man страниц. Для
этого применяется конвейер из трех команд.
эскейп коды подчеркивания и выделения текста в что-то читабельное и
наконец Vim для просмотра файла. $ man тема | ul -i | vim -
Man-страница будет сгенерирована и затем отображена в окне Vim.
Теперь вы можете ваши обычные команды редактирования для просмотра
текста. Удаление символа возврата каретки из MS-DOS
файла
заметили что каждая линия заканчивается символом ^M.
Причиной тому служит веселенький способ обращения MS-DOS к концу
строки. (Для понимания некоторых аспектов этой проблемы см. Историю
EOL. :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 до последней строки: $).
Квадратные скобки содержат возможные варианты совпадения. Так [
] указывает совпадение пробела или табуляции. Звездочка (*)
означает что предыдущее совпадение (пробел или табуляция) могут
повторяться любое число раз. Знак доллара ($
указывает на конец строки.
количество пробелов или табуляций находящихся в конце строки.
текст - пустышка, то пробелы и табуляция фактически удаляются. Упс, я оставил файл защищенным от записи
очень важный файл и для предотвращения внесения случайных правок вы
сделали его защищенным от записи, даже для себя.
файлы с небольшим или вообще без предупреждения. Единственная
трудность в том, что когда вы пытаетесь выйти используя "ZZ",
происходит ошибка: file.txt File is read only
и Vim не выходит.
вам нужно выйти из Vim для того чтобы снять запрет на запись.
команда выводит вас из Vim запуском командного процессора (shell) под
Vim
$ chmod u+w файл.txt
и выйти из командного процессора, возвратившись в Vim $ exit
В конце вам нужно заставить Vim записать файл используя команду: :w!
(файл до сих пор считается защищенным от записи, поэтому и нужно
использовать принудительную опцию (!) для проведения
попытки записи.) Примечание :
запущенного :shell командой. Просто потому что довольно легко забыть
что он запущен из-под Vim. Может получиться так, что будет запущен
командный процессор, который запустит Vim, который запустит командный
процессор, который запустит Vim, который .... Действуя таким способом
вы можете легко расходовать много ресурсов и вызвать большую
неразбериху.
избегаете большинства проблем. Замена "Последний, Первый" на
"Первый Последний" Последний, Первый
Как привести это к виду: Первый Последний
Осуществить это можно с помощью такой команды: :1,$s/\([^,]*\), \(.*$\)/\2 \1/
Двоеточие (:) указывает Vim что выражение является
командой в стиле ex.
задано диапазоном 1,$.
замену.
Ограничители \( ... \) используются для указания
редактирору, что отмечает регулярное выражение, которое должно быть
интерпретировано специально.
в заменяющем тексте. Второй участок текста внутри \( ... \)
определен для \2 и так далее.
группа символов в которой нет запятой. [^,]
обозначает "что угодно кроме запятой", * определяет набор
(ноль или более символов).
конца строки: $.
определяется как \1 и второе как \2.
Эти значения используются в конце команды для перестановки слова.
ограниченными маркерами \( \) и \1,
\2. :1,$s/\([^,]*\), \(.*$\)/\2 \1/
^^ ^^ ^^ ^^^ ^ ^
|| || || ||| | +----- Строка подставляемая
|| || || ||| | первым \( \)
|| || || ||| +--------- Строка подставляемая
|| || || ||| вторым \( \)
|| || || ||+----------- Разделение слешами
|| || || || старых/новых строк
|| || ++---++------------ Вторая \( \)
++-----++--------------------- Первая \( \)
Следующая схема раскрывает смысл различных частей регулярного
выражения в примере. :1,$s/\([^,]*\), \(.*$\)/\2 \1/
^^^^^ ^^ ^^^
||||| || ||+--- Конец строки
||||| || |+---- Повторяется 0 или более раз
||||| || +----- Любой символ
||||| || +++--- Любой повторный символ
||||| || до символа конца строки
||||| |+-------- Символ пробела
||||| +--------- Символ запятой
||||+------------ Повторяется 0 или более раз
|||+------------- Закрывает [] выражение
||+-------------- Символ запятой
|+--------------- Сравнение любого за исключением
| следующего символа
+---------------- Начало набора совпадений
++++------------- Совпадает все кроме запятой
+------------ Повторяется 0 или более раз
+--------- Пока не будет встречена запятаяКак редактировать все файлы содержащие
заданное слово
обратного апостроф (`).
выражение уровень_отступа выполните команду: $ vim `fgrep -l уровень_отступа *.c`
fgrep -l уровень_отступа *.c ищет во всех файлах,
чье название закачивается на .c слово и выводит их список.
, ее результат (список файлов) помещается в командную строку.
перемещения между файлами могут быть использованы команды :n{Enter}
и :rew{Enter}. Как редактировать все файлы
содержащие заданное слово используя встроенный grep :grep >слово</i0> >список_файлов
Будет найдено первое вхождение слово в данных файлах и установлен
курсор на данную строку. Вы можете использовать команду :cn
для поиска следующего вхождения.