settler 01.11.2010 01:08

ПереводыВозвращение к Vim - Часть 1

Я программист. Я работаю с текстовыми файлами по 6-12 часов в сутки, поэтому выбор текстого редактора для меня критичен. Если смена редактора увеличит эффективность моей работы хотя бы на 10%, значит я сэкономлю время и займусь чем-нибудь приятным.

Я не куплюсь на аргументы "90% времени ты думаешь, и только 10% - пишешь, поэтому редактор не имеет значения". Даже если утверждение верно, выводы - нет.

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

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

Обо мне


Я пользовался исключительно Vim примерно с 2002 по 2005 год. Я никогда особо не читал о нем и использовал его, в основном, как всем известный nano.

В 2006 я решил, что пора что-то менять. Я хотел редактор, который "вписывается" в OS X. Некоторое время я пробовал SubEthaEdit, и это было круто. Совместное редактирование было отточено больше, чем в любом другом редакторе, который я когда-либо видел, хотя я его и применял не очень много.

Каким бы не был крутым SubEthaEdit, я всегда чувствовал, что есть еще лучше. Потом я нашел TextMate.

В то время я думал, что TextMate превосходен (и он действительно был таким). Он выглядел как приложения Mac. Изучить было очень просто (все команды для работы с текстом в OS X просто работали). А еще для него были расширения.

Изредка я все еще использовал Vim (например, когда нужно было что-то сделать, а в наличии была только машина с Windows), но в основном я был ребенком TextMate.

После четырех лет пользования TextMate-ом я решил что пришло время для еще одной перемены. Разработка на TextMate застопорилась, когда TextMate Forever (будущий TextMate 2) застопорился в разработке. Я задумался о Vim (и начал читать блоги других людей об опыте перехода на него) и решил дать ему еще один шанс.

Несколько месяцев назад я купил книгу Learning the vi and Vim Editors и, отказавшись от всех редакторов, начал разбираться с Vim, как основным. С того времени я не оглядывался назад.

Почему я перешел на TextMate


Как я уже говорил, я перешел на TextMate по нескольким причинам.

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

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

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

Почему я вернулся к Vim


Я вернулся к Vim по ряду причин.

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

Другая причина — система контроля версий. С недавнего времени я храню свои конфиги в репозитории Mercurial, благодаря чему их легко переносить на новые машины. Vim использует конфигурацию из двух простых источников: простой файл ~/.vimrc и папка ~/.vim, где находятся текстовые файлы.

Текстовые конфиги и плагины Vim очень хорошо сочетаются с системой контроля версий. К ним удобно применять diff, в отличии от множества папок расширений в TextMate и ужасного XML.

Сообщество Vim существует значительно дольше, чем сообщество TextMate, так что доступен значительно более широкий набор плагинов, пакетов и файлов подсветки синтаксиса.

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

Основные отличия


На мой взгляд, Vim и TextMate сильно отличаются. Для чего-то большего, чем просто редактирование текста, в TextMate применяются, в основном, клавиатурные комбинации (использующие Shift, Ctrl, Cmd и Alt). С той же целью Vim использует идею "модального редактирования".

Философия TextMate, в основном, такая же, как в любом нормальном приложении OS X. Я уже говорил, что действуя как в ОС, уменьшается барьер вхождения в текстовый редактор. Так почему же я предпочёл философию Vim?

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

Назовем мою проблему с философией TextMate одним словом: "непрозрачность".

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

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

Режим вставки Vim означает, что, когда я редактирую текст, я использую обычные способы передвижения по тексту OS X, которые я знаю и люблю. Когда же я хочу сделать что-то особое, я вхожу в "нормальный" режим и не беспокоюсь о неизвестных командах (это можно сделать при помощи клавиши Vim "leader" ).

"Чувство" Vim


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

"Язык" редактирования текста


Чтобы понять команды нормального режима Vim надо думать о них, как о языке. У вас есть "глаголы" и "существительные". К примеру: команда "изменить" ("change" - c) будет глаголом, а "слово" ("word" - w) — существительным. Вы можете комбинировать их чтобы сформировать предложения, которые расскажут о том, что вы хотите сделать с текстом.

Самое замечательное в том, что, выучив новый глагол (как "удалить" ("delete" - d)), вы можете сразу применять его к существительным, которые знаете, и наоборот.

У Vim также есть "наречия", такие как "внутри" ("inside" - i) или "вокруг" ("around" - a), которые позволяют вам сочинять предложения "изменить внутри скобок" ("change inside parenthesis" - ci( или cib). Однажды выучив одно из них, вы можете сразу применять их ко всем глаголам и существительным, которые уже знаете.

Физика текста


Второй способ описать чувство Vim - это "физика". Это ещё менее конкретное описание, но, думаю, что оно будет полезно.

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

Операторы/действия/глаголы Vim действуют так же. Эффект от daw сильно отличается от эффекта da{, но их можно понять при помощи простого принципа: da<что-то> удалит то, что находится около этого (delete around <что-то>).

"Программируйте" редактирование


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

Эту аналогию часто можно услышать от программистов (что очевидно), и, думаю, это не только их мнение.

Первое: базовые команды редактирования Vim могут быть похожи на вызовы функций. daw может быть представлена как запуск функции delete(type='word', around=True). Я не думаю таким образом (мне больше нравится пользоваться языковыми и физическими аналогиями), но другие поступают именно так.

Я не воспринимаю базовые команды vim как программирование и замечаю некоторые его аспекты в других областях. Например, я назначу на leader команду в моём файле ~/.vimrc:

1
nnoremap &lt;leader>1 yypVr=


Я представляю это, как назначение на <leader>1 функции, которая выполнит следующие действия:

Скопировать текущую строку.
Вставить ниже (и затем переместиться на вставленную версию).
Выбрать скопированную строку.
Заменить все символы на =.

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

Начало


Когда я вернулся к Vim, то сделал пару вещей, которые помогли мне в переходе.

Первое: я купил Learning the vi and Vim Editors и прочитал ее от корки до корки. Из этой книги я немного узнал историю Vim и научился основным командам редактирования в нем.

Также я просмотрел subreddit, в поисках хороших постов о переходе в блогах. Опыт тех, кто писал об этом, очень помог.

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

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

Делаем Vim удобней


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

Вот несколько вещей, которые я сделал, чтобы сделать Vim более удобным.

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

Важные строки в .vimrc


Я не буду объяснять каждую строку в моем ~/.vimrc, но вот несколько строк, без которых я просто не могу обойтись.

Первое, пару строк, которые должны быть у каждого:

1
2
3
4
5
filetype off
call pathogen#runtime_append_all_bundles()
filetype plugin indent on
set nocompatible
set modelines=0



Строки с filetype и call загружают Pathogen (подробнее о нем в описании расширений). Чтобы понять, почему тут первая строка с filetype смотрите документацию к Pathogen.

set nocompatible избавляет от всего хлама, который делает Vim совместимым с vi. 2010 год на дворе — хватит поддерживать совместимость в ущерб функциональности.

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

Потом я устанавливаю настройки табуляции:

1
2
3
4
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab


Мне нравится, когда табы раскрываются в 4 пробела. Чтобы больше узнать об этих опциях, посмотрите этот Vimcast.

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

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set encoding=utf-8
set scrolloff=3
set autoindent
set showmode
set showcmd
set hidden
set wildmenu
set wildmode=list:longest
set visualbell
set cursorline
set ttyfast
set ruler
set backspace=indent,eol,start
set laststatus=2
set relativenumber
set undofile


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

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

Меня почти никогда не волнует номер строки, на которой я сейчас нахожусь (и если мне надо, я всегда могу увидеть его в статусной строке), поэтому я не скучаю по нормальной нумерации строк. Меня волнует как далеко находится нужная линия, потому что это говорит мне какое число нужно использовать в таких командах как d<ЧИСЛО>d.

undofile указывает Vim, что нужно создавать файлы <FILENAME>.un~, когда вы редактируете файл. Эти файлы содержат информацию для отмены выполненных действий, так что вы сможете отменять действия даже после того как закроете и откроете файл.

Следующим я меняю клавишу :

1
let mapleader = ","


Мне проще набирать , чем \. Я использую leader-комманды постоянно, поэтому ее стоит сменить.

Следующее что я делаю, это ручной поиск/перемещение:

 1
2
3
4
5
6
7
8
9
10
11
nnoremap / /\v
vnoremap / /\v
set ignorecase
set smartcase
set gdefault
set incsearch
set showmatch
set hlsearch
nnoremap &lt;leader>&lt;space> :noh&lt;cr>
nnoremap &lt;tab> %
vnoremap &lt;tab> %


Первые две строки исправляют сломанную по-умолчанию обработку регулярных выражений, автоматически вставляющую \v перед каждой строкой которую вы ищете. Это выключает в Vim сумасшедшие regex-символы и поиск использует нормальные. Я уже знаю Perl/Python-совместимое форматирование регулярных выражений, зачем мне учить другую схему?

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

gdefault применяет замены к строкам. К примеру, вместо: %s/foo/bar/g вы пишете просто: %s/foo/bar/. Это почти всегда соответствует желаемому (когда вы последний раз хотели заменить только первое вхождение слова в строке?). Для использования старого способа просто снова добавьте g.

incsearch, showmatch и hlsearch работают вместе, для подсветки результатов поиска (по мере набора). Это очень удобно, так как у вас так же есть поиск следующей строки.

Привязка <leader><space> позволяет легко очистить результаты поиска, набрав ,<space>. Это позволяет избавится от отвлекающей подсветки, когда нужное уже нашлось.

Последние две строки позволяют клавишей Tab искать пары скобок. Я использую это для переключения. Нажимать <tab> в сто раз проще, чем набирать %.

Следующая часть заставляет Vim правильно обрабатывать длинные строки:

1
2
3
4
set wrap
set textwidth=79
set formatoptions=qrn1
set colorcolumn=85


Эти строки управляют моими настройками переноса строк и выделяют цветом столбец с 85 символом (длинная строка становится заметней).

Чтобы узнать больше смотрите :help fo-table и Vimcast по soft wrapping и hard wrapping.

Это должно понравится тем, кто перешел с TextMate:

1
2
set list
set listchars=tab:?\ ,eol


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

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

 1
2
3
4
5
6
7
8
9
10
nnoremap &lt;up> &lt;nop>
nnoremap &lt;down> &lt;nop>
nnoremap &lt;left> &lt;nop>
nnoremap &lt;right> &lt;nop>
inoremap &lt;up> &lt;nop>
inoremap &lt;down> &lt;nop>
inoremap &lt;left> &lt;nop>
inoremap &lt;right> &lt;nop>
nnoremap j gj
nnoremap k gk


Это отключит клавиши стрелочек в нормальном режиме, чтобы вы приучились пользоваться hjkl. Поверьте мне, вы хотите научиться использовать hjkl. Долгая игра в Nethack также помогает.

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

Также это заставляет j и k делать то, что вы ждете от них, а не работать в каком-то архаичном "движение по строкам файла, вместо строк экрана" стиле.

Далее, избавимся от этого проклятого хелпа, в который вы будете постоянно попадать, пытаясь нажать на escape:

1
2
3
inoremap &lt;F1> &lt;ESC>
nnoremap &lt;F1> &lt;ESC>
vnoremap &lt;F1> &lt;ESC>


Мне нравится чтобы ; делало то же, что и : — это избавит еще от одного нажатия клавиши, когда я хочу сохранить файл:

1
nnoremap ; :


Я не переназначаю : на ; потому что это, кажется, мешает куче плагинов.

Наконец, мне очень нравится в TextMate функция "сохранить при потере фокуса". Я не припомню случая, когда я не хотел сохранить файл, после переключения на другое окно (особенно с контролем версий и бесконечным undo в Vim):

1
au FocusLost * :wa


Это самые важные куски моего ~/.vimrc. Дальше я раскажу о раздолье для настроек, которым в Vim является клавиша <leader>.


Это первая часть перевода. Продолжение
Оригинал
Переведено при помощи сервиса translated.by инициативной группой переводчиков welinux при участии пользователей settler, Shtsh, Zereal, blackraven.


Тэги: editors vim переводы
+ 31 -
Похожие Поделиться

vvlinux 01.11.2010 01:21 #
Когда уже эти упоротые набиратели текста повзрослеют и перестанут делать из ТЕКСТОВОГО РЕДАКТОРА IDE?
settler 01.11.2010 01:24 #
пользуйтесь дальше notepad.exe ;) можете даже через вайн
saver 01.11.2010 05:56 #
Аж прослезился, трогательная история. Этому чуваку бы романы писать, а не обзоры. Не люблю я такие статьи, куча текста, профита минимум (кроме отключения стрелок, варварство какое-то!).
vvorth 01.11.2010 07:30 #
Профит не в том чтобы тебе дать готовый конфиг, а показать что можно и мужно для начала ознакомится с темой(ссылок автор дал много - уже профит) и настроить.

Судя по большому количеству комментариев на тему "vi(m) не нужен" - многим не хватает терпения, или смелости просто попробовать разобраться, а статья эта помогает чуть ли не больше других в этом.
saver 01.11.2010 07:35 #
Пользуюсь вимом давно и не помню сколько, таких тем не нужно, т.к. несмотря на то, что многие недопонимающие говорят "Посиди месяц на виме и познаешь истину", он мне понравился с первых минут, другое дело чтобы КПД вырос нужно работать в нем постоянно, для начала на правках конфигов, а потом уже как IDE. Вот и вся суть - "Это всего лишь редактор!", но никак не объект поклонения.

Спасибо автору за старание, ребятам за перевод.
vvlinux 01.11.2010 10:21 #
Судя по твоим словам ты только тем и занимаешься целый день что правишь конфиги.
Скажи, зачем?
saver 01.11.2010 10:23 #
Админом я работаю на unix, еще вопросы?
vvlinux 01.11.2010 10:35 #
Да всё тот же вопрос.
И дополнительный: ты что, хреновый админ? Разве ты не должен целый день сидеть в серверной и плевать в потолок в то время как система просто работает?

> ... а потом уже как IDE
и ты ту да же
saver 01.11.2010 10:42 #
А кто говорит что я чиню или ломаю? Видимо ты не очень осведомлен в работе админа, не виндового... Технологии не стоят на месте, наноlinux уже рядом! =)

