Главная » Другое » Редактор Vim
текстовой редактор vim

Редактор Vim

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

Текстовый редактор Vim

По началу Вим оставляет весьма странные ощущения, ведь вы попросту не можете понять, как вообще работает этот редактор. То он вообще не реагирует на нажатия клавиш, то делает какие-то странные вещи. Например, вы пытаетесь написать door, а в результате получаете or да еще и в новой строке. Удалив это вы вновь пытаетесь ввести новое слово, но теперь редактор ведет себя адекватно и вы видите введенное вами слово, а потом снова какие-то непонятки.

Спустя несколько попыток разобраться, как это работает, и бесчисленное количество матерных слов ты идешь в интернет и узнаешь, что Vim — двухрежимный редактор. Писать текст здесь можно только в режиме ввода (INSERT), для перехода в который следует нажать кнопку i или Insert.

Основной же режим, для выхода в который используется Esc, здесь предназначен для ввода, как тебе на первый взгляд кажется, хоткеев. Причем состоять они могут всего из одной клавиши: w — передвигает курсор к следующему слову, 0 — в начало строки, $ — в конец строки, A переводит курсор в конец строки и переключает редактор в режим ввода, u — аналог Ctrl-Z в нормальных редакторах.

Погуглив еще немного, ты обнаруживаешь, что есть также «хоткеи» из двух и более последовательных нажатий. Такие, как, например, dd, который удаляет всю строку и dw, удаляющий слово, gg и GG, которые перемещают курсор в начало и конец документа.

Немного привыкнув, ты уже можешь кое-как прыгать между режимами и вводить эти странные хоткеи — они даже начинают казаться тебе удобными, но один вопрос все-таки тебя не покидает:

Зачем здесь эти режимы?!

«Хоткеи» Vim действительно удобны благодаря своей лаконичности, но разве необходимость переключения между режимами не убивает все их удобство? Разве не проще нажимать пусть и требующие больше движений горячие клавиши в нормальных редакторах, чем мотаться взад-вперед между режимами? Да, может быть сорок лет назад, когда на клавиатурах не было Ctrl и Alt, это и было оправдано, но сейчас-то зачем?

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

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

Vim
23 мая 2017 года вопрос «Как выйти из Vim набрал один миллион просмотров на StackOverflow»

