Режимы:
Vi имеет два режима: режим вставки и режим команд. Редактор начинает работать в командном режиме, когда происходит перемещение курсора и удаление и копирование текста. Режим вставки начинается после ввода команд вставки и изменения. [ESC] возвращает редактор в режим команд (где вы можете выйти из редактора, например, напечатав :q!). Большинство команд выполняется как только вы их напечатаете, кроме команд с двоеточием, которые выполняются, когда вы нажмете клавишу Enter.
Выход:
Выход с сохранением изменений | |
:q | Выход, если не было изменений |
ZZ | Выход с сохранением изменений, если они были |
:q! | Выход с игнорирование изменений |
Вставка текста:
i | Вставка после курсора |
I | Вставка перед текущей строкой |
a | Добавление после курсора |
A | Добавление после текущей строки |
o | Открытие новой строки после текущей строк |
O | Открытие новой строки перед текущей строкой |
r | Замена одного символа |
R | Замена нескольких символов |
Перемещение:
h | Перемещение влево |
j | Перемещение вправо |
k | Перемещение вверх |
l | Перемещение вниз |
w | Перемещение к следующему слову |
W | Перемещение к следующему пробелу – ограничителю слова |
b | Перемещение к началу слова |
B | Перемещение к начальному пробелу – ограничителю слова |
e | Перемещение к концу слова |
E | Перемещение к конечному пробелу – ограничителю слова |
( | Перемещение на предложение назад |
) | Перемещение на предложение вперед |
{ | Перемещение на параграф назад |
} | Перемещение на параграф вперед |
0 | Перемещение На начало строки |
$ | Перемещение на конец строки |
1G | Перемещение на первую строку файла |
G | Перемещение на последнюю строку файла |
nG | Перемещение на n-ю строку файла |
:n | Перемещение на n-ю строку файла |
fc | Перемещение впреред на c |
Fc | Перемещение назад на c |
H | Перемещение в начало экрана |
M | Перемещение в конец экрана |
L | Перемещение to botton of screen |
% | Перемещение to associated ( ), { }, [ ] |
Удаление текста:
Почти все команды удаления выполняются печатаньем d, а затем – команды перемещения. Например, dw удаляет слово. Несколько других команд удаления:
x | Удаление символа справа от курсора |
X | Удаление символа слева от курсора |
D | Удаление текста до конца строки |
dd | Удаление текущей строки |
:d | Удаление текущей строки |
Сохранение текста в буфере:
Как и команды удаления, большинство команд буферизации выполняются печатаньем y, а затем – команды перемещения. Например, y$ сохраняет в буфере текст до конца строки. Две другие команды сохранения в буфере:
yy | Сохраняет в буфере текущую строку |
:y | Сохраняет в буфере текущую строку |
Изменение текста:
Команды изменения являются командами удаления, которые переводят редактор в режим вставки. Они выполняются печатаньем c, а затем – команды перемещения. Например, cw изменяет слово. Несколько других команд изменения:
C | Изменение до конца строки |
cc | Изменение всей строки |
Вставка текста из буфера:
p | Вставка после позиции или после строки |
P | Вставка перед позицией или перед строкой |
Буферы:
Перед любой командой удаления, изменения, сохранения в буфере или вставки из буфера могут быть созданы именованные буферы. Общий префикс имеет форму «c, где c – любой символ нижнего регистра. Например, «adw удаляет слово в буфер a. Его можно впоследствие вернуть в текс соответствующей командой «ap.
Markers:
На любую строку в файле могут быть установлены именованные маркеры. Именем маркера может быть любой символ нижнего регистра. Markers may also be used as limits for ranges.
mc | Установка для строки маркер c. |
`c | Переход на начало строки с маркером c. |
‘c | Переход на первый непробельный символ строки с маркером c. |
Поиск строк:
/строка | Поиск вперед строки строка |
?строка | Поиск вперед строки строка |
n | Поиск следующего вхождения строки строка |
N | Поиск предыдущего вхождения строки строка |
Замена:
Функуии поиска и замены выполняются командой :s. Она обычно комбинируется с областью действия или с комендой :g (см.ниже).
:s/шаблон/строка/флаги | Замена шаблон на строка в соответствии с флаги. |
g | Флаг – замена всех вхождений шаблона. |
c | Флаг – подтверждение замен. |
& | Повторение последней команды :s. |
Регулярные выражения:
. (точка) | Один любой символ, кроме символа конца строки. |
* | Ноль или более любых символов. |
[…] | Один любой символ, определенный в наборе. |
[^…] | Один любой символ, не определенный в наборе. |
^ | Начало строки. |
$ | Конец строки. |
< | Начало слова. |
> | Конец слова. |
(…) | Группировка – обычно используется для группирования условий. |
n | Содержимок n-й группировки. |
[…] – примеры наборов:
[A-Z] | От заглавной буквы A до заглавной буквы Z. |
[a-z] | От строчной буквы a до строчной буквы z. |
[0-9] | От 0 до 9 (все цифры) |
[./=+] | Набор, содержащий . (точка), / (слеш), =, и +. |
[-A-F] | Набор от заглавной буквы A до заглавной буквы F и тире (тире д.б. указано первым). |
[0-9 A-Z] | Набор, содержащий все заглавные буквы и цифры и пробел |
[A-Z][a-zA-Z] | Первая позиция содержит заглавную букву от A до Z. Вторая позиция содержит любую букву. |
Примеры регулярных выражений:
/Hello/ | Соответствует строке, содержащей значение Hello. |
/^TEST$/ | Соответствует строке, содержащей только текст TEST. |
/^[a-zA-Z]/ | Соответствует строке, начинающейся с любой буквы. |
/^[a-z].*/ | Соответствует строке, в которой первый символ – из набора a-z, а за ним следует еще, как минимум, один символ. |
/2134$/ | Соответствует строке, заканчивающейся 2134. |
/(21|35)/ | Соответствует строке, содержащей 21 или 35. Обратите внимание на использование ( ) с вертикальной чертой, задающей условие «или». |
/[0-9]*/ | Соответствует строке, содержащей ноль или более цифр. |
/^[^#]/ | Соответствует строке, в которой первый символ – не #. |
Примечания:
1. Регулярные выражения чувствительны к решистру.
2. Регулярные выражения используются, когда задается pattern.
Счетчики:
Каждой командое может быть предшествовать число, которое задает, сколько раз она должна быть выполнена. Например, 5dw удалит 5 слов, а 3fe переместит курсор вперед на 3-е вхождение буквы e. даже вставка может повторяться в соответствии с этим методом, например, вставить одну и ту же строку 100 раз.
Области действия:
Области действия могут предшествовать большинству команд с двоеточием и приводят к тому, что команда будет выполняться для строки или строк. Например, :3,7d удалит строки 3-7. Области действия обычно комбинируются с командой :s для выполнения замены на нескольких строках и с :.,$s/шаблон/строка/g для выполнения замены от текцщей строки до конца файла.
:n,m | Область действия – Строки n—m |
:. | Область действия – Текущая строка. |
:$ | Область действия – Последняя строка. |
:’c | Область действия – Маркер c |
:% | Область действия – Все строки файла. |
:g/шаблон/ | Область действия – Все строки, содержащие шаблон. |
Файлы
:w файл | Запись в файл. |
:r файл | Чтение из файл. |
:n | Переход к следующему файлу. |
:p | Переход к предыдущему файлу. |
:e файл | Редактирование файла файл |
!!программа | Замена строки выводом программы программа. |
Другое
~ | Переключение регистра. |
J | Соединение строк. |
. | Повторение последней команды изменения текста. |
u | Отмена последнего изменения. |
U | Отмена всех изменений в строке. |
Введение:
У нас была первая встреча с режимами в предыдущей главе. Теперь, давайте изучим концепцию режимов детальнее и узнаем, что мы можем сделать в каждом режиме.
Типы режимов:
Есть три основных режима в Vim — нормальный, вставки и визуальный.
• Нормальный режим — это тот, в котором вы можете выполнять команды. Это основной режим, в который переходит Vim после запуска.
• Режим вставки — это режим, в котором вы можете набирать нужный текст.
• Визуальный режим — это где вы визуально выбираете часть текста, которую нужно обработать командой/операцией.
Нормальный режим:
Изначально, вы попадете в нормальный режим. Давайте посмотрим что вы можете делать в этом режиме. Наберите :echo «hello world» и нажмите enter. Вы увидите знаменитые слова hello world. То, что вы только что сделали, это запустили командуVim, называемую :echo, и вы добавили текст к ней, который и был успешно выведен. Наберите /hello и нажмите клавишу enter. Vim будет искать эту фразу и перейдет к первому её вхождению.
Это было только два простых примера команд, доступных в нормальном режиме. Мы рассмотрим много других команд в последующих главах. Как использовать помощь. Почти так же важно, как знать о нормальном режиме, это уметь пользоваться командой :help. Здесь вы можете больше узнать о командах, доступных в Vim. Запомните, вам не нужно знать все команды, доступные в Vim, достаточно просто знать, где найти их, когда они вам понадобятся. Например, смотрим :help usr_toc дает нам оглавление справочного руководства. Вы можете посмотреть :help index для поиска для поиска определенной темы, интересной вам, для примера, запустите /insert mode для просмотра информации относительно режима вставки. Если вы не можете запомнить эти две темы, нажмите F1 или просто запустите :help.
Когда Vim запускается, он открывается в нормальном режиме, вы можете использовать i для перехода в режим вставки.
Есть и другие способы переключения из нормального режима в режим вставки, такие как:
• Запустите :e dapping.txt
• Нажмите i
• Введите следующий обзац (включая все опечатки и ошибки, мы исправим их позже): means being determined about being determined and being passionate about being passionate
• Нажмите клавишу
• Запустите :w
Упс, мы, кажется, упустили слово в начале строки, а наш курсор находится в конце строки, что нам теперь делать?
Наиболее эффективным способом было бы перейти в начало строки и вставить пропущенное слово? Должны ли мы использовать мышь, чтобы переместить курсор в начало строки? Должны ли мы использовать клавиши со стрелками для перемещения к началу строки? Должны ли мы нажать клавишу home и затем нажать i для переключения снова в режим вставки?
Оказывается, что наиболее эффективным способом будет нажатие I (верхний регистр I):
• Нажмите I
• Напишите Dappin
• Нажмите клавишу
Обратите внимание, что мы использовали другой ключ для переключения в режим вставки, его особенностью является то, что он перемещает курсор в начало строки, а затем переключает в режим вставки.
Также обратите внимание, это важно, что нужно вернуться в нормальный режим, как только вы закончите вводить текст. Эта привычка будет полезна, потому что большинство ваших работ (после начальной фазы написания статьи) будет проводиться в нормальном режиме — где происходят все важные действия: перезапись, редактирование, полировка.
Теперь, давайте возьмем другой вариант команды i. Обратите внимание, что нажатие i поместит курсор на предыдущую позицию и включит режим вставки. Чтобы разместить курсора после текущей позиции, нажмите a (‘a’fter).
• Нажмите a
• Наберите g (для завершения слова «Dapping»)
• Нажмите
Как и в отношениях между i и I ключами, существует связь между ключами a и A — если вы хотите добавить текст в конце строки, нажмите клавишу A.
• Нажмите A
• Наберите . (поставьте точку для завершения предложения)
• Нажмите
Подведем итог, что мы узнали о четырех клавишах:
Команда | Действие |
i | вставить текст до курсора |
I | вставить текст с начала строки |
a | добавить текст после курсора |
A | добавить текст с конца строки |
Обратите внимание, как команды в верхнем регистре «больше» версий команд в нижнем регистре.
Теперь, когда мы умеем быстро двигаться в текущей строке, давайте посмотрим, как перейти на новые строки. Если вы хотите создать (‘o’pen) новую строку и начать ввод данных, нажмите клавишу о.
• Нажмите o
• Наберите I’m a rapper.
• Нажмите
Хм, было бы более интересно, если бы новое предложение мы написали в новом абзаце.
• Нажмите O (верхний регистр ‘O’)
• Нажмите
Подводя итог двум новым ключам мы запоминаем:
Команда |
Действие |
o |
открыть |
O |
открыть |
Обратите внимание, как верхний и нижний режим команды ‘o’ противоположны по направлению, в котором они открывают строку.
Было ли что-то не так в тексте, который мы только что написали? А да, это должно быть «Dapper», а не rapper! Один символ мы должны изменить, как эффективно это сделать?
Мы можем нажать i для переключения в режим вставки, нажать клавишу для удаления r, набрать d и затем нажать
• Перемещаем курсор к символу r (или просто нажимаем b для перехода назад [‘b’ack] к началу слова)
• Нажимаем s
• Набираем d
• Нажмите
Ну, ладно, возможно в данном случае это не сильно нас спасло, но представьте себе что этот процесс повторяется снова и снова в течение всего дня! Создание таких элементарных, максимально быстрых операций, это выгодно, потому что они помогают нам сконцентрировать наши усилия на более творческих и интересных аспектах работы. Как говорит Линус Торвальдс, «это означает не только то, что можно сделать что-то быстро, но поскольку это быстро, метод, которым вы делаете вашу работу, кардинально меняется».
Опять же, есть S, большая версия клавиши s, которая заменяет всю строку, а не текущий символ.
• Нажмите S
• Наберите Be a sinner.
• Нажмите
Команда |
Действие |
s |
замена |
S |
замена |
Давайте вернемся к нашему последнему действию… Не могли бы мы сделать его более эффективно, раз мы хотим заменить (‘r’eplace) только один символ? Да, мы можем использовать клавишу r.
• Двигаем курсор к первому символу слова sinner.
• Нажимаем r
• Набираем d
Обратите внимание, что мы еще в нормальном режиме и нам не нужно нажимать
Большая версия r называется R, она заменяет последовательно расположенные символы.
• Установите курсор на ‘i’ в sinner.
• Нажмите R
• Наберите app (слово теперь становится ‘dapper’)
• Нажмите
Команда |
Действие |
r |
Заменить |
R |
Текст должен выглядеть так:
Dapping means being determined about being determined and being passionate about being passionate. Be a dapper.
Уф. Мы рассмотрели много в этой главе, но я гарантирую, что это самый трудный шаг. Как только вы усвоите все это, вы поймете сердцем и душой как работает Vim, и все другие функции в Vim — это просто глазурь на торте.
Повторюсь, понимание того, как работают режимы и как переключаться между режимами, является ключом к пониманию Vim, так что если вы еще не понимаете, пересмотрите вышеизложенные примеры еще раз, пожалуйста, не стесняйтесь читать их снова. Делайте это когда вам понадобиться.
Если вы хотите прочитать больше о этих командах, смотри :help inserting и :help replacing.
Режим визуализации
Предположим, что вы хотите выделить несколько слов и заменить их полностью каким-то новым текстом, который вы хотите написать. Что вы будете делаете?
Один из способов заключается в использовании мыши, щелкните в начале текста, который вас интересует, удерживая левую кнопку мыши, перетащите мышь до конца соответствующего текста, а затем отпустите левую кнопку мыши. Но зачем там много работать?
Мы могли бы использовать клавиши или
Наиболее эффективным способом было бы поместить курсор в начало текста, нажать v, чтобы начать визуальный режим, используя клавиши со стрелками или какие-либо текстовые команды перейти в конец соответствующего текста (например, нажмите 5e, для перехода к концу пятого слова от текущей позиции курсора), а затем нажмите c, чтобы изменить («c’hange) текст. Обратите внимание на возросшую эффективность.
В этой конкретной операции (команда с), вы будете переведены в режим вставки, поэтому после его окончания нажмите
Команда v работает с символами. Если вы хотите работать со строками, используйте верхний регистр V.
Итоги
Это схема отношений между различными режимами:
+———+ i,I,a,A,o,O,r,R,s,S +———-+
| Normal +———->————+ Insert |
| mode | | mode |
| +———-<------------+ | +-+---+---++———-+
| |
| |
| |
| |
| |
v,V V ^
| |
| |
| |
| |
+—+—+—-+
| Visual |
| mode |
+————+
(Это нарисовано с использованием Vim и плагина Dr.Chip’s DrawIt)
Смотри :help vim-modes-intro и :help mode-switching для подробного описания различных режимов и переключение между ними, соответственно.
Если вы все еще не уверены в том, что концепция режимов является основной силой, обеспечивающей мощь и простоту Vim, читайте статьи «Почему Vi» и о модели ввода vi, которые показывают, что это лучший способ редактирования.
Внешние ссылки
http://vim.sourceforge.net/scripts/script.php?script_id=40
http://www.viemu.com/a-why-vi-vim.html
http://blog.ngedit.com/2005/06/03/the-vi-input-model/
Если вы все еще не уверены в том, что концепция режимов является основной силой, обеспечивающей мощь и простоту Vim, читайте статьи «Почему Vi»и о модели ввода vi, которые показывают, что это лучший способ редактирования.
Итак, вот она:
Файл настройки: ~/.vimrc
Можно редактировать файлы через сеть, например
:e
:Ex или :e ./ — файловый менеджерhjkl перемещение в разные стороны
i режим вставки
I добавление в начало строки
a режим добавления
A добавление в конец строки
o добавить строку сразу за текущей
O добавить строку перед текущей
R писать поверх имеющегося текста
u, :u[ndo] отмена предыдущего действия (undo)
CTR-R, :red[o] отмена отмены предыдущего действия (redo)
dd вырезать (удалить) строку
cc удалить и начать редактирование
yy копировать строку
p вставить из буфера обмена
ESC перейти в режим просмотра
DEL удалить следующий символ
:
% перейти к парной скобке
:e
:w [fname] записать изменения
:wa сохранить изменения во всех файлах
:q выйти из редактора
:q! выйти из редактора, не сохраняя изменения
:color
/usr/local/share/vim/vim72/colors/*.vim
:pwd текущий каталог
:cd [path] перейти в другой каталог
:!
CTR+p или CTR+n автоматическое дополнение текста
(в режиме редактирования)
CTR+r,=,
(в режиме редактирования)== Подсветка синтаксиса ==
:syntax on включить подсветку
:syntax off выключить подсветку (по умолчанию)
== Перенос строк ==
:set wrap разрешить word wrap (по умолчанию)
:set nowrap запретить word wrap
== Печать ==
:ha[rdcopy] распечатать документ
:set printoptions=duplex:off отключить двустороннюю печать
== Сворачивание ==
zc свернуть блок
zo развернуть блок
zM закрыть все блоки
zR открыть все блоки
za инвертирование
zf см :set foldmethod=manual
:set foldenable включить свoрачивание
:set foldmethod=syntax сворачивание на основе синтаксиса
:set foldmethod=indent сворачивание на основе отступов
:set foldmethod=manual выделяем участок с помощью v и говорим zf
:set foldmethod=marker сворачивание на основе маркеров в тексте
:set foldmarker=bigin,end задаем маркеры начала и конца блока
== Маркеры ==
ma установить локальный маркер a
mB установить глобальный маркер B
`c перейти к локальному маркеру c
`0 вернуться на позицию, на которой закончили
работу при закрытии vim
:marks просмотр маркеров
== Регистры ==
«ayy скопировать строку в регистр a
«bdd вырезать строку и поместить в регистр b
«С2d вырезать три строки и дописать в конец
регистра C
:reg [name1][name2][…] просмотреть содержимое регистров
== Выделение ==
v + hjkl выделение текста
SHIFT + v выделить строку
CTR + v выделение прямоугольника
p вставить
y копировать
d удалить
gu к нижнему регистру
gU к верхнему регистру
== Отступы ==
[#]> сдвинуть выделенное вправо
[#]< сдвинуть выделенное влево
[#]>> сдвинуть строку вправо
[#]<< сдвинуть строку влево
set tabstop=# для табуляции используется # пробелов
set shiftwidth=# в командах отступа используется # пробелов
set [no]expandtab заменять ли табуляцию на соответствующее
число пробелов
== Поиск и замена в файле ==
/<выражение> поиск выражения в файле
n следующее совпадение
N предыдущее совпадение
:%s/foo/bar/gi замена строк, см http://eax.me/regular-expr/
== Нумерация строк ==
:set number включить нумерацию строк
:set nonumber отключить нумерацию строк
== Работа с Tab’ами ==
:tabnew [fname] создать tab
:tabs вывести список табов
:tabn следующий таб
:tabp предыдущий таб
gt следующий таб
gT предыдущий таб
== Работа с окнами ==
:split горизонтальное разбиение
:vsplit вертикальное разбиение
Ctr+W, затем
с закрыть окно
= установить равный размер окон
hjkl или стрелочки перемещение между окнами
== Проверка орфографии ==
mkdir -p ~/.vim/spell
cd ~/.vim/spell
wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.sug
wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.spl
wget http://ftp.vim.org/vim/runtime/spell/en.ascii.sug
wget http://ftp.vim.org/vim/runtime/spell/en.ascii.spl
setlocal spell spelllang=ru,en включить проверку орфографии
set spell! вкл/выкл проверку во время работы
]s следующее слово с ошибкой
[s предыдущее слово с ошибкой
zg good word
zw wrong word
zG ignore word
== Работа с кодировкой ==
e ++enc=<имя кодировки> Редактирование файла в ??? кодировке
w ++enc=<имя кодировки> Сохранить файл в новой кодировке
set fileencodings=utf-8,koi8-r Список автоматически определяемых
кодировок в порядке убывания
приоритета
== Другое ==
:set [no]wildmenu При авто-дополнении в командной строке над
ней выводятся возможные варианты
:set list Отображать табуляцию и переводы строк
q: История команд
. Повторение последней команды
На этом пока все. Думаю, я буду время от времени редактировать эту шпаргалку, так что следите за PS в конце следующих постов.