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

UnixForum





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

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

Vim : Основы редактирования

Введение

Давайте изучим основные команды в Vim для чтения/создания файлов, cut/copy/paste, undo/ redo и поиска.

Чтение и создание файлов

Буферы

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

Это означает, что копия файла сохраняется в памяти компьютера, и все ваши изменения происходят в памяти компьютера, и сразу же отображаются. После того, как вы закончите редактирование файлов, вы можете сохранить файл, что означает, что Vim запишет текст из памяти компьютера на жесткий диск. Память компьютера, используемая для временного хранения текста, называется «буфер». Заметим, что эта же концепция является причиной, почему у нас есть пункт меню "save" во всех редакторах или текстовых процессорах, которыми мы пользуемся.

Теперь откроем Vim, запишем слова Hello World и сохраним это как файл hello.txt. Если вам нужно напомнить, как это сделать, пожалуйста пересмотрите главу Первые шаги.


Swap

Теперь вы можете видеть, что в том же каталоге был создан другой файл с примерным названием hello.txt.swp. Выполните следующую команду, чтобы узнать точное имя файла:

:swapname

Что это за файл? Vim делает копию буфера в файл, который регулярно сохраняется на жестком диске, так что если что-то пойдет не так (в случае выключения компьютера или вылета Vim), у вас будет сохраненная версия правок, созданных вами после последнего сохранения в оригинальный файл. Этот файл называется "swap file", поскольку Vim сохраняет содержимое буфера памяти компьютера на жесткий диск (свопирует). Смотри :help swap-file для подробной информации.

Сохранение моего файла

Теперь, когда файл был загружен, давайте сделаем незначительное редактирование. Нажмите клавишу ~ для изменения регистра символа, на котором стоит курсор. Обратите внимание, что Vim теперь пометил файл как изменённый (например, в графической версии Vim появляется знак + в строке заголовка). Вы можете открыть этот файл в другом редакторе и проверить, что эти изменения еще не сохранены. Vim пока изменил только буфер и не сохранил эти исправления на жесткий диск.

Вы можете записать буфер в оригинальный файл на жестком диске запустив:

:write

Примечание: Для простоты сохранения, добавьте следующую строку в ваш vimrc файл:

" To save, ctrl-s.

nmap <c-s> :w<CR>

imap <c-s> <Esc>:w<CR>a

Теперь вы можете простым нажатием комбинации ctrl-s сохранить файл.

Работа в моем каталоге

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

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

:e ../tmp/test.txt

:e C:\\shopping\\monday.txt

Или вы можете переключить Vim на другой каталог:

:cd ../tmp

:cd это сокращение от 'c'hange 'd'irectory (изменить директорию).

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

:pwd

:pwd это сокращение от слов 'p'rint 'w'orking 'd'irectory.

Cut, Copy и Paste

Как сказал Sean Connery в фильме 'Finding Forrester':

Не думайте — пишите. Вы должны писать сначала от вашего сердца. А переписывать от головы. Первый ключ к писательству... пишите, не думайте!

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

desktop world

vim world

operation

cut

delete

d

copy

yank

y

paste

paste

p

В нормальной терминологии дестопа, вырезать ('cut'ting) - это удалить текст и поместить его в буфер обмена. В Vim эта операция означает, что текст из буфера файла удаляется и сохраняется в 'регистре' (часть памяти компьютера). Поскольку мы можем выбрать регистр, где мы будем хранить текст, эта операция называется операцией удаления ("delete").

Аналогично, в нормальной терминологии десктопа, копировать ('copy') текст означает копирование текста в буфер обмена. Vim делает то же самое Дергая ("yanks") текст и размещая текст в регистре.

Вставить ("Paste") имеет одинаковый смысл в обоих терминологиях.

Мы увидели, как вы можете производить операции cut/copy/paste в Vim. Но как вы определите, с каким текстом выполнять эти операции? Хорошо, что мы уже изучили в предыдущем разделе текстовые объекты.

Сочетание операции и текстовых объектов означает, что мы имеем бесчисленное количество способов управления текстом. Давайте посмотрим несколько примеров.

Напишем этот текст в Vim (точно так, как показано):

