Shtsh 01.11.2010 12:46

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

Продолжение

Используем Leader

В Vim выделена целая клавиша для пользовательских настроек. Она называется "leader" и по-умолчанию назначена на \. Как я упоминал в предыдущем разделе, я предпочитаю использовать вместо нее , .

У любого есть несколько вещей, которые он часто вводит или исполняет и хочет создать для них ярлыки. Leader — своего рода "пространство имен", которое отделяет эти настройки, чтобы не допустить перекрывания ими стандартных команд.

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

Я использую ,W чтобы обрезать все лишние пробелы в текущем файле, так я могу быстро очищать текст:
1
nnoremap &lt;leader>W :%s/\s\+$//<cr>:let @/=''&lt;CR>


Я много пользуюсь Ack (описан ниже), поэтому я назначил leader-клавишу для него:
1
nnoremap &lt;leader>a :Ack


Я часто работаю с HTML, поэтому ,ft у меня привязано к функции "fold tag":
1
nnoremap &lt;leader>ft Vatzf


Также я работаю с Ником Серджантом, и он любит, чтобы его CSS-свойства были отсортированными, поэтому ,S у меня назначена для их сортировки:
1
nnoremap &lt;leader>S ?{&lt;CR>jV/^\s*\}?$&lt;CR>k:sort&lt;CR>:noh&lt;CR>


Следующие привязки имитируют TextMate-овскую функцию Ctrl+Q, для переразбивки переносов абзацев текста:
1
nnoremap &lt;leader>q gqip


У меня есть привязка ,v чтоб выделять текст, который только что вставил, так что я могу выполнять команды (как отступы) над ним:
1
nnoremap &lt;leader>v V`>


Эта последняя привязка позволяет мне быстро открывать мой файл ~/.vimrc в вертикально разделенном окне, так что я могу быстро дописывать в него что-то на ходу.
1
nnoremap &lt;leader>ev &lt;C-w>&lt;C-v>&lt;C-l>:e $MYVIMRC&lt;cr>



Более быстрый выход

Есть одна вещь, которую вы должны найти самостоятельно в vim, постоянно пользуясь ею — это переключение из режима вставки в нормальный режим. Способ по умолчанию — использовать для этого Escape, но эта клавиша далеко, и её тяжело нажимать.

Другой способ — использовать Ctrl+C или Ctrl+<, но мне не нравятся такие сочетания для чего-то часто используемого.

Лично я использую jj, чтобы выйти обратно в нормальный режим. Единственный раз, когда мне действительно нужно было набрать jj подряд — сейчас, когда я пишу эту статью, так что это не мешает нормальной печати.
1
inoremap jj &lt;ESC>



Работа с разделённым окном (сплитами)

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

Но стандартные команды для взаимодействиями со сплитами довольно громоздкие. Для удобства работы я добавил несколько назначений клавиш в мой ~/.vimrc.

Сначала я сделал так, чтобы ,w открывал новый вертикальный сплит и переключался на него. Ведь, действительно, как часто вы разделяете окно и не хотите ничего в нём делать?
1
nnoremap &lt;leader>w &lt;C-w>v&lt;C-w>l


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

Следующий набор назначает ; для выполнения команд по передвижению по сплитам. Если вы переназначите клавишу capslock на Ctrl, то получится очень удобная навигация.
1
2
3
4
5
6
7
nnoremap &lt;C-h> &lt;C-w>h

nnoremap &lt;C-j> &lt;C-w>j

nnoremap &lt;C-k> &lt;C-w>k

nnoremap &lt;C-l> &lt;C-w>l



Эстетика

Я знаю людей, которые скажут: "внешний вид не имеет значение, единственная важная вещь — функциональность". Это совершенно неправильно.

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

Сначала установите MacVim. Благодаря этому Vim будет выглядеть (и вести себя) как нативное приложение Mac. Тогда Vim не будет вяглядить инородным телом среди других приложений. Пользователи Windows и Linux, возможно, захотят использовать gvim.

Затем выберите подходящий шрифт. Я предпочитаю Menlo с 12 кеглем. Вам могут понадобиться другие настройки, но хотя бы попробуйте несколько разных и определите баланс между высотой строки (ведь нужно видеть много строк на экране) и читабельностью (перечёркнутые нули, пожалуйста).

Наконец, найдите хорошую цветовую схему. Я использую слегка модифицированную версию Molokai (порт темы Monokai от TexMate) с тех пор, как я перешёл на Vim, но недавно начал играться с Mustang и Clouds Midnight. Потратьте время и найдите что-нибудь на свой вкус.

Вот мои текущие настройки:
скриншот

Используемые расширения


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

Pathogen

Прежде всего скажу что, Pathogen, который делает управление другими плагинами Vim безболезненным. Вместо того, чтобы разбрасывать их файлы по папке ~/.vim/, вы можете держать их в одной папке в ~/.vim/bundles/.

Установите его и будьте благоразумны.

PeepOpen

Одной из "киллер-фич" TextMate является комбинация Cmd+T, которая позволяет быстро открывать файлы вводя фрагменты их имени.

Есть несколько таких плагинов. Мой любимый — PeepOpen. Да он работает только в OS X и стоит денег, но он стоит их. Он хорошо выглядит и "просто работает".

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

Если вы не используете OS X (или хотите свободную альтернативу), я слышал, что плагин Command-T довольно хорош.

NERDTree

Это плагин, о котором упоминается почти во всех постах вида "переходим на vim". Это маленький плагин для отображения всех файлов в проекте, и он отлично работает. Нет лучшего плагина, похожего на "TextMate file-drawer".

NERDCommenter

Хотите комментировать и раскомментировать код нажатием пары клавиш? Вам нужен NERDCommenter. Я был удивлён, когда узнал, что в Vim нету такой встроенной возможности, но NERDCommenter это исправляет.

Вообще, я использую этот плагин только для одной функции: "переключить комментарий" с <leader>c<space>:. Эта функция — то, ради чего стоит его поставить.

Ack

Если вы программист и не знаете об Ack, то вам нужно сейчас же начать его использовать. Он намного, намного лучше grep.

Плагин Ack для Vim интегрирует Ack с quickfix-окном Vim и позволяет вам легко искать и переходить к результатам.

Как я упоминал в части про привязки leader, я назначил ,a на включение Ack и подготовку к поиску.

Snipmate

Еще одной особенностью TextMate, которая меня впечатлила, когда я ее впервые увидел, были сниппеты (snippets). SnipMate — это плагин для Vim, который эмулирует сниппеты TextMate-а.

Он также сохраняет их в удобных для контроля версий простых текстовых файлах, что является преимуществом над сниппетами TextMate-а.

Sparkup

Sparkup это хороший порт Zen Coding для Vim. Если вы в основном пишете HTML, то этот плагин сэкономит вам тонны набранного текста.

В двух словах, он позволяет вам вводить что-то типа:
1
div.content>h1.post-title+p{Sample Content}


Нажмите Cmd+E и он будет развернут до:
1
2
3
4
5
6
7
<div class="content">

<h1 class="post-title"></h1>

<p>Sample Content</p>

</div>


Так намного меньше набранного текста и со временем становится еще меньше.

Yankring

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

К примеру, после того как вы вставили текст, вы можете заменить его тем, что вы копировали до этого, с помощью Ctrl+P. Вы можете переключатся назад дальше, просто ножимая Ctrl+P снова и снова.

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

Также вы можете увидеть список всех ранее скопированных фрагментов текста с помощью :YRShow. Очень удобно привязать эту команду к какой-то клавише:
1
2
3
nnoremap &lt;silent> &lt;F3> :YRShow&lt;cr>

inoremap &lt;silent> &lt;F3> &lt;ESC>:YRShow&lt;cr>


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

Surround (and Repeat)

Еще один плагин Тима Попа, которым я все время пользуюсь — это плагин Surround. Он добавляет еще один слой к физике Vim: "вращающиеся предметы".

Например, вы можете "изменить вокруг апострофы на кавычки" (“change surrounding single quotes to double quotes”) используя cs'". Или же если вы пишете что-то разметкой и хотите выделить слово курсивом, то можете использовать ysiW*.

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

Плагин Repeat необходим чтоб сделать действия с surround повторяемыми через ..

Slime

Пользователи Emacs часто говорят о SLIME как одной из его киллер-фич. И он великолепен при написании LISP-кода.

В Vim нету ничего подобного. Он не интегрирован с каким-нибудь языком, как Emacs с LISP. Однако вы можете получить часть мощи SLIME в Vim.

Jonathan Palardy написал маленький плагин для Vim, названный Slime.vim, который позволяет легко взаимодействовать с экранными сессиями, что, возможно, единственный способ запустить REPL для таких языков как LISP, Python или Ruby.

Общий смысл в том, что вы запускаете LISP в экранной сессии, затем переходите в Vim и используете Ctrl+C Ctrl+C для помещения участков кода из окна Vim в сессию.

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

Лично я использую слегка модифицированную версию с несколько меньшей гибкостью, не нужной мне в ближайшее время. Может, когда-нибудь я буду использовать его более полно и добавлю его в репозиторий на BitBucket и GitHub.

Scratch

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

Я привязал его к <leader><tab> и использую с slime, чтобы быстро вставить кусок кода в REPL, присутствие которого не нужно в реальном файле.

Rainbow Parentheses

Rainbow Parentheses — это плагин, который раскрашивает кавычки, квадратные скобки, круглые скобки и угловые скобки соответственно их паре.

Лучший способ описать это показать скриншот.
rainbow.png

Я использую слегка изменённую версию. Я привязал её к <leader>R выключил по умолчанию. Когда я работаю с большими кусками кода с большим количеством скобок, я просто жму <leader>R и получаю цветную картинку, которая помогает ориентироваться.

Нужные мне возможности

Хотя vim действительно моё любимый редактор, этот пост будет неполным без перечисления некоторых недостатков.

Если кто-то исправит/реализует какие-нибудь из них, я с радостью куплю ему пива.

Нормальная подсветка HTML

Я часто использую HTML. Есть вещь, которая меня бесит — "умная" подсветка HTML. Я пробовал разные комбинации cindent, smartindent и autoindent, и я не смог добиться адекватности от Vim.

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

Требуется следующее:
Когда я жму Enter, создаётся новая строка на том же уровне отступа, как текущая. Пускай не пытается быть умным и выстраивать отступы новой строки в каком-либо виде.

Если я жму Tab в начале строки, линия сдвигается на один табулятор.

Если я жму backspace в начале линии, удаляется только один табулятор только на этой линии.

Пожалуйста, кто-нибудь, сделайте это и восстановите моё спокойствие.

Поддержка Python в Slime

Ранее я писал, что использую плагин slime. Только один язык не работает с ним корректно — Python из-за использования пробелов для перемещения кода по REPL.

Проблема состоит в том, что при попытке перемещения участка с отступами, получаются ошибки вида "unexpected indent".

Я влюблюсь в того, кто сможет научить slime интеллектуально работать с отступами в коде Python. У меня есть несколько идей, как это сделать, но, к несчастью, у меня нету на это времени.

Gundo

Малоизвестный факт о Vim-e — у него не список отмены действий, а дерево.

Если я сделаю 5 изменений, отменю два, затем сделаю ещё 2, Vim будет следить за всеми ними. Вы можете использовать команду :undolist, чтобы увидеть список листьев этого "дерева отмен".

Чего мне хочется, так это чтобы кто-нибудь сделал замечательный плагин "graphical undo", показывающий график дерева отмен, подобно расширению Mercurial graphlog, отображающего график изменений репозитория.

В действительности, график будет проще, чем у Mercurial, так как не требуется работать с объединениями.

И, в качестве бонуса, позвольте мне смотреть его при помощи j и k, по нажатию p видеть diff с тем, что будет если я откачусь на эту версию и жать <CR>, чтобы действительно откатиться.

Апдейт: Я устал ждать и написал его сам.

Версия Fugitive для Mercurial

Последняя вещь, о которой хочется попросить — плагин поддержки Mercurial для Vim, как Fugitive от Tim Pope.

В Vim есть кое-какая поддержка Mercurial, но значительная часть завязана на использование плагинов, поддерживающих несколько систем контроля версий.

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

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

Общие мысли

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

Если TextMate 2 когда-нибудь появится, то, чтобы перейти на него обратно, там должны быть какие-нибудь удивительные функции.

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

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


Оригинал (английский): Coming Home to Vim
Переведено при помощи сервиса translated.by инициативной группой переводчиков welinux при участии пользователей settler, Shtsh, Zereal, blackraven.


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

Mironor 01.11.2010 14:06 #
Для арчеводов, если захотите пользоваться Sparkup (Zen coding), то в ~/.vim/ftplugin/html/sparkup.py нужно заменить первую строчку на #!/usr/bin/python2

Ну и да, это самая полезная статья по вим => ide, которая попадалась мне на просторах интернета. Спасибо за перевод.
enot 01.11.2010 14:54 #
статья хороша, но все же видео Дерека на вимео лучше
PeepOpen

Одной из "киллер-фич" TextMate является комбинация Cmd+T, которая позволяет быстро открывать файлы вводя фрагменты их имени.

кто-нибудь знает похожий бесплатный плугин для вима? буду очень признателен за наводку на что-то подобное (я скачаю по Ctrl + Shift + R из еклипса)
settler 01.11.2010 15:07 #
статья хороша, но все же видео Дерека на вимео лучше

так же много интересного есть в его блоге. Недавно по наводке philosoft наткнулся на него. Рекомендую посмотреть хотя бы начальное видео Welcome to Vim, после него сразу появляется желание сесть за изучение вима
enot 01.11.2010 15:12 #
s/\<скачаю\>/скучаю/ ну вы, наверное, поняли
enot 01.11.2010 17:19 #
кто-нибудь знает похожий бесплатный плугин для вима?

да, я знаю, FuzzyFind. не прдставляю как раньше жил без него

сам спросил - сам ответил. жаль только сам плюсануть не могу :3
enot 01.11.2010 18:40 #
бооже мой, фуф - это что-то!
мини-хау-ту:
1. cтавим fuf
2. настраиваем аббревиатуры для путей с искомыми файлами:
let g:fuf_abbrevMap = {
\ '^test:' : < '/home/burkov/workspace/test_prj/arch/arm/kernel/**/',
\ '/home/burkov/workspace/test_prj/arch/arm/include/**/' >,
\}
3. Делаем удобный бинд:
nnoremap <F3> :FufFile test:<CR>
inoremap <F3> <Esc>:FufFile test:<CR>
4. Наслаждаемся:


идею, думаю, уловили. этот и другие полезные хинты можно узнать, набрав короткую команду :help fuf :3
razum2um 02.11.2010 19:45 #
awesome + arm-kernel-devel detected
по теме:
а можно не хардкодить пути, в рантайме точка бу правильно работать?
enot 04.11.2010 14:32 #
можно не хардкодить, точка - по умолчанию. в смысле, если сделать
:FufFile
то он будет искать только в cwd
:FufFile **/
будет искать в cwd + рекурсивно во всех директориях
:FufFile myp:
будет искать там, куда указывает аббревиатура 'myp':
/home/burkov/workspace/test_prj/arch/arm/kernel/**/',
/home/burkov/workspace/test_prj/arch/arm/include/**/'

можно написать маленькую функцию для создания аббревиатур и добвалять их в вимрц а-ля
call AddFufFileAbbr('myp', '...')
call AddFufFileAbbr('docs', '...')
call AddFufFileAbbr('misc', '...')
call AddFufFileAbbr('etc', '...')
enot 04.11.2010 14:39 #
arm-kernel-devel

к сожалению нет, пока еще только воннаби
m0nhawk 01.11.2010 20:19 #
На выходных снёс все нано что бы начать пользовать vim. А тут нате, перевод чудесной статьи по vim!

Так держать!
Zereal 01.11.2010 22:12 #
телепаты не дремлют :)
razum2um 02.11.2010 20:02 #
inoremap jj

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

я канеш понимаю, русского в коде быть ПО ИДЕЕ не должно, но ведь бывает.
и сучность в том, что ремапы кириллицы на латиницу стоят. а "оо" в русском таки встречается..

silent 02.11.2010 20:30 #
Где б такой шрифт себе надыбать
Shtsh 02.11.2010 23:32 #
Это, конечно, не то, но попробуй monaco
silent 02.11.2010 23:43 #
На Monaco сейчас и сижу, хочется чего-нибудь новенького