Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Назад Просто о Vim Вперед

Vim : Углубленное редактирование

Введение

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

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

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

Что если вы хотите открыть файл на чтение и не хотите его редактировать? Этого можно добиться запустив команду vim -R, которая запускает Vim в режиме только-чтение. Или, если вы имеете файл, уже открытый в Vim, вы можете запустить :set ro для создания буфера только для чтения. Преимущество использования этого варианта будет видно при просмотре больших файлов. Это значительно ускоряет просмотр, поскольку Vim не нужно беспокоиться о создании изменений.

Что, если вы хотите вставить содержание иного файла в текущий файл? Просто запустите :r another_file.txt и содержание файла another_file.txt будет "прочитано" и вставлено в текущий буфер. Это полезно во многих случаях, таких как объединение двух различных файлов или когда нужно сделать копию файла для внесения небольших изменений, и т.д.

Крутым побочным эффектом команды :r является то, что вы можете использовать её для чтения вывода команд, а не только файлов.

Например, установим программу GCal и запустим её:

:r !gcal -s1 -K

Она вставляет календарь с текущим месяцем (!gcal), с неделей, начинающейся с Monday (Понедельника) (s1), а также показывает номер недели (K). Текст будет выглядеть примерно так:

         April 2007
    Mo Tu We Th Fr Sa Su CW
                       1 13
     2  3  4< 5> 6  7  8 14
     9 10 11 12 13 14 15 15
    16 17 18 19 20 21 22 16
    23 24 25 26 27 28 29 17
    30                   18

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

Регистры все запомнят

Давайте возьмем наш обычный простой текст:

I have coined a phrase for myself - 'CUT to the G':
1. Concentrate
2. Understand
3. Think
4. Get Things Done

Step 4 is eventually what gets you moving, but Steps 2 and 3 are equally important. As Abraham Lincoln once said "If I had eight hours to chop down a tree, I'd spend six hours sharpening my axe." And to get to this stage, you need to do Step 1 which boils down to one thing - It's all in the mind. That's why it's so hard.

Теперь, предположим, что вы хотите скопировать 4 пункта в другое место, например в резюме. Вы также хотите сохранить второе предложение, чтобы потом вставить его где-то. Было бы неплохо сохранить эти два отдельных фрагмента текста в двух разных местах одновременно, продолжить работу, а затем позже их вставить? Это достигается с помощью регистров, которые (опять же) часть памяти компьютера, с помощью которых можно быстро сохранять и извлекать текст.

Например, вы можете разместить курсор на строке, содержащей текст 1. Concentrate, и набрать "a4yy:

"a использовать регистр с именем 'a' для того, чтобы

4 выполнить 4 раза следующую операцию

yy скопировать строку

В переводе это означает "копировать следующие 4 строки в регистр с именем 'a' ".

Для следующего шага вы можете визуально выделить второе предложение в последнем параграфе и, набрав "bd, удалить ('d'elete) текст в регистр с именем 'b'.

Теперь, когда мы имеем копию соответствующего текста в буферах, мы можем вставить текст где требуется — просто нажатием "ap , где 'p'aste вставляет текст из регистра с именем 'a' и соответственно "bp вставляет текст из регистра с именем 'b' и так далее.

Для просмотра содержимого всех регистров выполните:

:registers

Видите, как Vim делает простой концепцию clipboard и делает её такой мощной!

Смотри :help registers для информации о различных типах регистров в Vim.

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

Если вы хотите разместить текст по центру? Давайте, скажем, возьмем такой текст:

   THIS IS THE HEADING

Нужно запустить:

:set textwidth=70

:center

Вы должны получить следующий результат:

                            THIS IS THE HEADING

Установка :set textwidth=70 определяет максимальную ширину всех абзацев в 70 символов, и если вы пишете строки длиннее чем 70 символов, Vim автоматически перенесет слово, превышающее эту длину, на следующую строку.

Например, возьмите такой текст:

   Step 4 is eventually what gets you moving, but Steps 2 and 3 are equally
   important. As Abraham Lincoln once said "If I had eight hours to chop down a
   tree, I'd spend six hours sharpening my axe." And to get to this stage, you need
   to do Step 1 which boils down to one thing - It's all in the mind. That's why
   it's so hard.

Он был написан с длиной строки 80. Мы хотим переформатировать абзац, заполнив максимально 70 колонок. Давайте выполним команды:

:set textwidth=70

gwap

Вторую команду нужно понимать как:

gw говорит начать ('g'o) форматирование текста и вернуться 'w'here I was

ap means 'a' 'p'aragraph

Ура! Текст принимает такой вид:

   Step 4 is eventually what gets you moving, but Steps 2 and 3 are
   equally important. As Abraham Lincoln once said "If I had eight hours
   to chop down a tree, I'd spend six hours sharpening my axe." And to
   get to this stage, you need to do Step 1 which boils down to one thing
   - It's all in the mind. That's why it's so hard.

Смотри :help formatting и :help formatoptions для детальной информации.

Также, аналогично команде :center, есть команды :left и :right для выравнивания текста по левому краю и по правому краю соответственно.

Поиск и замена

Мы рассмотрели, как найти текст. Ну, а допустим, мы хотим найти и заменить ('search and replace')? Можно использовать команду :s.

Например, вы имеете текст:

   Setp 4 is eventually what gets you moving, but Setps 2 and 3 are equally
   important. As Abraham Lincoln once said "If I had eight hours to chop down a
   tree, I'd spend six hours sharpening my axe." And to get to this stage, you need
   to do Setp 1 which boils down to one thing - It's all in the mind. That's why
   it's so hard.

