Vim (Русский)

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

Vim фокусируется на использовании клавиатуры; он не является простым текстовым редактором, как, например, nano или pico. Он требует много усилий для освоения и еще больше времени для привыкания.

Установка

Установите один из следующих пакетов, доступных в официальных репозиториях.

Пакеты с интерфейсом командной строки:

  • vim-minimal — облегченная версия.
  • vim — версия с поддержкой интерпретаторов Python 2, Lua и Ruby, но без графической оболочки.
  • vim-python3 — тоже самое что и vim, но уже с поддержкой интерпретатора Python 3.

Пакеты с графическим интерфейсом:

  • gvim — идентичен vim, но имеет интерфейс GTK+.
  • gvim-python3 — идентичен gvim, но имеет поддержку интерпретатора Python 3.
Обратите внимание: Пакет vim не имеет поддержки X, из - за этого вы не сможете ничего скопировать в системный буфер с помощью команды "+y, вы должны установить пакет gvim; Далее, запустите Vim с помощью команды vim, поддержка X будет включенна.
Обратите внимание: Неофициальный репозиторий herecura-stable также предоставляет несколько версий Vim/gVim: vim-cli, vim-gvim-common, vim-gvim-gtk, vim-gvim-qt, vim-rt и vim-tiny.

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

Здесь представлен поверхностный обзор использования Vim. Вы также можете запустить vimtutor/gvimtutor для отображения руководства по использованию Vim.

Vim имеет четыре различных режима:

  • Командный режим (Command mode): отображается приглашение для ввода команд.
  • Режим ввода (Insert mode): непосредственный ввод текста.
  • Визуальный режим (Visual mode): в этом режиме вы можете выделять, копировать и вставлять текст.
  • Режим Ex (Ex mode): режим ввода дополнительных команд из редактора Ex (например, сохранение файла, замена текста и т.д.).

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

Если вы запустите Vim с помощью:

$ vim файл.txt

то вы увидите пустой документ (при условии что файл.txt не существует; если он существует, вы увидите его содержимое). Вы будете не в состоянии редактировать файл — сейчас вы в Командном режиме. В этом режиме вы отдаете команды Vim с помощью клавиатуры.

Обратите внимание: Vim является классическим примером подхода Unix. Он имеет сложную систему обучения, но как только вы начнете с ним работать, вы увидите, что он является чрезвычайно мощным. Также, все команды чувствительны к регистру. Иногда команды в верхнем регистре более "сильные" (к примеру, s заменяет символ, в то время как S заменяет строку). Иногда это совершенно разные команды (j перемещает вниз, в то время как J объединяет две строки).

Вы пишете текст (он вставляется перед курсором) с помощью команды i. Та же команда в верхнем регистре (I) вставляет текст в начало строки. Для добавления текста после курсора, наберите a. Ввод A переместит курсор в конец текущей строки. Вы можете вернуться в командный режим в любое время, нажав клавишу Esc.

Перемещение

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

Чтобы переместиться вниз нажав j; вернуться обратно наверх вы можете нажатием k. Передвинуть курсор влево — h, вправо — l (L в нижнем регистре).

^ переместит курсор в начало строки, а $ переместит его в конец.

Обратите внимание: ^ и $ обычно используют в регулярных выражениях, и обозначают соответственно начало и конец строки. Регулярные выражения очень мощны и обычно используются в *nix системах. Множество клавиш для команд Vim выбраны не случайным образом — в основе выбора часто лежит какая-то идея.

w переместит курсор через слово. W сделает то же самое, но при этом включается несколько больше символов в то, что Vim считает словом (например, знак подчеркивания и минус). b и B работают аналогично, но перемещают курсор в обратном направлении. Наконец, чтобы переместиться в конец текущего слова, используйте e и E соответственно.

( переместит курсор в начало предложения. ) делает обратное, перемещая его в конец предложения. Для передвижения по абзацу используйте { и }.

H переместит курсор наверх экрана, M — в центр, L — вниз. gg переместит курсор в начало файла, G — в конец.

Повтор команд

Если перед командой стоит число, то эта команда будет выполняться столько раз, сколько ввел пользователь (есть исключения, но идея все та же — например, при использовании с командой s). Например, печатая 3i затем Help! , эта команда выведет 2}. Печатая 2} вы перенесетесь на два абзаца вперед. Это бывает очень удобно со следующими командами.

Удаление

Команда x удаляет символ под курсором. X удалит символ перед курсором. Это именно те команды, с которыми можно повеселиться. 6x удалит 6 символов. Нажав . (точка) вы повторите предыдущую команду. Итак, к примеру у вас есть слово foobar в нескольких местах, но потом вы ходите сделать из него слово foo. Поместите курсор под b и введите 3x. Теперь переместитесь к символу b следующего слова foobar и нажмите . (точка).

Команда d говорит Vim, что вы хотите что-то удалить. После ввода d надо указать Vim, что вы именно хотите удалить. Здесь вы можете использовать команды перемещения. dW удалит все до следующего слова. d^ удалит все до начала линии. Также, команды будут работать если перед ними будет число: 3dW удалит три слова. D (верхний регистр) это команда для удаления всего до конца линии (имеет тот же эффект, что и d$). dd удалит всю линию.