Философия текстового редактора Vim

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

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

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

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

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

}d(

Нажатие этих трех кнопок сделает то же самое. Я очень удивлюсь, если на это у вас уйдет больше пары секунд времени.

Что они значат? Давайте разберемся:

  • } — команда перемещения, перебрасывает курсор в конец абзаца;
  • d — команда изменения, а именно удаления (d — delete);
  • ( — команда перемещения, перебрасывает курсор в начало предыдущего предложения.

Так как команды перемещения могут быть аргументами команд изменения, вся команда на человеческом языке звучит так: } — переместить курсор в конец абзаца, а затем d( — удалить все символы до начала предыдущего предложения. А если совсем просто: удалить последнее предложение текущего абзаца.

Команды можно повторять, например: 3} — переместить курсор на три абзаца вперед, }d2( — удалить два последних предложения в абзаце, 3J — объединить следующие три строки в абзац (J — Join), 3w — перейти на три слова вперед (w — word), 50G — перейти к пятидесятой строке (G — Go).

Vim
У vim хорошая документация, просто набери :help и следуй инструкциям

Другой пример: вы опять же просматриваете готовый текст и замечаете слово Windows, которое лучше заменить на Linux. Решение в лоб — поставить курсор перед ним, нажать клавишу Del нужное количество раз, затем написать другое. Решение в затылок — переместить курсор на слово, нажать извращенную трехпальцевую комбинацию замены слова и написать другое. Правильное решение:

/WincwLinux

  • /Win — команда перемещения с помощью поиска (в данном случае ищем Win);
  • cw — команда замены (c — change) с аргументом «слово» (w — word);
  • Linux — новое слово.

Чтобы просто удалить слово можно использовать такую команду: /Windw (dw — delete word). Обратите внимание: в отличие от «поиска и замены» вам не обязательно писать слово целиком. Более то, вы можете сделать то же самое другими методами. Например, если слово Windows второе в третьем предложении заменить его можно так: {3)wcwLinux.

Теперь о том, как редактировать код. Представьте, что вы пишете или просматриваете свой код и замечаете, что метод текущего класса, вызов которого находится под курсором, используются только здесь и поэтому его лучше сделать приватным. То есть вам надо перейти к декларации метода и вставить перед ним слово-модификатор private.

Чайник в этой ситуации будет действовать прямолинейно: промотает код, найдет в нем нужный метод, тыкнет мышкой, вставит private перед именем метода, а потом промотает обратно. Более продвинутый разработчик использует хоткей для быстрого перехода к декларации метода, он может даже использовать другой хоткей, чтобы быстро сделать метод приватным, а самый продвинутый пользователей еще и воспользуется хоткеем для возврата назад.

Пользователь Vim сделает так:

gdiprivate

  • gd — переходим к определению функции или метода (gd — go definition);
  • i — переключаемся в режим ввода;
  • private — слово-модификатор и пробел;
  • Esc — возвращаемся в обычный режим;
  • — прыгаем туда, где были до перехода (возвращаем курсор обратно).

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

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

Кстати, обратите внимание на команду . Это команда (переход к метке) с аргументом (метка, которую редактор автоматически устанавливает перед любым перемещением курсора). Вместо можно использовать ., которая перебрасывает курсор к последнему отредактированному месту. Метки можно ставить и самостоятельно с помощью команды m, за которой следует буква. Например, ma — поставит метку «a», вернуться к которой можно с помощью a или ‘a (для перехода к началу строки).

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

К слову, команды удаления Vim не удаляют текст безвозвратно, а помещают его в буфер (в терминологии Vim — регистр), поэтому стандартными средствами здесь можно делать вещи, для которых в других редакторах потребовался бы отдельный хоткей. Например, менять две строки местами: ddp. Команда dd удаляет текущую строку (после чего курсор перемещается на следующую), p (paste) — вставляет текст из регистра под текущей строкой.

Вместо удаления строку можно просто скопировать с помощью yy (y — yank), а затем вставить с помощью все той же команды p. Объединим эту возможность с повторением команд и получим быстрый способ вставки множества одинаковых строк: yy10p.

Нарисовать линию ———- можно так: вводим символ -, затем переключаемся в обычный режим с помощью Esc и вводим команду x10p (x — вырезает символ под курсором, 10p вставляет его десять раз).

Команда . выполнит предыдущую команду. И да, ее тоже можно зациклить: 3. — повторить предыдущую команду три раза. Команда qa начнет запись макроса и именем «a», оставить запись можно нажатием q. Выполнить макрос: @a.

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

Командный и визуальный режимы Vim

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

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

Одна из самых известных команд данного режима — :s. Она предназначена для поиска и замены слов. С ее помощью второй пример из предыдущего раздела можно было бы решить так:

:s/Windows/Linux/

Такая команда заменит первое встреченное в текущей строке слово Windows на Linux. Чтобы заменить все слова Windows на Linux в текущей строке можно использовать модификатор g:

:s/Windows/Linux/g

А вместо искомого слова использовать регулярное выражение:

:s/Windows/Linux/

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

:%s/Windows/Linux/g

А можно натравить ее только на нужный диапазон строк:

:1,10s/Windows/Linux/g

Или на текст между двумя метками:

:1,10s/Windows/Linux/g

Удобнее всего использовать командный режим сочетании с визуальным. Последний представляет собой режим выделения, которого не было в редакторе Vi. Работает он так: вы переходите на строку, с которой хотите начать выделение текста, затем нажимаешь v (или Shift+V для построчного выбора) и выделяете текст с помощью любых стандартных команд перемещения (например, } чтобы выделить текущий абзац). Затем вы можете либо выполнить команду редактирования (например, d, чтобы удалить выделенный текст), либо перейти в командный режим и выполнить над ним более сложную операцию.

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

