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

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

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

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

### Руководства

- vim Tutorial and Primer
- vi Tutorial and Reference Guide
- Graphical vi-Vim Cheat Sheet and Tutorial
- Vim Introduction and Tutorial
- Open Vim - Коллекция средств обучения Vim.
- Learn Vim Progressively
- Learning Vim in 2014

#### Видео

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

#### Игры

- Vim Adventures
- VimGolf

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

- nion
- Детальная конфигурация от Amir Salihefendic
- Bart Trojanowski
- Дистрибьютор Vim Steve Francia
- Конфигурация Vim W4RH4W
- vimrc/colorscheme от askapache
- Базовый vimrc

### Другие

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

Categories:

- Development (Русский)
- Text editors (Русский)
- Русский