Для замены текущего слова, поместите курсор над ним и наберите команду cw. Это удалит слово и переведет редактор в режим ввода. Аналогично, s удаляет один символ под курсором и переведет редактор в режим ввода. S удалит строку целиком и переведет редактор в режим ввода. Чтобы просто заменить один символ, используйте r, R переведет вас в режим замены.

Отмена и повтор

Vim имеет встроенный буфер обмена. Вы можете отменять действия при помощи u, и возвращать их обратно с помощью Ctrl+r.

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

Нажав v, вы перейдете в визуальный режим. Здесь вы передвигаете курсор чтобы выделять текст, когда вы закончили, нажмите y чтобы скопировать текст в буфер, иначе используйте c чтобы вырезать его. p вставляет вырезанное после курсора, P — перед курсором. Введите V для режима визуальной строки, выделение по линиям. Введите Ctrl+v для визуального блока, выделение по блокам.

Обратите внимание: Когда вы удаляете что-либо, это сохраняется в буфер и доступно для вставки.

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

Для поиска буквы или слова в файле, просто нажмите /, введите символы, которые требуется найти и нажмите Enter. Чтобы искать введенную последовательность далее, нажимайте n; нажатием N вы вернетесь к предыдущему результату поиска.

Для поиска и замены используйте команду замены :s/. Синтаксис: [диапазон]s///[аргументы]. Например:

Команда         Результат
:s/xxx/yyy/     Замена xxx на yyy в первом вхождении
:s/xxx/yyy/g    Замена xxx на yyy в каждом вхождении на текущей строке
:s/xxx/yyy/gc   Замена xxx на yyy во всем файле с подтверждением каждой замены
:%s/xxx/yyy/g   Замена xxx на yyy во всем файле
:#,#s/xxx/yyy/g Замена xxx на yyy в диапазоне строк

Вы можете использовать глобальную команду :g/ для поиска по регулярному выражению, а затем выполнения какой-либо команды для каждого совпадения. Синтаксис: [диапазон]:g//[команда].

Команда  Результат
:g/^#/d  Удаление всех строк, которые начинаются с #
:g/^$/d  Удаление всех пустых строк

Сохранение и выход

Для сохранения и/или выхода, вам понадобится режим Ex. Команды режима Ex предваряются символом :. Чтобы записать файл, используйте :w, либо, если создаете новый файл, используйте w имя_файла. Выйти можно при помощи :q. Если вы не хотите сохранять изменения, используйте :q!. Для того чтобы сохранить изменения и выйти, используйте :x.

Дополнительные команды

  1. dd удалит текущую строку (используйте ddp для быстрой смены строки).
  2. cc удалит текущую строку и переведет вас в режим ввода.
  3. o создаст новую строку ниже текущей и переведет вас в режим замены, O создаст новую строку выше текущей и переведет вас в режим замены.
  4. yy скопирует всю строку в буфер.
  5. * подсветит текущее слово и n используется для его поиска.

Настройка

Пользовательский файл настроек Vim лежит в домашней директории: ~/.vimrc, а файлы Vim пользователя расположены внутри ~/.vim/. Глобальный файл настроек расположен в /etc/vimrc. Глобальные файлы Vim расположены внутри /usr/share/vim.

Глобальный файл настроек Vim в Arch Linux очень прост, но отличается от стандартного файла настроек в других дистрибутивах. Чтобы получить более-менее стандартное поведение (например, подсветку синтаксиса, возвращение курсора в последнюю запомненную позицию и т.д.), рассмотрим настройки, используя пример файла настроек Vim:

# mv /etc/vimrc /etc/vimrc.bak
# cp /usr/share/vim/vim74/vimrc_example.vim /etc/vimrc

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

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

:filetype plugin on
:syntax 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 с установленным gpm, смотрите подробнее на странице Console mouse support).

Чтобы включить эту особенность, добавьте линию в ~/.vimrc:

set mouse=a
Обратите внимание:
  • Это работает даже в PuTTY через SSH.
  • Копирование текста выделением мышью в PuTTY просто так работать не будет, потому что Vim входит в визуальный режим, когда используется мышь. Чтобы нормально выделять текст мышкой, удерживайте при этом Shift.

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

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

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

Пример ~/.vimrc

Смотрите Vim/.vimrc.

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

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

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

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

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

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

  1. :set number — обычная нумерация строк.
  2. :set relativenumber — относительная нумерация строк.
  3. :номер_строки — переход на строку по номеру.

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

Проверку орфографии в 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.
  • Чтобы включить проверку орфографии только для документов 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.

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

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

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

:%s/^M//g

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

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

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

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

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

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

Плагины

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

Установка

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

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

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

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

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

cscope

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

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

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

mkdir -p ~/.vim/plugin
wget -P ~/.vim/plugin http://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-taglist.

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

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

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

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

Руководства

Видео

Игры

Примеры конфигурации

Другие

  • HOWTO Vim - статья Gentoo Wiki на которой базировалась эта статья (автор не известен).
  • Vivify - Редактор Color.Scheme для Vim.
  • Usevim - Часто обновляемый блог о плагинах, хитростях и т.д.
  • Vim Awesome - Сайт, который сортирует плагины Vim по популярности среди пользователей GitHub.
  • Basic Vim Tips - Справочная таблица Vim, в первую очередь ориентированная на начинающих.
  • Vim colorscheme tailoring — переопределение установленной цветовой схемы на время или сделать ее постоянной.