Вторая из наиболее часто используемых команд — :g. Это встроенный grep, с помощью которого можно искать строки и выполнять над ними действия. Например, следующая команда удалит все строки, содержащие Windows во всем файле:

:%g/Windows/d

А такая команда удалит все пустые строки (содержащие только пробелы):

:g/^s*$/d

Следующая команда удалит пустые строки (не содержащие ни одного символа) в HTML-таблице:

:/

/,/

/g/^$/d

Строки можно перемещать, например, чтобы переместить все строки, содержащие «Windows», в конец файла, набирай:

:g/Windows/m$

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

С ее помощью удобно вставлять в текст содержимое других файлов или вывод команд Unix. Например, так можно вставить в текст содержимое файла todo.txt:

:r todo.txt

Команда :r поддерживает автодополнение, поэтому вбивать полный путь не придется.

Если добавить к r восклицательный знак — она вставит в текст вывод указанной команды:

:r! uname -a

Когда ты пишешь статью в «Хакер» с кучей цитат из вывода команд, такая функция становится просто незаменимой.

Vim позволяет не только читать вывод команд Unix, но и отправлять текст им на вход. Например, следующая команда отсортирует строки с 1 по 10 с помощью sort:

:1,10!sort

Отсортировать весь файл:

:%!sort

Прогнать файл через форматтер fmt:

:%!fmt

Конечно же, все это работает в том числе в визуальном режиме.

Как перейти на Vim с Sublime Text или Atom

Когда переходишь на Vim после долгого использования Sublime Text или Atom, ощущаешь себя неуютно. Не бойтесь! Захламить Vim ненужными панельками и плагинами проще простого. Вот краткий гайд по допиливанию Vim до состояния более-менее современного редактора кода.

Vim
Так может выглядеть Vim после установки плагинов и тем

Прежде чем колхозить свой Vim, посмотрите на готовые популярные дистрибутивы: spf13 и Janus. Они содержат необходимый базовый набор настроек и плагинов. Но вообще, это — не тру. Стоит как минимум однажды собрать собственный конфиг, а потом уже играться с third-party дистрибами.

Шаг 0. Выбор правильной версии vim

В основе Вим — код сорокалетней давности. Естественно, некоторые вещи не оптимизированы под современное железо и графические подсистемы. В результате вы можете столкнуться с глюками, тормозами при скролле и задержками во время переключения режимов. На YouTube полно видео с демками страдальцев.

Присмотрись к более современным форкам Vim, например neovim или, если вы пользуетесь macOS, macVim.

Шаг 1. Выбор эмулятора терминала с GPU-ускорением

Часто тормоза и глюки Vim связаны с терминалом, в котором вы его запускаете. Если у вас macOS, не мучайтесь с системным, ставьте сразу или macVim или запускайте в iTerm2.

Еще лучше попробовать Alacritty. Это быстрый, написанный на Rust, кроссплатформенный терминал, который эффективно работает с GPU. Он позволяет рендерить графику гораздо быстрее, чем любой из существующих аналогов. Из непривычностей — все настройки хранятся в текстовых файлах, да и управление окном придется допиливать самому. Например, в macOS не работает CMD+H, так что окно шотактом из коробки не спрятать.

Редактор Vim
Alacritty — эмулятор терминала с поддержкой GPU

Шаг 3. Базовые настройки в ~/.vimrc

Vim очень просто конфигурировать. Настройки Вим хранит в файле .vimrc, а необходимые файлы — плагины, локали, словари, цветовые схемы — в папке .vim/. Файл .vimrc выполняется при запуске редактора. У каждого любителя Vim свой конфиг. Поделюсь своим. Открывайте (или создавайте) .vimrc и пишите в него по порядку.

Для начала установим удобный шрифт и размер кегля. Я использую шрифт Monaco, вы, естественно, ставьте свой любимый. Многие пользователи Linux предпочитают Terminus или Roboto.

set guifont=Monaco:h15

Удалим задержку при переключении режимов редактора:

set timeoutlen=1000 ttimeoutlen=0

Добавим поддержку ремапа русских символов на латинские. Это позволит вам не переключать раскладку в режиме редактирования (например, нажать вв вместо dd). Добавляем такие строки в конфиг:

set keymap=russian-jcukenwin
set iminsert=0
set imsearch=0
highlight lCursor guifg=NONE guibg=Cyan

А затем скачиваем файл с русской раскладкой (для macOS, например, это будет russian-jcukenmac.vim) и кладем его в каталог ~/.vim/keymap.

Отменим перенос строк. Это не обязательно, но лично я не люблю переносы в коде.

set nowrap

Установим настройки сворачивания блоков кода:

set foldmethod=indent
set foldnestmax=10
set nofoldenable
set foldlevel=1

Поставим тему. Предлагаю для начала попробовать одну из самых популярных цветовых схем в мире — Solarized. Проект vim-colors-solarized предоставляет тему Solarized в нужном для Vim формате.

Склонируйте этот репозиторий, перейди в него и скопируй файл solarized.vim в папку ~/.vim/colors/ (надо создать, если ее нет):

cd vim-colors-solarized/colors
mv solarized.vim ~/.vim/colors/

А теперь включим ее в .vimrc:

colorscheme solarized
" выбираем темный вариант solarized. Как ты понял, есть еще светлый
set background=dark
" укажем явно количество цветов
let g:solarized_termcolors = 256

Иногда Vim некорректно распознает типы файлов и включает левый синтаксис. Например, если вы кодите на Rails, наверняка пробовали шаблонизатор Slim. Vim из коробки не может корректно подсвечивать синтаксис таких шаблонов. К счастью, Slim грамматически совместим с форматом Haml, так что давайте заставим его подсвечивать .slim в грамматике Haml:

au BufRead,BufNewFile *.slim setfiletype haml

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

С базовыми настройками все. Теперь плагины.

Шаг 4. Установка пакетного менеджера

Для Vim, как и для Sublime или Atom, есть несколько пакетных менеджеров. Я предпочитаю Vundle как один из самых удобных и простых в настройке.

Клонируйте vundle:

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

Добавьте в .vimrc такие строки:

set nocompatible " be iMproved, required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
"
" сюда будем вписывать плагины, которые хотим установить
"
call vundle#end() " required
filetype plugin indent on " required

Обратите внимание на комментарий. В этом место файла мы будем вписывать ссылки на плагины, которые нужно установить. Формат такой:

Plugin 'tpope/vim-fugitive'
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
Plugin 'git://git.wincent.com/command-t.git'
...

Вписываете плагин, сохраняете .vimrc, а затем выполняете команду в терминале:

vim +BundleInstall! +BundleClean +q

Vundle обнаружит новый плагин и поставит его.

Редактор Vim
Ставим плагины через Vundle

Ссылки на плагины можно вписывать в разном формате, смотри документацию. В случае плагинов с гитхаба формат будет таким:

Plugin '/'

Шаг 5. Устанока и настройка плагинов

Полный список своих плагинов перечислять не буду: вы сами с легкостью найдете все нужное вам запросами типа vim ract jsx syntax. Вместо этого приведу общие, которые будут полезны для переходящего с Sublime или Atom.

nerdtree

Это боковая панель с файловой структурой проекта. Аналог Sidebar в Sublime или Atom. Все привычно — выбираете файл, открываете его нажатием на Enter в нужном буфере. Можно установить каталог, от которого плясать.

Редактор Vim
Незаменимая вещь, если ты привык к сайдбару в Sublime

Из полезных трюков, предлагаю замапить открытые и скрытие этой панельки по ctrl+e:

nmap :NERDTreeToggle

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

let NERDTreeShowHidden=1

Включать NERDTree для всех табов:

nmap :NERDTreeTabsToggle

ctrlp

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

Редактор Vim
ctrlp ищет файлы в проекте по введенной комбинации символов

Нажимаем ctrp+p, вводим acu и плагин находит файл <A>pplication/<C>ontrollers/<U>sers.rb.

indentLine

Плагин рисует линии отступа в коде, помогая отслеживать вложенность. Раньше я использовал vim-indent-guides, но его глюки меня порядком достали. Плагин indentLine работает вроде бы получше.

vim текстовый редактор
Линии отступа. Что тут еще сказать

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

let g:indentLine_char = '│'

Дефолтный «крокодил» уж больно отвлекает внимание.

vim-startify

Плагин добавляет удобный стартовый экран для твоего Vim. На нем можете выбрать последние открытые файлы, перейти к проекту (в терминологии Vim — session).

vim текстовый редактор
vim-startify поможет быстро перейти к рабочему файлу или сессии

Из полезностей нелишним будет добавить следующие строки:

autocmd VimEnter *
if !argc()
| Startify
| NERDTree
| wincmd w
| endif

Это заставят vim-startify нормально работать вместе с NERDTree.

vim-easy-align

Отличный плагин для быстрого выравнивания блоков кода по символам. Другими словами, чтобы из

let abc='foo'
let abcdef='bar'
let abcdefghi='baz'

быстро сделать

let abc = 'foo'
let abcdef = 'bar'
let abcdefghi = 'baz'

В наличии регулярки, безумный синтаксис и целая страница с примерами команд выравнивания кода для разных языков. Обрати внимание на строки из start guide:

xmap ga (EasyAlign)
nmap ga (EasyAlign)

Первая запускает EasyAlign в интерактивном режиме по ga (например, vipga), вторая — то же самое для блока (gaip).

goyo и удобное написание текстов

Хороший помощник для тех, кто много пишет. Плагин убирает все лишние панели, индикаторы и центрирует текст, позволяя сфокусироваться на создании контента. По сути, это реализация distraction-free mode, вокруг которой даже делали отдельные текстовые редакторы вроде ommwriter.

Я забиндил переключение в этот режим по ctrl+g в .vimrc. По дороге отключается все, что не нужно, и включаются нужные опции:

map :NERDTreeTabsToggle:set wrap nolinebreak:Goyo:set background=light

vim как пользоваться
GoYo отключает ненужные элементы, позволяя сконцентрироваться на контенте

Вообще, для файлов в формате Markdown у меня автоматически включаются такие настройки:

" включаем светлый фон
autocmd FileType markdown :set background=light
" включаем перенос строк, для текста он нужен
autocmd FileType markdown :set wrap linebreak nolist
" включаем режим distraction-free, активируя Goyo
autocmd FileType markdown :Goyo
" включаем проверку орфографии
autocmd FileType markdown :set spell spelllang=ru_ru

vim-airline

Must-have панель со статусной информацией по текущему открытому файлу. Наверняка вы видели ее в большинстве скриншотов Вим в интернете — плагин очень популярен. Панель интерактивная, показывает текущий режим работы, раскладку, кодировку, позицию курсора в файле, строке и многое другое.

vim linux
vim-airline наглядно показывает текущий статус

Также советую глянуть проект-сателит vim-airline-themes. Это коллекция тем для vim-airline, которая позволет твоей статусной строке органично вписываться в основную цветовую схему редактора.

Выводы

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

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

использование vim
По статистике одной фирмы пользователей Vim берут на работу чаще, чем остальных

Нужно ли мне это?

Зависит от того, насколько часто вы работаете с текстовыми данными: пишите статьи, код, редактируете HTML. Vim может сделать эту работу намного более эффективной. При этом навыки пригодятся и при работе в других программах — плагины с режимом Вим есть почти для всех популярных сред разработки. Я, к примеру, использую плагин IdeaVim в Android Studio. Он позволяет получить мощь команд Vim, не отказываясь от богатых возможностей среды Idea.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *