Vim
Материал из Викиучебника
Продвинутый редактор — кошмар для случайного пользователя. Если его удается в конце-концов закрыть, то вздыхаешь с облегчением и твердой уверенностью, что больше не будешь запускать эту программу ни в коем случае.
Действительно, такой редактор нельзя просто открыть и начать работать — требуется предварительная подготовка. Зато стоит раз испытать его в работе, и поражаешься, как мог обходиться без него раньше.
Запустите команду vimtutor для быстрого ознакомления с функциональностью редактора.
Содержание |
[править] Введение
Вот запись типичной сессии работы с vi / Vim:
#vi httpd.conf
В открывшемся редакторе:
/SSLVerif[Enter]nwr1ZZ
В обычном редакторе, это соответствует:
- Открыть файл «httpd.conf»
- Открыть диалог поиска
- Ввести в поисковую строку «SSLVerif».
- Перейти ко второму по счету найденному слову
- Перенести курсор к его параметру
- Заменить параметр на 1
- Сохранить изменения
- Закрыть файл
Объяснение команд:
- / — Перейти в режим поиска
- Kлавиша [Enter] — Искать'.
- n — Перейти к следующему вхождению искомой строки
- w — Переместить курсор к следующему слову
- r — Заменить знак под курсором
- ZZ — Сохранить изменения и выйти
Здесь я делюсь опытом работы в Vim’е. Предполагается, читатель имеет установленные vi и vim, а также знаком с основами работы с UNIX-подобной системой.
Помнится, когда товарищ установил FreeBSD на мою домашнюю ЭВМ, некоторые файлы открывались непонятным мне образом. Я быстро старался избавиться от этого несчастья. Через некоторое время я понял, что происходит: в системе по умолчанию, в переменной окружения EDITOR, установлен редактор vi. Я сразу поменял его на 'ee' (easy editor). Это действительно простой редактор, затруднений с ним возникнуть просто не может, однако и особой свободы в нем не испытать. Вскоре его стало не хватать…
Описание работы с редактором я привожу в хронологическом порядке — от простого к сложному. Так как Vim на 99 % совместим с Vi, сначала я дам краткое описание работы с vi.
Легенда сокращений и специальных символов:
Строки, начинающиеся с символа "#" - командная строка; <ESC> - нажатие клавишу Escape (или Ctrl-[); <CR> - ... Enter; <SHIFT> - ... Shift ^x - ... Ctrl-x
[править] Vi
Главное отличие Vi от других редакторов в том, что у него несколько режимов работы. При этом привычный нам режим ввода текста — не основной. Вместо этого, в обычном режиме vi воспринимает каждое нажатие на клавишу, как команду. Это позволяет мгновенно перемещаться по файлу и быстро осуществлять редактирование.
Насколько Vi быстрее других редакторов? — Давайте сравним. Например, вот действия, которые необходимо выполнить ["продвинутому"] пользователю, чтобы поменять местами две буквы в обычном редакторе и в vi:
Обычный редактор:
<Shift-Стрелка вправо> <Ctrl-x> <Стрелка влево> <Ctrl-v>
Vi:
xp
[править] Переключение режимов
- «Обычный режим» — перемещение по файлу, стирание текста и другие редактирующие функции. Переход в него из любого другого режима:
<ESC>, иногда 2 раза;
- «Режим ввода» — ввод текста. Заметьте, что стирание и ввод текста происходит в двух разных режимах. Переход в него из обычного режима:
i
- «Командный режим» — Команды (операции с файлом, поиск и замена, настройка редактора…). Переход в него из обычного режима:
:
- «Режим поиска» — ввод поискового запроса. Переход в него из обычного режима
/
[править] Открыть/создать файл
Опишем операции, которые можно производить с файлом в обычном режиме.
#vi mamapapa.txt - открыть один файл #vi mamapapa.txt ++11 -- открыть файл и перейти к строке 11. #vi mama.txt papa.txt - открыть файл mama.txt, после выхода из него открыть файл papa.txt #vi -о mama.txt papa.txt - открыть сразу все файлы.
Файл открывается в обычном режиме с помощью команды vi. Здесь мы можем просмотреть файл, переместиться по его содержимому, стереть текст, но ввести текст в этом режиме нельзя.
Создание файла происходит при помощи той же команды. Собственно создание файла происходит в момент сохранения.
Для открытия или создания нового файла в обычном режиме набираем
:e filename
Перед этим нужно сохранить предыдущий файл
:w - сохраняет файл с существующим именем :w filename - сохраняет файл с новым именем
[править] Перемещение по файлу
Самые часто используемые в vi клавиши — клавиши перемещения. Это знаменитые h j k l, соответствующие стрелкам влево, вниз, вверх и вправо. Стрелочки тоже работают (при правильном указании терминала). Также можно использовать быстрые клавиши:
- 0 ("ноль") — в начало текущей строки;
- ^ — в начало текущей строки (к первому непробельному символу);
- $ — в конец текущей строки
- w — на слово вправо
- b — на слово влево
- W — до пробела вправо
- B — до пробела влево
- } — абзац вниз
- { — абзац вверх
- <Ctrl-f> — на страницу (экран) вниз
- <Ctrl-u> — на страницу (экран) верх
- g — перейти в начало файла
- G — перейти в конец файла
- <number>G — перейти на конкретную строку <number>
- /<text><CR> — перейти к <text>
- ?<text><CR> — то же самое, но искать назад
- n — повторить поиск
- N — повторить поиск назад
[править] Редактирование файла
Предположим в нашем файле записан следующий текст:
—Винни, тебе что намазать на хлеб, мёду или сгущённого молока? —И того, и другого, и можно без хлеба! —Ну, если вы больше ничего не хотите… — А что, что-то есть ещё?
Диалог симпатичный, но несколько несвязный. Давайте изменим его — для этого необходимо перейти в режим ввода. Самый простой способ — из обычного режима нажатие клавиши «i». После чего можно смело приступать к вводу текста. <ESC> вернет нас к обычному режиму. Другие важные команды:
- R — перейти в режим ввода с забиванием текста
- i — перейти в режим ввода с текущей позиции
- I — переместиться в начало строки и перейти в режим ввода
- a — перейти в режим ввода после курсора
- А — переместиться в конец строки и перейти в режим ввода
- o — перейти в режим ввода с новой строки под курсором
- O — перейти в режим ввода с новой строки над курсором
- x — удалить символ под курсором
- X — удалить символ влево (удалить символ перед курсором)
- dd — удалить текущую строку
- d<число>d — стирание числа строк начиная с текущей
- yy — копирование текущей строки в неименованный буфер
- y<число>y — копирование числа строк начиная с текущей в неименованный буфер
- p — вставка содержимого неименнованного буфера под курсором
- P — вставка содержимого неименнованного буфера перед курсором
- J — слияние текущей строки со следующей
- u — отмена последней команды
- . — повтор последней команды
Конечно, все сразу запомнить их трудно, даже не надо. Уверяю вас, через некоторое время эти команды будут пользоваться спросом.
Наконец мы дошли к самому главному — командному режиму. Помним как в него перейти? «:». Шифт-ж если по-русски.
[править] Запись/выход
Если вы в режиме ввода, то необходимо предварительно нажать <ESC>, чтобы перейти в обычный режим.
ZZ - записать файл и выйти(Если файл не изменяли, то записываться он не будет)
:w<CR> - записать файл
:sav filename<CR> - "Сохранить как"
:w!<CR> - записать файл.
Эта команда может помочь, если файл открыт в режиме "read-only" (с опцией -R), если файл заблокирован другим пользователем, либо отсутствуют такие привилегии, либо еще какая беда. При попытке записи без «!» будет выдано соответствующее предупреждение.
:w new_file<CR>
Создать новый файл «new_file» и записать в него текущее содержимое. Если файл существует, будет показано предупреждение. Дальше вы продолжаете работать со старым файлом — mamapapa.txt
:q<CR> - выйти из редактора.
Если файл был изменен, у вас ничего не получится. В таких случаях необходимо добавлять после команды «!»:
:q!<CR> - выйти из файла, не сохраняя изменения :qa!<CR> - выйти из всех файлов, не сохраняя изменения
[править] Коэффициент повторения
Почти все команды vi принимают так называемый коэффициент повторения. Попросту говоря, если перед командой в обычном режиме вы указываете число, то команда повторяется соответствующее количество раз. Например, команда «j» перемещает курсор на одну строку вниз — «3j» переместит курсор на 3 строки вниз. Результатом команды «iпривет<ESC>», как вы, наверное, догадались, будет вставка слова «привет» — «2iпривет<ESC>» вставит «приветпривет».
[править] Дополнительные возможности
Есть несколько вещей, без которых редактирование похоже на пытку:
^G - показать информацию о файле :<number> - перейти на строку с номером <number> :set number - отобразить слева нумерацию строк (:set nonumber - спрятать нумерацию) :set wrap - переносить длинные строки(:set nowrap - не переносить) :sy[ntax] on/off - включить/выключить подсветку синтаксиса :colorscheme <name> - задать цветовую тему (где <name> имя темы, TAB работает как авто-дополнение) :h или :help - список возможной помощи(:viusage, :exusage) привести концы строк в файле к виду dos или unix соответственно: :set fileformat=dos :set fileformat=unix Задать размер табуляции в 4 пробела: :set ts=4
[править] Vim
[править] Главные отличия от vi
- Неограниченное число undo/redo. (в 7-ой версии появились деревья)
- Многооконность.
- Поддержка множества буферов. (в 7-ой версии появились закладки)
- Подсветка синтаксиса.
- Редактирование командной строкой.
- Достраивание имен файлов.
- Визуальное редактирование.
- Кроссплатформенность.
- Графический интерфейс (GUI).
- Режим совместимости с vi.
- Проверка орфографии
[править] Команды
Переход к началу файла в Vim отличается от Vi:
gg
[править] Слово под курсором
Перейти к следующему вхождению слова под курсором
*
Перейти к предыдущему вхождению слова под курсором
#
Перейти к определению слова под курсором
gd (go definition)
Перейти к редактированию файла (под курсором должен быть путь)
gf (go file)
[править] Визуальный режим
Это существенное расширение возможностей Vi, без которого не обходится ни один «нормальный» текстовой редактор. Режим предназначен для выделения блока текста и дальнейшей работы с ним и состоит из 3-х последовательных шагов:
- Пометка начала блока с помощью «v», «V» или CTRL-V. Блок помечается с того символа на котором находится курсор(по умолчанию).
- Перемещение курсора в конец необходимого блока. Последний символ также будет включен в выделенный блок.
- Вызов необходимой команды.
Команда «v» предназначена для выделения текста посимвольно. Символы до и после курсора в строке не будут входить в выделение. Необходима в первую очередь для копирования участков текста в строке.
«V» — для выделения текста построчно.
CTRL-V — для выделения прямоугольного участка текста. Удобна в случае редактирования структурированного текста.
С выделеным участком текста можно производить стандартные действия по редактированию(копирование — «y», удаление — «d»). Напомню, что в Vim при удалении участка текста, он автоматически помещается в специальный регистр, что равноценно «вырезанию» участка текста, который потом можно будет вставить с помощью команды «p»(вставка текста после курсора) или «P»(вставка текста перед курсором).
[править] ~/.vimrc
vimrc — это файл конфигурации Vim. При запуске Vim сначала читает этот файл и применяет записанные в нем настройки. Рекомендуемое расположение этого файла для различных платформ:
Unix $HOME/.vimrc MS-DOS and Win32 $HOME/_vimrc или $VIM/_vimrc
Файл конфигурации используется для настройки различных аспектов поведения и внешнего вида Vim.
Комментарии в этом файле начинаются с символа " (двойная кавычка) и продолжаются до конца строки.
Для примера приводится выдержка из файла _vimrc автора:
" установить keymap, чтобы по Ctrl+^ переключался на русский и обратно set keymap=russian-jcukenwin " по умолчанию - латинская раскладка set iminsert=0 " по умолчанию - латинская раскладка при поиске set imsearch=0 " игнорировать регистр при поиске set ic " подсвечивать поиск set hls " использовать инкрементальный поиск set is " ширина текста set textwidth=70 " минимальная высота окна пусть будет 0 (по умолчанию - 1) set winminheight=0 " всегда делать активное окно максимального размера set noequalalways set winheight=9999 " установить шрифт Courier New Cyr set guifont=courier_new:h10:cRUSSIAN " настраиваю для работы с русскими словами (чтобы w, b, * понимали " русские слова) set iskeyword=@,48-57,_,192-255 " задать размер табуляции в четыре пробела set ts=4
Для получения более подробной информации по файлу _vimrc можно набрать в командной строке Vim команду
:help vimrc
[править] Vim и русская раскладка клавиатуры
В обычном режиме Vim по умолчанию ожидает, что консоль находится в режиме ввода латинских символов. Если вы, к примеру, редактируете с помощью Vim текст на русском языке, или в смешанных кодировках (к примеру, HTML-страницу на русском), то постоянная необходимость переключать системную клавиатурную раскладку очень быстро вам надоест. Существует несколько способов решить эту проблему.
[править] Способ 1
Сделать так, чтобы русские буквы можно было вводить когда системная раскладка находится в режиме ввода латинских символов.
Для этого в файл конфигурации Vim, который называется .vimrc (или _vimrc в Microsoft Windows) нужно добавить следующие строки:
set keymap=russian-jcukenwin set iminsert=0
После этого системную раскладку клавиатуры можно будет оставить в режиме ввода латинских символов, а переключение между языками осуществлять уже внутри самого редактора с помощью команды Ctrl+^ (Ctrl+6 в версии для Windows) Чтобы настроить переключение языков на другую кнопку (например на F12), можно использовать такие команды: для режима ввода символов:
- imap <F12> {ctrl-k}{ctrl-6}{ctrl-6}
При этом {ctrl-k} нужно вводить нажатием клавиш <Ctrl> и k. После нажатия {ctrl-k} появится подсвеченный значок вопроса, который потом заменится на код клавиши\комбинации, которую Вы введёте, в данном случае ^^.
для режима ввода командной строки:
- cmap <F12> {ctrl-k}{ctrl-6}{ctrl-6}
Кроме этого, в версии для Windows Vim по умолчанию не настроен на использование кодировок клавиатуры, содержащих символы кириллицы, например CP1251 и KOI8-R (в версии же для Linux настройка по умолчанию корректна). Как следствие этого, Vim при редактировании русского текста будет неправильно обрабатывать команды перемещения по тексту, основанные на поиске слова, такие как w (одно слово вперед), b (одно слово назад), * (найти в тексте слово под курсором) и т. п. Чтобы настроить Vim для корректной работы с этими командами независимо от языка, достаточно добавить в файл конфигурации _vimrc следующую строку:
set iskeyword=@,48-57,_,192-255
[править] Способ 2
Сделать так, чтобы Vim понимал, какие клавиши нажимаются, если включена русская раскладка.
Для этого в .vimrc добавьте строчку:
set langmap=ёйцукенгшщзхъфывапролджэячсмитьбю;`qwertyuiop[]asdfghjkl\;'zxcvbnm\,.,ЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>/
После этого Vim будет нормально понимать команды, вводимые при включенной русской раскладке.
Если у вас локаль UTF, то данный способ не работает. Необходимо каждый символ назначить индивидуально:
map ё `
map й q
map ц w
map у e
map к r
map е t
map н y
map г u
map ш i
map щ o
map з p
map х [
map ъ ]
map ф a
map ы s
map в d
map а f
map п g
map р h
map о j
map л k
map д l
map ж ;
map э '
map я z
map ч x
map с c
map м v
map и b
map т n
map ь m
map б ,
map ю .
map Ё ~
map Й Q
map Ц W
map У E
map К R
map Е T
map Н Y
map Г U
map Ш I
map Щ O
map З P
map Х {
map Ъ }
map Ф A
map Ы S
map В D
map А F
map П G
map Р H
map О J
map Л K
map Д L
map Ж :
map Э "
map Я Z
map Ч X
map С C
map М V
map И B
map Т N
map Ь M
map Б <
map Ю >
[править] Поиск в файлах с выводом в список
В Microsoft Visual Studio (возможно и в других IDE тоже) есть очень удобная функция Find In Files. Она ищет заданную строку или регулярное выражение в файлах в заданной папке и выводит результат поиска в виде списка. Если щёлкнуть по строке этого списка то откроется файл в том месте где была найдена заданная строка. Подобная функция есть и в Vim. Чтобы найти в файлах нужную строку надо набрать команду:
:vimgrep /искомая строка/ Путь к файлам | :copen
Более конкретный пример:
:vimgrep /translator/ R:\projects\**\*.txt | :copen
Команда vimgrep ищет строку или регулярное выражение заключенное между символами // в файле или файлах и сбрасывает результаты в специальный буфер. А так же открывает файл с первым найденным результатом. Команда copen открывает буфер с результатами поиска. Путь к файлам может указывать как на один файл так и на набор файлов. Чтобы путь указывал на несколько файлов надо использовать символы ? и *. Значение этих символов такое же как и в командной строке операционной системы. Чтобы поиск прошел по всем подпапкам указанной папки можно использовать две звездочки **. Пример использования **:
/usr/inc**/*.h
может означать:
/usr/include/types.h /usr/include/sys/types.h /usr/inc_old/types.h
[править] Конвертация кодировки файла
Vim автоматически конвертирует открываемый файл в текущую кодировку, а при сохранении конвертирует обратно в кодировку файла. Текущая кодировка задается переменной encoding(enc). Кодировка файла задается переменной fileencoding(fenc). Кодировка файла автоматически определяется при его открытии(или может берется из настроек системы?), но ее можно и задать вручную. Для того, чтобы сохранить файл в нужной кодировке, надо перед сохранением задать соответствующее значение переменной fileencoding.
Чтобы узнать список всех доступных значений переменных encoding и fileencoding наберите команду:
:help encoding-values
[править] Пример: как сконвертировать файл из cp1251 в utf-8
- Открываем пустой Vim
- Задаем текущую кодировку utf-8(если она уже не задана по умолчанию):
:set encoding=utf-8
- Открываем интересующий файл. При открывании файл автоматически конвертируется в utf-8
- Задаем кодировку файла utf-8:
:set fileencoding=utf-8
- Сохраняем файл
[править] Vim при переводах текста, или для чтения английской документации
Итак, чтобы можно было успешно читать и переводить документацию на английском языке, нужно ИМХО всего 3 вещи:
- Редактор.
- Переводчик.
- проверка орфографии
Если их удобно объединить, то можно получить хорошую среду, для перевода/чтения.
[править] Что возьмем
Редактор мы естественно возьмем VIM хотя бы потому что статья так называется. Переводчик mueller консольная версия, работает так:
% mueller sex sex [seks] _n. 1> _биол. пол; the weaker sex слАбый пол, жЕнщины; the sterner (или stronger) sex сИльный пол, мужчИны; the sex _шутл. жЕнщины 2> секс 3> _at tr. половОй, сексуАльный; sex instinct половОй инстИнкт; sex intergrade гермафродИт
И орфографмометр: это spell в виме, словари скачаем с vim.org
[править] Как настроим
Мне интересна возможность выпадающего списка, при наведением на неизвестное мне слово мышкой. Для этого, после долгого чтения манов (или гугленья) узнаем что с помошью команды system можно выполнить какое-то действие, вывод которой куда-либо записать. короче пишем где-нибудь в ~/.vimrc
function! MyBalloonExpr()
return system("mueller ". v:beval_text)
endfunction
set bexpr=MyBalloonExpr() set ballooneval set balloondelay=100
Определили функцию MyBallonExpr которая будет формировать строку mueller [слово на которое навели] и выполнять. Результат выполнения будет выдавать в «балоне» выпадающем окошке, через 100 миллисекунд.
Естественно вместо mueller вы можите поставить любую другую программу, которая переводит текст.
[править] Ссылки
- Vim.org — официальный сайт vim — документация, файлы, плагины
- Vim-howto — руководство по использованию vim
- Vim. Первая установка
- Все о редакторе VI (VIM, GVIM). Форум, документация.
- Очередной HowTo по Vim — HowTo, описывающий основные проблемы, возникающие при работе в Vim. Содержит примеры конфигурационных файлов и список наиболее полезных команд.

