Руководство по vim на русском

Примечание от переводчика: это первая часть монументальной (на самом деле монументальной) статьи о Vim и его возможностях от разработчика из Миннеаполиса и автора проекта PostgREST Джо begriffs Нельсона.

Первая часть статьи отводится на знакомство с историей Vim как редактора и автор рассказывает ряд интересных фактов и о возможностях Vim. Во второй части перевода будут сконцентрированы все фишки и лайфхаки, которыми Джо решил поделиться с аудиторией, там повествование, как таковое, затухает и остается лишь набор руководств к действию. Так как оригинал текста обладает совершенно неприемлемыми габаритами, мы разделили эту историю на две примерно равные по размерам статьи. Сегодня — первая из двух публикаций. Приятного чтения.


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

Список литературы

Чтобы выйти за границы привычных тем, я бы порекомендовал обзавестись бумажной копией этого руководства и емким карманным справочником. Я не смог найти печатную копию руководства пользователя для Vim, так что в итоге просто распечатал идущий вместе с редактором PDF-файл с помощью printme1.com. Он идет вместе с софтом в $VIMRUNTIME/doc/usr_??. В качестве удобного списка команд могу посоветовать справочник «Vi and Vim Editors Pocket».

Содержание

  • История
  • Иерархия конфигурации
  • Сторонние плагины
  • Бекапы и откаты
  • Include и path
  • Редактирование и компиляция цикла
  • Диффы и патчи
  • Буфер ввода / вывода
  • Типы файлов
  • Не забывайте про мышь
  • Разное

История

Рождение vi

Команды и функции Vi существуют уже более пятидесяти лет, начиная с редактора QED. Вот его таймлайн:

  • 1966: QED («Быстрый редактор») в Berkeley Timesharing System
  • 1969 июл: с его помощью проводили посадку на Луну (ну так, для справки)
  • 1969 Авг: QED → ed в AT&T
  • 1976 Фев: ed → em («Editor for Mortals») в колледже королевы Марии
  • 1976: em → ex («EXtended») в Калифорнийском университете в Беркли
  • 1977 окт: ex получает визуальный режим, vi — текстовый терминал

Если вы почитаете руководство по QED и ex, то сможете обнаружить между ними некоторое сходство. Оба редактора используют схожу грамматику для указания и работы с диапазонами строк.

Такие редакторы как QED ed и em разрабатывались для печатных терминалов, которые в основной своей массе были обычными электрическими пишущими машинками с подключенным к ним модемом. Такие «полнокопирные» терминалы выводили команды на бумагу и очевидно, после ввода внести какие-либо исправления было невозможно. Поэтому процесс редактирования заключался в ручных правках пользовательских команд на бумаге, а после — повторного ввода.

К 1976 году появились видеотерминалы, например, ADM-3A. В Ex-редактор добавили «открытый режим», который позволял редактирование через видеотерминал в рамках одной страницы. Был добавлен и визуальный режим для ориентирования на строках терминала с помощью курсора. Визуальный режим активировался командой «vi» и постоянно обновлял отображаемый на экране файла, сохраняя при этом позиционирование командной строки в нижней части экрана. Интересный факт: на клавишах h, j, k, l на ADM-3A были нанесены стрелки, которые позволяли перемещать курсор в vi.

Узнать больше об этом периоде перехода от ed к ex/vi можно в интервью Билла Джоя. В нем он рассказывает о том, как создал ex/vi и о некоторых вещах, которые в итоге его разочаровали.

Классический vi — это просто альтер-это ex. Оба представлены одним и тем же двоичным файлом, который может запускаться как в ex-режиме, так и vi-режиме в зависимости от имени исполняемого файла. Наследие всей этой истории в том, что ex / vi «раскрывается» при использовании, почти не требует системных ресурсов и может работать в условиях ограниченной полосы пропускания. Он также доступен в большинстве существующих систем и полностью описан в POSIX.

От vi к Vim

Будучи производным от ed, редактор ex / vi являлся интеллектуальной собственностью AT&T. Чтобы использовать vi на платформах, отличных от Unix, люди должны были писать клоны, которые имели другую кодовую базу исходника.

Вот некоторые из них:

  • nvi — 1980 для 4BSD
  • calvin — 1987 для DOS
  • vile — 1990 для DOS
  • stevie — 1987 для Atari ST
  • elvis — 1990 для Minix и 386BSD
  • vim — 1991 для Amiga
  • viper — 1995 для Emacs
  • elwin — 1995 для Windows
  • lemmy — 2002 для Windows

Мы сосредоточимся на клоне из центра списка — Vim. Брэм Муленаар хотел использовать vi на Amiga и начал переносить с Atari и развивать клона vi «stevie». А назвал он свою версию порта «Vi Imitation». Если хотите узнать об этом процессе из первых рук, то посмотрите его интервью для Free Software Magazine.

В версии 1.22 Vim был переименован в «Vi IMproved», что указывает на превосходство копии над оригиналом. Вот график следующих основных версий с описанием некоторых функций:

Для получения дополнительной информации о каждой версии стоит курить help, например, для vim8. Чтобы увидеть планируемые обновления, а так же список известных ошибок, стоит обратиться к todo.txt.

Например, восьмая версия включала некоторую поддержку асинхронных заданий по причине давления на проект со стороны NeoVim. Разработчики последнего хотели запускать отладку и REPL для веб-сценариев прямо внутри редактора.

Вообще Vim суперпортативный. Приспосабливаясь всю историю своего существования к работе на абсолютно разных платформах, этот редактор был вынужден держаться в рамках «легкой» культуры кодинга. Vim работает на OS / 390, Amiga, BeOS и BeBox, Macintosh Classic, Atari MiNT, MS-DOS, OS / 2, QNX, RISC-OS, BSD, Linux, OS X, VMS и MS-Windows. Вы можете положиться на Vim где угодно, и плевать, какое оборудование вы используете.

В конце пути оригинального vi, в 2002 году, исходный код ex / vi все же был опубликован под лицензией свободного программного обеспечения BSD. Сорцы доступны по адресу ex-vi.sourceforge.net.

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

Иерархия конфига

Раньше я ошибочно считал, что Vim достает все свои настройки и сценарии только из файла .vimrc. Просмотр репозиториев случайных «дотфайлов» может только укрепить в этом мнении. Довольно часто люди выкладывают чудовищные по своей сути одиночные файлы .vimrc, задача которых — контроль каждого аспекта редактора. Эти громадные конфиги еще иногда называют «vim distros».

На самом деле Vim имеет аккуратную структуру, в которой .vimrc — это только одна из множества «точек входа». Фактически, вы можете сами спросить у Vim, какие именно скрипты он загружает. Для этого отредактируйте какой-нибудь исходник случайного проекта на вашей машине, загрузите его а после запустите команду

:scriptnames

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

Список оказался длиннее, чем вы ожидали? Если вы установили множество плагинов, то редактору предстоит и многое сделать. Проверьте, что замедляет его работу при запуске, выполнив следующую команду создания start.log:

vim --startuptime start.log name-of-your-file

Просто сравните, как быстро Vim запускается с из коробки:

vim --clean --startuptime clean.log name-of-your-file

Чтобы определить, какие именно сценарии следует подгружать при запуске или во время загрузки буфера, нужно проверить «runtime path» Vim. Этот путь представлен разделенным через запятую списком каталогов, каждый из которых содержит в себе общую структуру. Vim проверяет эти структуры в каждом каталоге в поиске своих скриптов запуска. Обрабатываются каталоги строго по порядку, в котором они расположены в списке.

Проверьте путь выполнения в своей системе через эту команду:

:set runtimepath

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

~/.vim
Домашний каталог, предназначен для созданных профилей.

/usr/local/share/vim/vimfiles
Общесистемный каталог Vim, для профилей с правами системного администратора.

/usr/local/share/vim/vim81
Aka $ VIMRUNTIME, для файлов, распространяемых вместе с Vim.

/usr/local/share/vim/vimfiles/after
В общесистемном каталоге Vim есть еще каталог «after». Он предназначен для добавления персональных настроек системного администратора «по умолчанию».

~/.vim/after
Каталог «after» в домашнем каталоге. Нужен для того, чтобы личные конфиги не отменяли или не пересекались с общесистемным или настройками «по умолчанию».

Вообще каталоги обрабатываются в том же порядке, в котором они записаны в start.log, исключение сделано только для «after». Этот всегда стоит в конце списка и обрабатывается последним.

При обработке каждого каталога, Vim ищет в них подпапки с конкретными именами. Чтобы больше узнать об этом, посмотрите help runtimepath. Вот краткое описание тех, которые мы будем рассматривать далее по тексту:

plugin /
Тут лежат файлы сценариев Vim, которые автоматически загружаются при редактировании любого типа файла. Еще их называют «глобальными».

autoload /
(Не путать с «plugin»). Эти скрипты автозагрузки содержат функции, которые подтягиваются только по запросу других скриптов.

ftdetect /
Скрипты для определения типов файлов. В своей работе они опираются на расширение, расположение или внутреннее содержимое файла.

ftplugin /
Скрипты, которые выполняются при редактировании файлов известного типа.

compiler /
Определяет, как запускать различные компиляторы или lint-проверку, и как анализировать их вывод. Может быть разделен сразу между несколькими ftplugins. Compiler не выполняется автоматически и должен вызываться командой.

pack /
Контейнер для собственных пакетов Vim 8, преемник управления пакетами в стиле Pathogen. Имеет собственную систему упаковки, не требует для работы стороннего кода.

И, наконец, ~ / .vimrc — ловушка для общих настроек редактора. Используется для конфигурации настроек «по умолчанию», которые можно привязать к определенному типу файлов. Для ознакомления со всем списком можете выбрать .vimrc и запустить команду options.

Сторонние плагины

Плагины — это просто скрипты Vim, для выполнения которых их достаточно разместить в правильные места в runtimepath. В целом, процесс установки крайне прост: просто загрузите файл(ы). Проблема заключается в том, что некоторые плагины достаточно трудно обновить или удалить, поскольку их разбрасывает по разным подкаталогам и они засоряют пути выполнения своими сценариями. То есть, в итоге сложно определить, какой файл к какому плагину относится.

Именно для решения этого вопроса и стали развиваться «менеджеры плагинов». На vim.org был реестр плагинов как минимум до 2003 года включительно (если архив не врет). Однако в моду «менеджеры плагинов» как сущность вошли только к 2008 году.

Эти инструмент добавляют специальные каталоги для плагинов, чтобы отслеживать пути выполнения и расставлять теги, по которым можно отслеживать плагины. Большинство менеджеров также подтягивают обновления плагинов из сети.

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

  • Mar 2006 — Jul 2014: Vimball
  • Oct 2008 — Dec 2015: Pathogen
  • Aug 2009 — Dec 2009: Vimana
  • Dec 2009 — Dec 2014: VAM
  • Aug 2010 — Nov 2010: Jolt
  • Oct 2010 — Nov 2012: tplugin
  • Oct 2010 — Feb 2014: Vundle
  • Mar 2012 — Mar 2018: vim-flavor
  • Apr 2012 — Mar 2016: NeoBundle
  • Jan 2013 — Aug 2017: infect
  • Feb 2013 — Aug 2016: vimogen
  • Oct 2013 — Jan 2015: vim-unbundle
  • Dec 2013 — Jul 2015: Vizardry
  • Feb 2014 — Oct 2018: vim-plug
  • Jan 2015 — Oct 2015: enabler
  • Aug 2015 — Apr 2016: Vizardry 2
  • Jan 2016 — Jun 2018: dein.vim
  • Sep 2016 — Present: native in Vim 8
  • Feb 2017 — Sep 2018: minpac
  • Mar 2018 — Mar 2018: autopac
  • Feb 2017 — Jun 2018: pack
  • Mar 2017 — Sep 2017: vim-pck
  • Sep 2017 — Sep 2017: vim8-pack
  • Sep 2017 — May 2019: volt
  • Sep 2018 — Feb 2019: vim-packager
  • Feb 2019 — Feb 2019: plugpac.vim

Первое, на что нужно обратить внимание в списке выше — это огромное разнообразие. Второе — каждый из представленных инструментов «живет» примерно четыре года, а потом, по всей видимости, выходит из моды.

Путь наименьшего сопротивления в управлении плагинами — это просто использовать встроенную функциональность Vim 8, которая не требует подтягивания какого-то стороннего кода. Давайте рассмотрим, как это делать.

Для начала создайте две директории внутри вашего runtimepath: opt и start.

mkdir -p ~/.vim/pack/foobar/{opt,start}

Обратите внимание на плейсхолдер «foobar» (имя можно изменить). Он полностью классифицирует все пакеты, которые попадут внутрь. Большинство пользователей просто сбрасывают все свои плагины в какую-нибудь одну категорию и, в общем-то, это нормально. Выберите любое имя, которое вам нравится; Я продолжу использовать foobar. В теории, вы также можете создать несколько категорий, например ~/.vim/pack/navigation и ~/.vim/pack/linting. Обратите внимание, что Vim не распознает дублирование между категориями и дважды загружает дубликаты, если они существуют.

Пакеты в «start» загружаются автоматически, тогда как пакеты в «opt» не загружаются до тех пор, пока они не будут из в Vim с помощью команды :packadd. Эта опция хороша для редко используемых пакетов и поддерживается Vim «из коробки», без необходимости запуска скриптов. Обратите внимание, что у :packadd нет аналога для выгрузки пакетов.

Для рассмотрения этого примера мы добавим плагин нечеткого поиска ctrlp в opt. Загрузите и распакуйте его последнюю версию по адресу:

curl -L https://github.com/kien/ctrlp.vim/archive/1.79.tar.gz 
	| tar zx -C ~/.vim/pack/foobar/opt

Эта команда создаст папку ~ / .vim / pack / foobar / opt / ctrlp.vim-1.79 и выгрузит готовый к использованию пакет. Вернитесь в vim и создайте указатели справочных тегов (helptags index) для нового пакета:

:helptags ~/.vim/pack/foobar/opt/ctrlp.vim-1.79/doc

Эта команда создаст файл с именем «tags» в папке с сорцами пакета, которые делают темы доступными для просмотра во внутренней системе Vim. Альтернативный путь: запустить helptags ALL после загрузки пакета, и команда позаботится обо всех файлах и их путях выполнения.
Когда вы захотите использовать пакет, просто загрузите его и помните, что в этом случае работает завершение с помощью табуляции, так что полное имя вводить не потребуется:

:packadd ctrlp.vim-1.79