Мы хотим заменить все орфографические ошибки setp на step. Для этого выполним:

:s/setp/step/g

Эту команду можно прочитать так:

:s/pattern/replacement text/options

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

:s/\(bachchan\) \(amitabh\)/\2\1/g

Эта команда конвертирует текст из bachchan amitabh в amitabh bachchan.

Опциями можно определить, как замена будет работать. По умолчанию, поиск и замена работают только на первых вхождениях поискового шаблона в строке. Для распространения замены на все вхождения мы указываем опцию g, которая означает глобально ('g'lobal). Если мы хотим подтверждать каждое изменение, мы указываем опцию c, которая означает «подтверждать каждую замену».

Аббревиатуры

Иногда вам приходиться писать какой-то текст снова и снова. Почему бы не использовать короткие комбинации клавиш? Они называются в Vim аббревиатурами.

Например, если вы постоянно пишите текст Highly Amazing Corporation Pvt. Ltd., вы можете сделать так:

:iab hac Highly Amazing Corporation Pvt. Ltd.

Теперь, когда вы пишете текст и введете h, a, c, <space>, автоматически подставится указанный выше текст!

Запустите :verbose abbreviate для просмотра списка текущих аббревиатур.

Смотри :help :ab и :help :unab для получения подробной информации.

Проверка орфографии

Важной особенностью, добавленной в 7 версии Vim, является проверка орфографии. Она позволяет Vim искать орфографические ошибки в тексте, чтобы вы их исправляли.

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

Давайте откроем следующий текст:

   Setp 4 is eventually what gets you moving, but Setps 2 and 3 are equally
   important. As Abraham Lincoln once said "If I had eight hours to chop down a
   tree, I'd spend six hours sharpening my axe." And to get to this stage, you need
   to do Setp 1 which boils down to one thing - It's all in the mind. That's why
   it's so hard.

Для включения проверки орфографии запустим:

:setlocal spell spelllang=en_us

Где 'en' стандарт для 'English' и 'us' стандарт для USA. Вы можете выбрать язык и локализацию в зависимости от текста. Однако, соответствующие файлы с орфографией должны быть установлены в $VIMRUNTIME/spell/ каталоге. Если они не установлены, Vim спросит, нужно ли автоматически скачать файл орфографии с сайта Vim.

Vim должен показать красную волнистую линию под "Setp" и аналогичными ошибками. Цвет будет зависить от установленной цветовой темы.

Нажмите ]s для перехода к следующему 'плохому слову', т.е., с ошибочной орфографией.

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

Если вы хотите увидеть оценку для каждого слова насколько хорош ('good') выбор замены слова, запустите :set verbose=1 и затем запустите z=.

В нашем случае, мы можем заменить первое вхождение "Setp" на "Step", но в тексте это слово встречается неоднократно. Было бы лучше, если бы мы могли сделать эту замену во всем тексте. Для этого мы можем запустить :spellrepall.

Рассмотрим текст:

Swaroop is a name.

В этом случае Vim пометит 'Swaroop' как неправильное слово ("bad word"). Мы знаем, что это имя и наша задача добавить это правильное слово в список правильных слов, чтобы Vim помечал его постоянно. Для этого мы можем выполнить zg и добавить слово в список.

Для изучения работы с файлом орфографии вы можете запустить :spellinfo.

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

" Spell check

function! ToggleSpell()

if !exists("b:spell")

setlocal spell spelllang=en_us

let b:spell = 1

else

setlocal nospell

unlet b:spell

endif

endfunction

nmap <F4> :call ToggleSpell()<CR>

imap <F4> <Esc>:call ToggleSpell()<CR>a

Проверка орфографии - это обширная тема и, если вы интересуетесь реализацией проверки орфографии в Vim, и тем, как вы можете добавить орфографию или слова в список для вашего языка, пожалуйста, смотрите :help spell.

Прямоугольное выделение

Когда мы редактируем табличные данные, мы иногда хотим копировать лишь несколько столбцов текста, а не несколько строк. Для этого мы можем использовать режим прямоугольного выделения в Vim, нажав ctrl-v.

Рассмотрим следующий простой текст:

   1. Concentrate
   2. Understand
   3. Think
   4. Get Things Done

Поместите курсор на заглавную 'C' в первой строке.

Нажмите ctrl-v.

Нажмите 3j для перехода вниз на 3 строки.

Нажмите $ для перемещения в право в конец строки.

Нажмите y для копирования (yank) текста в регистр по умолчанию.

Запустите :new и нажмите p, что бы вставить прямоугольное выделение.

Новый файл будет иметь следующее содержание:

   Concentrate
   Understand
   Think
   Get Things Done

Смотри :help ctrl-v для получения детальной информации.

Удаленное редактирование файлов

Используя Vim, Вы можете редактировать файл удаленно, через ftp. Просто запустите команду vim ftp://ftp.foo.com/bar или запустите :Nread ftp://ftp.foo.com/bar в Vim.

Для этого можно использовать встроенный плагин "netrw" в Vim, используя который вы можете редактировать удаленно файл через scp, http, webdav и другие протоколы. Смотрите :help netrw-urls для подробной информации.

Вы можете прописать username и password в вашем файле ~/.netrc, что бы Vim мог автоматически логиниться за вас.

Смотрите :help netrw-start для получения подробной информации.

Итоги

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

Хорошей идеей будет просмотреть секцию "Editing Effectively" из :help user-manual и потом читать только разделы, которые вы находите интересными.


Предыдущий раздел: Следующий раздел:
Основы редактирования Оглавление Множественность (Multiplicity)