Про IDE, это к тому, что рано или поздно админ начинает программировать и мне удобно пользоваться тем, к чему я привык, вот и затачиваю "свой" вим под IDE для java.
vvlinux 01.11.2010 10:58 #
А кто сказал что ты чинишь и ламаешь?
И вообще, раскажи нам, unix админ, почему ты так зациклен на редактировании конфигов.

> мне удобно пользоваться тем, к чему я привык
боюсь себе представить твоё положение сейчас (мыши, кактус) если бы ты был виндовс-админом )
судя по твоей логике, делал бы из notepad'а IDE, верно?
Zereal 01.11.2010 11:01 #
Предупреждение: смените тон и манеру общения на ресурсе.
Ваши комментарии к данной записи вызывают желание забанить.
vvlinux 01.11.2010 11:06 #
Великодушный Модератор, не могли бы Вы показать мне где имено Вы узрели агрессию или неуважение в моих словах?
Zereal 01.11.2010 11:14 #
в первом же Вашем комменте.
Прошу воздержаться от сторонних дискуссий и высказываться по теме.
адекватность других и зацикливание на конфигах можно обсудить в личке.
vvlinux 01.11.2010 11:24 #
Я, как мне кажется, высказываюсь строго по теме.
DobrijZmej 01.11.2010 11:34 #
тема - vim. каким боком тут конфиги ?
vvlinux 01.11.2010 12:32 #
так и не я первым начал про конфиги
saver 01.11.2010 11:23 #
notepad не vim


vvlinux 01.11.2010 11:27 #
Оба - текстовые радакторы.
Так что вы не правы.
DobrijZmej 01.11.2010 11:32 #
различны по возможностям
saver 01.11.2010 11:32 #
Господин Холмс перелогиньтесь, вашей проницательности и логики нет предела
vvlinux 01.11.2010 12:33 #
вы должно быть ошиблись окном
thoughtful_fox 01.11.2010 11:16 #
Вот чего вы на тролля внимание обращаете?
Он же с пеной у рта будет доказывать, что ВизуалСтудио лучше вима.

эх.

А для джавы рекомендую посмотреть в сторону eclim
DobrijZmej 01.11.2010 11:57 #
Вот чего вы на тролля внимание обращаете?

ну прикольно-же =)
or10n 01.11.2010 19:18 #
не надо путать админа-эникейшика в конторе из 5 человек,
и того же админа на хостинге или у провайдера
Zereal 01.11.2010 09:24 #
Это только первая часть статьи.
K900 01.11.2010 09:16 #
Очень круто, уже сам думаю попробовать :) Даешь неделю Ъ-редакторов на мылинуксе!
enot 01.11.2010 14:30 #
Даешь неделю Ъ-редакторов на мылинуксе!

уже прошла

вот это просто нечто, гениально!
nnoremap <up> <nop>
nnoremap <down> <nop>
nnoremap <left> <nop>
nnoremap <right> <nop>
inoremap <up> <nop>
inoremap <down> <nop>
inoremap <left> <nop>
inoremap <right> <nop>