This is the rthe first paragraph.

This is the second line.


This is the second paragraph.

Разместите курсор в верхнюю левую позицию, нажав 1 и G, это переместит нас в первую строку и первый столбец соответственно.

Давайте рассмотрим первый случай: Мы напечатали лишний 'r', который мы должны удалить. Нажмите 3w для перемещения на 3 слова. Теперь, нам нужно удалить один символ в текущей позиции курсора.

Примечание: есть два способа сделать это:

Операция

Текстовый блок/Перемещение

Удаление - Delete

Один символ в текущей позиции курсора

d

l (L в нижнем регистре)

Таким образом, мы должны просто нажать dl и мы удаляем один символ! Обратите внимание, что мы можем использовать l, хотя это перемещение.

Теперь мы замечаем, что это слово является лишним, потому что мы два раза ввели "the". Давайте подумайте о том, какую быструю комбинацию клавиш нам использовать, чтобы это исправить? Возьмите паузу, чтобы подумать и самим это понять. Если не додумались, то читайте ниже.

Операция

Текстовый блок/Перемещение

Удаление - Delete

Слово - Word

d

w

Итак, нажав dw, вы удалите слово. Ура! Так просто и так красиво. Вся прелесть в том, что такие простые комбинации можно комбинировать для получения большого спектра возможностей.

Как мы можем сделать ту же операцию для строки? Строки - это отдельный случай в Vim, потому что строки, как правило, это отдельные мысли в нашем тексте. Коротко, если вы повторите имя операции дважды, она будет произведена над строкой. Так, dd удалит текущую строку а yy скопирует текущую строку.

Наш пример текста в Vim должен выглядеть примерно так:

This is the first paragraph.

This is the second line.

This is the second paragraph.

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

This is the first paragraph.

This is the second paragraph.

Давайте посмотрим далее: как мы выдернем (удалим) текущий абзац?

Операция

Текстовый блок/Перемещение

Выдернуть - Yank

Текущий абзац

y

ap

Таким образом, yap скопирует текущий абзац. Теперь, когда мы скопировали текст, как мы можем вставить его? Просто нажав 'p'.

Теперь мы увидим:

This is the first paragraph.

This is the first paragraph.


This is the second paragraph.

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

Существуют два вида вставить (paste), это аналогично двум видам вставок (inserts), которые мы рассмотрели раньше:

p (нижний регистр)

вставить после текущей позиции курсора

P (верхний регистр)

вставить до текущей позиции курсора

Поняв идею, далее мы можем комбинировать их в более эффективные методы.

Как поменять два символа? Нажмите xp.

x → удалить один символ в текущей позиции курсора

p → вставить после текущей позиции курсора

Как поменять два слова? Нажмите dwwP.

d → удалить

w → одно слово

w → перейти к следующему слову

P → вставить до текущей позиции курсора

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

Маркировка вашей территории

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

Вы можете создать закладку нажав m и затем имя закладки, которое должно состоять из простых символов a-zA-Z. Например, нажатие ma создаст закладку с именем 'a'.

Нажмите 'a и курсор вернется на строку с закладкой. Нажатием 'a вы будете переведены точно на строку и колонку закладки.

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

Смотри :help mark-motions для более подробной информации.

Машина времени с использованием undo/redo

Предположим, что вы переписывали абзац, но в итоге вы запутались в том, что вы пытались переписать, и вы хотите отменить исправления и вернуться к написанному ранее. Здесь мы можем применить "undo", чтобы отменить сделанное. Если же позже мы захотим вернуться к тому, что мы имеем сейчас, мы можем использовать "redo", чтобы мы вернули сделанное. Учтите, что изменения касаются изменений в тексте и не учитывают движение курсора и другие вещи, не относящиеся к тексту.

Предположим вы имеете текст:

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.

(Abraham Lincoln однажды сказал "Если бы я имел восемь часов, чтобы срубить дерево, я бы потратил шесть часов точа свой топор." И, чтобы добраться до этой стадии, что вам нужно сделать шаг 1, который сводится к одному - Это все в голове. Вот почему это так трудно.)

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

1. Нажмите S для замены ('s'ubstitute) всей строки.

