| ||
перевод : 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 | Вставить текст после курсора. |
Часто вы будете редактировать файл, содержащий список имен. К
примеру, список объектных файлов для компоновки в программу.
Пример :
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 пропустить текст |
Результат:
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
командой 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 передать через программный |
3. | fmt -70 | UNIX команда fmt - примитивный форматировщик. Она |
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 показало
что это лучший размер для отступа.)
Вы можете использовать редактор Vim для просмотра текстовых
файлов. Один из самых полезных способов - просмотр man страниц. Для
этого применяется конвейер из трех команд.
Первая - man для взятия страницы. Следующая - ul, переводящая
эскейп коды подчеркивания и выделения текста в что-то читабельное и
наконец Vim для просмотра файла.
Итак, наши команды это:
$ man тема | ul -i | vim -
Man-страница будет сгенерирована и затем отображена в окне Vim.
Теперь вы можете ваши обычные команды редактирования для просмотра
текста.
Если вы когда-нибудь пытались редактировать 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}.
Запустите Vim.
Выполните команду :
:grep >слово</i0> >список_файлов
Будет найдено первое вхождение слово в данных файлах и установлен
курсор на данную строку. Вы можете использовать команду :cn
для поиска следующего вхождения.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |