Мануал 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. Дата последней синхронизации: 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

From

Jump to: navigation, search

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

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

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

Contents

  • 1 Начнем с примера
  • 2 Введение
  • 3 Vi
    • 3.1 Переключение режимов
    • 3.2 Открыть/создать файл
    • 3.3 Перемещение по файлу
    • 3.4 Редактирование файла
    • 3.5 Запись/выход
    • 3.6 Коэффициент повторения
    • 3.7 Дополнительные возможности
  • 4 Vim
    • 4.1 Главные отличия от vi
    • 4.2 Команды
    • 4.3 Слово под курсором
    • 4.4 Визуальный режим
    • 4.5 ~/.vimrc
      • 4.5.1 Для примера приводится выдержка из файла _vimrc автора:
      • 4.5.2 Можно добавить привычное поведение и привычные сочетания клавиш.
      • 4.5.3 Дополнительно
    • 4.6 Vim и русская раскладка клавиатуры
      • 4.6.1 Способ 1
      • 4.6.2 Способ 2
  • 5 Вставка форматированного текста с отступами
  • 6 Поиск в файлах с выводом в список
  • 7 Как открыть файл в нужной кодировке
    • 7.1 Автоматически
    • 7.2 Можно указать кодировку текста вручную
    • 7.3 Можно предварительно, перед открытием файла, указать ожидаемую кодировку
    • 7.4 Пользовательское меню
    • 7.5 Дополнительно
  • 8 Конвертация кодировки файла
    • 8.1 Пример: как сконвертировать файл из MS Windows cp1251 в Linux utf-8
    • 8.2 Пример: конвертировать файл из Linux utf-8 в MS Windows cp1251
  • 9 Vim при переводах текста, или для чтения английской документации
    • 9.1 Что возьмем
    • 9.2 Как настроим
    • 9.3 Рецепт для оч.умелых ручек
  • 10 Строка статуса редактора
  • 11 Проверка орфографии
    • 11.1 Пользовательское меню
    • 11.2 Как это работает?
  • 12 Ссылки

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

Типичная сессия работы с 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-[);
<CR> - ... Enter;
<SHIFT> - ... Shift
^x - ... Ctrl-x

Vi

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

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

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

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

Vi:

xp

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

  • «Обычный режим» — перемещение по файлу, стирание текста и другие редактирующие функции. Переход в него из любого другого режима:
<ESC>, иногда 2 раза;
<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
  • www.net4me.net — vim коротко от простого с сложному.
  • Vim. Первая установка
  • Все о редакторе VI (VIM, GVIM). Форум, документация.
  • Очередной HowTo по Vim — HowTo, описывающий основные проблемы, возникающие при работе в Vim. Содержит примеры конфигурационных файлов и список наиболее полезных команд.
  • «Всё о Vim» — блог, полностью посвящённый Vim

Template:Wp

Категория:Программное обеспечение

en:Vim pl:Vim pt: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. Содержит примеры конфигурационных файлов и список наиболее полезных команд
Йовица Илич
Апрель 2018 (7527)

перевод В.Айсин

Глава 1
Вместо предисловия

О чем эта книга

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

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

Что понадобится для чтения этой книги

У вас должна быть достаточно сильная мотивация и желание изучить Vim. Это необходимо. Но этого недостаточно. Мотивация не является фактором, который изменит вашу жизнь. Если кто-то дурак и становится мотивированным, он просто становится мотивированным дураком. Это не приведет к положительным изменениям.

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

Вы можете застрять в какой-то момент. Можете даже подумать о том, чтобы сдаться. Вы можете подумать, что Vim слишком сложен. Я скажу вам одну вещь: не желайте, чтобы Vim был легче, желайте, чтобы вы были лучше!

Для кого эта книга

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

Версии Vim

Все команды, сочетания клавиш и примеры в этой книге протестированы с использованием Vim 8. Вы можете использовать различные версии Vim во время обучения (например, gvim, macvim, neovim), но некоторые сочетания клавиш и команды могут вести себя не так, как представлено в книге.

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

Соглашения

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

Нажатия клавиш

Esc — указывает, что указанная клавиша (в данном случае клавиша Esc) должна быть нажата.

Ctrl-p — клавиши, разделенные дефисом (-) должны быть нажаты одновременно. В этом примере следует удерживать клавишу Ctrl, пока не будет нажата клавиша p.

Команды нормального режима

Это команды, которые вы вводите в нормальном режиме. Например, команда для удаления четырех слов — это команда: d4w. Названные символы следует вводить по порядку.

Команды командной строки

Вы узнаете больше о командах позже. Теперь просто обратите внимание на формат этих команд.

Пример команды командной строки (включить номера строк):

:set nu

Эта команда включает номера строк.

Все команды, начинающиеся с :, должны выполняться в нормальном режиме. Если вы находитесь в другом режиме, нажмите клавишу Esc, прежде чем вводить команду. В нормальном режиме вы можете запускать команды режима командной строки (Ex). Нормальный режим также известен как командный режим.

Шрифты

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

:read
:r

Шрифт фиксированной ширины используется для имен файлов, кода, имен переменных и команд.

Другое форматирование

Команды показаны в таком формате: :ju[mps]. Это означает, что вы можете выполнить эту команду двумя способами:

:jumps
:ju

Как видите, все, что находится между [ и ], является необязательным.

Очень часто я буду использовать жирный шрифт в словах, объясняющих команды. Например: команда для удаления (delete) — d.

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

Команды чувствительны к регистру. Если вы видите g в команде, это то, что вы вводите. Если вы видите букву G, это означает, что вы набираете заглавную букву G.

Если какие-то команды нужно ввести в системной командной строке, они будут показаны в блоке, подобном этому:

$ vim

Вот как вы запускаете Vim из командной строки. Символ $ используется для обозначения командной строки. После этого вы должны напечатать все, что идет после — в данном случае vim.

Пиратство

Пиратство защищенных авторским правом материалов в Интернете является постоянной проблемой. Я очень серьезно отношусь к защите своих авторских прав и лицензий. Если вы столкнетесь с незаконными копиями моих работ в любой форме в Интернете, пожалуйста, напишите мне по адресу contact@jovicailic.org со ссылкой на предполагаемый пиратский материал. (Йовица, прости! — Прим. пер.)

Я буду очень признателен за вашу помощь в защите моей работы и возможность предоставить вам более ценный контент.

Mastering Vim Quickly Newsletter

Я рекомендую вам подписаться на мою еженедельную рассылку Mastering Vim Quickly Newsletter, доступную на http://masteringvim.com.

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

Почему это имя

Когда я впервые увидел опытного пользователя Vim, работающего над своим кодом, у меня сложилось впечатление: «чё за хрень сейчас случилась». Он редактировал свой код так, как я никогда раньше не видел. Затем, когда я понял, как легко это сделать, я подумал: «Боже, я должен это попробовать!».

Вот как я придумал Mastering Vim Quickly: From WTF to OMG in no time (Быстрое освоение Vim: От WTF до OMG в кратчайшие сроки).

Вопросы

Если у вас возникнут проблемы с каким-либо аспектом этой книги, не стесняйтесь обращаться ко мне в любое время. Моя электронная почта: contact@jovicailic.org. Я сделаю все возможное, чтобы решить проблему.

Глава 2
Вступление

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

За эти годы я усвоил две неудобные истины, связанные с обучением. Во-первых: навыки требуют времени и усилий для освоения. И второе: многие вещи не приносят удовольствия, пока вы в них не разбираетесь.

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

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

Mastering Vim Quickly — это набор основных концепций Vim, которые вы можете использовать для достижения цели. Как только вы овладеете основами, вы с удивительной легкостью сможете выполнять даже самые сложные магические действия Vim. И вам это понравится!

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

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

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

Брэм Муленаар, создатель Vim, писал:

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

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

Искусство обучения

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

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

Принцип Парето

Итальянский экономист и социолог Вильфредо Парето (1848-1923) заметил, что 80% земли в Италии принадлежит 20% населения. Исследуя другие страны, он обнаружил такое же неравное распределение доходов и богатства в каждой из них.

Принцип Парето в основном гласит, что примерно 20% всех наших действий производят 80% наших результатов. Это означает, что 80% следствий исходят из 20% причин. Из-за этих цифр его также называют принципом 80/20.

Мы знаем, что это не обязательно должно быть 80/20. Также может быть 90/10 или 70/30. Это сейчас не важно. Что вы должны знать, так это то, что принцип 80/20 работает независимо от того, осознаете вы его действие или нет. Это верно для вашего бизнеса, личной жизни и всего, чему вы учитесь. В том числе для Vim.

Это означает, что примерно 80% того, что вы сегодня сделали, было практически бесполезным для вашей прибыли. Вы, вероятно, знаете, что есть вещи, которые вы должны делать, но которые вы просто не делаете по какой-либо причине. Может быть, у вас избыточный вес или вы не в форме, и вы знаете, что должны больше тренироваться. Но, вернемся к теме.

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

Мини-привычки

Чтобы изучить Vim, вам нужно посвятить ему себя.

Вспомните, когда вы в последний раз брали на себя обязательство чему-то научиться. Или изменить что-то в своей жизни. Было легко взять на себя обязательство, не так ли? Может быть, у вас даже был план! Затем перенеситесь на несколько недель вперед. Где эта приверженность? Ушла, да? Вы уже не так мотивированы. Ваша сила воли близка к нулю.

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

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

Самым большим препятствием для формирования новых привычек обычно является тот факт, что требуется дисциплина, чтобы продолжать делать то, что вам на самом деле не хочется делать. Я нашел обходной путь для этого. Это называется мини-привычка. Это меняет правила игры!

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

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

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

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

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

Обходной путь в моем примере выглядел так: я взял на себя обязательство писать всего 50 слов в день. Один абзац или один совет Vim. Это была моя ежедневная цель. Этого было очень легко добиться. Я не чувствовал сопротивления тому, чтобы написать всего 50 слов. Даже если у меня был плохой день, я все равно находил пару минут и писал эти 50 слов! Любой может это сделать. На самом деле, я понял, что написать эти 50 слов было проще, чем не написать их.

Почему? Потому что если вы берете на себя обязательство, и если, независимо от того, хорошо или плохо вы себя чувствуете, вы не можете заставить себя написать эти чертовы 50 слов, то, по сути, вы говорите себе, что вы большой неудачник. Ваша гордость не позволит вам потерпеть неудачу в чем-то столь смехотворно маленьком. Особенно, если это занимает менее двух минут.

Это изменило правила игры для меня.

Вы можете подумать: «Да, но вы ничего не добьетесь, если будете писать по 50 слов в день…» Ну, это совершенно неправильно. Как так? Можете попробовать. Сядьте, чтобы написать 50 слов. Или поверьте мне. Когда я начинал писать (с целью написать 50 слов), я обычно писал гораздо больше, чем 50 слов. Потому что, начав, было трудно остановиться.

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

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

1% улучшения в день

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

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

Когда 1% складывается каждый день, он удваивается каждые 72 дня. Если вы обязуетесь улучшать свои навыки Vim на 1% каждый день, через год ваши навыки станут в 38 раз лучше!

Как узнать, сколько составляет 1%? Что ж, когда речь идет о Vim, его трудно измерить. Я бы посоветовал вам решить, каким будет ваш 1%. Это может быть чтение одной страницы этой книги. Или изучение одной новой функции, команды или трюка Vim.

Другой способ — посвящать определенное время изучению Vim каждый день. Допустим, вы посвящаете 20 минут каждый день изучению Vim. За эти 20 минут вы улучшите свои навыки работы с Vim — иногда на 1%, иногда меньше или больше. Точность не так уж и важна. Здесь самое главное — постоянство. Продолжайте улучшать свои навыки каждый божий день.

Опыт не обязателен

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

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

Mastering Vim Quickly предназначена для всех, кто хочет изучить Vim, но, возможно, не знает, с чего начать, или пытался учиться, но не смог добиться прогресса, или напуган тем, насколько сложным кажется Vim. Эта книга даст вам фору, которой не было у меня. Где бы вы ни находились, если вы хотите изучить Vim, эта книга поможет вам учиться эффективнее. Начните изучать Vim сегодня и быстро добейтесь продуктивности!

Глава 3
Освоение Vim — Основы

Установка Vim 8

Если в вашей ОС еще не установлен Vim, сделайте это сейчас. Я предполагаю, что вы используете какой-то Linux. Однако, даже если вы используете Vim на операционных системах PC или Mac, все в порядке.

Чтобы установить Vim, вы должны выполнить следующую команду:

Gentoo: emerge vim

Ubuntu/Debian: apt-get install vim

CentOS/Fedora: yum install vim

MacOS: brew install vim

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

Философия Vim

Vim отличается от других текстовых редакторов. Хотя он кажется трудным для изучения, есть только две основные идеи, которые вам нужны, чтобы действительно понять Vim. Именно эти два фактора отличают Vim от других текстовых редакторов. Это модальное редактирование (modal editing) и операторы (operators).

Модальное редактирование

Цель Vim — дать вам возможность эффективно редактировать текст.

Когда вы пишете код, как вы проводите большую часть времени в редакторе? Скорее всего, вы не печатаете большую часть времени, а перемещаетесь по существующему коду и редактируете его тут и там.

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

Например, вы хотите перейти в конец файла? Просто нажмите G. Хотите перейти к началу файла? Нажми gg.

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

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

Вы можете сделать это, нажав i в нормальном режиме. Когда вы закончите вводить текст, нажмите Esc, и вы вернетесь в нормальный режим.

Помимо нормального и вставки, есть еще несколько важных режимов.

Операторы

Если вы привыкли перемещать курсор с помощью клавиш со стрелками, «page up», «page down», «home» и «end», вы будете очень удивлены тем, что может предложить Vim. Вы сможете перемещать курсор быстрее и точнее.

Например, вы хотите удалить текст с середины до конца строки? Поместите курсор в позицию, с которой вы хотите удалить, и нажмите d$. Здесь d означает удаление (delete), а $ означает конец строки.

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

В предыдущем примере d — это команда оператора. Команды оператора (или операторы) могут удалять, изменять или вставлять текст, копировать или форматировать его и т. д. Вскоре вы узнаете больше о командах.

Запуск Vim

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

  • +NUM — курсор будет установлен на строку номер «NUM» для первого открытого файла.

  • +/{pattern} — курсор будет помещен в первую строку, содержащую «pattern», в первом открытом вами файле.

  • +cmd или -c cmd — команда «cmd» будет выполнена после того, как будет прочитан первый файл. Это интерпретируется как команда Ex (команда в режиме командной строки — Прим. пер.). Вы скоро узнаете о командах Ex.

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

Например, чтобы открыть файл my_file.txt с курсором, расположенным в строке 33, вы должны запустить Vim следующим образом:

$ vim +33 my_file.txt

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

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:+lqGiMAmByST3y6wER8uv5INGlIagx2pOVIMdAPc6LSRKI.
Please contact your system administrator.
Add correct host key in /home/jole/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/jole/.ssh/known_hosts:466
ECDSA host key for secret.masteringvim.com has changed and you have requested strict checking.
Host key verification failed.

jole:~/ $ vim +466 .ssh/known_hosts

Эту проблему с SSH можно решить, удалив строку 466 из файла ~/.ssh/known_hosts. Решение, указанное выше, является хорошим способом сделать это. Однако самый быстрый способ сделать это — запустить в терминале следующую команду:

vim .ssh/known_hosts +"466d|x"

Глава 4
Ваша первая сессия Vim

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

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

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

Если вы никогда раньше не использовали Vim, вы, вероятно, немного запутались. Что такое режим? Я объясню это вам очень скоро. А пока просто попытайтесь понять, что Vim отличается от любого другого текстового редактора, который вы использовали. Концепция режимов очень проста: вы хотите вставить текст — сначала войдите в режим вставки. Вы закончили печатать? Выйдите из режима вставки.

Теперь всякий раз, когда вы хотите ввести команду, вам нужно ввести :. Так начинается каждая команда. Команда для сохранения файла и выхода из Vim: :wq <filename>. Буква w происходит от write, буква q происходит от quit. Итак, введите: wq test.txt и нажмите Enter. Вуаля, вы только что создали файл с именем test.txt.

Если вы хотите открыть только что созданный файл, просто введите в терминале: vim test.txt. Нажмите клавишу i и добавьте еще немного текста в ваш файл. Но на этот раз вы не хотите его сохранять. Чтобы закрыть файл без его сохранения и выйти из Vim, вам нужно вернуться в нормальный режим (нажмите Esc) и ввести :q!.

Очень просто. Конечно, есть еще несколько способов открывать и закрывать файлы в Vim, но этого достаточно для вашей первой сессии Vim.

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

Если вы используете https://github.com и git в командной строке, вам, вероятно, приходилось время от времени сжимать некоторые из ваших коммитов. Этот пример покажет вам, как быстро вы можете сделать это с Vim, даже если вы только начинаете.

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

Информация: вы сжимаете свои коммиты, вот их список:

pick e08be68 Add initial Rexfile
pick 5b4143f Fixes
pick 855be75 fix
pick d7a5285 Initial work
pick 59e82a2 add more stuff
pick 34cfc9c Fixes

Задача: изменить слово pick из строки 2 в последнюю строку (строка 6) на s.

Решение:

  1. Откройте Vim. Нажмите i, чтобы войти в режим вставки. Затем скопируйте текст сверху. Вставьте текст в Vim, используя шорткат для вставки в терминале.

  2. Теперь нажмите Esc, чтобы вернуться в нормальный режим. С помощью стрелок поместите курсор в начало второй строки.

  3. Нажмите Ctrl-v. Затем нажмите стрелку вправо три раза. Вы заметите, что вы только что выделили слово pick во второй строке.

  4. Теперь четыре раза нажмите стрелку вниз. Вы заметите, что выбрали все слова, начиная со второй и заканчивая последней строкой.

  5. Когда этот блок слов выделен, нажмите c. Это команда для изменения (changing) текста.

  6. Все выбранные вами слова будут удалены, а курсор переместится на вторую строку. Режим изменится на вставку. Теперь просто введите s. Это то, чем мы хотим заменить слово pick.

  7. Заключительный шаг — нажмите Esc. И вуаля! Вы сделали это!

Вот как должен выглядеть результат:

pick e08be68 Add initial Rexfile
s 5b4143f Fixes
s 855be75 fix
s d7a5285 Initial work
s 59e82a2 add more stuff
s 34cfc9c Fixes

Это может показаться сложным, но поверьте мне, это очень просто. Продолжайте читать, и вскоре вы поймете, что на самом деле произошло в этом примере.

Глава 5
Концепции Vim

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

Режимы

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

Вот наиболее важные из них:

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

Режим вставки. Как следует из названия, он предназначен для вставки нового текста. В этом режиме вы также можете запускать некоторые команды. В этом режиме по умолчанию внизу окна Vim отображается «— INSERT —» (или «— ВСТАВКА —»).

Режим командной строки. В этом режиме вы можете запускать команды (например, :set number), вводить шаблоны поиска (например, /word) и вводить команды фильтрации. После выполнения команды Vim возвращается в нормальный режим.

Визуальный режим. Для навигации и управления выделенным текстом. Он похож на нормальный режим, но команды перемещения расширяют выделенную область. Когда вы используете команду без перемещения, она выполняется для выделенной области. В этом режиме по умолчанию в нижней части окна отображается «— VISUAL BLOCK —» (или «— ВИЗУАЛЬНЫЙ БЛОК —»).

Нормальный подрежим режима вставки. Когда вы находитесь в режиме вставки и нажимаете Ctrl-o, вы входите в этот режим. Он похож на нормальный режим Vim, но после выполнения одной команды Vim возвращается в режим вставки. В этом режиме по умолчанию в нижней части окна отображается «— (insert) —» (или «— вставка —»).

Команды

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

Ex команды

Это любая команда, которую вы можете запустить как :{command}, например :help. Вы будете использовать их часто. Вы можете увидеть весь список этих команд (он очень длинный, не делайте этого сейчас), запустив :help ex-cmd-index.

Команды привязки клавиш

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

Команды редактирования

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

Глава 6
Работа с файлами

Открытие файлов

Вот два наиболее распространенных способа открытия файлов в Vim.

Способ 1 — открыть файл из терминала

Открыв терминал, введите vim, а затем имя файла. Например:

$ vim /etc/passwd

Способ 2 — открыть файл из Vim

Когда вы запускаете Vim, вводя vim в своем терминале, по умолчанию файлы загружаться не будут. Затем выполните команду: :e <filename>, чтобы открыть файл в существующей сессии Vim.

Например:

$ vim

:e /etc/passwd

Очень часто вы хотите получить содержимое какого-либо другого файла в ваш текущий открытый файл. Собственно, если быть точнее, то теперь вместо «текущий открытый файл» мы будем использовать термин «текущий буфер» (current buffer).

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

Конечно, вы можете открыть второй файл, скопировать нужный вам контент, вернуться к первому файлу и вставить его. Но есть лучший способ.

В Vim есть команда чтения:

:read
:r

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

Вот несколько примеров того, как вы можете его использовать:

Команда Описание
:r file.txt Вставить файл file.txt под курсором в текущий буфер.
:0r file.txt Вставить файл file.txt перед первой строкой.
:r!sed -n 2,8p file.txt Вставить строки со 2 по 8 из файла file.txt под курсором.
:r !ls Вставить список каталогов под курсором.

Конечно, все это должно быть запущено в нормальном режиме. Последняя команда будет работать только в Linux или macOS.

Связанный совет: с помощью команды gf вы можете открыть файл, имя (или путь) которого находится под курсором или после него. Запомните его как «goto file». Точно так же с помощью команды gx вы можете открывать ссылки в браузере по умолчанию.

Закрытие файлов

В Vim существует несколько способов закрыть файл. Вот некоторые из наиболее распространенных способов:

Команда Описание
:wq Сохранить текущий открытый файл и выйти из Vim (даже если файл не изменился).
:x Выйти из Vim, но сохранять только только если были внесены изменения.
ZZ Эквивалентно :x. Обратите внимание, что нет :. Это нажатие клавиши.
:q! Выйдите из Vim без сохранения открытого файла.
:qa Закрыть все открытые файлы в текущей сессии Vim.

Сохранение файлов

Есть несколько способов сохранить файл в Vim. Когда вы сохраняете файл, вы фактически записываете содержимое буфера на диск. Поэтому команда для сохранения — «запись» (write).

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

Команда Описание
:w Сохранить текущий открытый файл и выйти из Vim (даже если файл не изменился).
:w file.txt Сохранить текущий открытый файл как file.txt.
:w! file.txt Сохранить файл как file.txt с возможностью перезаписи.
:sav file.txt Сохранить текущий буфер как новый файл file.txt.
:up[date] file.txt Аналогично :w, но сохраняется только при изменении буфера.

Навигация

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

Основные перемещения

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

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

  • h — налево

  • j — вниз

  • k — вверх

  • l — направо

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

Посмотрите на свою клавиатуру и обратите внимание, что буква j выглядит как стрелка вниз с половиной острия. Итак, j переводит ваш курсор на одну позицию вниз. Эти клавиши расположены следующим образом (при условии, что вы используете раскладку клавиатуры qwerty): H J K L.

Крайняя правая клавиша — это l, и она приведет вас вправо. Крайняя левая клавиша — это h, и она приведет вас влево. Две клавиши остаются посередине, j и k.

Как мы уже говорили, мы можем легко идентифицировать клавишу j как стрелку, указывающую вниз. Осталась только клавиша k, которая должна вывести вас вверх — поскольку все остальные направления мы уже рассмотрели.

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

Мало-помалу вы, вероятно, очень быстро осознаете большое преимущество h j k l. Вам не придется убирать пальцы с основного ряда клавиш, что очень удобно и эффективно.

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

Навигация по словам

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

Клавиша Описание
w Перейти к началу следующего слова (word)
W Перейти к началу следующего СЛОВА (WORD)
e Перейти к концу (end) текущего слова (word)
E Перейти к концу (end) текущего СЛОВА (WORD)
b Перейти к предыдущему (before) слову (word)
B Перейти к предыдущему (before) слову (WORD)

СЛОВО (WORD) состоит из последовательности непустых символов. Оно всегда ограничено пробелом. С другой стороны, слово (word) ограничено символами, не являющимися ключевыми словами, которые можно настроить. Помните, что слово (word) заканчивается символом, не являющимся словом, например, ., - или ).

Например, в предложении:

Vim "navigation" is not-so difficult!

у нас есть 5 СЛОВ (WORDS): Vim "navigation" is not-so difficult!, все разделены пробелом. Однако у нас есть 10 слов (words).

Итак, если вы перемещаетесь по исходному коду и хотите останавливаться на разделителях и символах, таких как ( ) . { } , $, используйте w. Если вы работаете с текстом и хотите их пропустить, используйте W. Для получения дополнительной информации см. :help 03.1.

Примечание. Все эти команды для навигации могут принимать число в качестве префикса. Например, 3w перенесет вас в начало третьего следующего слова, а 6j перенесет вас на шесть строк ниже.

Прокрутка страниц

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

Сокращение Описание
Ctrl-d Прокрутить полстраницы вниз (down)
Ctrl-u Прокрутить полстраницы вверх (up)
Ctrl-f Прокрутить всю (full) страницу вниз (или вперед (forwards))
Ctrl-b Прокрутить всю страницу вверх (в начало (beginning) или назад (backwards))

Прыжки по файлу

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

Команда Описание
gg Перейти к началу файла
G Перейти к концу файла
{ Перейти к началу текущего абзаца
} Перейти к концу текущего абзаца
% Перейти к соответствующей паре символов (), [], {}
50% Перейти к строке на 50% файла
:NUM Перейти к строке NUM. :28 переходит на строку 28

Навигация внутри окна

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

Клавиша Описание
H Переместить курсор на первую (самую верхнюю (highest)) строку в текущем окне.
L Переместить курсор на самую нижнюю (lowest) строку в текущем окне.
M Переместить курсор в середину (middle) текущего окна.

Навигация в режиме вставки

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

Например, вы можете нажать Ctrl-o F m, чтобы перейти к предыдущему символу m и перейти в режим вставки.

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

Сокращение Описание
Shift-Стрелка вправо Перейти вправо, слово за словом
Shift-Стрелка влево Перейти влево, слово за словом

Связанный совет: находясь в режиме вставки, вы можете нажать Ctrl-o, чтобы вернуться в нормальный режим и выполнить одну команду, после чего вы автоматически вернетесь в режим вставки.

Базовый поиск

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

Все поисковые операции выполняются в нормальном режиме.

Вы можете выполнить поиск вперед, нажав / и затем введя шаблон поиска. Нажатие Esc отменит его, а нажатие Enter выполнит поиск. Как только вы нажмете Enter, вы можете нажимать n для поиска следующего вхождения вперед или N для поиска в обратном направлении.

Теперь давайте попробуем разобраться, какой будет команда для поиска первого совпадения:

  1. Первое совпадение обычно ставится «поверх» всех остальных.

  2. Мы уже упоминали, что команда для перехода к началу файла — это gg.

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

Итак, если вы выполняете поиск шаблона и хотите перейти к первому совпадению, вам нужно нажать ggn. Да, таким образом мы говорим Vim: «перейти к началу файла и найти следующее (фактически первое вхождение)».

И такая же логика для команды перехода к последнему совпадению вашего поиска. Как вы уже догадались, это GN.

Вы можете выполнить поиск назад, если нажмете ? а затем введете шаблон поиска. Нажатие n выполняет поиск в том же направлении (в данном случае назад), а N выполняет поиск в противоположном направлении (в данном случае вперед).

Поиск текущего слова

Vim может искать слова под вашим курсором. В нормальном режиме поместите курсор на любое слово.

Нажмите *, и Vim будет искать следующее вхождение этого слова вперед! Как это круто!

Нажмите #, и Vim начнет поиск слова под вашим курсором в обратном направлении.

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

Поэтому, если вам нужны не только точные совпадения со словом поиска, используйте соответственно команды g* и g#.

История поиска

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

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

  1. Нажмите /

  2. Затем нажмите Ctrl-r, а затем Ctrl-w.

Это скопирует текущее слово под курсором в командную строку, готовое к поиску. Теперь вы можете отредактировать его и нажать Enter.

Когда вы закончите поиск, вы можете нажать Ctrl-o, чтобы вернуться к предыдущей позиции (или Ctrl-i, чтобы перейти вперед).

Что делать, если вы снова ищете последний искомый шаблон? Нет необходимости вводить шаблон снова или когда-либо просматривать историю. Просто нажмите / и нажмите Enter — пустой шаблон поиска будет повторять последний поиск. Это также будет работать для команд :s и :g, о которых мы поговорим позже.

Vim также позволяет вам вводить число перед поиском. Например, что, если вы хотите перейти к пятому вхождению шаблона? Просто введите 5/pattern. Кроме того, ввод 6* приведет к поиску шестого вхождения текущего слова под курсором.

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

Файловый менеджер (netrw) в Vim

Vim поставляется со встроенным плагином netrw, который является отличным способом просмотра файлов и каталогов в сессии Vim. Этот файловый менеджер поддерживает четыре способа отображения файлов и каталогов.

Вы можете запустить netrw несколькими способами, например:

  • :Ex — открыть текущий каталог в текущем окне Vim (помните, что это сокращение от Explore).

  • :Ex <dir> — открыть указанный каталог <dir>.

  • :Sex — открыть текущий каталог в горизонтальном разделенном окне (забавный факт: Vim — единственный редактор в мире, который имеет команду Sex!).

  • :Vex — открыть текущий каталог в вертикально разделенном окне.

  • :Tex — открыть текущий каталог в новой вкладке.

  • :Lexplore — открыть текущий каталог в вертикальном разделении слева. По умолчанию файлы открываются в окне справа от окна сети.

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

:40vs +Ex

чтобы открыть текущий каталог в вертикальном разделенном окне шириной 40 столбцов.

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

Вы можете изменить представление списка каталогов, чтобы показать больше или меньше информации, изменить порядок сортировки или скрыть некоторые типы файлов. Как только вы запустите netrw, попробуйте нажать i, чтобы просмотреть типы представлений. Их четыре: узкое (только имена), длинное (с размером и временем), широкое (колонки) и дерево. Как только вы выберете свое любимое, установите его по умолчанию в вашем файле .vimrc, например:

let g:netrw_liststyle = 3

Изменение способа открытия файлов

С Vim вы можете открывать не только файлы, но и каталоги! Да, попробуйте открыть какой-нибудь каталог. Например, эта команда:

$ vim /home/jole

откроет мой домашний каталог. Я получу список всех файлов и список всех подкаталогов в каталоге, который я открыл.

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

  • <Enter> — открывает файл под курсором или входит в каталог под курсором

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

  • R — переименовывает файл под курсором.

  • X — запускает файл под курсором.

  • % — создает новый файл в текущем каталоге. Vim запросит у вас имя файла и откроет буфер.

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

Чтобы сделать выбор постоянным, добавьте в свой .vimrc следующее:

let g:netrw_browse_split = 4

Вариант 4 — тот, который я лично предпочитаю. Он открывает файлы в предыдущем окне (текущее разделение у вас есть рядом с сетевым разделением).

Установка ширины разделения netrw

То, как файловый менеджер будет располагать окно для нового файла, который вы открываете, можно установить с помощью опции netrw_browse_split. Если вы хотите установить ширину разделения netrw равной 20% от всего окна Vim, поместите это в свой .vimrc:

let g:netrw_winsize = 20

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

Одной из менее известных функций Vim является возможность удаленного редактирования файлов по сети. Эта функция поставляется с плагином netrw. Для этого netrw использует протокол SSH и управляет удаленными файлами с помощью команды scp.

Вот как это сделать:

vim scp://user@myserver[:port]//path/to/file.txt

Обратите внимание на двойной слэш // для каталога на удаленном хосте, который необходим для правильного разрешения абсолютного пути. [:port] является необязательным.

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

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

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

Конечно, для аутентификации рекомендуется использовать ключи SSH. В противном случае у вас могут слишком часто запрашивать пароль SSH.

Помимо SSH, поддерживаются и другие протоколы, такие как sftp, ftp, dav и т. д.

Например, чтобы открыть файл на удаленном FTP-сервере, вы можете запустить такую команду:

vim ftp://hostname/path/to/file

Netrw предлагает множество опций и возможностей для удаленного редактирования, поэтому для получения дополнительной информации об этом см. :help scp.

Глава 7
Персонализация Vim

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

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

Объяснение конфигурации Vim

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

Основной файл конфигурации — vimrc. Он существует в двух версиях — глобальной и персональной. Ваш личный файл vimrc обычно находится в вашем домашнем каталоге. В операционных системах Linux это обычно скрытый файл с именем .vimrc.

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

:echo $HOME

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

:set number

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

:set nonumber

Другой способ включить/отключить с учетом логических параметров — использовать восклицательный знак !. В этом случае мы могли бы включить номера строк (при условии, что они отключены) с помощью команды:

:set number!

Сделаем Vim красивым

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

Чтобы выбрать цветовую схему, откройте файл с исходным кодом. Затем введите: :colorscheme и нажмите Tab. Затем нажмите Enter. Вы увидите, как выглядит схема. Повторяйте ту же команду, просто нажимайте Tab несколько раз, пока не найдете понравившуюся цветовую схему. И когда найдете, добавьте ее в свой файл .vimrc:

colorscheme scheme_name

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

set cursorline

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

:highlight CursorLine guibg=lightblue ctermbg=lightgrey

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

set cursorcolumn

Конечно, очень важно добавить номера строк, поэтому добавьте: set nu[mber] в ваш файл .vimrc.

Если вы хотите включить проверку орфографии для английского языка по умолчанию, вы должны добавить это: set spell. Если вы хотите включить проверку орфографии для какого-либо другого языка, вы можете сделать это следующим образом (пример для немецкого языка): set spelllang=de. Если вы хотите проверить орфографию сразу для нескольких языков, не проблема: set spelllang=en,de,it. Конечно, если вы измените настройку spelllang на язык, который не установлен, Vim спросит вас, следует ли попытаться загрузить его.

Вы всегда можете проверить конфигурацию любого параметра Vim, добавив ? в конец своего имени. Например:

set spell?
nospell

Улучшения удобства использования

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

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

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

  • set backspace=indent,eol,start — разрешить работу Backspace по отступам, разрывам строк и началу строк в режиме вставки.

  • set history=1000 — установить большую историю выполненных команд.

  • set showcmd — показывать незавершенные команды внизу.

  • set showmode — показывать текущий режим внизу.

  • set autoread — автоматически перечитывать файлы, если они были изменены не внутри Vim.

  • set hidden — эффективное управление несколькими буферами: текущий буфер можно «отправить» в фоновый режим без записи на диск. Когда фоновый буфер снова становится текущим, метки и история отмены запоминаются. См. главу Буферы, чтобы лучше это понять.

Опции пользовательского интерфейса
  • set laststatus=2 — всегда отображать строку состояния.

  • set ruler — всегда показывать положение курсора.

  • set wildmenu — отображать полные параметры вкладки командной строки в виде меню.

  • set tabpagemax=40 — максимальное количество вкладок, которые можно открыть из командной строки.

  • colorscheme desert — изменить цветовую схему.

  • set cursorline — выделение строки, находящейся под курсором.

  • set number — показывать номера строк на боковой панели.

  • set relativenumber — показывать номер строки в текущей строке и относительные номера во всех остальных строках. Работает, только если опция выше (number) включена.

  • set noerrorbells — оключить звуковой сигнал при ошибках.

  • set visualbell — мерцание экрана вместо звукового сигнала при ошибках.

  • set mouse=a — включить мышь для прокрутки и изменения размера.

  • set background=dark — использовать цвета, подходящие для темного фона.

  • set title — установить заголовок окна, отражающий редактируемый в данный момент файл.

Параметры подкачки и резервного копирования файлов — отключите их все:
  • set noswapfile

  • set nobackup

  • set nowb

Параметры отступов:
  • set autoindent — новые строки наследуют отступы предыдущих строк.

  • filetype plugin indent on — умный автоматический отступ (вместо старой опции умного отступа).

  • set tabstop=4 — показать существующую табуляцию шириной 4 пробела.

  • set shiftwidth=2 — при отступе с помощью > использовать ширину в 2 пробела.

  • set expandtab — при нажатии табуляции вставить 4 пробела.

  • set nowrap — не переносить строки.

Параметры поиска:
  • set incsearch — найти следующее совпадение по мере ввода запроса.

  • set hlsearch — выделение поисковых запросов по умолчанию.

  • set ignorecase — игнорировать регистр при поиске …

  • set smartcase — … пока вы не ввели заглавную/прописную.

Параметры рендеринга текста
  • set encoding=utf-8 — использовать кодировку, поддерживающую Unicode.

  • set linebreak — перенос строк в удобных точках, избегать переноса строки в середине слова.

  • set scrolloff=3 — количество строк экрана, которые должны оставаться выше и ниже курсора.

  • set sidescrolloff=5 — количество колонок экрана слева и справа от курсора.

  • syntax enable — включить подсветку синтаксиса.

Разные параметры
  • set confirm — отображать диалоговое окно подтверждения при закрытии несохраненного файла.

  • set nomodeline — игнорировать строки режима файла; вместо этого используйте конфигурации vimrc.

  • set nrformats-=octal — интерпретировать восьмеричное число как десятичное при увеличении числа (числа, начинающиеся с нуля, не будут восприниматься как восьмеричные).

  • set shell — оболочка, используемая для выполнения команд.

  • set spell — включить проверку орфографии.

Строка состояния

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

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

Мы рассмотрим только основы, поэтому, если вы хотите изменить свою строку состояния, вы знаете, как это сделать.

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

" показать строку состояния
set laststatus=2

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

Если по какой-то причине вы хотите отключить ее, то вам нужно:

set laststatus=0

Строка состояния может быть установлена в вашем файле .vimrc следующим образом:

set statusline=%F%m%r%h%w%=(%{&ff}/%Y) (line %l/%L, col %c)

Это может быть немного сложно читать и понимать, если вы новичок. Другой способ настройки может быть примерно таким:

set statusline=%t       " конец имени файла
set statusline+=%{&ff}  " формат файла
set statusline+=%h      " флаг файла справки
set statusline+=%m      " флаг изменения
set statusline+=%r      " флаг только для чтения
set statusline+=%y      " тип файла
set statusline+=%c,     " столбец курсора
set statusline+=%l/%L   " строка курсора/общее количество строк
set statusline+= %P    " в процентах по файлу

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

Например, %m показывает [+], если текущий буфер изменен. Использование %L показывает общее количество строк в текущем файле.

Конечно, их много, и это выходит за рамки данной книги. См. :help statusline для получения дополнительной информации о настройке строки состояния.

Совет по теме: Используя команду g Ctrl-g, вы можете отобразить подробную информацию о количестве строк, слов, символов и т. д. в вашем текущем буфере.

Дилемма обмена и резервного копирования файлов

Обмен файлами

Рано или поздно вы заметите, что когда вы редактируете файлы, Vim создает файлы с именами вроде .filename.swp в том же месте, что и редактируемый вами файл. Эти файлы называются файлами подкачки.

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

Отключение файлов подкачки

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

Организация файлов подкачки

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

  1. Создайте каталог для хранения файлов подкачки, например:

    $ mkdir ~/.vim/swp
  2. Поместите этот фрагмент в свой .vimrc:

    set directory=$HOME/.vim/swp//

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

Резервные файлы

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

Конечно, эта функция может быть полезна. Бэкапы управляются настройками двух опций: backup и writebackup. Если интересно, поищите их в :help.

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

set backupdir=~/.vim/.backup//

Конкретный проект .vimrc

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

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

" включить vimrc для конкретного проекта
set exrc

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

Базовая рекомендуемая конфигурация

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

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

Но не торопитесь и не тратьте много времени на настройку конфигурации Vim прямо сейчас. Используйте эту конфигурацию ниже и продолжайте учиться.

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

set nocompatible        " Использовать настройки Vim, а не Vi
set softtabstop=2       " Отступ на 2 пробела при нажатии клавиши tab
set shiftwidth=4        " Отступ на 4 пробела при автоматическом отступе
set tabstop=4           " Показать существующую вкладку шириной в 4 пробела
syntax on               " Включить подсветку синтаксиса
filetype indent on      " Включить отступы для файлов
set autoindent          " Включить автоматический отступ
set number              " Включить номера строк
colorscheme desert      " Установить красивую цветовую схему
set nobackup            " Отключить резервные копии файлов
set laststatus=2        " Показать строку состояния
set statusline=%F%m%r%h%w%=(%{&ff}/%Y) (line %l/%L, col %c)
set wildmenu            " Отображение полных параметров вкладки командной строки в виде меню

Глава 8
Undo и Redo

Vim имеет очень мощную функцию отмены. Когда вы нажимаете u в нормальном режиме или запускаете :u в режиме командной строки, вы вызываете команду Undo. Чтобы отменить все последние изменения в текущей строке, нажмите U.

Когда вы нажмете Ctrl-r в нормальном режиме или запускаете :red[o], вы запустите команду повтора.

Если вы хотите отменить несколько раз, просто нажмите u нужное количество раз. Например, команда uuu отменит последние три изменения. Чтобы отменить несколько изменений, вы также можете использовать команду u с цифровым префиксом, например: 5u, которая отменит последние пять изменений.

Это еще не все — будет еще лучше. В Vim вы можете путешествовать во времени! Используя команду ea[rlier], вы можете вернуться назад во времени, а используя команду lat[er], вы можете путешествовать вперед. Эти две команды работают на основе состояния. Это означает, что если вы сделаете 4 изменения и запустите earlier 2, последние два изменения будут отменены. Точно так же, если вы запустите команду later 1, Vim повторит последнее изменение.

Лучшее в этих командах то, что вы можете отменять и повторять действия во временных рамках. Например, если вы внесли много изменений за последние 10 минут и поняли, что все они неверны, потребуется много действий по отмене. Вместо этого вы можете просто попросить Vim отменить все изменения, которые вы сделали за последние десять минут, выполнив команду earlier 10m. Аналогичным образом вы можете использовать более команду later.

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

Команда Описание
:earlier 2d Отменить изменения за последние два дня
:ea 3h Отменить изменения за последние три часа
:ea 1m Отменить изменения за последнюю минуту
:later 5m Повторить все изменения за последние 5 минут
:lat 15s Повторить все изменения за последние 15 секунд
:earlier 3f Отменить последние три состояния файла (последние три записи в буфер)

Отмена веток

У Vim есть еще одна мощная функция, когда речь идет об отмене операции. Давайте посмотрим пример:

  1. Откройте новый файл и напишите Hello. Нажмите Esc.

    Hello
  2. Нажмите o, чтобы перейти на новую строку в режиме вставки и написать world. Нажмите Esc.

    Hello
    world
  3. Теперь нажмите u. Это действие отмены удалит слово world.

    Hello
  4. Теперь, когда ваш курсор снова находится в первой строке, на слове Hello нажмите o, введите everyone и нажмите Esc.

    Hello
    everyone
  5. Если вы снова нажмете u, вы уничтожите everyone.

    Hello
  6. Если вы снова нажмете u, вы удалите Hello. Но вы больше никогда не получите слово world. По крайней мере, в большинстве традиционных редакторов.

Таким образом, независимо от того, сделали ли вы редактирование после отмены, вы сможете вернуться к world в предыдущем примере. У Vim есть решение для этого, и оно называется Undo branches (отмена ветвей). Я не буду вдаваться в подробности об этом, а просто расскажу, как использовать эту функцию.

В приведенном выше примере на шаге 4, после того, как вы завершите шаг 4 — и вы хотите снова вернуться к world — вам нужно запустить команду g-. Вуаля :)

По сути, Vim создает ветку отмены каждый раз, когда вы нажимаете u. Ветвь представляет состояние файла до того, как вы выполнили отмену. Таким образом, вы можете использовать команду g- для перемещения назад или команду g+ для перемещения вперед между этими ветвями.

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

Постоянная отмена

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

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

Как это работает? Это просто — Vim создает новые скрытые файлы, в которых хранится история отмен. Теперь настройка очень проста. Вы можете добавить только эту строку в свой .vimrc:

set undofile " Сохранять историю отмен между сессиями

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

Лучший способ — создать специальный каталог для этих файлов истории отмен, выполнив команду, например:

$ mkdir ~/.vim/undodir

Я предполагаю, что ~/.vim — это ваш основной каталог Vim. Теперь, когда вы создали каталог, вам нужно добавить еще одну строку в ваш файл .vimrc:

set undodir=~/.vim/undodir

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

Глава 9
Вы говорите на Vim’e?

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

Элементы языка Vim

Мы можем разделить элементы Vim на три разные группы языковых элементов: глаголы, модификаторы и существительные. Как только вы изучите их, вы практически сможете «говорить» со своим редактором.

Глаголы

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

Слабые глаголы — это название, которое я люблю использовать для глаголов, которые могут применяться только к одному символу. Вот почему они не очень сильны — так что вы поняли, откуда взялось это название.

Они здесь:

  • x — удалить символ под курсором справа

  • X — удалить символ под курсором слева

  • r — заменить символ под курсором другим символом

  • s — удалить символ под курсором и войти в режим вставки

Их полезно знать, и вы, вероятно, будете использовать их очень часто.

Сильные глаголы гораздо интереснее. Вот самые важные:

  • y — дернуть (yank) (скопировать)

  • c — изменить (change)

  • d — удалить (delete)

  • v — визуально (visually) выделить (не совсем глагол, но используется с глаголами)

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

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

Модификаторы

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

  • i — внутренний (внутри ((inside)))

  • а — а (вокруг (around))

  • NUM — число (например: 1, 2, 10)

  • t — ищет что-то и останавливается перед этим (искать до (search until))

  • f — ищет эту вещь и приземляется на нее (найти (find))

  • / — найти строку (буквальное или регулярное выражение)

Существительные

В английском языке существительные могут быть объектами, с которыми вы что-то делаете. То же самое и в Vim. Вот наиболее важные из них:

  • w,W — начало следующего слова (word) или СЛОВА (WORD)

  • b,B — начало предыдущего слова или СЛОВА (начало слова перед (before))

  • e,E — конец (end) слова или СЛОВА

  • s — предложение (sentence)

  • p — абзац (paragraph)

  • t — тэг (tag) (в контексте HTML/XML)

  • b — блок (block) (в контексте программирования)

  • h,j,k,l — влево, вниз, вверх, вправо

  • $ — конец строки

  • ^,0 — начало строки

Их можно расширить и дать вам еще больше возможностей:

  • aw — (полное) слово (a word)

  • as — (полное) предложение (a sentence)

  • ap — (полный) абзац (a paragraph)

  • iw — внутреннее слово (inner word)

  • is — внутреннее предложение (inner sentence)

  • ip — внутренний абзац (inner paragraph)

Научитесь разговаривать с Vim

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

  • Удалить текущее слово: dw (удалить слово (delete word) от позиции курсора до конца слова)

  • Изменить текущее предложение: cis (изменить внутри предложения (change inside sentence))

  • Изменить строку внутри кавычек: ci" (изменить внутри кавычек (change inside quote))

  • Изменить до следующего появления «hello»: c/hello (изменить поиск hello (change search hello))

  • Изменить всё отсюда на букву Y: ctY (измените до Y (change until Y))

  • Визуально выбрать этот абзац: vap (визуально вокруг абзаца (visual around paragraph))

Изменение внутренних кавычек

Например, если у вас есть строка:

print "Hello world!"

Поместить курсор на строку и запустить ci" говорит Vim’у: измени внутри кавычек. Вы получите:

print ""

с курсором, помещенным между "", в режиме вставки. Таким образом, вы можете легко менять содержимое между кавычками. Вы также можете вместо изменения удалить все внутри кавычек, запустив di".

Изменение внутренних тегов

Допустим, у вас открыт HTML-файл со строкой:

<h1>Welcome to my site</h1>

Вы хотите изменить содержимое этого тега. Вы можете сказать Vim: удали внутри тега (delete inside tag) или измени внутри тега (change inside tag). Например, вы хотите сказать Vim: измени все внутри тега.

Вы сделаете это, поместив курсор на определенную строку, упомянутую выше (на любой символ в строке). Затем в нормальном режиме запустите cit.

Результат будет выглядеть так:

<h1></h1>

с курсором, расположенным между тегами, в режиме вставки.

Если вы посмотрите на последние два примера, вы увидите закономерность — оба предложения имеют такую структуру: <глагол><модификатор><существительное>.

Другие примеры

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

  • Удалить (delete) строку: dd

  • Удалить (delete) до следующего слова (word): dw

  • Удалить (delete) все текущее слово (word): daw

  • Удалить (delete up until) до следующей запятой (,) в текущей строке: dt,

  • Удалить (delete) до конца (end) текущего слова: de

  • Удалить (delete) до конца (end) следующего слова (word): d2e

  • Удалить (delete) строку вниз (текущую и следующую): dj

  • Удалить (delete up until) до следующей закрывающей скобки: dt)

  • Удалять до тех пор, пока не будет найдено первое совпадение со словом «rails»: d/rails.

  • Перейти на 3 слова (words) от курсора вперед и удалить (delete) следующие 2 слова (words): 3wd2w

  • Удалить (delete) слово от курсора до начала слова, включая символ под курсором: dvb

Дополнительные команды см. в файле :help motion.txt.

Команда «точка»

Думаю, вы уже слышали о принципе «Не повторяйся» (Don’t Repeat Yourself). В программной инженерии это принцип разработки программного обеспечения, при котором основное внимание уделяется сокращению повторений любых видов. Как вы увидите на протяжении всей книги, в Vim есть много способов и команд для автоматизации различных видов задач, поэтому вам не нужно повторять свои действия.

Одной из самых мощных команд Vim, позволяющих избежать повторений, является команда . («точка»).

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

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

Если вы использовали dd для удаления строки и хотите удалить еще 4 строки, вы также можете выполнить 4. вместо нажатия ..... Это тоже работает.

Очень важно понимать, что на самом деле повторяется командой точки.

Например, если у вас есть такой пример кода:

my $i
my $learn
my $quickly

и ваш курсор находится на первой строке. Вы хотите добавить ; на все три строки.

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

A;<Esc>j
  • A — поместить курсор в конец первой строки в режиме вставки.

  • ; — ввести точку с запятой, а затем нажать Esc, чтобы вернуться в нормальный режим.

  • j — перейти на одну строку вниз.

Теперь ваш курсор находится на второй строке. Если вы затем нажмете . чтобы повторить изменение в следующей (второй) строке, это не сработает. Вот что вы получите:

my $i;
my $learn;
my $quickly

Ваш курсор по-прежнему будет находиться на второй строке, а не на третьей, но ; будет добавлена. Это приводит нас к выводу, что повторялась только эта часть нашей исходной команды: A;Esc.

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

Думайте с точки зрения грамматики вашего родного языка: не существительные, а глаголы используются для выражения какого-то действия. То же самое и в Vim: существительные (или движения) не могут влиять на текст, поэтому их нельзя повторить с помощью команды точки.

Конечно, если вы хотите повторить несколько изменений или комбинацию движений и изменений, вы можете легко записать их в макрос. Мы рассмотрим макросы позже. Чтобы увидеть все команды, которые могут повлиять на текст в буфере, см. :help change.txt

Глава 10
Замена

Диапазоны

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

Например:

  • :s/bad/good/g — меняет все слова с bad на good в текущей строке.

  • :6,11s/bad/good/g — применяет те же изменения, но в строках с 6 по 11, включая 6 и 11.

  • :%s/bad/good/g — применяет те же изменения во всем файле.

Давайте проанализируем эти примеры.

Как вы помните, команда s означает замену substitute. Поскольку мы выполняем поиск и замену (подстановку (substitution)), это объясняет s. Если мы удалим ту часть строки, которая одинакова во всех примерах /bad/good/g, а затем удалим s и удалим : (которую мы всегда используем для запуска команды), вот что останется:

  • '' — первый пример: ничего не осталось, поэтому диапазон не определен. Это означает, что применяется диапазон по умолчанию, которым обычно является текущая строка.

  • 6,11 — второй пример: совершенно очевидно, что именно так мы определили диапазон строк от 6 до 11.

  • % — третий пример: это специальный символ для определения всего файла.

Как определять диапазоны

Если диапазон строк не указан, команда замены substitute по умолчанию будет работать только с текущей строкой. Как уже упоминалось, для большинства команд диапазон по умолчанию равен . (текущая строка). Однако для команд :g (глобально (global)) и :w (запись (write)) по умолчанию используется % (все строки).

Диапазон Описание Пример
28 строка 28 :28s/bad/good/g
1 первая строка :1s/bad/good/g
$ последняя строка :$s/bad/good/g
% все строки в файле (аналогично 1,$) :%s/bad/good/g
6,28 строки с 6 по 28 включительно :6,28s/bad/good/g
11,$ строки с 11 до конца файла :11,$s/bad/good/g
.,$ с текущей строки до конца файла :.,$s/bad/good/g
.+1,$ со строки после текущей строки до конца файла :.+1,$s/bad/good/g
.,+4 с текущей до текущей +5 строк включительно :.,.+4s/bad/good/g
?a?,/b между образцами a и b включительно :?a?,/b/s/bad/good

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

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

Как мы уже видели из предыдущего примера, команду для подстановки текста в Vim можно определить так:

:[range] s[ubstitute]/pattern/string/[flags] [count]

Все, что заключено между [ и ] в этой команде, является необязательным.

Флаги замены могут быть:

  • c — подтверждать (confirm) каждую замену

  • g — заменить все вхождения в строке

  • i — игнорировать (ignore) регистр для шаблона

  • I — не игнорировать регистр для шаблона

Прежде чем мы углубимся в детали, давайте рассмотрим некоторые основы. Как только вы начнете поиск и получите первую совпадающую строку, чтобы перейти к следующему совпадению, нажмите n. Чтобы вернуться к предыдущему совпадению, нажмите N.

Замена во всем файле

Допустим, ваша задача — заменить все вхождения строки новой строкой во всем файле. Это очень распространенный вариант использования. Вот как это сделать:

%s/old_string/new_string/g
  • %s означает, что замена будет выполнена для всех строк.

  • g указывает, что действие будет выполняться для всех вхождений в строке.

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

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

Замена в одной строке

Чтобы добиться этого, вам нужно запустить:

:s/old/new/gi

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

Замена в пределах ряда строк

Вы можете выполнять подстановку в определенном диапазоне строк. В этом примере мы заменим old на new в строках с 15 по 30:

:15,30s/old/new/g

Замена внутри визуального выбора

Вы можете выполнять поиск и замену по вашему визуальному выбору. В нормальном режиме используйте v для визуального выбора строк, в которых вы хотите выполнить поиск и замену. Затем введите :, который автоматически изменится на :'<,'>. Теперь вы можете начать вводить остальную часть команды подстановки, например:

'<,'>s/helo/hello/g

Замена только целых слов

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

Например, вы хотите заменить слово is на was из следующего предложения:

This sentence is short.

Обычная команда замены:

:s/is/was/g

Просто, верно? Но посмотрите, что мы получим:

Thwas sentence was short.

Что-то не так, не так ли? Строка is в слове This также была заменена на was.

Чтобы искать и заменять только целые слова, вам нужно использовать < и >, чтобы указать, что должно совпадать только целое слово. Вот как будет выглядеть правильная команда:

:s/<is>/was/g

Теперь результат будет правильным:

This sentence was short.

Замена строки1 или строки2 новым словом

Используя регулярное выражение, мы заменим в этом предложении слова pretty и good на awesome:

That pretty girl did good on test.

Выполните следующую команду:

:s/(pretty|good)/awesome/g

и вы получите в результате:

That awesome girl did awesome on test.

В этой команде вы заметите один новый символ | что является «логическим ИЛИ». Таким образом, вы указываете Vim найти первое слово ИЛИ второе слово и заменить его. Но чтобы использовать символ |, вы должны добавить перед ним. Поэтому, когда вы хотите использовать логическое ИЛИ, вы всегда должны использовать | в замещающей команде. Если вам это интересно, см. :help magic.

Интерактивный поиск и замена

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

Давайте посмотрим пример:

:%s/bad/good/gc

replace with good (y/n/a/q/l/^E/^Y)?

Эта команда вам уже знакома. Она ищет строку bad и заменяет ее на good во всем файле.

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

Это означает, что для каждого совпадения вы должны ввести букву и сказать Vim, что вы хотите сделать. Вот варианты для выбора:

  • y — да (yes) — заменить текущее выделенное слово. После замены этого слова Vim выделит следующее слово, соответствующее шаблону поиска.

  • n — нет (no) — не заменять текущее выделенное слово. Однако будет выделено следующее слово, соответствующее шаблону поиска.

  • a — все (all) — заменить все оставшиеся совпадения, не спрашивая вас, что делать.

  • q — выйти (quit) — просто прекратить процесс замены.

  • l — последнее (last) — заменить только текущее выделенное слово и завершить процесс замены.

Здесь ^E на самом деле является Ctrl-e и позволяет вам прокручивать экран вверх. Точно так же ^Y или Ctrl-y позволяют вам прокручивать экран вниз. Однако эти команды могут быть недоступны, если ваш Vim не был скомпилирован с поддержкой insert_expand.

Совет по теме: чтобы узнать подробности о вашей версии Vim, вы можете запустить команду :version. Вы сможете увидеть различные детали, в том числе информацию о том, включена ли опция insert_expand. Если включена, то перед ней будет знак +.

Поиск по нескольким файлам

Вы можете легко выполнять поиск по нескольким файлам с помощью команды vimgrep. Эта команда будет искать строку warning во всех файлах markdown (заканчивающихся на .md) в текущем каталоге:

:vimgrep warning *.md

Эта команда перейдет к первому файлу, содержащему совпадение (по умолчанию).

Вот команды, которые вы можете использовать для навигации по поисковым совпадениям:

  • :cn — перейти к следующему совпадению.

  • :cN — перейти к предыдущему совпадению.

  • :clist — просмотреть все файлы, содержащие совпадающую строку.

  • :cc number — перейти к определенному номеру совпадения, который вы получаете из вывода :clist.

Также возможен рекурсивный поиск. Допустим, вы хотите найти строку error во всех файлах *.log в текущем каталоге и во всех подкаталогах. Вот что вам нужно сделать:

:vimgrep error **/*.log

Совпадение строки

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

:match ErrorMsg /Error/

Давайте посмотрим, что у нас есть:

  • :match — сама команда

  • ErrorMsg — предопределенный цвет в Vim для сообщений об ошибках

  • /Error/ — шаблон поиска, который мы определили

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

  • ErrorMsg

  • WarningMsg

  • ModeMsg

  • MoreMsg

Вы даже можете предопределить свой собственный цвет.

Совет по теме: вы всегда можете отобразить следующую совпадающую строку в центре экрана при нажатии n или N, чтобы было легче определить свое местоположение в файле. Чтобы включить это, поместите следующие строки в свой .vimrc:

nnoremap n nzz

nnoremap N Nzz

Сила глобальной команды

Глобальная команда :g[lobal] очень полезна. Способ ее использования представлен ниже:

:[range]g/pattern/cmd

Давайте ее разберем:

  • [range] — мы уже рассмотрели его в описании команды замены. Указывать диапазон необязательно, но важно отметить, что диапазон по умолчанию — это весь файл.

  • pattern — это шаблон, который мы ищем в файле

  • cmd — это команда Ex (в режиме командной строки), которая должна выполняться для каждой строки, соответствующей шаблону (напоминание: команда Ex начинается с двоеточия, например, :d для удаления).

Давайте посмотрим на некоторые примеры.

Удаление всех строк, содержащих шаблон

Мы хотим удалить все строки в текущем файле, содержащие строку error:

:g/error/d
  • g — сама глобальная (global) команда

  • error — образец, который мы хотим сопоставить

  • d — Ex команда удалить (delete)

Удаление всех строк, не содержащих шаблон

Мы хотим удалить все строки, не содержащие строку important:

:g!/important/d

Единственное отличие от предыдущего примера в том, что мы добавили ! после g. ! указывает Vim инвертировать совпадение.

Удаление всех пустых строк

Мы хотим удалить все пустые строки в текущем файле:

:g/^s*$/d

Разберем эту команду:

  • g — глобальная команда

  • ^ — начало строки

  • s* — ноль или более пробелов (space)

  • $ — конец строки

  • d — Ex команда удалить (delete)

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

Удаление огромного количества строк

Как мы уже видели, команда :g/pattern/d выполняет удаление всех строк, соответствующих шаблону. Когда строка удаляется, она сначала копируется в регистр. Поскольку регистр не указан, используется регистр по умолчанию (без имени).

Совет: возможно, вы захотите ознакомиться с главой «Регистры».

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

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

:g/pattern/d_
Выполнение макросов с помощью глобальной команды

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

:g/vim/normal @a
  • :g/vim/ — соответствует всем строкам со строкой vim.

  • normal @a — указывает Vim, что макрос, хранящийся в регистре a, должен выполняться в нормальном режиме.

Не волнуйтесь, если вы не понимаете этого сейчас. Вскоре вы узнаете больше о макросах.

Копирование и перемещение строки, с использованием :g

Вы даже можете копировать или перемещать строки в файле с помощью команды :g. Вот как скопировать строки с 3 по 9 после строки 20. Неважно, где находится ваш курсор:

:3,9t20

Вы можете запомнить это как: строки 3-9 в (to) строку 20. Если в приведенной выше команде вы использовали $ вместо 20, строки с 3 по 9 будут скопированы в конец файла.

Таким образом, вы будете использовать t для копирования строк с помощью команды g. Но если вы хотите переместить строки, то вам нужно использовать m (move). Это означает, что если вы хотите переместить строки с 3 по 9 в строку 20, вам нужно будет выполнить:

:3,9m20

Вы также можете работать с текущей строкой вместо диапазонов. Вот как переместить текущую строку в начало файла (в строку 0):

  1. Поместите курсор на строку, которую вы хотите переместить в начало файла.

  2. Запустите команду: :m0

В каждой строке, содержащей слово «good», заменить все «bad» на «ugly».

Название говорит само за себя. Вот как это сделать:

:g/good/s/bad/ugly/g

Давайте разберем это:

:g/good/ — эта часть соответствует строкам, содержащим слово good, во всем буфере.

s/bad/ugly/g — замещающая команда, которая заменяет bad на ugly во всех случаях в ранее совпавших строках (в первой части команды).

Реверс всех строк

Допустим, у вас есть файл вида:

first line
second line
third line

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

third line
second line
first line

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

:g/^/m0

Для получения дополнительной информации об этом см. :help 12.4.

Для получения дополнительной информации о глобальной команде в целом см. :help 10.4.

Глава 11
Регистры

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

Предупреждение: это глава, в которой вы можете застрять. Это требует от вас полной концентрации. Так что не спешите. Не переходите к ней в спешке. Дайте себе время и, если возможно, читайте ее в то время дня, когда вы хорошо концентрируетесь.

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

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

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

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

Да, существует девять типов регистров. Их имена начинаются с ", например как регистр "a. Вот список всех типов регистров:

  • Безымянный регистр ""

  • Десять пронумерованных регистров от "0 до "9

  • Малый регистр удаления "-

  • Двадцать шесть именованных регистров от "a до "z или от "A до "Z

  • Четыре регистра только для чтения ":, "., "% и "#

  • Регистр выражения "=

  • Регистры выбора и перетаскивания "*, "+ и "~

  • Регистр черной дыры "_

  • Регистр последнего шаблона поиска "/

Не пытайтесь запомнить их все в данный момент.

Внутреннее использование регистров Vim

Чтобы лучше понять регистры, рассмотрим простой пример.

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

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

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

1 port = 5432
2
3 work_mem = 512MB
4
5 wal_level = hot_standby

Наша главная цель — просмотреть старый файл конфигурации только один раз и скопировать эти три строки текста в три разных регистра.

В нормальном режиме вам нужно скопировать первую строку в регистр . Вы можете сделать это как обычно, вытянув всю строку командой yy, но с небольшим дополнением — вам нужно указать команде yy, куда ее скопировать. Вот почему вам нужно запустить команду "ayy. Точно так же извлеките третью строку, чтобы скопировать ее в регистр "b, используя команду "byy. Наконец, скопируйте пятую строку в регистр "c с помощью команды "cyy.

На данном этапе у нас есть копии трех строк из приведенного выше фрагмента, сохраненные в трех регистрах с разными именами: "a, "b и "c.

Теперь в новом файле конфигурации PostgreSQL мы хотим вставить эти три строки в соответствующие места:

В нормальном режиме вы найдете нужное место для строки port = 5432, которая теперь хранится в регистре "a, и вставите ее с помощью команды "ap (вставить после курсора) или "aP (вставить перед курсором). Затем, чтобы вставить строку work_mem = 512MB, хранящуюся в регистре "b, вы можете аналогичным образом запустить команды "bp или "bP. Наконец, чтобы вставить последнюю скопированную строку wal_level = hot_standby, хранящуюся в регистре "c, запустите команду "cp или "cP.

Вы только что использовали три разных буфера обмена в Vim. Это так просто!

Чтобы быть полностью корректным, вы только что использовали именованные регистры "a, "b и "c. Это всего лишь три из 26 именованных регистров: от "a до "z или от "A до "Z. Vim сохраняет текст в этих регистрах только тогда, когда вы явно скажите об этом. Вы можете подумать, что на самом деле должно быть 52 регистра, но есть важное различие между регистрами, начинающимися со строчной, и начинающимися с прописной буквы.

Например, "a и "A указывают на один и тот же регистр. Если вы копируете некоторый текст в регистр , используя "ау, предыдущее содержимое регистра заменяется текстом, который был извлечен. Если вы копируете текст, используя "Ау, предыдущее содержимое не будет заменено. Вместо этого вновь извлеченный текст будет добавлен к содержимому регистра.

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

Конечно, вместо того, чтобы выдергивать текст, вы также можете удалить текст и поместить его в определенный регистр с помощью "ad. Чтобы вырезать текст и сохранить его содержимое в регистре, используйте "ax.

Всякий раз, когда вы копируете (y), изменяете (c), удаляете (d), заменяете (s) или вырезаете (x) какой-либо текст в Vim, он копируется в безымянный регистр. Vim использует содержимое безымянного регистра для любой команды размещения (вставки) (p или P), которая не указывает регистр явно.

Так что, если вы, например, используете команду "ad, а затем вставляете с помощью команды p (без выбора какого-либо регистра), вы вставите текст, хранящийся в безымянном регистре "".

Наконец-то решена знаменитая надоедливая проблема

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

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

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

Чтобы решить эту проблему, вам нужно знать, что Vim автоматически сохраняет ваш последний yank в регистре 0. Это означает, что вы можете скопировать текст (без использования именованного регистра), затем удалить некоторый текст между ними и в конечном итоге вставить ранее извлеченный текст с помощью "0p.

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

Вы находитесь в режиме вставки. Вам нужно создать список из 10 локальных IP-адресов. Вы вводите текст: 192.168.1.10 в первой строке, нажимаете Enter, чтобы перейти к следующей строке, и нажимаете Esc. Теперь в нормальном режиме нажмите .. Эта команда вставит тот же текст 192.168.1.10. Вы можете повторить эту команду и вызвать . еще восемь раз, и вы получите список из десяти IP-адресов (все те же, но их легко изменить). В качестве альтернативы, после первого шага вы можете нажать 9. и вставить текст еще 9 раз.

Итак, просто вызвав команду ., вы можете вставить содержимое регистра ".. Этот регистр Vim является одним из четырех регистров только для чтения.

Регистриры «+ и «* системного буфера обмена

Все регистры, упомянутые до сих пор, являются внутренними регистрами Vim. То есть вы можете использовать их только внутри Vim. Однако, если вы хотите скопировать некоторый текст из Vim в другое приложение в вашей системе (или наоборот), вам нужно использовать регистры "+ или "*.

Чтобы скопировать некоторый текст из Vim в системный буфер обмена, используйте регистр "+. Допустим, вы хотите скопировать текст из строк с 1 по 3 следующего кода в какое-либо другое приложение, например Libre Office.

1 my $ceph     = get cmdb 'ceph';
2 my $hostname = run 'hostname';
3 my $config   = $ceph->{$hostname};
4
5 file '/etc/ceph/ceph.client.admin.keyring',
6  source => 'files/etc/ceph/ceph.client.admin.keyring',
7    owner => 'ceph';

Как вы уже узнали, вы можете скопировать строки с 1 по 3, поместив курсор на строку 1 и вызвав команду 3yy. В этом случае нам нужно скопировать эти три строчки в системный регистр "+.

Вот что вам нужно сделать:

  1. Поместите курсор на строку 1, затем используйте "+3yy, чтобы скопировать строки с 1 по 3 в системный регистр "+.

  2. Перейдите к приложению, в которое вы хотите скопировать текст (например, Libre Office), и нажмите Ctrl-v, чтобы вставить его. Вам не обязательно использовать Ctrl-v. Вы можете использовать любой другой способ вызова команды вставки.

Это работает в Linux, Windows и macOS. Однако когда вам нужно скопировать текст из другого приложения в Vim, все становится немного сложнее. Если вы используете Vim в Windows или macOS, регистры "+ и "* относятся к одному и тому же системному буферу обмена, поэтому не имеет значения, какой из них вы будете использовать.

В приведенном ниже примере мы скопируем URL-адрес из веб-браузера в нашу сессию Vim:

  1. Выберите URL-адрес в браузере и нажмите Ctrl-c, чтобы скопировать его в системный буфер обмена. Кроме того, вы можете использовать любой другой способ, поддерживаемый вашим браузером, для копирования URL-адреса.

  2. В сессии Vim войдите в нормальный режим и нажмите: "*p или "+p, чтобы вставить URL-адрес.

Обратите внимание, что не имеет значения, используете ли вы "* или "+ на втором шаге.

Когда вы запускаете Vim в Linux, вам нужно знать кое-что еще, чтобы эффективно работать с системным буфером обмена: оконная система X11 (присутствующая в вашей системе) имеет три разных системных буфера обмена. Здесь нас интересуют только два из них.

Если вы используете какое-либо приложение, кроме Vim, и копируете текст с помощью Ctrl-c, Ctrl-x или любого подобного действия, это содержимое сохраняется в системном буфере обмена, называемом CLIPBOARD. Обычно это основной системный буфер обмена. В этом случае, когда вы хотите вставить этот контент в Vim, вам нужно использовать регистр "+.

Например:

  1. Откройте любую веб-страницу в браузере и выберите абзац текста. Затем нажмите Ctrl-c (или скопируйте текст с помощью команды, поддерживаемой вашим браузером).

  2. В Vim, находясь в нормальном режиме, используйте команду "+p, чтобы вставить этот текст.

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

Например:

  1. Используйте мышь, сенсорную панель или клавиатуру, чтобы выбрать только одно предложение на веб-странице в веб-браузере. Не делай ничего другого.

  2. В Vim, находясь в нормальном режиме, используйте команду "*p, чтобы вставить это предложение.

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

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

Глава 12
Буферы

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

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

  • Буфер — это хранящийся в памяти текст файла.

  • Окно — это окно просмотра в буфере.

  • Вкладка представляет собой набор окон.

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

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

Теперь, как вы используете буферы? На самом деле это очень просто.

Например, запустите команду :ls, чтобы получить список буферов. Или вы можете использовать команду :buffers для того же результата. Чтобы выбрать буфер, к которому вы хотите перейти, вам нужно нажать цифру под нужным буфером, показанную в списке, а затем b. Например, чтобы переключиться на буфер 5, вы должны запустить команду :5b.

Если вы уже знаете номер буфера в списке, вы можете перейти непосредственно к этому буферу, запустив :buffer N, где N — номер буфера.

Чтобы открыть все буферы в окнах, введите :ball. Запомните это как «буферы все» (buffers all). Также есть :bnext и :bprevious или сокращенная форма :bn и :bp, так что вы можете переключаться между ними. Если вы хотите закрыть текущий буфер, просто запустите :bd. Запомните это как «удалить буфер» (buffer delete).

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

map <C-K> :bprev<CR>
map <C-J> :bnext<CR>

В этой конфигурации вы сможете перейти к предыдущему буферу с помощью Ctrl-k и перейти к следующему буферу с помощью Ctrl-j. Он чувствует себя намного лучше!

Если вы хотите переключаться между текущим и предыдущим буфером, вы можете нажать Ctrl-6.

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

Глава 13
Окна, вкладки и сессии

Окна и вкладки

Как мы уже говорили, буфер — это текст файла в памяти. Официальная документация говорит, что окно — это область просмотра в буфере, а вкладка — это набор окон.

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

Буфер может находиться в одном из трех состояний:

  • активный — когда буфер отображается в окне.

  • скрытый — когда буфер не отображается в видимом окне.

  • неактивный — когда буфер не отображается и ничего не содержит.

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

По умолчанию Vim запускается с одним окном.

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

Например, при запуске откроются три окна, разделенные по вертикали: vim -O file1 file2 file3. Вы также можете использовать -oN, где N — десятичное число, чтобы открыть N окон, разделенных по горизонтали.

Если имен файлов больше, чем окон, открываются только N окон, а остальные файлы не получают окон. Точно так же -ON открывает N окон, разделенных по вертикали, с теми же ограничениями.

Разделение окон

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

Теперь вы хотите открыть файл second_file.txt. Вот что вы можете сделать:

  • :sp[lit] second_file.txt — открывает файл как разделенный по горизонтали

  • :vsp[lit] second_file.txt — открывает файл как разделенный по вертикали.

И :sp, и :vsp могут принимать числовое значение для определения размера разделения.

Например, это создаст горизонтальное разделение высотой 20 строк third_file.txt:

:20sp third_file.txt

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

:25vsp third_file.txt

Переключение окон

Вот сокращения по умолчанию для переключения окон:

Сокращение Описание
Ctrl-w h Переключиться на окно слева
Ctrl-w j Переключиться на окно ниже
Ctrl-w k Переключиться на окно выше
Ctrl-w l Переключиться на окно справа

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

nnoremap <C-H> <C-W><C-H>
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>

Мы можем использовать различные сокращения клавиш для более удобной навигации между разбиениями. Если вы поместите этот фрагмент в свой .vimrc, вы вместо Ctrl-w, и затем j сможете переключаться на окно ниже, просто нажав Ctrl-j.

Перемещение окон

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

Сокращение Описание
Ctrl-w r Повернуть окна слева направо (только если они разделены по вертикали)
Ctrl-w R Повернуть окна справа налево (только если они разделены по вертикали)
Ctrl-w H Переместить текущее окно в крайнее левое положение и использовать всю высоту экрана
Ctrl-w J Переместить текущее окно в самый низ и использовать всю ширину экрана

Изменение размера окон

Очень часто вы хотели бы изменить размер ваших окон. Вот несколько способов сделать это:

Сокращение Описание
Ctrl-w = Сделать размеры окон одинаковыми
Ctrl-w > Постепенно увеличивать окно вправо (принимает параметр: Ctrl-w 10 >)
Ctrl-w < Постепенно увеличивать окно влево (или Ctrl-w 10 <)
Ctrl-w — Постепенно уменьшать высоту окна (или Ctrl-w 5 -)
Ctrl-w + Постепенно увеличивать высоту окна (или Ctrl-w 5 +)

Еще один полезный совет, который вы должны знать, касается команды :on[ly]. Если у вас открыто несколько разделенных окон, но вы хотите, чтобы в фокусе было только одно окно, вам может показаться утомительным переход к этим другим разделенным окнам, чтобы закрыть их. Конечно, есть более простой способ. Команда Ex :on[ly] закроет все остальные разделения, за исключением окна, которое в данный момент находится в фокусе. См. :h only для более подробной информации.

Для получения дополнительной информации о разделении окон см. :help splits.

Сессии

Если вы часто используете разделенные окна и вкладки в своем рабочем процессе, вы знаете, что каждый раз создавать и размещать окна и вкладки так, как вы хотите, может быть утомительно (или, по крайней мере, скучно).

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

Итак, когда у вас есть сессия, которую вы хотите сохранить, достаточно запустить такую команду: :mksession ~/mysession.vim.

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

  • В терминале выполнить vim -S ~/mysession.vim и таким образом запустить Vim с уже загруженной сессией.

  • Запустить Vim и выполнить команду: :source ~/mysession.vim.

Глава 14
Макросы

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

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

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

Давайте посмотрим на пример рабочего процесса:

  1. С этого момента начинаем запись действий в регистр a: qa. Можно использовать любой регистр.

  2. Нажимаем q во время записи, чтобы остановить ее.

  3. Выполняем запись в назначенный регистр а, нажав @a.

  4. Чтобы повторить последний выполненный макрос, вы можем просто запустить @@.

Конечно, вы можете вставить любое число перед @, чтобы повторить выполнение макроса указанное количество раз. Например, 10@a выполнит макрос, записанный в регистре a, 10 раз.

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

Выполнение макроса в нескольких файлах

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

В этом примере мы загрузим все модели из приложения Rails:

:args app/models/*.rb

Предположим, что ранее записанный макрос находится в регистре a. Запускаем макрос командой:

:argdo normal @a

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

:argdo update

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

Редактирование макроса

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

  1. Вставьте макрос в пустую строку, выполнив команду: "<register>p. Если ваш макрос сохранен в регистре m, команда будет "mp.

  2. Отредактируйте макрос по своему усмотрению.

  3. Скопируйте макрос в корректный регистр: переместите курсор в начало строки и запустите "my$ (где m — корректный регистр). Вы можете снова использовать исходный регистр или использовать другой. Если вы хотите используйте регистр n, команда будет "ny$.

Рекурсивные макросы

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

Связанный совет: чтобы очистить регистр, нажмите q<register>q.

Например, чтобы сделать пустым регистр a, нажмите qaq.

Начните записывать макрос, как показано ранее. Сразу после того, как вы записали последнее действие вашего макроса, вызовите сам макрос в качестве последней команды. Поскольку мы убедились, что регистр пуст, вызов макроса ничего не даст.

Давайте посмотрим на образец текста:

mastering
vim
quickly
wtf
omg
.
in
.
no time
  1. Поместите курсор на первую строку. Мы предполагаем, что регистр a пуст, поэтому мы можем записать такой макрос: qaI"EscA"Escj@aq

  2. Шаг за шагом: вы должны нажать q, затем a, чтобы начать запись макроса в регистр a.

  3. Затем нажмите I, что переведет вас в режим вставки (в начало строки), а затем введите ".

  4. Нажав клавишу Esc, вы вернетесь в нормальный режим. Затем нажмите A, что является командой для добавления текста. Вы снова оказываетесь в режиме вставки и добавляете " в конец слова в текущей строке.

  5. Нажмите Esc еще раз, чтобы вернуться в нормальный режим, затем нажмите j, чтобы перейти к следующей строке.

  6. И вот мы подошли к ключевой части: вы, наконец, выполняете сам текущий макрос — все, что вы записали до сих пор — для применения к строке, на которую вы только что переместились. Итак, нажмите @a, чтобы вызвать макрос, а затем q, чтобы остановить его запись.

Затем с помощью одного вызова @a все строки файла теперь будут заключены в двойные кавычки.

Другие примеры макросов

Вы можете использовать команду normal[al] в режиме Ex, чтобы повысить эффективность работы с макросами.

Вот пара примеров того, как его использовать:

  • Выполнить макрос, хранящийся в регистре v в строках с 6 по 16: :6,16norm @v

  • Выполнить макрос, хранящийся в регистре i в строках с 10 по конец файла: :10,$norm @i

  • Выполнить макрос, хранящийся в регистре m, во всех строках: :%norm @m

  • Выполнить макрос, хранящийся в регистре o, во всех строках, соответствующих шаблону: :g/pattern/norm @o

  • Выполнить макрос на визуально выделенных строках: выделить строки в визуальном режиме. Затем введите :norm @a и обратите внимание на следующую строку ввода: :'<,'>norm @a. Нажмите Enter, и макрос, записанный в регистре a, будет выполнен.

  • Выполнить макрос в регистре a до следующих 100 строк, если сам макрос перемещается на следующую строку: нажмите 100@a.

  • Выполнить макрос в регистре a до следующих 100 строк, если сам макрос не переходит на следующую строку: нажмите .,+99norm @a.

Примечание. Дополнительные сведения о команде :normal см. в главе Эффективное редактирование нескольких файлов.

Глава 15
Сила визуальных режимов

Vim позволяет визуально выбирать содержимое и управлять выделением. Использование визуального режима можно описать тремя этапами:

  1. Начните выделять текст с помощью v, V или Ctrl-v. Символ под курсором используется в качестве начала выделения.

  2. Перейдите к концу текста, который хотите выделить. Выделенный текст будет выделен.

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

Запуск команды gv в нормальном режиме повторно выберет предыдущий визуальный выбор. Это удобно, когда вы выполняете поиск и замену для визуального выбора и не можете правильно подобрать замену с первой попытки.

Выбор символов

Вы можете выбрать символы в строке с помощью команды:

[count]v
Обратите внимание, это сложно

Например, если вы хотите выбрать 3 символа, один под курсором и два после него, вы можете нажать: 3v. Как вы уже знаете, [count] является необязательным, поэтому вы можете просто использовать v, чтобы начать выделение, а затем переместить курсор (и расширить выделение) с помощью клавиш навигации.

Но допустим, вы начали новую сессию Vim и использовали 3v. Теперь, когда вы перемещаетесь в другое место и набираете 1v, вы ожидаете, что будет выбран только 1 символ. Но произойдет то, что будут выбраны 3 символа (как в предыдущей команде). Кроме того, если бы вы сейчас запустили команду 2v, она выбрала бы 6 (2 x 3) символов вместо 2. Для получения дополнительной информации взгляните на :help v.

Выбор строк

Мы рассмотрим два способа выбора строк.

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

Тем не менее, лучше использовать V. Просто нажав V, вы можете выбрать всю строку, в то время как ваш курсор может быть расположен в любом месте строки.

Хотя эти две команды, кажется, делают одно и то же, между ними есть разница. Лучший способ понять это — попробовать. Например, скопируйте одну строку, используя v$y, и вставьте ее. Затем сделайте то же самое, используя Vy, и вставьте его.

Вы заметите, что выделение символов (v$y) вставляется не так, как выделение строки (Vy).

Визуальный выбор блока

Отличительной особенностью Vim является визуальный режим по блокам. Нажатие Ctrl-v позволит вам сделать выбор вашего контента в блоке. Лучший способ понять это — попробовать. И вы действительно это сделали в примере, который мы рассмотрели в главе Ваша первая сессия Vim.

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

Расширение текущего визуального выбора

Например, вы сделали выделение с 10-й по 20-ю строку. Но вы поняли, что хотите расширить выделение с 8-й по 22-ю строку.

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

Я предполагаю, что вы выбрали строки от строки 10 до строки 20. Поскольку ваш курсор находится в строке 20, вы можете перейти к строке 22 и выбрать дополнительные строки. Теперь нажмите o, и ваш курсор переместится в верхнюю часть выделения, в строку 10. Теперь вы можете переместить курсор на две строки вверх и выбрать также строки 9 и 8.

Запуск команд через выделение

Вы можете запускать команды через визуальный выбор так же, как вы запускаете их в нормальном режиме. Допустим, у нас есть следующие строки, написанные на Perl, и мы забыли добавить ; в конце каждой из них:

my $a
my $b
my $c

Мы можем визуально выделить все 3 строки с помощью Shift-v, а затем выполнить команду:

:normal A;

Это выполнит команду A; (добавить ; в конец строки) для каждой строки.

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

:%normal A;

Команда точки в визуальном режиме

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

В главе Вы говорите на Vim у нас был пример, в котором мы хотели добавить ; к трем строкам кода:

my $i
my $learn
my $quickly

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

A;<Esc>

Теперь мы можем визуально выделить вторую и третью строку (используя Shift-v и клавиши со стрелками или j и k) и запустить:

:normal .

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

Еще лучше, чтобы сделать эту операцию быстрее, вы можете добавить это в свой .vimrc:

" применить . для работы с визуально выделенными линиями
vnoremap . :normal.<CR>

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

Вы можете узнать больше о команде :normal в главе Эффективное редактирование нескольких файлов.

Перемещение визуального выделения

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

" Перемещение визуального выделения
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv

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

Возможности визуального режима

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

После понимания всего, что содержится в этой главе, хорошим следующим шагом будет изучение того, какие команды, объекты и операторы вы можете использовать в визуальном режиме, для этого см. :help visual-operators.

Глава 16
Привязка клавиш (mappings)

Рано или поздно вам придет в голову идея настроить новые или изменить существующие клавиатурные сокращения Vim. Для этого нужно знать основы привязки клавиш. Создание сокращения в мире Vim аналогично созданию привязки. Чтобы определить наши собственные привязки, мы будем использовать различные типы команд :map.

Пример 1: Используйте команду nmap для определения привязки только для нормального режима.

Задача: Показать информацию о версии Vim при нажатии v.

Информация: информацию о версии Vim мы можем получить с помощью команды :version.

  1. Откройте новую сессию Vim.

  2. Выполните команду :nmap v :версия<cr>. (n в nmap означает нормальный режим).

  3. Теперь нажмите v. Вы увидите информацию о версии Vim, так как привязка v выполнит команду :version.

  4. Удалите эту привязку, выполнив команду: nunmap v.

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

На шаге 4 вы можете увидеть, как мы удалили привязку. Это цель команды nunmap. Чтобы удалить привязку для v, мы использовали команду nunmap v. Таким образом, мы удалили привязку, в которой нажатие v показывает информацию о версии Vim, и восстановили поведение по умолчанию (вход в визуальный режим).

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

Пример 2: Нерекурсивное отображение

Задача: создать привязку w для echo Hello world!. Создать другую привязку a, чтобы заменить поведение w по умолчанию.

Информация: По умолчанию клавиша w перемещает курсор на одно слово вперед.

  1. Откройте новую сессию Vim.

  2. Выполните эту команду :nmap w :echo "Hello world!"<cr>, чтобы создать первую привязку.

  3. Выполните команду: nmap a w, чтобы привязать поведение по умолчанию клавиши w с клавишей a.

  4. Вставьте пару слов в ваш текущий сессии, чтобы проверить, будет ли a принимать поведение по умолчанию w и перемещать курсор на одно слово вперед.

  5. Теперь в нормальном режиме нажмите w. Вы увидите Hello world! в строке состояния. Хорошо, это работает.

  6. Затем нажмите a. Вы заметите, что курсор не двигается, но Hello world! снова отображается в строке состояния.

Резюме: поскольку мы уже привязали w к другому действию, и мы знаем, что команда nmap является рекурсивной, это означает, что какую бы новую привязку мы ни создали для w, она всегда будет выполнять существующую привязку для w, а не ее поведение по умолчанию.

Правильный способ решить эту проблему — использовать вместо этого команду нерекурсивной (non-recursive) привязки.

Итак, теперь используйте команду nunmap a, чтобы удалить привязку, созданную на шаге 3. Затем создайте новую привязку, используя: nnoremap a w. Вернитесь в нормальный режим, теперь, когда вы нажимаете клавишу a, будет применено поведение клавиши w по умолчанию, и ваш курсор переместится на одно слово вперед.

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

Рекурсивные Нерекурсивные Удаление привязки Режим
:map :noremap :unmap нормальный, визуальный, ожидания оператора[1]
:nmap :nnoremap :nunmap нормальный
:xmap :xnoremap :xunmap визуальный
:imap :inoremap :iunmap вставки
:cmap :cnoremap :cunmap командной строки
:omap :onoremap :ounmap ожидания оператора
  1. Режим ожидания оператора — это режим, в который переходит редактор после ввода команды-оператора, например d или y. Редактор ожидает ввода текстового объекта или команды перемещения для указания области применения оператора. Иными словами, при вводе команды dw, клавиша w нажимается в режиме ожидания оператора. — Прим. пер.

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

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

Если вы хотите предварительно просмотреть текущие привязки для нормального режима, просто запустите команду :nmap.

Например, запуск команды вида:

:nmap <leader>

покажет вам все привязки нормального режима, которые начинаются с привязанной клавиши leader.

Чтобы отключить стандартное привязку, вам нужно привязать ее к специальному символу <nop>, например: :noremap <left> <nop>. Эта команда отключает клавишу со стрелкой влево.

Для получения дополнительной информации по этой теме см. :h mapping и :h key-notation.

Глава 17
Сворачивание (folding)

Объединение нескольких строк текста в одну строку называется сворачиванием. Эта функция может быть очень удобной, когда вы хотите «скрыть» части вашего текста или кода, которые не важны для вас. Так вы сможете лучше понять структуру вашего текста.

Когда вы делаете свертки (fold), текст все еще находится в буфере, без изменений, но просто не виден, пока вы не откроете свертку.

Когда дело доходит до свертки, самое сложное помнить, что каждая связанная команда начинается с z. Но вот подсказка: z выглядит как сложенная бумага, если смотреть сбоку :)

Согласитесь, это не так уж трудно запомнить.

Прежде чем мы углубимся во все детали и варианты, сначала попробуйте:

  1. Откройте любой существующий файл, в котором есть хотя бы один абзац текста.

  2. Поместите курсор в любом месте этого абзаца.

  3. В нормальном режиме введите: zfap.

Вы увидите, что абзац был заменен выделенной строкой. Вы только что создали свертку!

Что это за команда и как она работает, мы рассмотрим в следующих параграфах.

Вот пара строк конфигурации для начала, поместите их в свой .vimrc:

set foldenable        " Включить сворачивание.
set foldlevelstart=10 " По умолчанию открывается большинство сверток. Если установлено значение 0, все свертки будут закрыты.
set foldnestmax=10    " Свертки могут быть вложенными. Установка максимального значения защищает вас от слишком большого количества сверток.
set foldmethod=manual " Определяет тип сворачивания.

Как видите, последняя строка конфигурации сверху — это опция foldmethod.

Эта опция определяет свертывание текущего окна. Вот возможные значения, которые вы можете установить:

Значение Описание
manual свертки определяются вручную с помощью команд
indent группы строк с одинаковым уровнем отступа формируют синтаксис свертки
syntax свертки определяются маркером подсветки синтаксиса
marker в текст могут быть добавлены специальные символы, чтобы отметить начало/конец свертки
expr свертки определяются пользовательским выражением
diff используется для свертывания неизмененного текста при просмотре различий

Здесь мы рассмотрим только три наиболее важных параметра.

Ручное свертывание

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

Если вы установите для параметра foldmethod значение manual, то в нормальном режиме вы можете создать свертку, набрав: zf{motion}, где {motion} представляет собой выбор строк, которые вы хотите свернуть.

Например, команда:

zf5j

создаст свертку текущей строки вместе с пятью последующими строками.

Или, если у вас есть код, в котором фигурные скобки { } используются для разделения блоков кода, вы можете создать свертку этого блока кода:

  1. Поместите курсор на любую строку в любом месте внутри блока кода.

  2. Запустите команду zfa{ или zfa} (обе будут работать).

Разберем эту команду:

  • z — я полагаю, вы помните, почему используется z.

  • f — происходит от свертки (fold).

  • a — происходит от вокруг (around) (см. Модификаторы в главе Вы говорите на Vim)

  • { или } — это символ, окружающий текст, который мы хотим свернуть.

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

zfap

Теперь вы понимаете, что zf — это оператор, используемый для создания сверток, тогда как a означает вокруг (around), а p — абзац (paragraph). Используя команду выше, мы в сущности говорим Vim «создать свертку вокруг абзаца».

В этот момент вы можете задаться вопросом, а что, если есть закрытая свертка, и вы хотите отредактировать свернутый абзац?

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

Вот наиболее важные команды свертывания, которые вы можете выполнять в нормальном режиме:

Команда Описание
zo Открыть (open) текущую свертку под курсором.
zc Закрыть (close) текущую свертку под курсором.
za Переключить текущую свертку под курсором.
zd Удалить (delete) свертку под курсором (только свертку, текст остается неизменным).
zj Переместить курсор к следующей свертке.
zk Переместить курсор на предыдущую свертку.
zR Открыть все свертки в текущем буфере. (Раскрыть (Reduce) все свертки.)
zM Закрыть все открытые свертки в текущем буфере. (Закрыть все больше и больше (more and More) сверток.)
zE Удалить все свертки из текущего буфера
:fold В визуальном режиме: сложить выбранные строки.

Свертывание по отступу

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

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

Вам нужно будет установить для параметра foldmethod значение indent, чтобы строки с одинаковым уровнем отступа можно было свернуть вместе.

Например, следующие строки:

This is line one
  This is line two
  This is line three
  This is line four
This is line five

будут свернуты как:

Line one
+ Line two, three and four
Line five

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

:set foldcolumn=2

Она покажет небольшой столбец в левой части окна, рядом с номерами строк, для визуального обозначения сверток. Знак + отображается для закрытой свертки, а - отображается в начале каждой открытой свертки. Все строки свертки будут отмечены символом |. Рекомендуется установить foldcolumn хотя бы на тот уровень сверток, который вы хотите отобразить. Если у вас четыре уровня свертки, то установите его на 4.

Свертывание синтаксиса

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

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

set foldmethod=syntax
set foldlevelstart=1

let perl_fold=1           " Perl
let perl_fold_blocks = 1  " Свертки блоков в операторах if и т.д. в Perl
let sh_fold_enabled=1     " sh - включить функцию свертывания
let vimsyn_folding='af'   " Vim script
let r_syntax_folding=1    " R
let ruby_fold=1           " Ruby
let php_folding=1         " PHP
let javaScript_fold=1     " JavaScript
let xml_syntax_folding=1  " XML

Это только пример. Удалите или добавьте параметры для языков, которыми вы действительно пользуетесь. Для получения дополнительной информации о том, какие языки и параметры вы можете использовать, см. :h syn-file-remarks.

Сохраняющиеся свертки

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

Если вы хотите, чтобы ваши свертки оставались постоянными во время сессий Vim, после их создания вы можете запустить команду: mkview. Это сохранит ваши свертки из текущего буфера в ваш каталог просмотра (см. :h viewdir).

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

Вы можете пойти дальше и автоматизировать этот процесс. Все, что вам нужно сделать, это добавить это в ваш файл .vimrc:

augroup auto_save_folds
autocmd!
autocmd BufWinLeave * mkview
autocmd BufWinEnter * silent loadview

Это загрузит существующие свертки (если они есть) при открытии файла.

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

Для получения дополнительной информации см. справку по параметрам viewoptions и viewdir.

Глава 18
Эффективное редактирование нескольких файлов

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

  • :argdo — для списка аргументов

  • :bufdo — для списка буферов

  • :windo — для списка окон

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

  • :norm[al] — для запуска команд в нормальном режиме.

  • :exe[cute] — для выполнения команд

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

Команды execute и normal

Команда execute

Команда exe[cute] используется для выполнения строки, как если бы это была команда Vim. Вы можете запустить такую команду:

:execute "echom 'Hello world!'"

чтобы повторить строку Hello world. В этом примере мы использовали внутреннюю команду Vim для эха содержимого echom.

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

Команда normal

Если вы попытаетесь запустить команду:

:normal gg

вы увидите, что ваш курсор переместится на первую строку в вашем текущем буфере. Как вы уже могли догадаться, команда normal[al] просто берет последовательность набранных вами клавиш и обрабатывает их как команду Vim, которую вы вводили бы в нормальном режиме.

Конечно, эта команда подхватит ваши личные привязки, если они существуют. Это подводит нас к следующему вопросу: что произойдет, если пользователь переназначит команду gg для удаления одной строки вместо перехода к первой строке буфера?

В этом случае пример выше выполнит команду для удаления строки или что-то еще, что было указано для привязки.

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

:normal! gg

Таким образом, Vim переместит ваш курсор на первую строку буфера, даже если уже есть другая привязка для последовательности клавиш gg. Поэтому, если вы используете !, привязки использоваться не будут.

Вы также можете использовать диапазоны для выполнения команд нормального режима для каждой строки в указанном диапазоне. Для получения более подробной информации об этой команде, см. :help normal.

argdo против bufdo

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

Например, если вы запускаете Vim следующим образом:

$ vim my_file1.txt my_file2.txt

Vim добавит в список аргументов два элемента (my_file1.txt, my_file2.txt). Когда вы находитесь в Vim, вы можете посмотреть содержимое списка аргументов, выполнив команду :args.

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

На данный момент оба списка — и аргументов, и буферов — содержат элементы my_file1.txt и my_file2.txt.

Если мы дополнительно из Vim откроем еще один файл, например:

:e my_file3.txt

Vim создаст еще один буфер для этого файла. А также добавит еще один элемент в список буферов. Итак, теперь список буферов будет содержать три элемента (для всех трех файлов, которые мы открыли), а список аргументов по-прежнему будет содержать два элемента (my_file1.txt и my_file2.txt).

И вот мы, наконец, подошли к сути:

  • Команда argdo влияет только на файлы, присутствующие в списке arglist.

  • команда bufdo влияет только на файлы, присутствующие в списке буферов.

В нашем примере редактирование файлов с помощью команды argdo повлияет только на my_file1.txt и my_file2.txt, а команда bufdo повлияет на эти два плюс my_file3.txt.

Теперь давайте рассмотрим несколько полезных примеров этих команд.

Примеры bufdo

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

Допустим, вы открыли несколько файлов, поэтому у вас есть несколько буферов. В какой-то момент вы хотите выполнить команду, которая повлияет на все активные буферы (в списке буферов), вам нужно использовать команду :bufdo.

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

:bufdo wq

Таким образом, мы только что сказали Vim выполнить команду :wq в каждом активном буфере. В качестве альтернативы вы также можете запустить команду:

:wqa

который запишет (write) изменения во все (all) буферы и закроет (quit) Vim.

Вставка в конец каждого буфера
:bufdo exe ":normal Gp" | update

Давайте разберем это:

  • :bufdo — выполнить команды по всем активным буферам

  • exe — команда «выполнить» (execute), которая будет выполнять команду в двойных кавычках.

  • ":normal Gp" — выполняется командой exe. Мы используем :normal Gp, чтобы сообщить Vim: запустить G (перейти в конец файла) и p (вставить) в нормальном режиме.

  • | update — при выполнении предыдущих команд мы используем | для выполнения другой команды (update), которая фактически записывает изменения в буферы. Вместо этого вы также можете использовать w.

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

С другой стороны, когда вы выполняете :up[date], Vim будет обновлять метку времени файла ТОЛЬКО в том случае, если файл был изменен.

Выполнение макроса по всем активным буферам
:bufdo execute "normal! @a" | w

Как видите, структура команды такая же, как и в предыдущем примере. На этот раз мы запускаем команду @a в нормальном режиме, чтобы выполнить макрос, записанный в регистре a. Кроме того, на этот раз мы используем w вместо update (без особой причины).

Мы уже рассмотрели, как управлять буферами в главе Буферы, поэтому не будем повторять команды для добавления и удаления буферов.

Примеры argdo

Все примеры для команды :bufdo можно применить к файлам, хранящимся в arglist, заменив :bufdo на команду :argdo.

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

Вот несколько полезных команд:

Команда Описание
:args Показать файлы в вашем текущем списке аргументов
:args /path/to/files/*/* Заменить старые файлы списка аргументов новыми
:arga[dd] /path/to/file.txt Добавить file.txt в ваш список аргументов
:argd[elete] /path/to/file.txt Удалить файлы из вашего списка аргументов
:argdo update Сохранить изменения во всех файлах списка аргументов
:argdo undo Отменить последнюю операцию в каждом файле списка аргументов

Вот пример: вы работаете над проектом и имеете несколько файлов в своей ветке git. Вы хотите заменить строку Bad строкой Good во всем проекте.

Мы можем сделать это в два этапа, вот первый:

:args `git grep -l Bad`

Эта команда запускает команду оболочки git grep -l Bad, которая предоставит нам список файлов, содержащих строку Bad, и поместит эти файлы в argslist.

Затем мы можем запустить:

:argdo %s/Bad/Good/gc | update

и выполнить замену во всех файлах в arglist и сохранить изменения.

Но что, если вы добавите несколько файлов в список аргументов и захотите заменить bad на good во всех из них, где появляется bad, без использования внешних команд оболочки? Если вы запустите такую команду:

:argdo %s/bad/good/g | update

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

:argdo %s/bad/good/ge | update

Мы включили флаг e, который говорит Vim не выдавать ошибку, если поиск не дал результата. Если вы хотите выполнить замену выборочно и пропустить некоторые совпадения, вы можете просто добавить флаг c[onfirm].

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

:argdo exe '%!sort' | w

Эта команда отсортирует содержимое всех файлов в вашем списке аргументов. Она вызывает команду оболочки sort.

Команда windo

Давайте будем краткими.

Команда :windo похожа на :argdo и :bufdo с одним важным отличием: она влияет только на видимые буферы. Как мы уже упоминали, в Vim может быть открыто много буферов, но если открыто только одно окно, то одновременно отображается только один буфер.

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

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

Глава 19
Советы по продуктивности

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

Прочитайте их все, попробуйте их все в течение нескольких дней. И если они вам подойдут — отлично! Если нет, просто забудьте о них на время и попробуйте снова через несколько месяцев.

Относительные числа

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

В Vim многие команды могут начинаться с числа. Переместиться на 5 строк ниже текущей строки — используйте 5j. Удалить следующие 5 строк — используйте команду d5j. Переместить 8 строк выше текущей строки — используйте 8k. Сделайть отступ в следующих пяти строках — используйте 5>>. Вы также можете использовать + для ссылки на строку ниже текущей строки и - для ссылки на строку выше текущей строки.

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

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

set number
set relativenumber

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

Возможно, вы захотите сделать еще один шаг. Будет лучше включить относительные числа только в нормальном режиме и абсолютные числа только в режиме вставки. Вот что вам нужно поместить в свой .vimrc:

augroup toggle_relative_number
autocmd InsertEnter * :setlocal norelativenumber
autocmd InsertLeave * :setlocal relativenumber

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

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

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

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

Клавиша leader по умолчанию — это обратная косая черта , но рекомендуется переназначить ее либо на Space, либо на клавишу ,. В основном это зависит от ваших личных предпочтений. Чтобы активировать определенное сокращение, вам в основном нужно нажать Leader key, а затем определенную клавишу привязки.

Например, вместо выполнения :w для сохранения файла вы можете привязать эту команду и выполнить ее, как Leader w. Чтобы настроить такую привязку, вам сначала нужно привязать клавишу leader. В этом примере давайте сделаем Space ключевой клавишей. Просто добавьте эту строку в свой .vimrc:

let mapleader = "<Space>"

Затем, чтобы включить сокращение из приведенного выше примера, все, что вам нужно, это добавить простое сокращение в ваш .vimrc:

nnoremap <Leader>w :w<CR>

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

  • Клавиша Space не имеет большого значения в нормальном режиме по умолчанию.

  • Она симметрична и одинаково легко доступна для обеих рук

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

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

vmap <Leader>y "+y
vmap <Leader>d "+d
nmap <Leader>p "+p
nmap <Leader>P "+P
vmap <Leader>p "+p
vmap <Leader>P "+P

Если вы хотите узнать больше о клавише leader, см. :help mapleader и :help maplocalleader.

Автоматическое завершение

Есть несколько способов (как обычно) для автоматического завершения слов, которые вы вводите в Vim. Мы рассмотрим три различных способа использования функции автозаполнения:

  • использование известных слов

  • с помощью файла словаря

  • использование тезауруса

Неважно, что вы пишете, даже после небольшого количества текста вам будет необходимо использовать несколько повторяющихся слов. Автодополнение с использованием известных слов является самым простым в использовании — все, что вам нужно сделать, это нажать Ctrl-n. Вам просто нужно ввести несколько первых букв слова (которое уже присутствует где-то в вашем предыдущем тексте) и нажать Ctrl-n.

Давайте посмотрим пример. Сначала введите предложение:

I love to learn new things.

Затем напишите:

Today I le

нажмите Ctrl-n и введите пробел и слово Vim.

Vim автоматически дополнит слово, которое вы набираете, потому что он уже «знает» слово learn. Таким образом, вы получите предложение:

Today I learn Vim.

Нажатие Ctrl-n указывает Vim искать подходящее слово вперед по файлу. Если у вас очень большой файл, и вы знаете, что недавно набрали слово, которое хотите автодополнить, то вместо Ctrl-n используйте Ctrl-p. Нажатие Ctrl-p также автоматически дополнит ваше слово, но оно будет искать известные слова в обратном направлении от вашей позиции.

Также очень полезно повторять Ctrl-x Ctrl-n. Работает только после предыдущего автозавершения, обычно Ctrl-n. Вы можете использовать его для частичного завершения строки, когда начало отличается или когда вы хотите другое окончание.

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

Когда у вас есть файл словаря, все, что вам нужно сделать, это:

set dictionary+=/path/to/dictionary/file

После запуска этой команды Vim внезапно узнает много слов, которые можно завершить автоматически. Но в этом случае каждый раз, когда вы хотите автодополнить слово, вам следует нажимать Ctrl-x Ctrl-k.

Нажатие Ctrl-x переводит вас в «режим завершения», а нажатие Ctrl-k указывает Vim на автоматическое завершение ключевого слова в словаре.

Vim предлагает еще несколько вариантов автозавершения. После того, как вы нажмете Ctrl-x, помимо Ctrl-k, о котором мы уже упоминали, вы также можете использовать:

  • Ctrl-l для завершения целых строк текста

  • Ctrl-i для завершения слов из текущего и включенного файлов

  • Ctrl-t для завершения слов из тезауруса

  • Ctrl-f для завершения имени файлов, к которым у текущего пользователя есть доступ

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

  1. Сначала вам нужно определить файл тезауруса. Вам нужно написать список синонимов, разделенных запятыми или пробелами в одну строку.

  2. Укажите местоположение файла тезауруса в вашем .vimrc:

    set thesaurus+=/home/jole/my_thesaurus.txt
  3. Используйте тезаурус по мере ввода, нажимая Ctrl-x Ctrl-t, чтобы заменить слово его синонимом.

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

Использование шаблонов файлов

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

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

!/usr/bin/env perl
#===========================================================================
#         FILE: filename.pl
#        USAGE: ./filename.pl
#  DESCRIPTION:
#      OPTIONS: ---
# REQUIREMENTS: ---
#         BUGS: ---
#        NOTES: ---
#       AUTHOR: YOUR NAME (),
# ORGANIZATION:
#      VERSION: 1.0
#      CREATED: 04/18/2017 08:58:16 PM
#     REVISION: ---
#===========================================================================
use strict;
use warnings;
use utf8;

Вот как включить эту функцию:

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

    mkdir ~/.vim/templates
  2. Создайте содержимое файла, который вы хотите предварительно загрузить. В этом примере давайте создадим простой шаблон для файлов .html:

    
    <html>
        <head>
            <title></title>
            <meta name="generator" content="Vim" />
            <meta name="author" content="Jovica Ilic"/>
        </head>
        <body>
            <p>Your content here.</p>
        </body>
    </html>
    

    назовите его html.tpl и сохраните в каталоге templates, который вы только что создали.

  3. Скажите Vim автоматически загружать этот шаблон каждый раз, когда вы создаете новый файл .html, добавив следующую строку в ваш .vimrc:

    :autocmd BufNewFile *.html 0r ~/.vim/templates/html.tpl

И это все. Если вы хотите добавить еще один шаблон для разных типов файлов, просто повторите последние два шага.

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

Как вы уже знаете, Ex-команды — это команды, которые вы выполняете в командном режиме, например :sort. Иногда вам нужно будет повторить последнюю команду Ex несколько раз. Вместо того, чтобы вводить ее снова, вы можете повторить последнюю команду Ex, набрав @: в нормальном режиме.

Это возможно благодаря доступному только для чтения регистру ":, известному как регистр двоеточия. Мы упоминали его только в главе Регистры, поэтому рассмотрим его здесь.

Всякий раз, когда вы выполняете команду в режиме Ex, такую как :write, она заполняет регистр двоеточия. Допустим, вы включили относительные номера строк с помощью команды set relativenumber в текущей сессии Vim. Теперь вы хотите сделать это изменение постоянным и поместить его в свой файл .vimrc. Открыв файл .vimrc, вы можете просто запустить ":p, чтобы вставить содержимое регистра двоеточия.

Вставка текста в режиме вставки

Вы находитесь в режиме вставки и хотите вставить скопированный текст, не переходя в нормальный режим. Вы можете сделать это с помощью Ctrl-r 0. Если скопированный текст содержит символы новой строки, Ctrl-r Ctrl-p 0 устранит проблемы с отступами.

Удаление в режиме вставки

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

  • Ctrl-h — удалить один символ назад (так же, как Backspace)

  • Ctrl-w — удалить одно слово назад

  • Ctrl-u — удалить обратно к началу строки или к началу текущей вставки

Повторяющиеся операции над поисковыми совпадениями

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

/MyString

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

Но в этом случае есть лучший способ: вместо cw используйте cgn. Затем просто нажмите клавишу . и Vim перейдет к следующему совпадению и изменит его для вас. В то время как c означает изменение, gn выполняет поиск последнего использовавшегося шаблона поиска и запускает визуальный режим для выбора совпадения.

Это также работает, если вы (вместо поиска с помощью /) используете *, которая ищет слово, находящееся в данный момент под курсором. Для получения дополнительной информации прочитайте :help gn.

Копирование строк без перемещения курсора

Ваш курсор находится в строке 10. Вы хотите вставить строку 20 на одну строку ниже текущей позиции курсора.

Вот как это сделать с помощью команды co[py]:

:20co.

Вы также можете использовать диапазоны. Допустим, ваш курсор находится в строке 10. Вы хотите вставить текст строк с 20 по 25 под строку 10. Вот как это сделать:

:20,25co10

Но можно сделать еще лучше: :t — это псевдоним команды co[py], так что вы можете сэкономить несколько нажатий клавиш. Вы можете запустить команды сверху и добиться того же результата, если замените в них co на t.

Эта команда также работает с относительными номерами строк. Например, чтобы вставить строку, которая находится на 10 строк выше текущей строки, в строку ниже текущей позиции:

:-10t.

Последний пример: если вы находитесь в строке 45, :35,t. сделает дубликат строк 35 до вашего курсора (то есть с 35 по 45 включительно) и поставит его после вашего текущего курсора.

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

:-15,t.

Перемещение строк без перемещения курсора

Использование команды m[ove] аналогично команде co[py]. Например, чтобы переместить строку 6 в строку 28, вы должны запустить:

:6m28

Она также поддерживает диапазоны и относительные строки. Вот пример использования обоих:

:-10,-5m+7

Эта команда возьмет пять строк, расположенных между строками 10 и 5 над вашей текущей позицией, и переместит их на 7-ю строку под вашей текущей позицией. После этой команды положение вашего курсора изменится. Чтобы вернуться в исходное место, где был ваш курсор до запуска этой команды, просто нажмите ''.

Удаление строк без перемещения курсора

Было бы здорово иметь возможность удалять строки, не перемещая курсор?

Подобно командам :copy и :move, вы также можете запустить команду :delete для удаления строк, не переходя к ним.

Например, чтобы удалить строки с 5 по 10, выполните:

5,10d

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

Ввод текста с заменой

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

Запуск одной и той же команды на нескольких строках

Используя команду norm, вы можете запустить одну и ту же команду сразу в нескольких строках. Допустим, вы хотите удалить все подстроки внутри одинарных кавычек ' во всех строках. Вот что вам нужно сделать:

:%norm di'
  • % — определяет диапазон: все строки.

  • normal[al] — команда, которая указывает Vim повторить следующую команду в нормальном режиме.

  • di' — удалить внутри одинарных кавычек '

Создание нумерованных списков

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

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

:put =range(1,10)

Вы также можете вставлять числа после определенного номера строки, например, команда:

:28put =range(6,87)

вставляет список чисел от 6 до 87 после строки номер 28.

Создание списка IP-адресов

Вы также можете использовать цикл для создания различных списков. В этом примере мы хотим создать список IP-адресов, начиная с 192.168.0.1 и заканчивая 192.168.0.100:

:for i in range(1,100) | put ='192.168.0.'.i | endfor

Результатом будет список IP-адресов в указанном диапазоне, с одним IP-адресом в строке.

Увеличение или уменьшение числа

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

Эти клавиши работают со счетом. Например, нажатие 4, а затем Ctrl-a увеличит следующее число на четыре (добавит 4).

Почему Vim 8 великолепен

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

Допустим, у вас есть что-то вроде этого в вашем коде:

array[0] = 0;
array[0] = 0;
array[0] = 0;
array[0] = 0;
array[0] = 0;

и вы хотите получить что-то вроде этого:

array[1] = 0;
array[2] = 0;
array[3] = 0;
array[4] = 0;
array[5] = 0;

Лучший способ сделать это:

  1. Поместите курсор на первую строку, на 0 которой должен стать 1.

  2. Нажмите Ctrl-v, чтобы войти в режим визуального блока, переместите курсоры вниз, чтобы выделить остальные нули, до последней строки.

  3. Теперь нажмите g, а затем нажмите Ctrl-a (сочетание клавиш для увеличения чисел).

Быстрое удаление/изменение до конца строки

Вы можете удалить всю строку с позиции курсора, выполнив команду d$. Это занимает три нажатия клавиш: d, Shift, $. Более быстрый способ сделать это двумя нажатиями клавиш: D. То же самое касается команды изменения. Вы можете изменить (удалить текст и войти в режим вставки) от позиции курсора до конца строки, нажав c$. Более быстрый способ: С.

Повторяющиеся символы

Вы хотите добавить 8 новых строк под текущую строку? Не вздумайте нажимать Enter 8 раз. Вместо этого запустите:

8i<Enter><Esc>

Вам нужно вставить 20 символов «-» (дефис)? Пожалуйста, не жмите - двадцать раз. Выполните:

20i-<Esc>

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

Очистка выделенных поисковых запросов

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

/adasdada

Эта строка не будет найдена и выделена, а ранее выделенная строка больше не будет выделена. Хотя это и самый простой способ сделать это, но он не очень крутой. Гораздо более приятным решением может быть создание собственного сокращения (shortcut) (в мире Vim мы называем это привязкой (mapping)) для запуска команды, которая очистит ранее выделенные строки.

Например, вы можете добавить это в свой .vimrc:

nmap <silent> ,/ :nohlsearch<CR>

В следующий раз вы можете быстро набрать ,/, чтобы очистить выделение. Такой вызов команды nohlsearch не изменяет значение параметра, поэтому, как только вы снова используете команду поиска, выделение возвращается.

Выполнение нескольких команд подряд

У вас есть возможность выполнить более одной команды. Все, что вам нужно сделать, это использовать | между командами. Например, предположим, что у вас есть предложение типа «Atom is bad and slow». и вы хотите запустить три разные команды замены.

%s/Atom/Vim/c | %s/bad/good/c | %s/slow/fast/c

Этот пример заменяет Atom на Vim, затем переходит к замене bad на good и, наконец, заменяет slow на fast. Обратите внимание, что вторая и последующие команды выполняются только в том случае, если предыдущая команда выполнена успешно.

Это не сработает для таких команд, как :argdo или :bufdo, поскольку они используют | для выполнения ряда команд.

Однако вы можете использовать команду :execute:

:exe "argdo %s/bad/good/e" | exe "bufdo %s/old/new/e" | echo "done"

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

Интеграция с внешней программой

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

:%!<command>

Вот несколько примеров, чтобы дать вам представление о том, насколько мощной может быть эта функция:

  • :%!sort -k3 — сортировать буфер по столбцу 3

  • :%!column -t — форматировать текст столбцами (полезно при работе с табличными данными)

  • :%!ls|grep .txt — вставить список txt файлов из текущего каталога

Проявив немного творчества, вы можете творить чудеса!

Автоматическое удаление пробелов в конце

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

" выделить конечные пробелы
match ErrorMsg 's+$'
" автоматически удалить завершающие пробелы
autocmd BufWritePre * :%s/s+$//e

Ну да, на самом деле это всего четыре строки. Но комментарии всегда полезны.

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

Вам нужно отредактировать файл внутри архива? Что ж, вам придется распаковать архив, отредактировать файл и сохранить изменения, а затем создать новый архив с обновленным файлом. Хотя нет!

С Vim вы можете открывать и редактировать файлы внутри архивных файлов без предварительного их извлечения. Поддерживаются несколько типов архивов, например .zip, .tar, .tar.gz, .jar и т. д. Например, вы можете запустить:

$ vim my_archive.tar.gz

и вы увидите все файлы и каталоги внутри my_archive.tar.gz. Вы сможете просматривать их, открывать, редактировать и сохранять.

Открытие последнего отредактированного файла

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

Просто запустите Vim и нажмите Ctrl-o-o.

Навигация по истории курсора

Как мы уже говорили, в Vim есть разные типы списков для разных целей. Еще два списка, о которых стоит упомянуть, это Jumplist и Changelist.

Вкратце, Jumplist хранит каждую позицию, на которую перешел ваш курсор, а Changelist хранит каждое изменение (фактически его позицию), которое можно отменить (с помощью undo).

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

Легко. Научитесь перемещаться по этим двум упомянутым спискам.

Вы хотите переместиться по Jumplist? Это делается так:

  • Ctrl-o — двигаться назад

  • Ctrl-i — двигаться вперед

Для перемещения по Changelist используйте:

  • g; — двигаться назад

  • g, — двигаться вперед

Если вы находите эту функцию полезной, см. :help jumps и :help changes. Есть несколько неожиданных и интересных вещей, которые там можно обнаружить.

Инвертирование выделения

Вы можете легко выполнить команды Ex [cmd] в строках в пределах [range], где {pattern} НЕ совпадает, используя команду :v. Вот ее структура:

:[range]v[global]/{pattern}/[cmd]

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

:v/127.0.0.1/d

Быстрое переключение буферов

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

На самом деле в Vim для этого есть сокращение: Ctrl-^. Но пользоваться им не очень удобно, особенно если пользоваться им нужно часто.

Хорошей идеей было бы создать привязку для ваших предпочтений. Вот пример:

" Возврат к последнему отредактированному буферу
nnoremap <C-b> <C-^>
inoremap <C-b> <esc><C-^>

При этом вы можете переключаться между двумя файлами, просто используя сочетание клавиш Ctrl-b.

Исправление отступов во всем файле

Для отступа текущей строки вы должны запустить ==, а для отступа на 4 строки ниже текущей строки вы должны запустить 4==. Чтобы сделать отступ блока кода, вы можете поместить курсор в одну из фигурных скобок и использовать команду =%.

Чтобы исправить отступ во всем файле, запустите gg=G. Команда gg перенесет вас в начало файла, команда = — это команда отступа, а G в конце указывает Vim выполнить команду отступа до конца файла.

Глава 20
Плагины

Мир плагинов Vim огромен. И продолжает расти. Существует так много очень полезных плагинов, что даже сложно отследить лучшие из них.

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

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

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

Есть много менеджеров плагинов, и лишь немногие из них действительно хороши. Один из этих немногих называется Vundle. Вы можете получить больше информации о Vundle по адресу: https://github.com/VundleVim/Vundle.vim.

Как установить менеджер плагинов Vundle

Мы предполагаем, что ваш основной каталог Vim находится в ~/.vim. Первый шаг — запустите следующую команду в терминале:

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

Затем поместите следующий код в начало файла .vimrc:

set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
" filetype plugin on

Это минимальный пример, но он показывает вам самые важные части. Итак, после того, как вы поместите этот код в свой .vimrc, сохраните его и закройте сессию Vim. Снова запустите Vim и выполните команду :PluginInstall. Она откроет новое разделенное окно и запустит установку ваших новых плагинов, в данном случае только Vundle. Это все, что нужно для установки Vundle.

Как установить новый плагин

Большинство лучших плагинов размещены на github.com. Один из замечательных плагинов для продвинутых пользователей Vim называется targets.vim и доступен по адресу: https://github.com/wellle/targets.vim.

Чтобы установить этот плагин, добавьте строку Plugin wellle/targets.vim в ваш .vimrc в нужном месте, например:

call vundle#begin()

Plugin 'VundleVim/Vundle.vim'
Plugin 'wellle/targets.vim'

call vundle#end()

Очень важно добавлять все свои плагины между строками call vundle#begin() и call vundle#end(), как в примере выше. Затем нужно запустить команду :PluginInstall.

Наиболее важные команды Vundle:

  • :PluginList — список установленных плагинов.

  • :PluginInstall — установка плагинов (добавьте ! для обновления или просто :PluginUpdate)

  • :PluginClean — удаление неиспользуемых плагинов (добавьте ! для автоматического подтверждения удаления)

Чем меньше плагинов вы используете, тем лучше. По крайней мере, я так думаю. Перед установкой плагина, чтобы получить какую-то функцию, всегда пытайтесь найти существующее решение в Vim. Очень часто бывает так, что вам не понадобится новый плагин. Если вы хотите узнать, какие плагины наиболее популярны среди пользователей Vim, посетите https://vimawesome.com.

Глава 21
Что дальше

Прежде всего, поздравляю с завершением этой книги! :) Я надеюсь, что вы нашли ее полезной.

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

В Vim есть чему поучиться! Для большинства людей изучение и совершенствование навыков работы с Vim — это длительный процесс. Всегда есть какая-то новая команда или новый совет, чтобы улучшить то, как мы работаем в Vim. Я говорю это не для того, чтобы вас напугать, а для того, чтобы пригласить вас в это веселое путешествие. Да, улучшать свои навыки работы с Vim годами — это действительно весело!

В качестве первого следующего шага я бы посоветовал вам подписаться на мою бесплатную рассылку новостей о Vim. Она доступна на http://masteringvim.com. Таким образом, вы будете получать новые советы по Vim и лучшие сообщения в блогах, которые я собираю от сообщества Vim по всему миру, обычно раз в неделю.

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

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

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

Удачи, мой друг, и получайте удовольствие! :smile

Глава 22
Рекомендации

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

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

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

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

И теперь, вместо того, чтобы пытаться перечислить какие-либо ссылки, которые я мог бы вспомнить, я предпочитаю сказать большое СПАСИБО всему сообществу Vim по всему миру и всем, кто делится знаниями по этой теме!

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

Глава 23
Об авторе

Меня зовут Йовица Илич, в настоящее время я работаю системным администратором.

Я верю, что в конце концов все будет хорошо. Я знаю, что ничего не потеряно, пока не потеряно все.

Если вы хотите связаться со мной, пишите по адресу contact@jovicailic.org. Вы также можете найти меня в Твиттере под именами @jovica и @MasteringVim.

Пока :smile

Йовица.

Берлин, апрель 2018 (7537)

Понравилась статья? Поделить с друзьями:
  • Руководство управление персоналом подразделения
  • Тестер ms8910 smart smd tester инструкция на русском
  • One step раствор для линз инструкция по применению
  • Авастин 400 мг инструкция по применению
  • Гель прожестожель цена инструкция по применению цена отзывы аналоги