Базовый каталог Packadd лежит в runtimepath, что позволяет ему использовать сценарии его плагина и ftdetect. После загрузки ctrlp вы сможете использовать команду CTRL-P, чтобы открыть поиск файлов по частичному совпадению.

Некоторые люди следят за своим каталогом ~ / .vim и для контроля версий каждого пакета используют git. Я же, со своей стороны, просто распаковываю пакеты из tar-архивов и отслеживают их по репозиторию вручную. Если вы используете достаточно зрелые пакеты, которые не требуют частых обновлений, а также скрипты, то они достаточно маленькие и не загромождают историю git.

Бэкапы и откаты версий

В зависимости от пользовательских настроек, Vim может защитить вас от четырех возможных причин потери данных:

  1. Сбой во время редактирования (между сохранениями). Vim может защитить от этого, периодически сохраняя вносимые изменения в файле подкачки.
  2. Защита от редактирования одного и того же файла двумя экземплярами Vim, защита от перезаписи изменений, внесенных через один или несколько экземпляров. Это тоже делается через файл подкачки.
  3. Сбой во время самого процесса сохранения после изменения конечного файла, но до полной записи нового содержимого. Vim может защитить вас от этого с помощью функции «writebackup». Для этого он создает в процессе сохранения новый файл, которым впоследствии заменяет оригинал, если все прошло гладко. Способ замены определяется настройкой «backupcopy».
  4. Сохранение нового содержимого файла при условии восстановления оригинала. Vim позволяет сохранить резервную копию файла после внесения изменений.

Но прежде чем заняться изучением этих умных настроек, как насчет пары шуток? Вот несколько примеров комментариев из файлов vimrc на GitHub:

«Не создавайте файл подкачки. Управляйте всем через контроль версий».
«Резервные копии для ссыкунов. Используйте контроль версий».
«Только контроль версий! Только хардкор!»
«Мы живем в мире контроля версий, поэтому свопам и резервным копиям место на помойке».
«Зачем вам файлы резервных копий, если достаточно контроля версий».
«Я никогда не пользовался файлами резервных копий Vim… Пользуйтесь контролем версий».
«Большинство вещей можно найти с помощью контроля версий».
«Отключите резервное копирование файлов, ведь вы все равно пользуетесь системой контроля версий ;)».
«И пришел контроль версий, и Git спас нас».
«Отключите файлы подкачки и систему резервного копирования. Всегда используйте контроль версий! ВСЕГДА!»
«Мне не нужно резервное копирование, ведь я работаю с контролем версий».

Ирония в том, что комменты выше отражают лишь понимание четвертого и, частично, третьего типа сбоя. Если вы откажетесь от файла подкачки и резервного копирования, вы лишитесь защиты в случая, описанных в пунктах №1 и №2.

Вот пример конфигурации, которую я рекомендую для обеспечения безопасной работы:

" Protect changes between writes. Default values of
" updatecount (200 keystrokes) and updatetime
" (4 seconds) are fine
set swapfile
set directory^=~/.vim/swap//

" protect against crash-during-write
set writebackup
" but do not persist backup after successful write
set nobackup
" use rename-and-write-new method whenever safe
set backupcopy=auto
" patch required to honor double slash at end
if has("patch-8.1.0251")
	" consolidate the writebackups -- not a big
	" deal either way, since they usually get deleted
	set backupdir^=~/.vim/backup//
end

" persist the undo tree for each file
set undofile
set undodir^=~/.vim/undo//

Эти настройки включают резервное копирование для незавершенной записи, но не сохраняют файлы после успешного окончания операции, потому что у нас же есть контроль версий, самый лучший контроль версий, бла-бла-бла и т.д. и т.п. Обратите внимание на то, что вам может понадобиться mkdir ~ / .vim / {swap, undodir, backup}, иначе Vim будет обращаться к следующей доступной для чтения папке. Также, вероятно, нужно будет выполнить команду chmod для целевых папок, чтобы их содержимое было приватным, поскольку файлы подкачки и история бэкапов могут содержать конфиденциальную информацию.

Стоит отметить, что особенность путей нашего конфига заключаются в том, что закрываются они всегда слэшем. Такое написание позволяет функции устранять возможную неоднозначность в путях файлов подкачки и резервных копий для файлов с одинаковыми именами, которые при этом находятся в разных каталогах. Например, файл подкачки для / foo / bar будет сохранен в ~ / .vim / swap /% foo% bar.swp (слэши я экранировал знаками процента). В недавнем патче Vim была ошибка, из-за которой слэш не учитывался для backupdir, так что защита от нее показана выше.

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

Когда мы говорим об откатах, то стоит помнить о том, что Vim поддерживает полное древо истории редактирования файлов. Это означает, что вы можете внести изменение, откатить его, а потом повторить те же изменения вновь, и все это будет тремя разными точками восстановления. Время и объем внесенных изменений можно проверить с помощью команды undolist, но именно древо вытащить из нее проблематично. С помощью этой команды вы можете перемещаться между конкретными изменениями или разными версиями в зависимости от времени: прыгать с шагом в 5 минут, или опираться на количество сохраненных файлов. При этом на мой взгляд, навигация по каталогу откатов с помощью плагина — хороший вариант, но undotree — вариант железобетонный.

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

Ну и несколько финальных оговорок: следите за всеми файлами резервного восстановления, они могут накапливаться в папке ,vim и со временем начнут отжирать солидный объем дискового пространства. Также вам может потребоваться использование установки nowritebackup, если вы работаете с огромным по объему файлом, а дисковое пространство у вас ограничено. Об этом моменте стоит помнить, потому что Vim попытается сделать полную копию вашего файла, что приведет к очевидным последствиям. По умолчанию параметр backupskip отключает резервное копирование файла во временном системном каталоге.

Еще «patchmode» Vim напрямую связан с механизмом резервного копирования. Вы можете использовать его в каталогах, в которых нет контроля версий. Например, когда вы хотите загрузить tar-архив, внесите изменения и отправьте патч по списку рассылки, не добавляя его в git. Запустите set patchmod = .orig и любой foo-файл будет скопирован и перезаписан в foo.orig.

Include и path

Большинство языков программирования позволяют включать (include) один модуль или файл в другой. Vim умеет отслеживать идентификаторы через path, include, suffixesadd, и includeexpr. Поиск по индентификатору (см. help include-search) — это альтернатива мониторингу файлов по тегам ctags для системных заголовков.

Из коробки все это работает для программ на Си. Другие языки тоже поддерживаются, но в этом случае требуется ручная настройка. Так как эта тема выходит за пределы обозначенной для этой статьи, то могу порекомендовать курить help include.

Если все работает правильно, вы можете нажать [i на идентификаторе, чтобы получить его описание, либо же нажать [d для получения макропостоянной переменной. Также при использовании gf на имени файла Vim ищет путь перехода к нему. Поскольку путь влияет и на команду :find, некоторые пользователи имеют привычку добавлять **/* или другие общедоступные каталоги к имени пути для того, чтобы использовать нечеткий поиск. Последнее замедляет поиск по идентификатору и каталогам, т.к. просматривается и то, что не имеет отношения к нашей задаче.

Есть способ получить тот же эффект нечеткого поиска, не загрязняя при этом сам путь. Суть заключается в нажатии (обычно это пробел с обратным косым слэшем) и вводе имени файла с использованием табуляции или CTRL-D. Это поможет найти файл.

" fuzzy-find lite
nmap <Leader><space> :e ./**/

И опять повторюсь: параметр path был разработан для верхних (headers) файлов. Если вам нужны еще пруфы, есть целая команда: checkpath, которая показывает, работает ли путь. Загрузите любой файл из C и запустите checkpath. Он вернет вам дамп файлов, которые он не смог найти, но которые были включены в текущий файл. Также стоит помнить, что checkpath принудительно сбрасывает всю иерархическую цепочку файлов, зацепленных за текущий.

По умолчанию путь имеет вид «., / Usr / include ,,». Он означает, что наша рабочая директория — это /usr/include, а все файлы являются родственными для активного буфера. Спецификации директорий и глобов достаточно мощная штука, посмотрите подробнее в мануале :help file-searching.

В моем ftplugin для Си (подробнее расскажу позже) также есть поиск пути для файлов, включенных в текущий проект. Пример: ./src/include или ./include.

setlocal path=.,,*/include/**3,./*/include/**3
setlocal path+=/usr/include

Конструкция вида «**3» — это ограничитель глубины поиска по каталогам. В этом конкретном случае, глубина ограничена тремя подкаталогами. Нужно это, что избежать блокировки поиска по идентификатору.

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

Также посмотрите команды: :he [, :he gf, :he :find.


Конец первой части.

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

Пожалуй, Vim нельзя просто запустить и начать работать — требуется определенная подготовка. Зато стоит раз испытать его в деле и поражаешься тому, как можно было без него обходиться.

Для быстрого ознакомления с функциональностью Vim запустите команду vimtutor.

Начнем с примера

Типичная сессия работы с Vim выглядит так:

#vim httpd.conf

В открывшемся редакторе:

/SSLVerif
nwr1ZZ

В данном случае задачей было изменить значение определенного параметра конфигурации apache. В обычном редакторе подобный результат достигается следующими действиями:

  • Открыть файл «httpd.conf»
  • Открыть диалог поиска
  • Ввести «SSLVerif».
  • С помощью кнопки «Далее», перейти ко второму по счету вхождению искомой строки.
  • Поставить курсор в нужном месте
  • Удалить «0» и напечатать «1»
  • Сохранить изменения
  • Закрыть файл

Объяснение команд VIM:

  • / — Перейти в режим поиска
  • Kлавиша Enter — Искать’.
  • n — Перейти к следующему вхождению искомой строки
  • w — Переместить курсор к следующему слову
  • r — Заменить знак под курсором
  • ZZ — Сохранить изменения и выйти
  • ZQ — Выйти без сохранения изменений

Введение

Здесь я делюсь опытом работы в Vim’е. Предполагается, читатель имеет установленные vi и vim, а также знаком с основами работы с UNIX-подобной системой.

Помнится, когда товарищ установил FreeBSD на мою домашнюю ЭВМ, некоторые файлы открывались непонятным мне образом. Я быстро старался избавиться от этого несчастья. Через некоторое время я понял, что происходит: в системе по умолчанию, в переменной окружения EDITOR, установлен редактор vi. Я сразу поменял его на ‘ee’ (easy editor). Это действительно простой редактор, затруднений с ним возникнуть просто не может, однако и особой свободы в нем не испытать. Вскоре его стало не хватать…

Описание работы с редактором я привожу в хронологическом порядке — от простого к сложному. Так как Vim на 99 % совместим с Vi, сначала я дам краткое описание работы с vi.

Легенда сокращений и специальных символов:

Строки, начинающиеся с символа "#" - командная строка;
<ESC> - нажатие клавишу Escape (Ctrl-[ или Ctrl-c);
<CR> - ... Enter;
<SHIFT> - ... Shift
^x - ... Ctrl-x

Vi

Главное отличие Vi от других редакторов в том, что у него несколько режимов работы. При этом привычный нам режим ввода текста — не основной. Вместо этого, в обычном режиме vi воспринимает каждое нажатие на клавишу, как команду. Это позволяет мгновенно перемещаться по файлу и быстро осуществлять редактирование.

Насколько Vi быстрее других редакторов? — Давайте сравним. Например, вот действия, которые необходимо выполнить [«продвинутому»] пользователю, чтобы поменять местами две буквы в обычном редакторе и в vi:

Обычный редактор:

<Shift-Стрелка вправо>
<Ctrl-x>
<Стрелка влево>
<Ctrl-v>

Vi:

xp

Переключение режимов

  • «Обычный режим» — перемещение по файлу, стирание текста и другие редактирующие функции. Переход в него из любого другого режима:
<ESC>, иногда 2 раза;
<Ctrl-[>
<Ctrl-c>
  • «Режим ввода» — ввод текста. Заметьте, что стирание и ввод текста происходит в двух разных режимах. Переход в него из обычного режима:
i
<Insert>
  • «Командный режим» — Команды (операции с файлом, поиск и замена, настройка редактора…). Переход в него из обычного режима:
:
  • «Режим поиска» — ввод поискового запроса. Переход в него из обычного режима
/
  • «Визуальный режим» — режим выделения текста. Переход в него из обычного режима
v

Открыть/создать файл

Опишем операции, которые можно производить с файлом.

#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

или

:new filename

Перед этим нужно сохранить предыдущий файл

:w            - сохраняет файл с существующим именем
:w filename   - сохраняет файл с новым именем

Перемещение по файлу

Самые часто используемые в vi клавиши — клавиши перемещения. Это знаменитые h j k l, соответствующие стрелкам влево, вниз, вверх и вправо. Стрелочки тоже работают (при правильном указании терминала). Можно использовать также быстрые клавиши:

  • 0 («ноль») — в начало текущей строки;
  • ^ — в начало текущей строки (к первому непробельному символу);
  • $ — в конец текущей строки
  • w — на слово вправо
  • b — на слово влево
  • W — до пробела вправо
  • B — до пробела влево
  • } — абзац вниз
  • { — абзац вверх
  • <Ctrl-f> — на страницу (экран) вниз
  • <Ctrl-b> — на страницу (экран) верх
  • gg — перейти в начало файла
  • G — перейти в конец файла
  • <number>G — перейти на конкретную строку <number>
  • /<text><CR> — перейти к <text>
  • ?<text><CR> — то же самое, но искать назад
  • n — повторить поиск
  • N — повторить поиск назад
  • [[ — в начало функции
  • “ — к месту выполнения команды [[

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

Предположим в нашем файле записан следующий текст:

— Винни, тебе что намазать на хлеб, мёду или сгущённого молока?

— И того, и другого, и можно без хлеба!
— Ну, если вы больше ничего не хотите…

— А что, что-то есть ещё?

Диалог симпатичный, но несколько несвязный. Давайте изменим его — для этого необходимо перейти в режим ввода. Самый простой способ — из обычного режима нажатие клавиши «i». После чего можно смело приступать к вводу текста. <ESC> вернет нас к обычному режиму. Другие важные команды:

  • R — перейти в режим ввода с забиванием текста
  • r — заменить один символ
  • i — перейти в режим ввода с текущей позиции
  • I — переместиться в начало строки и перейти в режим ввода
  • a — перейти в режим ввода после курсора
  • А — переместиться в конец строки и перейти в режим ввода
  • o — перейти в режим ввода с новой строки под курсором
  • O — перейти в режим ввода с новой строки над курсором
  • x — удалить символ под курсором
  • X — удалить символ влево (удалить символ перед курсором)
  • d — используется совместно с командами перемещения. Удаляет символы с текущего положения курсора до положения после ввода команды перемещения. Пример: dw — удаляет символы с текущего до конца слова; diw — удаляет слово под курсором
  • с — команда аналогичная d, но после удаление переходит в режим ввода. Очень удобная альтернатива команде R
  • dd — удалить текущую строку (вырезать)
  • d<число>d — стирание числа строк начиная с текущей
  • yy — копирование текущей строки в неименованный буфер
  • y<число>y — копирование числа строк начиная с текущей в неименованный буфер
  • p — вставка содержимого неименнованного буфера под курсором
  • P — вставка содержимого неименнованного буфера перед курсором
  • J — слияние текущей строки со следующей
  • u — отмена последней команды
  • U — отмена всех последних изменений в строке.
  • <Ctrl-r> или :redo вперед по изменениям.
  • . — повтор последней команды

Конечно, все сразу запомнить их трудно, даже не надо (к тому же здесь перечислены не все). Уверяю вас, через некоторое время эти команды будут пользоваться спросом.

Наконец мы дошли к самому главному — командному режиму. Помним как в него перейти? «:». Шифт-ж если по-русски.

Запись/выход

Если вы в режиме ввода, то необходимо предварительно нажать <ESC>, чтобы перейти в обычный режим.

ZQ - выйти без сохранения

или

:q! - выйти без сохранения
ZZ - записать файл и выйти(Если файл не изменяли, то записываться он не будет)

или

:wq - записать файл и выйти

или

:x - записать файл и выйти
:w<CR> - записать файл
:sav filename<CR> - "Сохранить как"

или

:w 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>
<number>G - перейти на строку с номером <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 tabstop=4
:set expandtab

Конвертация кодировки файла:

:set fenc=cp1251<CR>
:set fenc=koi8-r<CR>
:set fenc=ibm866<CR>
:set fenc=utf-8<CR>

Смена кодировки (возможна до внесения изменений в редактируемый файл. т.е. сразу после открытия)

:e ++enc=cp1251<CR>
:e ++enc=koi8-r<CR>
:e ++enc=ibm866<CR>
:e ++enc=utf-8<CR>

Vim

Главные отличия от vi

  • Неограниченное число undo/redo. (в 7-ой версии появились деревья)
  • Многооконность.
  • Поддержка множества буферов. (в 7-ой версии появились закладки)
  • Подсветка синтаксиса.
  • Редактирование командной строкой.
  • Достраивание имен файлов.
  • Визуальное редактирование.
  • Кроссплатформенность.
  • Графический интерфейс (GUI).
  • Режим совместимости с vi.
  • Проверка орфографии

Команды

Переход к началу файла в Vim отличается от Vi:

gg

Переход к строке под номером <number>:

<number>gg

Слово под курсором

Перейти к следующему вхождению слова под курсором

*

Перейти к предыдущему вхождению слова под курсором

#

Перейти к определению слова под курсором

gd (go definition)

Перейти к редактированию файла (под курсором должен быть путь)

gf (go file)

Визуальный режим

Это существенное расширение возможностей Vi, без которого не обходится ни один «нормальный» текстовой редактор. Режим предназначен для выделения блока текста и дальнейшей работы с ним и состоит из 3-х последовательных шагов:

  1. Пометка начала блока с помощью «v», «V» или Ctrl-V. Блок помечается с того символа на котором находится курсор(по умолчанию).
  2. Перемещение курсора в конец необходимого блока. Последний символ также будет включен в выделенный блок.
  3. Вызов необходимой команды.

Команда «v» предназначена для выделения текста посимвольно. Символы до и после курсора в строке не будут входить в выделение. Необходима в первую очередь для копирования участков текста в строке.
«V» — для выделения текста построчно.
Ctrl-V — для выделения прямоугольного участка текста. Удобна в случае редактирования структурированного текста.

С выделенным участком текста можно производить стандартные действия по редактированию(копирование — «y», удаление — «d»). Напомню, что в Vim при удалении участка текста, он автоматически помещается в специальный регистр, что равноценно «вырезанию» участка текста, который потом можно будет вставить с помощью команды «p»(вставка текста после курсора) или «P»(вставка текста перед курсором).

~/.vimrc

vimrc — это файл конфигурации Vim. При запуске Vim сначала читает этот файл и применяет записанные в нем настройки. Рекомендуемое расположение этого файла для различных платформ:

Unix-like         $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
" отображение выполняемой команды
set showcmd 
" перенос по словам, а не по буквам
set linebreak
set dy=lastline

Можно добавить привычное поведение и привычные сочетания клавиш.

  • Например, можно будет прокручивать (скроллить) текст колесиком мыши и вставлять выделенное в X`ах мышкой в Vim нажатием средней кнопки мыши (нажать на колесико мыши):
 set mouse=a
 map <S-Insert> <MiddleMouse>
 map! <S-Insert> <MiddleMouse>
  • По <F2> сохранение сделанных изменений:
imap <F2> <Esc>:w<CR>
map <F2> <Esc>:w<CR>
  • По <F3> вставка содержимого заданного файла в редактируемый текст. Требуется ввести имя файла. Работает авто-дополнение имени файла по <Tab> в текущем каталоге.
imap <F3> <Esc>:read 
map <F3> <Esc>:read 

Также возможен интересный прием работы:

:read !ls -la

Эта команда вставит в текущую позицию редактируемого текста весь вывод указанной после «!» команды (в нашем случае: ls -la).

  • По <F4> открывается новая вкладка (tab) и выводится список каталогов и файлов текущего каталога. Клавишами управления курсором можно выбрать каталог или файл. Нажатие <Enter> на каталог отобразит его содержимое в том же режиме (можно путешествовать по каталогам), а нажатие <Enter> на файле — откроет его в этой же вкладке. Работает быстрый поиск-перемещение по «/«.
imap <F4> <Esc>:browse tabnew<CR> 
map <F4> <Esc>:browse tabnew<CR>
  • По <F5> позволяет переключать вкладки справа-налево, по-порядку, отображая открытые в них файлы.
imap <F5> <Esc> :tabprev <CR>i
map <F5> :tabprev <CR>
  • По <F6> позволяет переключать вкладки слева-направо, по-порядку, отображая открытые в них файлы.
imap <F6> <Esc> :tabnext <CR>i
map <F6> :tabnext <CR>
  • Пользовательское меню. По <F9> позволяет приостановить работу Vim и вызвать соответствующие программы:
set wildmenu
set wcm=<Tab>
menu Exec.GForth  :!gforth % <CR>
menu Exec.Perl    :!perl % <CR>
menu Exec.Python  :!python % <CR>
menu Exec.Ruby    :!ruby % <CR>
menu Exec.bash      :!/bin/bash<CR>
menu Exec.xterm     :!xterm<CR>
menu Exec.mc        :!mc<CR>
menu Exec.xterm_mc  :!xterm -e mc<CR>
map <F9> :emenu Exec.<Tab>
Обратите внимание на, например, конструкцию :!python % <CR> — символ % будет заменён на имя текущего редактируемого файла. В итоге, Vim приостановит работу и вызовет python filename.ext (если вы редактировали filename.ext) в текущем терминале (в том же, где запущен Vim), а затем, после завершения работы python filename.ext, вернётся к редактированию файла. Не забудьте сохранить изменения перед вызовом. Впрочем, Vim должен будет вам напомнить о том, что изменения нужно сохранить, если вы этого не сделали.
Заметьте: что Exec. — это не специальная команда, в всего лишь идентификатор меню, объединяющая группу команд и их идентификаторы/названия пунктов меню/.
  • Пользовательское меню. По <F10> позволяет вызвать меню различных вариантов завершения работы с Vim. ( Глоток воздуха для новичка  :)
set wildmenu
set wcm=<Tab>
menu Exit.quit     :quit<CR>
menu Exit.quit!    :quit!<CR>
menu Exit.save     :exit<CR>
map <F10> :emenu Exit.<Tab>
  • Позволяет по <Tab>, более привычному некоторым пользователям, вызывать авто-дополнение для текущего активного синтаксиса:
 function! InsertTabWrapper(direction)
    let col = col('.') - 1
    if !col || getline('.')[col - 1] !~ 'k'
        return "<tab>"
    elseif "backward" == a:direction
        return "<c-p>"
    else
        return "<c-n>"
    endif
 endfunction
 inoremap <tab> <c-r>=InsertTabWrapper ("forward")<cr>
 inoremap <s-tab> <c-r>=InsertTabWrapper ("backward")<cr>
 

Дополнительно

Для получения более подробной информации по файлу _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 и после этого обе клавиши одновременно отпускаются. После нажатия {Ctrl-k} появится подсвеченный значок вопроса, который потом заменится на код клавишикомбинации, которую Вы введёте, в данном случае {Ctrl-6}{Ctrl-6}, что будет выглядеть как ^^.

для режима ввода командной строки:
cmap <F12> {Ctrl-k}{Ctrl-6}{Ctrl-6}

В итоге, визуально в .vimrc это должно выглядеть так:

imap <F12> ^^
cmap <F12> ^^

Кроме этого, в версии для Windows Vim по умолчанию не настроен на использование кодировок клавиатуры, содержащих символы кириллицы, например CP1251 и KOI8-R (в версии же для Linux настройка по умолчанию корректна). Как следствие этого, Vim при редактировании русского текста будет неправильно обрабатывать команды перемещения по тексту, основанные на поиске слова, такие как w (одно слово вперед), b (одно слово назад), * (найти в тексте слово под курсором) и т. п. Чтобы настроить Vim для корректной работы с этими командами независимо от языка, достаточно добавить в файл конфигурации _vimrc следующую строку:

set iskeyword=@,48-57,_,192-255

Способ 2

Сделать так, чтобы Vim понимал, какие клавиши нажимаются, если включена русская раскладка.

Для этого в .vimrc добавьте следующую строчку:

Для стандартной раскладки (Windows, Linux):

set langmap=ёйцукенгшщзхъфывапролджэячсмитьбю;`qwertyuiop[]asdfghjkl;'zxcvbnm,.,ЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>

Для раскладки Mac:

set langmap=йцукенгшщзхъфывапролджэячсмитьбю/ЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/;qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP[]ASDFGHJKL:'ZXCVBNM,./

(Так как в Mac-раскладке символы под цифрами вводят другие символы, соответствующие английским, например, нажатие Shift-4 вводит «%» вместо «$», их не получится переназначить, поэтому способ 1 подходит лучше.)

После этого Vim будет нормально понимать команды, вводимые при включенной русской раскладке.

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

  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 Ю >

Возможно это зависит от версии, у меня работает так и причём в UTF:

set langmap=ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;`qwertyuiop[]asdfghjkl;'zxcvbnm,.~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>

Так как в последних версиях возможна проблема с парсером символа экранирования » — его необходимо записывать как ‘\’ перед специальными символами ‘,’, ‘;’, ‘»‘ и ». Потому в версии 7.3 правильная строка может быть такой:

set langmap=ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;`qwertyuiop[]asdfghjkl\;'zxcvbnm\,.~QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>

Вставка форматированного текста с отступами

У начинающих часто возникает ситуация, когда при копировании форматированного текста с отступами (например, текст страницы из браузера или пример форматированного кода из документации) в vim строки «съезжают» вправо. Это происходит потому, что редактор пытается помочь отформатировать текст «красиво» и копирует отступы с предыдущей строки в новую. Бороться с этим легко:

:set paste

…вставляем форматированный текст с отступами в режиме редактирования (например, средней кнопкой мыши) и строки «съезжать» вправо не будут. После этого режим «вставки» можно отключить командой:

:set nopaste

Поиск в файлах с выводом в список

В 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 попытается определить кодировку, и открыть файл в этой кодировке. Для этого, в ~/.vimrc:

set encoding=utf-8                                  " set charset translation encoding
set termencoding=utf-8                              " set terminal encoding
set fileencoding=utf-8                              " set save encoding
set fileencodings=utf8,koi8r,cp1251,cp866,ucs-2le   " список предполагаемых кодировок, в порядке предпочтения

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

Можно указать кодировку текста вручную

Например, можно вручную указать кодировку cp1251 (MS Windows) уже открытому тексту:

:e ++enc=cp1251

Можно предварительно, перед открытием файла, указать ожидаемую кодировку

Для этого нужно установить переменную encoding (сокращенно enc). Например, установить кодировку ucs-2le (unicode MS Windows):

:set enc=ucs-2le

После этого можно открывать файл. Он откроется в этой кодировке.

Пользовательское меню

Часто, для упрощения работы в Vim с файлами в различных кодировках, в ~/.vimrc определяют специальное пользовательское меню, которое будет вызываться, например, по <F12>.

set wildmenu
set wcm=<Tab>
menu Encoding.koi8-r  :e ++enc=koi8-r<CR>
menu Encoding.cp1251  :e ++enc=cp1251<CR>
menu Encoding.cp866   :e ++enc=cp866<CR>
menu Encoding.ucs-2le :e ++enc=ucs-2le<CR>
menu Encoding.utf-8   :e ++enc=utf-8<CR>
map <F12> :emenu Encoding.<Tab>

Перемещаться по пунктам пользовательского меню можно по <Tab> или клавишами управления курсором.

Дополнительно

Чтобы узнать список всех поддерживаемых кодировок, наберите команду:

:help encoding-values

Конвертация кодировки файла

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

  • Текущая используемая в Vim кодировка задается переменной encoding (enc).
  • Кодировка отображения задается переменной termencoding (tenc).
  • Кодировка сохранения файла задается переменной fileencoding (fenc).

Кодировка файла encoding определяется при его открытии или берется из настроек системы. При отображении, Vim производит трансляцию текущей кодировки encoding в кодировку отображения termencoding. При сохранении в файл Vim конвертирует из текущей кодировки encoding в кодировку сохранения fileencoding.

Обычно encoding и fileencoding совпадают. Для того, чтобы сохранить файл в другой кодировке, надо перед сохранением задать соответствующее значение переменной fileencoding.

Чтобы узнать список всех доступных значений переменных encoding и fileencoding наберите команду:

:help encoding-values

Пример: как сконвертировать файл из MS Windows cp1251 в Linux utf-8

  • Открываем файл в Vim:
vim filename.txt
  • Задаем текущую кодировку cp1251:
:e ++enc=cp1251
  • Текст конвертируется и Vim отобразит изменения, если они произошли. Исходный файл не изменился.
  • Задаем кодировку сохранения файла utf-8:
:set fileencoding=utf-8
  • Задаем формат переводов строки (dos, unix или mac):
:set fileformat=unix
  • Сохраняем файл.
:w
  • Выходим
:q

Пример: конвертировать файл из Linux utf-8 в MS Windows cp1251

Обратная операция — конвертировать файл из Linux utf-8 в MS Windows cp1251 — будет такой:

vim filename.txt
:e ++enc=utf-8
:set fileencoding=cp1251
:set fileformat=dos
:w
:q

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 вы можете поставить любую другую программу, которая переводит текст.

Рецепт для оч.умелых ручек

Если у вас нет консольной версии mueller, но есть много энтузиазма, то можно поступить так:

  • Идем на http://sourceforge.net/projects/mueller-dict/ и забираем оттуда mueller-dict-3.1.1.tar.gz
  • Извлекаем из полученного архива файл mueller-base.dict.dz и кладем его, скажем, в ~/dict/
  • Там же создаем файл mueller-base.sh со следующим содержимым:
#!/bin/bash
# 
WORD=`echo $1 | sed -e 's/[A-Z]*/L&/g;s/[,.;:]//g'`;
if [ -z $WORD ]; then exit; fi;
LINES=50;  
DICTIONARY="$HOME/dict/mueller-base.dict.dz"; 
# 
zgrep -aA$LINES '^'$WORD'$' $DICTIONARY | sed -e '/^$/d; 1s/^/ &/;/^[^ ]/,$d'
#
  • даем нашему новому консольному словарику право на исполнение:
$ chmod +x ~/dict/mueller-base.sh
  • и проверяем его работоспособность:
$ ~/dict/mueller-base.sh head
  • Для графической версии редактора (gvim) функция перевода в нашем ~/.vimrc должна будет выглядеть так:
function! MyBalloonExpr()
   return system("$HOME/dict/mueller-base.sh ". v:beval_text)
endfunction
set bexpr=MyBalloonExpr()
set ballooneval
set balloondelay=500

Примечание:

  • Естественно, что функция MyBalloonExpr() работает только в gVim, зато выглядит красиво. Наведите курсор мышки на слово и оставьте его неподвижным секунду-две (поначалу, можно вообще убирать руку с мышки, позже приловчитесь).
  • LINES=50 ограничивает количество выводимых строчек. Можете подобрать цифру под свой монитор.
  • Рекомендую выставить balloondelay=500 миллисекунд. Да, помедленнее. Но мышка будет меньше цепляться за слова.
  • Для текстовой версии редактора (vim) придётся делать специальную функцию TranslateWord() и вешать её вызов на специальную функциональную клавишу, например <F9>:
function! TranslateWord()
   let s:dict    = "$HOME/dict/mueller-base.sh"
   let s:phrase  = expand("<cword>")
   let s:tmpfile = tempname()
   silent execute "!" . s:dict . " " . s:phrase . " > " . s:tmpfile
   execute "botright sp " . s:tmpfile
endfunction
map <F9> :call TranslateWord()<CR>

Примечание:

  • Это работает точно так же и в графической версии редактора (gvim). Поэтому метод можно считать универсальным, но требует нескольких нажатий клавиш, и сплит-окно выглядит менее элегантно, чем подсказки.
  • Открывшееся окно с переводом можно закрыть стандартным способом ( :q ). Ну, а если вы воспользовались советом выше и забиндили на клавишу <F10> предложенное пользовательское меню, то алгоритм работы будет совсем простой: <F9> смотрим перевод <F10><Enter> вернули как было.
  • Этот метод использует временный файл
  • Т.к. в этом методе нет необходимости в ограничении, чтоб подсказка помещалась на экран, то для LINES можно увеличить лимиты, хоть до LINES=500. Этот метод не имеет ограничений на количество выводимых строчек.

Строка статуса редактора

Строка статуса редактора бывает очень полезна, если вам не жалко пары строчек на экране. Добавьте в ~/.vimrc:

set laststatus=2   " всегда показывать строку статуса
set statusline=%f%m%r%h%w %y enc:%{&enc} ff:%{&ff} fenc:%{&fenc}%=(ch:%3b hex:%2B) col:%2c line:%2l/%L [%2p%%]

…и у вас в предпоследней строке будет выводиться что-то вроде этого:

.vimrc [vim] enc:utf-8 ff:unix fenc:utf-8       (ch: 92 hex:5C) col:26 line:158/168 [94%]

Комментарий:

%f — имя файла и путь к нему, относительно текущего каталога
%m — флаг модификации/изменения, выводит [+] если буфер изменялся
%r — флаг «только для чтения», выводит [RO] если буфер только для чтения
%h — флаг буфера помощи, выводит [help] если буфер со справкой vim
%w — флаг окна превью, выводит [Preview]
' ' — экранированный символ пробела. Пробел можно указывать только экранированным, иначе ошибка синтаксиса
%y — тип файла в буфере, например [vim]
enc:%{&enc} — отображение кодировки encoding (enc). Обратите внимание: «enc:» — текст, «%{&enc}» — вывод значения внутренней переменной (enc)
ff:%{&ff} — отображение формата перевода строки fileformat (ff)
fenc:%{&fenc} — отображение кодировки сохранения в файл fileencoding (fenc)
%= — далее выравнивать вправо
ch:%3b — код символа под курсором в десятичной чистеме счисления, минимум 3 символа
hex:%2B — код символа под курсором в шестнадцатеричной системе счисления, минимум 2 символа
col:%2c — курсор в колонке, минимум 2 символа
line:%2l/%L — курсор в строке (минимум 2 символа)/всего строк в файле
%2p — число % в строках, где находится курсор (0% — начало файла; 100% — конец файла), минимум 2 символа
%% — т.к. символ ‘%’ используется для переменных, то вывод символа ‘%’ в строке статуса нужно делать особым образом — %%

Подробнее о формате вывода statusline можно узнать из справки:

:help statusline

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

Пользовательское меню

Часто бывает удобно оформить процедуры, связанные с проверкой орфографии, в виде пользовательского меню:

set wildmenu
set wcm=<Tab>
" проверка орфографии:
menu SetSpell.ru  :set spl=ru spell<CR>
menu SetSpell.en  :set spl=en spell<CR>
menu SetSpell.off :set nospell<CR>
map <F7> :emenu SetSpell.<Tab>
" выбор альтернатив:
imap <F8> <Esc> z=<CR>i
map <F8> z=<CR>

Здесь, по <F7> вызывается подменю: проверить орфографию русского языка [ru], проверить орфографию английского языка [en] или отключить проверку орфографии [off].

По <F8> для слова под курсором можно найти корректную альтернативу из словаря. Порядок работы следующий:

  • Наводим курсор на выбранное слово (или подсвеченное проверкой орфографии слово)
  • Нажимаем <F8> и видим список альтернатив. Каждый вариант в списке помечен цифрой.
  • Находим понравившийся вариант и запоминаем его номер.
  • Смело начинаем набирать запомненный номер, неважно, одна это цифра или две.
  • Снова нажимаем <F8>.
  • Слово под курсором будет заменено альтернативой с указанным номером.

Последовательность: <F8><одна-или-две-цифры><F8>

Как это работает?

Попробуйте на примере слова «Шпоргалка».

  • Откройте Vim, перейдите в режим редактирования и наберите слово «Шпоргалка».
  • Выйдите из режима редактирования в командный режим (обычно, <Esc><Esc>)
  • Установите курсор на слово «Шпоргалка»
  • Нажмите последовательно два символа «z» и «=» (два символа: z=)
  • Как результат, вы должны увидеть экран с альтернативами, подобранными для слова под курсором. Нажатие любой клавиши скроет этот экран, но безопасными и не оставляющими следов в буфере клавиатуры будут либо <Esc><Esc>, либо <Enter>.
  • Запоминаем, что хорошей альтернативой слову «Шпоргалка» было слово «Шпаргалка», под номером «1«.
  • А теперь магия! Нажимаем последовательно три символа: «1«, «z» и «=» (три символа: 1z=)
  • Слово под курсором «Шпоргалка» заменено на «Шпаргалка».
  • С использованием пользовательского меню, операция будет выглядеть, как три нажатия на кнопки: <F8>1<F8>.

Теперь мы с вами знаем, что если навести на слово «Шпоргалка» курсор и нажать три магических символа 1z= ,то ошибочное слово будет волшебным образом заменено на правильное («Шпаргалка»). А если нажать четыре магических символа 39z= ,то слово «Шпоргалка» под курсором будет волшебным образом заменено, скорее всего, на слово «Прогулка» (это если у вас стоят словари той же версии, что и у меня).

А теперь, самая главная тайна:

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

На всякий случай, напоминаю, что выход без сохранения изменений:

:q!<Enter>

Выход, с сохранением всех изменений:

:x<Enter>

Ссылки

  • Vim.org — официальный сайт vim — документация, файлы, плагины
  • Vim-howto — руководство по использованию vim
  • Vim. Первая установка
  • Очередной HowTo по Vim — HowTo, описывающий основные проблемы, возникающие при работе в Vim. Содержит примеры конфигурационных файлов и список наиболее полезных команд.
Vim

Vim (сокр. от Vi Improved, произносится «вим») — кошмар для случайного пользователя. Если его и удаётся закрыть, вздыхаешь с облегчением и твёрдой уверенностью, что ни разу в жизни больше не запустишь эту программу.

Пожалуй, нельзя просто запустить Vim и начать работать, требуется определённая подготовка. Зато стоит раз испытать его в деле, и поражаешься, как можно было без него обходиться.

Для быстрого ознакомления с функциональностью Vim запустите команду vimtutor.

Начнём с примера[править]

Типичная сессия работы с Vim выглядит так:

# vim httpd.conf

В открывшемся редакторе:

/SSLVerif
nwr1ZZ

Задачей было изменить значение параметра конфигурации Apache. В обычном редакторе подобный результат достигается командой вроде:

# editor_name httpd.conf

или сочетанием Ctrl + O и выбором файла из диалога открытия файла.

Ctrl + F SSLVerif ↵ Enter ↵ Enter Esc
Ctrl + 
Del 1
Ctrl + S
Alt + F4

Команды обычного редактора:

  • открыть файл «httpd.conf» одним из указанных способов;
  • Ctrl + F — открыть диалог поиска;
  • ввести «SSLVerif»;
  • ↵ Enter — фокус в диалоге поиска обычно стоит на поиске следующего вхождения искомого слова;
  • Esc — закрыть окно поиска;
  • Ctrl +  — снять фокус с найденного слова и перейти к следующему (в некоторых редакторах курсор проскакивает слово и переходит через слово — тогда нажимаем не отпуская Ctrl; в других одиночное нажатие приводит лишь к снятию фокуса и нужно повторно нажать );
  • Del ― удалить «0», остаётся напечатать «1»;
  • Ctrl + S — сохранить изменения;
  • Alt + F4 — закрыть файл и выйти.

Команды VIM:

  • / — перейти в режим поиска;
  • ↵ Enter — искать;
  • n — перейти к следующему вхождению искомой строки;
  • w — переместить курсор к следующему слову;
  • r — заменить знак под курсором;
  • ZZ — сохранить изменения и выйти;
  • ZQ — выйти без сохранения изменений.

С одной стороны, у Vim более лаконичные команды, с другой же — клавиши для «обычного» редактора работают в практически неизменном виде во многих приложениях, и их нужно выучить лишь раз.

Введение[править]

Здесь я делюсь опытом работы в 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 раза
<Ctrl-[>
  • «Режим ввода» — ввод текста. Как только завершается ввод текста, принято возвращаться в обычный режим. Заметьте, что стирание и ввод текста происходит в двух разных режимах. Перейти в него из обычного режима можно разными способами, к примеру:
i — начать ввод перед курсором
o — начать ввод с новой строки
S — очистить текущую строку и начать ввод
  • «Командный режим» — команды (операции с файлом, поиск и замена, настройка редактора и т. д.). Переход в него из обычного режима:
:
  • «Режим поиска» — ввод поискового запроса. Из обычного режима:
/ — поиск от курсора до конца документа
? — поиск от курсора до начала документа
  • «Визуальный режим» — режим выделения текста. Из обычного режима:
v

Открыть/создать файл[править]

Опишем операции, которые можно производить с файлом.

# vi mamapapa.txt           - открыть один файл
# vi mamapapa.txt +11       - открыть файл и перейти к строке 11
# vi mamapapa.txt ++11      - если файл был отрыт на строке 1, открыть его на строке 12
# vi mama.txt papa.txt      - открыть файл mama.txt, после выхода из него открыть файл papa.txt
# vi -о mama.txt papa.txt   - открыть сразу все файлы

Файл открывается в обычном режиме с помощью команды vi. Строка статуса будет отображать название файла. Мы можем просмотреть файл, переместиться по содержимому, стереть текст, но ввести текст в этом режиме нельзя.

Создание файла происходит при помощи той же команды. Собственно создание файла происходит в момент сохранения.

Для открытия или создания нового файла в обычном режиме набираем

:e filename

или

:new filename

Перед этим нужно сохранить предыдущий файл:

:w            - сохранить файл с существующим именем
:w filename   - сохранить файл с новым именем

Перемещение по файлу[править]

Самые часто используемые в Vi клавиши — клавиши перемещения. Это знаменитые h, j, k, l, соответствующие стрелкам влево, вниз, вверх и вправо. Стрелочки тоже работают (при правильном указании терминала). Также можно использовать быстрые клавиши:

  • <Ctrl-f> — на страницу (экран) вниз;
  • <Ctrl-b> — на страницу (экран) вверх;
  • <Ctrl-d> — на полстраницы (экрана) вниз;
  • <Ctrl-u> — на полстраницы (экрана) вверх;
  • <Ctrl-y> — на строку вверх, без изменения положения курсора;
  • <Ctrl-e> — на строку вниз, без изменения положения курсора;
  • 0 («ноль») — в начало текущей строки;
  • ^ — в начало текущей строки (к первому непробельному символу);
  • $ — в конец текущей строки;
  • w — на слово вправо;
  • b — на слово влево;
  • W — до пробела вправо;
  • B — до пробела влево;
  • } — абзац вниз;
  • { — абзац вверх;
  • gg — в начало файла;
  • G — в конец файла;
  • <number>G — перейти на конкретную строку <number>;
  • /<text><CR> — перейти к <text>;
  • ?<text><CR> — то же, но искать назад;
  • n — повторить поиск;
  • N — повторить поиск назад;
  • [[ — в начало функции;
  • » — к месту выполнения команды [[.

Перемещение по экрану[править]

Изменение положения экрана без изменения положения курсора. Сдвинуть страницу так, чтобы строка с курсором оказалась:

  • z- — внизу;
  • z[Enter] — вверху;
  • z. или zz — посредине.

Перемещение в пределах экрана:

  • H — на верхнюю строку (5H на пять строк ниже верхней строки);
  • M — на среднюю строку;
  • L — на последнюю строку (5L на пять строк выше нижней строки).

Редактирование файла[править]

В файле записан следующий текст:

— Винни, тебе что намазать на хлеб, мёду или сгущённого молока?

— И того, и другого, и можно без хлеба!
— Ну, если вы больше ничего не хотите…

— А что, что-то есть ещё?

Диалог симпатичный, но несколько несвязный. Давайте изменим его: для этого переходим в режим ввода. Самый простой способ — нажатие «i» из обычного режима, после чего можно смело приступать к вводу текста. <ESC> вернёт нас к обычному режиму.

Вводное замечание. Поскольку заглавные и строчные буквы команд соответствуют разным командам, следует быть внимательным к регистру ввода, учитывать, например, нажата ли клавиша <CAPS LOCK>. Используйте команду U, чтобы отменить ошибочные действия.

Другие важные команды:

Ввод текста[править]

Эти команды переводят редактор в режим ввода. Они экономят время на движение курсора или на перевод его на новую строку. В командах ввода возможны числовые аргументы (за исключением O и o). Например, команда 20iПривет<ESC> вставляет 20 слов «Привет».
Перейти в режим ввода:

  • i — с текущей позиции;
  • a — после курсора;
  • I — в начало строки;
  • А — в конце строки;
  • o — с новой строки под курсором;
  • O — с новой строки над курсором;
  • s — заменить указанное количество символов, т. е. удалить это число символов и перейти в режим ввода. В отличие от команды с, которая может удалить кусок текста размером не меньше слова (cw), командой s можно удалить любое число символов. Например, 4s удалит четыре символа, начиная с того, который находится под курсором. Эта команда применяется для замены одного или нескольких символов другими символами;
  • S — удалить всю текущую строку и перейти в режим ввода. Число перед командой показывает, сколько нужно удалить строк, начиная с текущей. Например, 4S удалит четыре строки, включая текущую;
  • R — перейти в режим ввода с заменой текста. Аналог insert. Символы под курсором заменяются на вводимые. Команда применяется, когда неизвестно, сколько придётся изменить символов на другие (иначе можно было бы использовать команду s с указанием числа заменяемых символов, например, 7s). При удалении вводимых символов возвращаются те, которые были до ввода команды. Такой режим сохраняется до конца строки. При вводе новой строки, по нажатию Enter, происходит не переход на другую строку с тем же режимом замены текста, а создание новой строки;
  • r — заменить один символ. Заменяет символ, находящийся под курсором на символ который, следует за командой. При этом не происходит выхода из командного режима, т. е. не надо нажимать ESC после изменения текста. Например, команда ry изменит символ под курсором на «y». Числовой показатель указывает, сколько символов необходимо заменить на данный. Например, 3ry вставляет три символа «y».

Удаление[править]

  • x — удалить символ под курсором (<число>x — удалить указанное число символов начиная с того, который находится под курсором);
  • X — удалить символ влево (удалить символ перед курсором);
  • d — используется совместно с командами перемещения. Удаляет символы с текущего положения курсора до положения после ввода команды перемещения.
Удалить символы:

  • dw — с текущего до конца слова, включая пробел после слова;
  • de — до конца слова, но оставить пробел;
  • dE — с текущего до конца слова, включая символы пунктуации, но оставить пробел после слова;
  • d<число>d или <число>dd — число строк начиная с текущей;
  • db — с текущего до начала слова (в обратном направлении);
  • d0 — с начала строки до текущего положения курсора;
  • d$ или D — с текущего положения курсора до конца строки.
Удалить:

  • diw — слово под курсором;
  • dd — текущую строку;
  • d<число>d или <число>dd — число строк начиная с текущей.
  • с — команда, аналогичная d, но после удаления переходит в режим ввода (замена текста). Удобная альтернатива команде R. Удалить:
  • сс — текущую строку и перейти в режим ввода;
  • C — текст с текущего положения курсора до конца строки, аналогична команде с$ (где $ — символ конца строки).
  • yy (также Y) — копирование текущей строки в неименованный буфер;
  • y<число>y — копирование числа строк начиная с текущей в неименованный буфер;
  • p — вставка содержимого неименнованного буфера под курсором. В Vim девять ячеек буфера удаления, так что можно вставить не только последнее удаление, но сделанные ранее. Например, 4p вставит под курсор содержимое четвертого удаления начиная с последнего. Также чтобы поменять местами два символа, можно использовать комбинацию команд «удалить» — x (удаление в буфер) и «вставить» — p (вставить из буфера). Таким образом, поставив курсор на первую букву из двух, которые необходимо поменять местами, и нажав комбинацию клавиш xp, мы совершим необходимые действия;
  • P — вставка содержимого неименованного буфера перед курсором;
  • J — слияние текущей строки со следующей. Числовой аргумент перед командой показывает, сколько следующих линий необходимо объединить с текущей. Например, 2J объединит две следующие строки с текущей, на которой расположен курсор.

Отмена изменений[править]

  • u — отменить последнюю команду;
  • U — отменить все последние изменения в строке; если строка удалена, то применить эту команду к ней будет невозможно.

Команды u и U могут отменять друг друга.

  • <Ctrl-r> или :redo — перейти вперёд по изменениям;
  • . — повторить последнюю команду, включая ввод текста;
  • ~ (тильда) — изменить символы под курсором на противоположный регистр (заглавные на строчные и строчные на заглавные), может применяться числовой показатель. Например, команда 5~ поменяет пять символов, начиная с текущего под курсором, на противоположный регистр.

Конечно, запомнить все команды сразу трудно, даже не нужно, к тому же здесь перечислены не все. Уверяю, через некоторое время эти команды будут пользоваться спросом.
Некоторые особенности использования редактора в режиме редактирования:

  • Любой удаляемый текст сохраняется временно в буфере. Из этого буфера его можно вставить в текст (см. команду p). Буфер изменяется также после применения команды y — копировать.
  • Любая команда редактирования хранится в буфере, пока не будет вызвана другая команда.

Наконец мы дошли к самому главному — командному режиму. Помним, как в него перейти? «:». Шифт-ж, если по-русски.

Запись/выход[править]

В режиме ввода предварительно нажмите <ESC>, чтобы перейти в обычный режим.

ZQ - выйти без сохранения

или

:q! - выйти без сохранения
ZZ - записать файл и выйти (если файл не изменяли, то записываться он не будет)

или

:wq - записать файл и выйти

или

:x - записать файл и выйти
:w<CR> - записать файл
:sav filename<CR> - "сохранить как"

или

:w filename<CR> - "сохранить как"
:w!<CR> - записать файл

Эта команда может помочь, если файл открыт в режиме «read-only», т. е. с опцией -R, если файл заблокирован другим пользователем, либо отсутствуют такие привилегии, либо ещё какая беда. При попытке записи без «!» будет выдано соответствующее предупреждение.

:w new_file<CR>

Создать новый файл «new_file» и записать в него текущее содержимое. Если файл существует, будет показано предупреждение. Дальше вы продолжаете работать со старым файлом — mamapapa.txt.

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

:sh<CR> - переход в командную оболочку

Чтобы из командной оболочки вернуться в редактор, нажмите CTRL-D или введите exit.

:q<CR> - выйти из редактора.

Ничего не получится, если файл был изменен. В таких случаях после команды добавляют «!»:

:q!<CR> - выйти из файла, не сохраняя изменения
:qa!<CR> - выйти из всех файлов, не сохраняя изменения

Чтобы отменить сделанные в текущей сессии изменения и вернуться к первоначальному варианту файла, применяют команду:

:e!<CR> - отменить изменения в текущей сессии

Коэффициент повторения[править]

Почти все команды vi принимают так называемый коэффициент повторения. Попросту говоря, если перед командой в обычном режиме вы указываете число, то команда повторяется соответствующее количество раз. Например, команда «j» перемещает курсор на одну строку вниз — «3j» переместит курсор на 3 строки вниз. Результатом команды «iпривет<ESC>», как вы, наверное, догадались, будет вставка слова «привет» — «2iпривет<ESC>» вставит «приветпривет».

Дополнительные возможности[править]

Есть несколько вещей, без которых редактирование похоже на пытку:

^G - показать информацию о файле
:<number> - перейти на строку с номером <number>
<number>G - перейти на строку с номером <number>
:set number - отобразить слева нумерацию строк (:set nonumber - спрятать нумерацию)
:set relativenumber - отобразить слева нумерацию строк относительно текущего положения курсора (:set norelativenumber - спрятать) 
: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 tabstop=4
:set expandtab
Размер табуляции новой строки:
:set shiftwidth=4

Конвертация кодировки файла:

:set fenc=cp1251<CR>
:set fenc=koi8-r<CR>
:set fenc=ibm866<CR>
:set fenc=utf-8<CR>

Смена кодировки (возможна до внесения изменений в редактируемый файл, т. е. сразу после открытия):

:e ++enc=cp1251<CR>
:e ++enc=koi8-r<CR>
:e ++enc=ibm866<CR>
:e ++enc=utf-8<CR>

Vim[править]

Главные отличия от Vi[править]

  • Неограниченное число undo и redo (в 7-й версии появились деревья).
  • Многооконность.
  • Поддержка множества буферов (в 7-й версии появились закладки).
  • Подсветка синтаксиса.
  • Редактирование командной строкой.
  • Достраивание имён файлов.
  • Визуальное редактирование.
  • Кроссплатформенность.
  • Графический интерфейс (GUI).
  • Проверка орфографии.

Команды[править]

Переход к началу файла в Vim отличается от Vi:

gg

Переход к строке под номером <number>:

<number>gg

Слово под курсором[править]

Перейти к следующему вхождению слова под курсором:

*

Перейти к предыдущему вхождению слова под курсором:

#

Перейти к определению слова под курсором:

gd (go definition)

Перейти к редактированию файла (под курсором должен быть путь):

gf (go file)

Визуальный режим[править]

Это существенное расширение возможностей Vi, без которого не обходится ни один «нормальный» текстовой редактор. Режим предназначен для выделения блока текста и дальнейшей работы с ним и состоит из трех последовательных шагов:

  1. Пометка начала блока с помощью «v», «V» или CTRL-V. Блок помечается с того символа, на котором находится курсор (по умолчанию).
  2. Перемещение курсора в конец необходимого блока. Последний символ также будет включён в выделенный блок.
  3. Вызов необходимой команды.

Команда «v» предназначена для выделения текста посимвольно. Символы до и после курсора в строке не будут входить в выделение. Необходима в первую очередь для копирования участков текста в строке.

  • «V» — для выделения текста построчно.
  • CTRL-V — для выделения прямоугольного участка текста. Удобна в случае редактирования структурированного текста.

С выделенным участком текста можно производить стандартные действия по редактированию (копирование — «y», удаление — «d»). Напомню, что в Vim при удалении участка текста он автоматически помещается в специальный регистр, что равноценно «вырезанию» участка текста, который потом можно будет вставить с помощью команды «p» (вставка текста после курсора) или «P» (вставка текста перед курсором).

~/.vimrc[править]

vimrc — это файл конфигурации Vim. При запуске Vim сначала читает этот файл и применяет записанные в нем настройки. Рекомендуемое расположение этого файла для различных платформ:

Unix-like         $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
" отображение выполняемой команды
set showcmd 
" перенос по словам, а не по буквам
set linebreak
set dy=lastline

Можно добавить привычное поведение и привычные сочетания клавиш.[править]

  • Например, можно будет прокручивать (скроллить) текст колёсиком мыши и вставлять выделенное в X`ах мышкой в Vim нажатием средней кнопки мыши (колёсика):
 set mouse=a
 map <S-Insert> <MiddleMouse>
 map! <S-Insert> <MiddleMouse>
  • По <F2> сохранение сделанных изменений:
imap <F2> <Esc>:w<CR>
map <F2> <Esc>:w<CR>
  • По <F3> вставка содержимого заданного файла в редактируемый текст. Требуется ввести имя файла. Работает автодополнение имени файла по <Tab> в текущем каталоге:
imap <F3> <Esc>:read 
map <F3> <Esc>:read 

Также возможен интересный приём работы:

:read !ls -la

Эта команда вставит в текущую позицию редактируемого текста весь вывод указанной после «!» команды (в нашем случае: ls -la).

  • По <F4> открывается новая вкладка (tab) и выводится список каталогов и файлов текущего каталога. Клавишами управления курсором можно выбрать каталог или файл. Нажатие <Enter> на каталог отобразит его содержимое в том же режиме (можно путешествовать по каталогам), а нажатие <Enter> на файле ― откроет его в этой же вкладке. Работает быстрый поиск-перемещение по «/».
imap <F4> <Esc>:browse tabnew<CR> 
map <F4> <Esc>:browse tabnew<CR>
  • По <F5> позволяет переключать вкладки справа налево, по порядку, отображая открытые в них файлы.
imap <F5> <Esc> :tabprev <CR>i
map <F5> :tabprev <CR>
  • По <F6> позволяет переключать вкладки слева направо, по порядку, отображая открытые в них файлы.
imap <F6> <Esc> :tabnext <CR>i
map <F6> :tabnext <CR>
  • Пользовательское меню. По <F9> позволяет приостановить работу Vim и вызвать соответствующие программы:
set wildmenu
set wcm=<Tab>
menu Exec.GForth    :!gforth % <CR>
menu Exec.Perl      :!perl % <CR>
menu Exec.Python    :!python % <CR>
menu Exec.Ruby      :!ruby % <CR>
menu Exec.bash      :!/bin/bash<CR>
menu Exec.xterm     :!xterm<CR>
menu Exec.mc        :!mc<CR>
menu Exec.xterm_mc  :!xterm -e mc<CR>
map <F9> :emenu Exec.<Tab>
Обратите внимание на, например, конструкцию :!python % <CR> — символ % будет заменён на имя текущего редактируемого файла. В итоге, Vim приостановит работу и вызовет python filename.ext (если вы редактировали filename.ext) в текущем терминале (в том же, где запущен Vim), а затем, после завершения работы python filename.ext, вернётся к редактированию файла. Не забудьте сохранить изменения перед вызовом. Впрочем, Vim должен будет вам напомнить о том, что изменения нужно сохранить, если вы этого не сделали.
Заметьте, что Exec. — это не специальная команда, а всего лишь идентификатор меню, объединяющая группу команд и их идентификаторы/названия пунктов меню.
  • Пользовательское меню. По <F10> позволяет вызвать меню различных вариантов завершения работы с Vim. Глоток воздуха для новичка:
set wildmenu
set wcm=<Tab>
menu Exit.quit     :quit<CR>
menu Exit.quit!    :quit!<CR>
menu Exit.save     :exit<CR>
map <F10> :emenu Exit.<Tab>
  • Позволяет по <Tab>, более привычному некоторым пользователям, вызывать автодополнение для текущего активного синтаксиса:
 function! InsertTabWrapper(direction)
    let col = col('.') - 1
    if !col || getline('.')[col - 1] !~ 'k'
        return "<tab>"
    elseif "backward" == a:direction
        return "<c-p>"
    else
        return "<c-n>"
    endif
 endfunction
 inoremap <tab> <c-r>=InsertTabWrapper ("forward")<cr>
 inoremap <s-tab> <c-r>=InsertTabWrapper ("backward")<cr>
 

Дополнительно[править]

Для получения более подробной информации по файлу _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 и после этого обе клавиши одновременно отпускаются. После нажатия {ctrl-k} появится подсвеченный значок вопроса, который потом заменится на код клавиши или комбинации, которую Вы введёте, в данном случае {ctrl-6}{ctrl-6}, что будет выглядеть как ^^.

для режима ввода командной строки:
cmap <F12> {ctrl-k}{ctrl-6}{ctrl-6}

В итоге, визуально в .vimrc это должно выглядеть так:

imap <F12> ^^
cmap <F12> ^^

Кроме этого, в версии для Windows Vim по умолчанию не настроен на использование кодировок клавиатуры, содержащих символы кириллицы, например CP1251 и KOI8-R (в версии же для Linux настройка по умолчанию корректна). Как следствие этого, Vim при редактировании русского текста будет неправильно обрабатывать команды перемещения по тексту, основанные на поиске слова, такие как w (одно слово вперёд), b (одно слово назад), * (найти в тексте слово под курсором) и т. п. Чтобы настроить Vim для корректной работы с этими командами независимо от языка, достаточно добавить в файл конфигурации _vimrc следующую строку:

set iskeyword=@,48-57,_,192-255

Однако вышеуказанная строка не позволяет изменять регистр русского текста в версии Vim для Windows. Для решения обеих этих проблем
вместо вышеуказанной строки в файл конфигурации добавьте следующую строку:

language ctype Russian_Russia.1251

Способ 2[править]

Сделать так, чтобы Vim понимал, какие клавиши нажимаются, если включена русская раскладка.

Для этого в .vimrc добавьте следующую строчку:

Для стандартной раскладки (Windows, Linux):

set langmap=ёйцукенгшщзхъфывапролджэячсмитьбю;`qwertyuiop[]asdfghjkl;'zxcvbnm,.,ЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>

Для раскладки Mac:

set langmap=йцукенгшщзхъфывапролджэячсмитьбю/ЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/;qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP[]ASDFGHJKL:'ZXCVBNM,./

(Так как в Mac-раскладке символы под цифрами вводят другие символы, соответствующие английским, например, нажатие Shift+4 вводит «%» вместо «$», их не получится переназначить, поэтому способ 1 подходит лучше.)

После этого Vim будет нормально понимать команды, вводимые при включённой русской раскладке.

В старых версиях 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 Ю >

Возможно, это зависит от версии, у меня работает так и причём в UTF:

set langmap=ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;`qwertyuiop[]asdfghjkl;'zxcvbnm,.~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>

Так как в последних версиях возможна проблема с парсером символа экранирования «» ― его необходимо записывать как «\» перед специальными символами «,», «;», «»» и «». Потому в версии 7.3 правильная строка может быть такой:

set langmap=!\"№\;%?*ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;!@#$%&*`qwertyuiop[]asdfghjkl\;'zxcvbnm\,.~QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>

Способы 3 и 4[править]

Использование плагинов ruscmd или vim-xkbswitch.

Вставка форматированного текста с отступами[править]

У начинающих часто возникает ситуация, когда при копировании форматированного текста с отступами — например части страницы из браузера или кода из документации — в Vim строки «съезжают» вправо. Это происходит потому, что редактор пытается помочь отформатировать текст «красиво» и копирует отступы с предыдущей строки в новую. Бороться с этим легко:

:set paste

…вставляем форматированный текст с отступами в режиме редактирования — например средней кнопкой мыши — и строки «съезжать» вправо не будут. После этого режим «вставки» можно отключить командой:

:set nopaste

Поиск в файлах с выводом в список[править]

В некоторых 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 попытается определить кодировку и открыть файл в ней. Для этого пропишите в ~/.vimrc:

set encoding=utf-8                                  " set charset translation encoding
set termencoding=utf-8                              " set terminal encoding
set fileencoding=utf-8                              " set save encoding
set fileencodings=utf8,koi8r,cp1251,cp866,ucs-2le   " список предполагаемых кодировок, в порядке предпочтения

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

Указать кодировку текста вручную[править]

Например, можно вручную указать кодировку cp1251 (MS Windows) уже открытому тексту:

:e ++enc=cp1251

Предварительно, перед открытием файла, указать ожидаемую кодировку[править]

Для этого установите переменную encoding (сокращённо enc). Например, установить кодировку ucs-2le (Unicode MS Windows):

:set enc=ucs-2le

После этого можно открывать файл. Он откроется в этой кодировке.

Пользовательское меню[править]

Часто для упрощения работы с файлами в различных кодировках в ~/.vimrc определяют специальное пользовательское меню, которое будет вызываться, например, по <F12>.

set wildmenu
set wcm=<Tab>
menu Encoding.koi8-r  :e ++enc=koi8-r<CR>
menu Encoding.cp1251  :e ++enc=cp1251<CR>
menu Encoding.cp866   :e ++enc=cp866<CR>
menu Encoding.ucs-2le :e ++enc=ucs-2le<CR>
menu Encoding.utf-8   :e ++enc=utf-8<CR>
map <F12> :emenu Encoding.<Tab>

Перемещаться по пунктам пользовательского меню можно по <Tab> или клавишами управления курсором.

Дополнительно[править]

Чтобы узнать список всех поддерживаемых кодировок, наберите команду:

:help encoding-values

Конвертация кодировки файла[править]

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

  • Текущая используемая в Vim кодировка задаётся переменной encoding (enc).
  • Кодировка отображения задаётся переменной termencoding (tenc).
  • Кодировка сохранения файла задается переменной fileencoding (fenc).

Кодировка файла encoding определяется при его открытии или берется из настроек системы. При отображении Vim транслирует текущую кодировку encoding в кодировку отображения termencoding. При сохранении в файл — конвертирует из текущей кодировки encoding в кодировку сохранения fileencoding.

Обычно encoding и fileencoding совпадают. Для того чтобы сохранить файл в другой кодировке, надо перед сохранением задать соответствующее значение переменной fileencoding.

Чтобы узнать список доступных значений переменных encoding и fileencoding, наберите команду:

:help encoding-values

Пример: как сконвертировать файл из MS Windows cp1251 в Linux utf-8[править]

  • Открываем файл в Vim:
vim filename.txt
  • Задаем текущую кодировку cp1251:
:e ++enc=cp1251
  • Текст конвертируется, и Vim отобразит изменения, если они произошли. Исходный файл не изменился.
  • Задаем кодировку сохранения файла utf-8:
:set fileencoding=utf-8
  • Задаем формат переводов строки (dos, unix или mac):
:set fileformat=unix
  • Сохраняем файл:
:w
  • Выходим:
:q

Пример: конвертировать файл из Linux utf-8 в MS Windows cp1251[править]

Обратная операция — конвертировать файл из Linux utf-8 в MS Windows cp1251 — будет такой:

vim filename.txt
:e ++enc=utf-8
:set fileencoding=cp1251
:set fileformat=dos
:w
:q

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, словари скачаем с 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 вы можете поставить любую другую программу, которая переводит текст.

Рецепт для очень умелых ручек[править]

Если у вас нет консольной версии mueller, но есть много энтузиазма, можно поступить так:

  • идем на http://sourceforge.net/projects/mueller-dict/ и забираем оттуда mueller-dict-3.1.1.tar.gz;
  • извлекаем из архива файл mueller-base.dict.dz и кладем его, скажем, в ~/dict/;
  • там же создаем файл mueller-base.sh со следующим содержимым:
#!/bin/bash
# 
WORD=`echo $1 | sed -e 's/[A-Z]*/L&/g;s/[,.;:]//g'`;
if [ -z $WORD ]; then exit; fi;
LINES=50;  
DICTIONARY="$HOME/dict/mueller-base.dict.dz"; 
# 
zgrep -aA$LINES '^'$WORD'$' $DICTIONARY | sed -e '/^$/d; 1s/^/ &/;/^[^ ]/,$d'
#
  • даем нашему новому консольному словарику право на исполнение:
$ chmod +x ~/dict/mueller-base.sh
  • и проверяем его работоспособность:
$ ~/dict/mueller-base.sh head
  • Для графической версии редактора, gvim, функция перевода в нашем ~/.vimrc должна выглядеть так:
function! MyBalloonExpr()
   return system("$HOME/dict/mueller-base.sh ". v:beval_text)
endfunction
set bexpr=MyBalloonExpr()
set ballooneval
set balloondelay=500

Примечание:

  • Естественно, что функция MyBalloonExpr() работает только в gVim, зато выглядит красиво. Наведите курсор на слово и оставьте неподвижным секунду-две (поначалу можно вообще убирать руку с мышки, позже приловчитесь).
  • LINES=50 ограничивает количество выводимых строчек. Можете подобрать цифру под свой монитор.
  • Рекомендую выставить balloondelay=500 миллисекунд. Да, помедленнее. Но мышка будет меньше цепляться за слова.
  • Для текстовой версии редактора (vim) придётся делать специальную функцию TranslateWord() и вешать её вызов на специальную функциональную клавишу, например <F9>:
function! TranslateWord()
   let s:dict    = "$HOME/dict/mueller-base.sh"
   let s:phrase  = expand("<cword>")
   let s:tmpfile = tempname()
   silent execute "!" . s:dict . " " . s:phrase . " > " . s:tmpfile
   execute "botright sp " . s:tmpfile
endfunction
map <F9> :call TranslateWord()<CR>

Примечание:

  • Это работает точно так же и в графической версии редактора, gvim. Поэтому метод можно считать универсальным, но он требует нескольких нажатий клавиш, и сплит-окно выглядит менее элегантно, чем подсказки.
  • Открывшееся окно с переводом можно закрыть стандартным способом ( :q ). Ну, а если вы воспользовались советом выше и забиндили на клавишу <F10> предложенное пользовательское меню, то алгоритм работы будет совсем простой: <F9> смотрим перевод <F10><Enter> вернули как было.
  • Этот метод использует временный файл.
  • Так как в этом методе нет необходимости в ограничении, чтоб подсказка помещалась на экран, то для LINES можно увеличить лимиты, хоть до LINES=500. Этот метод не имеет ограничений на количество выводимых строчек.

Строка статуса редактора[править]

Строка статуса редактора бывает очень полезна, если вам не жалко пары строчек на экране. Добавьте в ~/.vimrc:

set laststatus=2   " всегда показывать строку статуса
set statusline=%f%m%r%h%w %y enc:%{&enc} ff:%{&ff} fenc:%{&fenc}%=(ch:%3b hex:%2B) col:%2c line:%2l/%L [%2p%%]

…и у вас в предпоследней строке будет выводиться что-то вроде этого:

.vimrc [vim] enc:utf-8 ff:unix fenc:utf-8       (ch: 92 hex:5C) col:26 line:158/168 [94%]

Комментарий:

%f — имя файла и путь к нему относительно текущего каталога;
%m — флаг модификации/изменения, выводит [+] если буфер изменялся;
%r — флаг «только для чтения», выводит [RO], если буфер только для чтения;
%h — флаг буфера помощи, выводит [help], если буфер со справкой Vim;
%w — флаг окна превью, выводит [Preview];
' ' — экранированный символ пробела. Пробел можно указывать только экранированным, иначе произойдёт ошибка синтаксиса;
%y — тип файла в буфере, например [vim];
enc:%{&enc} — отображение кодировки encoding (enc). Обратите внимание: «enc:» — текст, «%{&enc}» — вывод значения внутренней переменной (enc);
ff:%{&ff} — отображение формата перевода строки fileformat (ff);
fenc:%{&fenc} — отображение кодировки сохранения в файл fileencoding (fenc);
%= — далее выравнивать вправо;
ch:%3b — код символа под курсором в десятичной системе счисления, минимум 3 символа;
hex:%2B — код символа под курсором в шестнадцатеричной системе счисления, минимум 2 символа;
col:%2c — курсор в колонке, минимум 2 символа;
line:%2l/%L — курсор в строке (минимум 2 символа)/всего строк в файле;
%2p — число процентов в строках, где находится курсор (0 % — начало файла; 100 % — конец файла), минимум 2 символа;
%% — так как символ «%» используется для переменных, вывод символа «%» в строке статуса нужно делать особым образом — %%.

Подробнее о формате вывода statusline смотрите в справке:

:help statusline

Проверка орфографии[править]

Пользовательское меню[править]

Часто бывает удобно оформить процедуры, связанные с проверкой орфографии, в виде пользовательского меню:

set wildmenu
set wcm=<Tab>
" проверка орфографии:
menu SetSpell.ru  :set spl=ru spell<CR>
menu SetSpell.en  :set spl=en spell<CR>
menu SetSpell.off :set nospell<CR>
map <F7> :emenu SetSpell.<Tab>
" выбор альтернатив:
imap <F8> <Esc> z=<CR>i
map <F8> z=<CR>

Здесь по <F7> вызывается подменю: проверить орфографию русского [ru], английского языка [en] или отключить проверку орфографии [off].

По <F8> для слова под курсором можно найти корректную альтернативу из словаря. Порядок работы следующий:

  • наводим курсор на выбранное слово (или подсвеченное проверкой орфографии слово);
  • нажимаем <F8> и видим список альтернатив. Каждый вариант в списке помечен цифрой;
  • находим понравившийся вариант и запоминаем его номер;
  • смело начинаем набирать запомненный номер, неважно, одна это цифра или две;
  • снова нажимаем <F8>.

Слово под курсором будет заменено альтернативой с указанным номером. Последовательность: <F8><одна-или-две-цифры><F8>.

Как это работает?[править]

Попробуйте на примере слова «шпоргалка»:

  • Откройте Vim, перейдите в режим редактирования и наберите слово «шпоргалка».
  • Выйдите из режима редактирования в командный режим (обычно <Esc><Esc>).
  • Установите курсор на слово «шпоргалка».
  • Нажмите последовательно два символа «z» и «=» (два символа: z=).
  • Как результат, вы увидите экран с альтернативами, подобранными для слова под курсором. Нажатие любой клавиши скроет этот экран, но безопасными и не оставляющими следов в буфере клавиатуры будут либо <Esc><Esc>, либо <Enter>.
  • Запоминаем, что хорошей альтернативой слову «шпоргалка» было слово «шпаргалка», под номером «1».
  • А теперь магия! Нажимаем последовательно три символа: «1», «z» и «=» (три символа: 1z=).
  • Слово под курсором «шпоргалка» заменено на «шпаргалка».
  • С использованием пользовательского меню, операция будет выглядеть, как три нажатия на кнопки: <F8>1<F8>.

Теперь мы с вами знаем, что если навести на слово «шпоргалка» курсор и нажать три магических символа 1z=, то ошибочное слово будет волшебным образом заменено на правильное («шпаргалка»). А если нажать четыре магических символа 39z=, то слово «шпоргалка» под курсором будет волшебным образом заменено, скорее всего, на слово «прогулка» (если у вас стоят словари той же версии, что и у меня).

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

На всякий случай напоминаю, что выход без сохранения изменений:

:q!<Enter>

Выход с сохранением изменений:

:x<Enter>

Влияние Vim[править]

Существуют браузеры и расширения для браузеров, делающее управление ими похожим на управление текстовым редактором Vim, например:

  • Vimperator — расширение для Mozilla Firefox.
  • Pentadactyl — расширение для Mozilla Firefox, форк Vimperator.
  • Vimium — расширение для браузеров на базе Chromium.
  • Conkeror — лёгкий веб-браузер на основе движка Gecko.
  • Luakit — лёгкий, быстрый браузер для UNIX-систем, использующий движок WebKit.

Ссылки[править]

  • Vim.org — официальный сайт Vim — документация, файлы, плагины
  • Vim-howto — руководство по использованию Vim
  • www.net4me.net — Vim коротко от простого к сложному
  • Vim. Первая установка
  • Все о редакторе Vi (Vim, gVim). Форум, документация
  • Очередной HowTo по Vim — HowTo, описывающий основные проблемы, возникающие при работе в Vim. Содержит примеры конфигурационных файлов и список наиболее полезных команд

Состояние перевода: На этой странице представлен перевод статьи Vim. Дата последней синхронизации: 29 июня 2018. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Vim — консольный текстовый редактор, являющийся расширенной версией vi с дополнительными функциями, которые включают в себя: подсветку синтаксиса, полноценную систему помощи, встроенную поддержку скриптов (vimscript), визуальный режим для простоты выделения и сравнение файлов (vimdiff).

Установка

Установите один из следующих пакетов:

  • vim — с поддержкой Python 2/3, Lua, Ruby и Perl, но без поддержки GTK/X.
  • gvim — идентичен vim, но c поддержкой GTK/X.

Примечание:

  • Пакет vim собран без поддержки Xorg; отсутствует компонент +clipboard, поэтому Vim не сможет оперировать с основным и обменным буфером. Пакет gvim предоставляет доступ также и к Vim с интерфейсом командной строки, но с поддержкой +clipboard
  • Неофициальный репозиторий herecura предоставляет несколько версий Vim/gVim: vim-cli, vim-gvim-common, vim-gvim-gtk, vim-gvim-qt, vim-rt and vim-tiny.

Использование

Также вы можете запустить vimtutor (для версии с интерфейсом командной строки) или gvimtutor (для версии с графическим интерфейсом) для отображения руководства по использованию Vim.

Vim включает в себя широкую справочную систему, доступ к которой можно получить посредством :h субъект. Субъекты включают в себя команды, опции, горячие клавиши, плагины и так далее. Используйте команду :h (без какого-либо субъекта), чтобы полчуить информацию о вспомогательной системе и о том, как перемещаться между субъектами.

Настройка

Файл конфигурации Vim для конкретного пользователя расположен в домашней директории — ~/.vimrc, файлы текущего пользователя в ~/.vim/. Общий файл конфигурации — ~/.vimrc, а общие файлы находятся в /usr/share/vim/.

Примечание: Более ли менее стандартное поведение — например, подсветка синтаксиса — определяется в defaults.vim, который загружается, когда отсутствует ~/.vimrc. Добавьте let skip_defaults_vim=1 в /etc/vimrc для полного отключения загрузки defaults.vim. [1]

Буфер обмена

Такие команды Vim как :yank или :paste работают с безымянным регистром, который по умолчанию соответствует регистру "*. Если доступна +clipboard, то регистр "* отображается в PRIMARY буфер в X.

Чтобы изменить стандартный регистр на "+, используйте :set clipboard=unnamedplus. Регистр "+ соответствует CLIPBOARD буферу в X.

Для более подробной информации смотрите :help 'clipboard'.

Совет: Для копирования и вставки могут быть созданы горячие клавиши. Смотрите, например, [2] для ctrl+c, ctrl+v и ctrl+x.

Подсветка синтаксиса

Чтобы включить подсветку синтаксиса для многих языков программирования:

:filetype plugin on
:syntax on

Отступы

Отступы для определенного типа файла:

:типфайла indent on

Визуальный перенос

Опция wrap (включена по умолчанию) указывает Vim переносить длинные строки, которые не помещаются на экран, так, что оставшаяся часть строки отображается на следующей линии. Опция wrap влияет только на отображение текста, сам текст при этом не изменяется.

Изначально перенос строки происходит ровно в том месте, где размещается последний ее символ, поместившийся на экране, даже если он находится в середине слова. Для более умного переноса используйте опцию linebreak. Когда эта опция включена командой set linebreak, перенос строки происходит только после символов, которые перечислены в опции breakat, которая по умолчанию содержит в себе пробел и некоторые знаки препинания (смотрите :help breakat).

Остаток строки обычно начинается с начала следующей линии, без всякого отступа. Опция breakindent сообщает Vim, что необходимо отображать перенесенный остаток строки с отступом, так, что на всех последующих линиях перенесенные части строки имеют тот же отступ, что и начало этой строки. Поведение breakindent может быть настроено при помощи опции breakindentopt. Например, для файлов исходного кода на языке Python может быть полезно добавлять дополнительный отступ в 4 пробела для перенесенных частей длинной строки (подробнее смотрите в :help breakindentopt):

autocmd FileType python set breakindentopt=shift:4

Использование мыши

Vim позволяет пользоваться мышью, но только в тех терминалах, которые это поддерживают:

  • xterm/urxvt
  • Консоль linux с gpm (смотрите подробнее на странице Console mouse support)
  • PuTTY

Чтобы включить поддержку мыши, добавьте в ~/.vimrc:

set mouse=a

Опция mouse=a устанавливается в defaults.vim

Примечание: Копирование/вставка будут использовать регистр "*, если есть доступ к X серверу; смотрите раздел #Буфер обмена. xterm по-прежнему может обрабатывать нажатия мыши, когда зажат shift.

Переход на новую строку с помощью клавиш со стрелками

По умолчанию, при нажатии в начале строки или в конце, курсор не переводится на следующую/предыдущую строку.

Это можно исправить с помощью добавления строки set whichwrap=b,s,<,>,[,] в ваш файл ~/.vimrc.

Объединение файлов

Vim включает в себя diff-редактор (программа, которая отображает различия между двумя файлами и позволяет удобно их объединять). Используйте vimdiff для этого — просто укажите ей пару файлов: vimdiff файл1 файл2. Ниже приведен список команд vimdiff.

Действие Горячая клавиша
следующие изменение ]c
предыдущее изменение [c
diff obtain do
diff put dp
развернуть блок zo
свернуть блок zc
перечитать файлы :diffupdate
переключить окна Ctrl+w+w

Советы и рекомендации

Нумерация строк

Чтобы включить отображение номера столбца, используйте :set number. По умолчанию показываются абсолютные значения номеров строк, относительные включаются посредством :set relativenumber.

Переход к новой строке осуществляется посредством :line number или line numbergg. Все переходы запоминаются в лист переходов, для более подробной информации смотрите :h jump-motions.

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

Проверку орфографии в Vim можно включить с помощью:

set spell

По умолчанию установлен только английский словарь. Другие словари можно найти в официальных репозиториях по запросу vim-spell. Еще больше словарей можно найти в FTP-архиве Vim. Словари необходимо поместить в каталог для словарей — ~/.vim/spell/. Включить словарь можно командой :setlocal spell spelllang=ru_yo (заменив ru_yo на имя нужного словаря).

Действие Команда
следующая ошибка ]s
предыдущая ошибка [s
предложения для исправления z=
добавить правильное написание zg
добавить правильное написание (на сеанс) zG
добавить неправильное написание zw
добавить неправильное написание (на сеанс) zW
повторить проверку орфографии во всем файле :spellr

Совет:

  • Чтобы включить проверку сразу для двух языков (например, английского и русского), добавьте set spelllang=en,ru в ~/.vimrc или /etc/vimrc и перезапустите Vim.
  • Вы можете включить проверку орфографии для конкретных типов файлов (например .txt), используя плагин FileType и собственное правило для определения типа файла. Чтобы включить проверку орфографии для всех файлов, оканчивающихся на .txt, создайте файл /usr/share/vim/vimfiles/ftdetect/plaintext.vim и вставьте туда строку: autocmd BufRead,BufNewFile *.txt setfiletype plaintext. Далее, вставьте строку autocmd FileType plaintext setlocal spell spelllang=ru в файл ~/.vimrc или /etc/vimrc и перезапустите Vim. Или поместите строку autocmd BufRead,BufNewFile *.txt setlocal spell в ~/.vimrc или /etc/vimrc и перезапустите Vim. Не забудьте отредактировать строчку (specifically *.txt), чтобы включить соответствующие типы файлов для проверки орфографии.
  • Чтобы включить проверку орфографии только для документов LaTeX (или TeX), добавьте autocmd FileType tex setlocal spell spelllang=ru в файл ~/.vimrc или /etc/vimrc и перезапустите Vim.

Сохранение позиции курсора

Если вы хотите, чтобы курсор возвращался в прежнее положение после открытия файла, добавьте следующее в ~/.vimrc:

augroup resCur
  autocmd!
  autocmd BufReadPost * call setpos(".", getpos("'""))
augroup END

Запуск Vim по команде vi

Создайте псевдоним для vi на vim.

Если вы хотите, чтобы при вводе sudo vi запускался vim, то установите пакет vi-vim-symlinkAUR, который удалит vi и заменить его символической ссылкой на vim.

Возврат каретки DOS/Windows

Если вы видите последовательность ^M в конце каждой линии, это означает, что вы редактируете текстовый файл, который был создан в MS-DOS или Windows. Дело в том, что в Linux для переноса принято использовать один символ новой строки (LR), тогда как в системах Windows/MS DOS для той же цели используется последовательность из двух символов: возврата каретки (CR) и новой строки (LR). Как раз эти символы возврата каретки и отображаются в виде ^M.

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

:%s/^M//g

Обратите внимание, что ^ здесь — управляющий символ, а не обычный. Чтобы ввести управляющую последовательность ^M, нажмите Ctrl+v,Ctrl+m.

Также вы можете просто установить пакет dos2unix и исправлять файлы командой dos2unix файл.

Примечание: Другой простой способ заключается в изменении опции fileformat. Используйте set ff=unix для преобразования файлов с окончанием строки DOS/Windows в файлы с окончанием строки Unix. Для того, чтобы сделать обратное, просто используйте set ff=dos.

Пустое пространство в нижней части окон gVim

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

Решение заключается в регулировании количества места, которое будет резервировать в нижней части окна gVim. Поместите следующую строку в ~/.vimrc:

set guiheadroom=0

Примечание: Установив значение 0, вы не сможете видеть горизонтальную полосу прокрутки внизу окна.

Плагины

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

Совет: For a list of popular plugins, see Vim Awesome)

Установка

Используя встроенную систему управления пакетами

В Vim 8 добавлена возможность загрузки сторонних плагинов. Чтобы использовать эту функциональность, переместите плагины в ~/.vim/pack/foo.

Используя менеджер плагинов

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

  • Vundle — в настоящее время наиболее популярный менеджер плагинов Vim.
  • Vim-plug — минималистичный менеджер плагинов для Vim, который имеет много особенностей, например, загрузка плагинов по запросу и параллельное обновление.
  • pathogen.vim — простой плагин для управления переменной runtimepath.
  • Dein.vim — менеджер плагинов, заменяющий NeoBundle, доступен как vim-dein-gitAUR.

Из репозиториев Arch

Группа vim-plugins объединяет множество разнообразных плагинов. Используйте команду pacman -Sg vim-plugins для отображения списка пакетов, которые вы можете затем установить, используя pacman.

cscope

Cscope является инструментом для навигации по программному проекту. Путем перехода к слову/символу/функции и вызову cscope (обычно с помощью горячих клавиш) можно найти: функции, которые вызывают данную, определение функции и многое другое.

Установите пакет cscope.

Скопируйте стандартный файл cscope, который Vim будет автоматически читать:

mkdir -p ~/.vim/plugin
wget -P ~/.vim/plugin https://cscope.sourceforge.net/cscope_maps.vim

Примечание: Вам наверное понадобится откомментировать следующие строки в ~/.vim/plugin/cscope_maps.vim, чтобы включить горячие клавиши cscope в Vim 7.x:

set timeoutlen=4000
set ttimeout

Создайте файл, который содержит список файлов для индексации (cscope может обрабатывать множество языков, но для примера мы возьмем файлы на Си/Си++ с расширениями .c, .cpp и .h):

cd /путь/к/каталогу/проекта
find . -type f -print | grep -E '.(c(pp)?|h)$' > cscope.files

Создание файлы базы данных, которые cscope будет читать:

cscope -bq

Примечание: cscope ищет файл cscope.out в рабочем каталоге, поэтому тот же каталог следует использовать и для навигации по проекту в Vim. Также, вы можете указать путь до этого файла явно, установив его в переменной окружения $CSCOPE_DB.

Горячие клавиши по умолчанию:

 Ctrl- и
      c: найти функции вызывающие эту функцию
      d: найти функции вызываемые этой функцией
      e: найти egrep паттерн
      f: найти этот файл
      g: найти это определение
      i: найти файлы, включающие этот файл (#include)
      s: найти этот символ Си
      t: найти присвоения

Не стесняйтесь изменять горячие клавиши:

#Maps ctrl-c to find functions calling the function
nnoremap <C-c> :cs find c <C-R>=expand("<cword>")<CR><CR>

Taglist

Taglist отображает структуру файлов исходного кода и позволяет эффективно просматривать исходники на различных языках программирования.

Установите пакет vim-taglistAUR.

Полезные опции можно записать в ~/.vimrc:

let Tlist_Compact_Format = 1
let Tlist_GainFocus_On_ToggleOpen = 1
let Tlist_Close_On_Select = 1
nnoremap <C-l> :TlistToggle<CR>

Смотрите также

Официальные ресурсы

  • Домашняя страница
  • Документация
  • Vim Wiki
  • Vim Scripts

Руководства

  • vim Tutorial and Primer
  • vi Tutorial and Reference Guide
  • Graphical vi-Vim Cheat Sheet and Tutorial
  • Vim Introduction and Tutorial[устаревшая ссылка 2020-08-06 ⓘ]
  • Open Vim — Коллекция средств обучения Vim.
  • Learn Vim Progressively
  • Learning Vim in 2014
  • Seven habits of effective text editing
  • Basic Vim Tips

Видео

  • Vimcasts — Скринкаст в формате .ogg.
  • Vim Tutorial Videos — От основ к продвинутым темам.

Игры

  • Vim Adventures
  • VimGolf

Конфигурация

  • nion
  • Детальная конфигурация от Amir Salihefendic[устаревшая ссылка 2020-08-06 ⓘ]
  • Bart Trojanowski
  • Steve Francia’s Vim Distribution
  • Vim Awesome — Vim Plugins
  • Конфигурация Vim W4RH4W
  • Fast vimrc/colorscheme from askapache
  • Базовый vimrc
  • Usevim

Цвета

  • Vivify
  • Vim colorscheme customization

Опытные пользователи Linux часто используют терминал, потому что так можно намного быстрее выполнить необходимые действия. Во время настройки системы нам довольно часто приходится редактировать различные файлы. Это могут быть настройки программ, какие-нибудь данные или обычные текстовые файлы.

В операционной системе Linux есть несколько текстовых редакторов, которые работают в терминале. Чаще всего новички используют редактор nano, но если вы заметили на нашем сайте во всех статьях используется текстовый редактор vi. Nano неудобный, и недостаточно функционален. Я сознательно не пишу в своих статьях о nano. Есть намного лучший текстовый редактор, это редактор vi. Здесь поддерживается быстрое перемещение по тексту, удобное редактирование, команды для изменения настроек работы, выполнение команд терминала из редактора, а также плагины для расширения функциональности. Но он немного сложный для новичков и очень непривычный.

В этой статье мы рассмотрим как пользоваться vim, рассмотрим основы работы с этим редактором, а также его основные команды.

Я рекомендую использовать редактор Vim практически во всех статьях на этом сайте, где надо что-то отредактировать. Но у многих пользователей возникают проблемы при использовании этого редактора. Эта статья написана чтобы помочь их решить. Но если вам быстро надо отредактировать файл и вы не хотите читать всё, в этом разделе я сделал небольшую инструкцию как внести изменения и выйти. Для того чтобы открыть файл выполните:

vim имя_файла

Затем нажмите i, для того чтобы перейти в режим редактирования. Здесь вы можете редактировать файл так же, как и в nano. После того как завершите нажмите Esc, чтобы перейти в командный режим и наберите :wq. Записать и выйти. Все, готово.

Минимальные основы

На данный момент существует две версии редактора — vi и vim. Vim расшифровывается как Vi Improved, улучшенный vi. Это новая версия, которая принесла очень много улучшений. В большинстве современных дистрибутивов используется именно она. Поэтому если я буду писать vi, это значит, что я предполагаю использование vim.

Текстовый редактор Vim может работать в двух режимах. Это и есть его главная особенность. Первый режим, который используется по умолчанию при открытии редактора — это командный. В этом режиме вы можете вводить команды vi, а также использовать символьные клавиши для управления редактором. Второй режим — обычное редактирование текста, он работает так же как и редактирование текста в nano. Для переключения в командный режим используется клавиша Esc. Для переключения в режим редактирования — клавиша i. Если вас интересует только как в редакторе vi сохранить и выйти, листайте вниз, но если вы хотите узнать как пользоваться текстовым редактором vim, эта статья для вас.

Перед тем как идти дальше я бы посоветовал вам пройти курс обучения встроенный в редакторе. Выполнение всех обучающих заданий займет 25-30 минут. Это поможет вам закрепить всё знания полученные из этой статьи на практике. Дело в том, что команд и сочетаний клавиш у vim очень много и запомнить их все без практики невозможно. Для запуска обучения наберите:

vimtutor

Но делать это сейчас необязательно, в этой статье есть вся необходимая базовая информация и после ее прочтения вы уже сможете уверенно пользоваться vim, а обучение пройти чуть позже.

Как использовать редактор Vim

Начнем мы, как обычно с запуска программы, а также опций, которые ей можно передать. Синтаксис Vim очень прост:

$ vim опции имя_файла

Или:

$ vi опции имя_файла

Если в вашей системе установлен пакет vim, то команда vi будет ссылаться на исполняемый файл vim. В таком случае между этими командами нет разницы. Простой запуск vim без указания имени файла приведет к созданию пустого файла. А теперь давайте рассмотрим основные опции запуска:

  • +номер — переместить курсор к указной строке после запуска.
  • +/шаблон — выполнить поиск по шаблону и переместить курсор к первому вхождению
  • «+команда» — выполнить команду после запуска программы
  • -b — двоичный режим, для редактирования исполняемых файлов.
  • -d — режим поиска различий в файлах, нужно указать несколько файлов для открытия.
  • -g — графический режим.
  • -n — не использовать автосохранение для восстановления файла при сбое.
  • -R — режим только для чтения.
  • -w — сохранить все действия в файл.
  • -x — шифровать файл при записи.
  • -C — режим совместимости с Vi.

Круто, правда? Но это только начало. Опции ничего по сравнению с командами редактора.

1. Перемещение курсора

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

Для перемещения используются такие команды:

  • h — на один символ влево;
  • l — на один символ вправо;
  • j — на одну строку вниз;
  • k — на одну строку вверх;
  • w — на слово вправо;
  • b — на слово влево;
  • H — перейти в низ экрана;
  • G — перейти в конец файла;
  • gg — перейти в начало файла;
  • <номер>G — перейти к конкретной строке;
  • . — перейти к последнему редактированию.

Можете запустить редактор и поэкспериментировать, чтобы было легче понять как это работает. Начните с h, l, j, k — многие пользователи используют их для перемещения по тексту не только в Vim, потому что это позволяет не открывать руки от клавиатуры. Если перед тем как нажать кнопку буквы нажать цифру, то эта команда будет повторена несколько раз. Например, 3j переведет курсор на три строки вверх.

Очень часто возникает необходимость перейти в начало строки или в её конец. Команды Vim могут с этим помочь. Используйте команду ^ для того чтобы перейти в начало строки или команду $ для перехода в конец строки. Обратите внимание, что для того чтобы набрать эти команды нужно зажать Shift и нажать 4 или 6.

2. Режим редактирования

Для переключения в режим редактирования используются такие команды:

  • i — вставить текст с позиции курсора, символ под курсором будет заменен;
  • I — вставить текст в начало строки;
  • a — добавить текст начиная от позиции курсора;
  • o — вставить новую строку после этой и начать редактирование;
  • O — вставить новую строку перед этой и начать редактирование;

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

3. Удаление символов и строк

Вы можете править текст не только в обычном режиме, но и в командном с помощью команд. Иногда это даже удобнее чем в режиме редактирования. Например, вы можете удалять символы. Для этого применяются такие команды:

  • d — удалить символ;
  • dd — удалить всю строку;
  • D — удалить символы начиная от курсора и до конца строки.

Эти команды редактора vim работают немного по-другому после нажатия одной из них ничего не произойдет. Мы еще можем задать сколько раз нужно повторить команду, но также нужно указать количество символов количество символов, к которым она будет применена и направление, с помощью кнопок перемещения курсора. Это делается после нажатия команды. Например, для того чтобы удалить один символ справа наберите dl. Чтобы удалить два символа справа от курсора нажмите d3l, а чтобы удалить три строки вниз — d3j.

4. Замена символов

В командном режиме вы можете не только удалять символы, но и заменять их на другие. Для этого существуют две команды:

  • r — заменить текущий символ;
  • R — заменить несколько символов.

Первая команда позволяет заменить один символ и вернутся в командный режим. Вторая команда будет заменять все символы, пока вы не вернетесь в командный режим нажатием клавиши Esc:

5. Отмена и повтор действий

В обычных текстовых редакторах вы можете использовать Ctrl+Z для отмены последних действий. В редакторе Vim есть собственная история действий. Она доступна в командном режиме. Если вы хотите отменить последнее изменение, просто нажмите u. Обратите внимание, что каждое следующее нажатие этой кнопки будет отменять предыдущее изменение сделанное в командном режиме. Например, если вы удалили один символ командой d, то он будет восстановлен.

Однако, если вы переключитесь в режим редактирования и сделаете там много изменений, а потом вернетесь в командный режим, то все эти изменения будут рассматриваться как одно. Если вы случайно отменили что-то важное, то можете повторить действие, нажав Ctrl+r:

Вот некоторые команды для отмены и повтора действий:

  • u — отменить последнее действие;
  • U — отменить последнее действие в текущей строке;
  • . — повторить последнее действие;
  • Ctrl+r — отменить отмену последнего действия.

6. Командная строка Vim

Командная строка Vim запускается в командном режиме нажатием двоеточия — «:«. Здесь доступны команды для сохранения файла и выхода из редактора, настройки внешнего вида и взаимодействия с внешней оболочкой. Рассмотрим наиболее часто используемые команды редактора vim:

  • :w — сохранить файл;
  • :q — закрыть редактор;
  • :q! — закрыть редактор без сохранения;
  • :e файл — прочитать содержимое файла в позицию курсора;
  • :r файл — вставить в содержимое файла в следующую строку;
  • :r! — выполнить команду оболочки и вставить ответ в редактор;
  • :set переменная=значение — установить значение переменной, например, tabstop=4, или set number, с помощью этой команды можно управлять многими аспектами работы vim.
  • :buffers — посмотреть открытые файлы;
  • :reg — посмотреть содержимое буферов обмена.

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

7. Выделение и буфер обмена

Текстовый редактор Vim поддерживает выделение текста без использования мышки. Поэтому вы можете копировать и вставлять текст даже в TTY окружениях, без графического интерфейса. Нажмите v когда вы находитесь в командном режиме для перехода в режим выделения. Затем вы можете использовать кнопки перемещения курсора h, j, k, l для выделения нужных символов или строк:

Теперь вы можете выполнять какие-либо действия с выделенным текстом. Например, можно его удалить, нажав кнопку d. Для того чтобы сбросить выделение нажмите кнопку Esc. Это ещё не всё. У Vim есть свой буфер обмена, который можно использовать для копирования и вставки текста. Этот буфер обмена состоит из нескольких регистров. Если не задать иное, то все команды работают с буфером обмена по умолчанию. Вот основные команды для копирования и вставки текста:

  • y — скопировать в буфер обмена;
  • yy or Y — скопировать строку в буфер обмена;
  • x — вырезать в буфер обмена;
  • p — вставить из буфера обмена.

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

Если вы хотите скопировать данные в системный буфер обмена, сначала необходимо убедится что Vim, установленный в вашей системе это поддерживает. Для этого выполните команду:

vim --version | grep clip

Если эта возможность поддерживается вы увидите +clipboard или +xterm_clipboard. Давайте вернемся к регистрам. В Vim есть несколько регистров буфера обмена и один из них связан с системным буфером обмена. Это регистр «+. Вы можете вывести все регистры и их содержимое с помощью команды:

:reg

Регистр с именем «» это тот самый буфер обмена, который используется по умолчанию. Если вы хотите скопировать текст в системный регистр, необходимо набрать имя регистра перед командой копирования. Например, нажмите «+ а затем y. Обратите внимание, что нужно использовать клавишу Shift для получения нужного символа. Надо нажать Shift+’ и Shift+=.

Как видите, это довольно сложно, особенно если вы не привыкли использовать эти клавиши. Есть более простой способ. Вы можете скопировать текст в регистр по умолчанию, а затем скопировать его оттуда в системный буфер обмена с помощью командной строки Vim. Для этого скопируйте текст как обычно, а затем используйте такую команду:

:let @+=@"

После этого вы сможете вставить текст в любом месте операционной системы.

8. Поиск и замена в Vim

Довольно часто нам нужно найти определенную последовательность в тексте. Текстовый редактор Vim умеет это делать. Во-первых, если нужно найти символ в строке, нажмите f и наберите нужный символ, курсор будет перемещен к его позиции.

Для поиска по всему файлу используйте команду /. После нее нужно ввести слово, которое нужно найти. Для поиска следующего вхождения используйте n, для предыдущего — N.

Вот основные команды для поиска:

  • f — найти один символ;
  • / — искать несколько символов;
  • n — найти следующее вхождение;
  • N — найти предыдущее вхождение.

Для замены будет использоваться немного другая конструкция:

:%s/искать/заменить/g

Например, давайте заменим все вхождения слова Alice на Robert:

:%s/Alice/Robert/g

Двоеточие запускает командную оболочку с командой s для замены. Символ % означает что обрабатывать нужно весь файл, а g значит, что нужно обработать все найденные строки, а не только первую. Чтобы программа спрашивала перед каждой заменой можно добавить в конец строки опцию c.

9. Редактирование нескольких файлов

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

vim /etc/default/grub /etc/default/cron

Редактор vim linux откроет первый файл, для переключения ко второму используйте команду :n, чтобы вернутся назад :N. С помощью команды :buffers вы можете посмотреть все открытые файлы, а командой :buffer 1 переключится на первый файл.

10. Кириллица в Vim

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

Но переключать каждый раз раскладку, когда работаете в командном режиме тоже не очень удобно, поэтому открываем файл ~/.vimrc и добавляем туда такие строки:

set keymap=russian-jcukenwin
set iminsert=0
set imsearch=0

Теперь раскладка клавиатуры в командном режиме переключается по Ctrl+^ и все команды работают.

Выводы

В этой статье мы рассмотрели как пользоваться текстовым редактором vim. Это еще далеко не все его возможности, но теперь вы можете уверенно обращаться с редактором и забыть о nano. Более подробно о настройке Vim читайте тут. А вы уже пользуетесь Vim? Или другим редактором? Напишите в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Понравилась статья? Поделить с друзьями:
  • Casio 3298 a168 инструкция на русском часы
  • Видео инструкция по сборке кровати сакура с ящиками видео
  • Выпрямитель зарядный луч ссср 6 12 v инструкция
  • Roborock s5 max инструкция на русском скачать бесплатно
  • Стиральная машина ardo tl800ex инструкция на русском языке