спасибо за статью.
razum2um 02.11.2010 19:21 #
хотел пошутить про стрелочки на намлоке, но попробовал и обломался >
f0y 01.11.2010 14:24 #
Одна из самых лучших статей по виму, которые я видел...
enot 01.11.2010 14:39 #
да, кстати, рекомендации автора переназначить ; и , - не самая лучшая идея. ; и , довольно полезны, они позволяют производить повторный поиск(последней команды F или f) вперед(;) и назад(,)
mamay 01.11.2010 15:21 #
omgfs!!! Позвольте полюбопытствовать - зачем долго и нудно клацать по клаве если можно просто открыть, например, mcedit и отредактировать кусок текста не парясь мыслью о том какую комбинацию клавиш нажать чтобы начать изменять текст ?
Я согласен - аскетичность не порок!!!
Но я хочу ездить на экономичном, быстром и безопасном современном автомобиле а не на машине начала 18го века с паровым двигателем...
Shtsh 01.11.2010 15:31 #
Но я хочу ездить на экономичном, быстром и безопасном современном автомобиле а не на машине начала 18го века с паровым двигателем...

Вот поэтому и нужен vim :)
or10n 01.11.2010 19:21 #
а как ты в мцедите (или нано) будешь редактировать файл в кодировке CP1251 ?
yuretsz 01.11.2010 20:19 #
mcedit это как раз про паровой двигатель.
mamay 02.11.2010 14:38 #
а как ты в мцедите (или нано) будешь редактировать файл в кодировке CP1251 ?

1) iconv никто не отменял
2) mcedit как пример - необязательно именно он
mamay 02.11.2010 14:49 #
но дело даже не в этом,
я считаю что vim
mamay 02.11.2010 14:49 #
заставляет делать слишком много телодвижений
sergicus 02.11.2010 17:02 #
за статью спасибо
razum2um 02.11.2010 19:14 #
"Язык" редактирования текста

разрыв шаблона. он прав.
TiGR 03.11.2010 01:49 #
Буквально сегодня это ощутил впервые, когда особо не помня никаких команд начал редактировать файл в виме, при этом проговаривая про себя названия команд. И тут оно сработало, Ряд действий получилось сделать реально быстрее, чем в обычном редакторе, и это почти при нулевой практике (vimtutor и так, по мелочам).