2. Наберите текст After much thought, I have coined a new phrase to help me solidify my approach:.

3. Нажмите <esc>.

Теперь подумайте о том изменения, которые мы только что сделали. Есть предложения лучше? Хм, предыдущий текст был лучше? Как мы можем его вернуть?

Нажмите u для отмены (undo) последних изменений и посмотрите, что было до этого. Вы теперь видите текст I have coined a phrase for myself - 'CUT to the G':. Для восстановления последних изменений нажмите ctrl-r и теперь вы увидите строку After much thought, I have coined a new phrase to help me solidify my approach:.

Важно отметить, что Vim ведет неограниченную историю undo/redo, но, как правило, она ограничена настройками undolevels в Vim и объемом памяти в вашем компьютере.

Теперь, давайте посмотрим примеры, которые действительно демонстрируют большую функциональность undo/redo в Vim, таким возможностям другие редакторы будут завидовать: Vim это не только ваш редактор, он также выступает в качестве машины времени.

Например,

:earlier 4m

вы вернетесь на 4 минуты, т.е. состояние текста которое было 4 минут назад "earlier".

Сила в том, что Vim превосходно все отменяет и повторяет. Например, если вы внесли изменения, а затем отменили его, а затем продолжили редактирование, то изменения на самом деле невозможно извлечь с помощью простого u снова. Но это возможно в Vim с использованием команды :earlier.

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

:later 45s

интервал составит 45 секунд.

Или, если вы хотите более простой подход для отмены 5 внесенных изменений:

:undo 5

Вы можете просмотреть дерево undo используя:

:undolist

Смотри :help :undolist для объяснения работы этой команды.

Смотри :help undo-redo и :help usr_32.txt для подробной информации.

Мощная поисковая машина, но не dotcom

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

Давайте вернемся к нашему знакомому примеру:

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.

Предположим мы хотим найти слово "Step". В нормальном режиме, наберем /Step<cr> (т.е. /Step и затем клавишу enter). Мы перейдем на первое вхождение этого слова. Нажмите n и вы перейдете в следующему ('n'ext) вхождению, а N перейдет к следующему слову в обратном направлении, т. е. к предыдущему вхождению слова.

Что, если вы знаете только часть фразы или не знаете точного написания? Не было бы полезно, если бы Vim начал поиск при вводе поисковой фразы? Вы можете включить это командой:

set incsearch

Вы также можете сказать Vim игнорировать регистр (верхний или нижний регистр) текста, который вы ищете:

set ignorecase

Или вы можете использовать:

set smartcase

Если у вас включен smartcase, то:

Если вы ищете /step, т.е. текст введен в нижнем регистре, то Vim будет искать любую комбинацию верхнего и нижнего регистра текста. Например, это будет соответствовать всем четырем следующим вариантам - "Step", "Stephen", "stepbrother", "misstep.".

Если вы ищите /Step т.е. текст, введенный вами, содержит символы в верхнем регистре, то поиск будет только для текста в соответствующем регистре. Например, мы найдем "Step" и "Stephen", но не "stepbrother" или "misstep.".

Примечание: Я рекомендую вам вставить эти две строки в ваш файл vimrc (о нем будет сказано позже, а пока посмотрите :help vimrc-intro для ознакомления), чтобы эти опции были включены по умолчанию.

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

Например, вы увидели, что /step найдет нам steps, а также step и даже footstep, если такое слово встречается в тексте. Что делать, если вы хотите найти исключительно слово step и ничего больше, и чтобы оно не являлось частью другого слова? Для этого мы можем использовать /\<step\>. Структуры \< и \> показывают начальную и конечную позицию слова.

А что, если вы хотите найти какое то число? Поиск с конструкцией /\d будет искать цифру ('digit'). Но число это просто группа цифр вместе. Мы можем указать "одну или более" цифр вместе, используя /\d\+. Если мы будем искать ноль или более символов, мы можем использовать * вместо +.

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

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

Итоги

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

Теперь, пойдем далее и начнем редактирование!

Внешние ссылки

http://www.imdb.com/title/tt0181536/



Предыдущий раздел: Следующий раздел:
Помощь (Help) Оглавление Углубленное редактирование