Vim: маленькие открытия

17.08.2010

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

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

D — аналогична d$.
C — аналогична c$.
s — аналогична xi.
S — аналогична cc.
. — повторяет предыдущую команду.
I — аналогична ^i.
A — аналогична $a.

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

t, T — аналогичны f и F, но перемещают курсор не на сам символ, а на символ, находящийся перед ним.
; — повторяет поиск, производимый последней командой f, F, t или T.
, — повторяет поиск, производимый последней командой f, F, t или T, но в обратном порядке.

Вот это вообще супер! Я раньше только f и F пользовался, и не подозревал про такие возможности. Блин, сколько ещё всяких охренительных удобностей предстоит открыть, особенно учитывая то, что вимовые команды комбинируются. Что нам даёт знание о t, T, ; и запятой? Вот пример — допустим, есть строка str_replace('one', 'two', $text), а нам надо заменить всё содержимое внутри скобок (пример просто для иллюстрации), при этом курсор находится в начале строки. Как вы будете действовать в своём любимом редакторе, если это не Vim? Наверняка перенесёте руку на мышку и выделите содержимое между скобок, после чего станете вводить новое содержимое. А Vim позволяет сделать это вообще почти мгновенно, причём не одним способом (не зная про команду t я всё равно выполнил бы задачу очень быстро). Итак, решение:

Кажется сложно и долго? Но даже после нескольких дней активной работы подобные команды начинаешь вводить просто автоматически, не задумываясь. Вот сколько вам нужно времени, чтобы набрать «слово»? А вышеприведённая команда тоже состоит всего лишь из пяти символов, как и «слово» — f'ct).

Не знаю, убедил кого я или нет, но просто поверьте — любому программисту, каждому, точно стоит попробовать Vim! Начать с vimtutor (просто ввести эту команду в консоли, если Vim уже установлен). Уже в первые минуты работы с Vimtutor приятное удивление гарантировано, если вы не изначально скептически настроенный совсем сухарь :)

O! Выделение!

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

Или, например, иногда хочется скопировать куда-то три строчки, между которыми есть ещё всякий ненужный текст. Для традиционных редакторов и методов работы обычно это выливается в тройную вереницу Ctrl+C и Ctrl+V с перемещениями курсора между ними. А Vim может просто добавлять строчки к регистру (так называются буферы обмена Vim, которых дочерта). Опять же, нижеследующие команды со стороны могут показаться незапоминаемым бредом, но это охренительно:

Важно отметить одну особенность при работе с регистрами: имена регистров лежат в диапазоне a-z. Если "ayy копирует строку в регистр a, то "Ayy добавляет строку в регистр a. Это очень важная особенность. Ее очень удобно использовать, когда вы копируете строки из разных частей файла и хотите потом вставить их в одном месте. Но вся ее мощь проявляется при записи и воспроизведении макросов Vim (через клавиши q и @) – если у вас уже существует работающий макрос, который вы хотите расширить, то вам не обязательно записывать все действия заново – достаточно выполнить, например, qA, и набранные вами команды добавятся к уже существующим.

Метки в тексте и перемещение между ними

ma — создает метку с именем a.
`a — перемещает курсор на метку a.
'a — перемещает курсор на начало строки, содержащей метку a.
:marks — показывает все существующие в данный момент метки.
<C-o> и <C-i> — перемещение к ранее посещенным меткам назад и вперед.
`` и '' (две одинарных кавычки, прим. BrokenBrake) — перейти на предыдущую позицию (разница между `` и '' такая же как и между `a и 'a).

Вот эти последниее '' для меня тоже стали открытием, как я без них жил раньше? Чертовски удобно, просто супер.

Немного про режим вставки

Работа с текстом в режиме вставки
<C-w> — удаляет слово перед курсором.
<C-u> — удаляет все символы от начала строки до курсора.
<C-y> — вставляет символ, который находится над курсором (в предыдущей строке).
<C-e> — вставляет символ, который находится под курсором (в следующей строке).
<C-o>cmd — выполняет команду cmd и возвращается обратно в режим вставки.

Окна и буферы

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

Что ещё почитать?

P.S. Che, всё равно не работаешь сейчас, а хернёй страдаешь. Поставь Vim прямо сейчас и набери команду vimtutor в своём Putty или чего там у тебя. ПРЯМО СЕЙЧАС! Не пожалеешь.

Выложил снимок своего .vimrc на 17 августа 2010 года. «Снимок», потому что он всё ещё периодически переписывается (в основном, добавляются новые плюшки). Прикольный круглый номер на pastie.org получился :)

Комментарии

  1. # Rozboris

    Здорово, всё-таки Вы меня убедили. Пойду пробовать. Раз уж меня и так все демоном считают за использование FAR Manager, пойду в VIM.
    Может быть через время отпишусь о результатах.

  2. #  Тормоз

    Прикольно, уже как минимум второй человек заинтересовался. Я настоящий менеджер пирамидальной секты, круто! Теперь надо чего-нибудь платное вам впарить. Покупайте Daos :-D

  3. # Young: 

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

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

    Т.е. не просто текстовый поиск, а разбор java/c++ кода и анализ где она реально используется.

    Такие в Vim есть? А то без этого жить нельзя?

    И еще, переименование переменных, классов, методов – т.е. когда выделяешь метод, переименовываешь его и он везде подменяется. Т.е. в соответвии с правилами языка.

    Это тоже важно. Если это есть я тоже готов попробовать.

    P.S. И рефакторинг – т.е. например выделить кусок кода в отдельный метод (с поиском дубликатов).

  4. # nugops: 

    Хорошая статья.
    Я очень часто использую omni-compitition (Ctrl-x Ctrl-p, etc). Реально удобная вещь.

    Советую посмотреть скринкасты по vim:
    vimeo.com/user169020…

  5. # tarantul

    «уже как минимум второй человек заинтересовался»

    Третим буду.

  6. #  Тормоз

    Young, всё что ты перечислил — это просто поиск и замена, никаких проблем не вижу. + Есть куча плагинов заточеных именно под всякое такое.

    Я очень часто использую omni-compitition (Ctrl-x Ctrl-p, etc). Реально удобная вещь.

    + SuperTab и тогда вообще супер.

    ТретЬим буду.

    OK, записываю :)

  7. # Grayscaler

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

  8. #  Тормоз

    Тебе же не надо их ВСЕ помнить. Постепенно изучатся самые необходимые. Ты ведь от клавиатуры не откажешься, удобная штука, правда? А в ней более 100 кнопок.

  9. # Ал: 

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

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

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

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

  10. # Young: 

    С этим понятно. Но тогда не совсем понятно в чем смысл. Собственно набор кода как текста в работе программиста не очень много занимает. И как нету разницы печатаешь ты 200 или 400 символов в минуту, так нету разница в том насколько быстро редактор тебе позволяет править текст. И так все равно большая часть автокомплит.

    И отказыватся от наличия сложного рефакторинга, и сложного поиска по коду (не по тексту), ради ускорения 20% работы на 20% мне видится глупым. Даже если эти 20% ускорятся на 200%.

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

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

  11. # Ал: 

    2Young, значит вим не для тебя. Я вобщем то никого не убеждал, я описал факты так как сам их вижу.

    Мне вим очень понравился сразу после 30 минут знакомства в процессе прохождения vimtutor. Я загорелся и начал его изучать.

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

    Пример такого остряка вот в этом вчерашнем анонсе на хабре можно посмотреть: habrahabr.ru/blogs/v…
    Второй коммент, который получил уже дофига минусов.

    Есть реальный интерес — пробуй. Нет интереса, мне кажется и начинать не стоит.

  12. #  Тормоз

    И отказыватся от наличия сложного рефакторинга, и сложного поиска по коду (не по тексту), ради ускорения 20% работы на 20% мне видится глупым. Даже если эти 20% ускорятся на 200%.

    А, блин, Young, ты ведь тот же, что у Samlowry? Что тебе рассказываем тут тогда? :) Мне видится глупым тратить время на объяснение каких-либо преимуществ Vim такому человеку. Извини, но ты просто маленько тролль (без обид).

  13. # samlowry

    Тормоз: ты маленько сам тролль с этой фразой:

    всё что ты перечислил — это просто поиск и замена, никаких проблем не вижу

    С тем же пылом, с которым ты пропагандируешь вим, изучи 1 день какой-нить настоящий ИДЕ.

    Как ты, допустим, себе представляешь переименование переменной с учётом областей видимости языка? Т. е. вот этого: php.net/manual/en/la… , пример номер 1 возьми — это автозамена? Проанализировать, что в ф-ции идёт обращение к внешней переменной — ты предлагаешь писать разборщик языка полный?

    Я единственное что вижу для IDE — это в сами IDE встраивать как-то VIM.

  14. # Young: 

    Я тот же. И без обид бы хотелось уточнить, «такому» это какому?

    Ты делишься своим опытом, я делюсь своим. Мы опыт показывает что программисты чаще код читаю и анализируют чем пишут.

    2samlowry,

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

    Смотреть IDE тоже не могу ему посоветовать, для PHP я нормального ничего не видел, а для C++ или java все это можно будет оценить в достаточно сложном проекте, с которым ему нету смысла разбираться.

    Ну и по теме, чтобы в оффтоп совсем на сваливаться, два ролика про Visual Studio и про Vim (из ветки про vim на rsdn)

    www.youtube.com/watc…

    www.youtube.com/watc…

    По vim многим будет думаю интересно посмотреть.

  15. #  Тормоз

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

    Young, «такому» в смысле, что у тебя изначально есть какое-то своё мнение, которые ты всё равно менять не собираешься в любом случае, но поспорить любишь :) Впечатление такое составилось.

    Впрочем, я безусловно согласен, что о преимуществах IDE не мне судить, я про них просто ничего не знаю.

  16. # samlowry

    Тормоз, я сказал магическую фразу — variable scope. Ты прикидываешься? Переменные в программе могут называться одинаково, но быть разными и наоборот — быть одной и той же, но обращаться к ней могут по-разному. ИДЕ парсит текст программы с разбором языка, всех его правил. И исходя из этого все её продвинутые штуки и делаются, типа переименования переменной (не слова $brokenbrake в текстовом файле, а именно переменной) или класса, или ф-ций.

    >я про них просто ничего не знаю
    Ну вот об том и речь :) Я, кстати, глянул — в ИДЕ популярны плагины, привносящие ВИМ, про что я и говорил.

  17. # samlowry

    Добавлю: речь идёт о разном логическом уровне. Вим — уровень правки текста. IDE — уровень правки того, что этот текст значит.

    Я те пример приведу из другой отрасли, специально для твоих затуманенных восторгом мозгов: для писателей существуют IDE для работы над романом. Там можно отслеживать персонажей, их личности, можно переплетать нити повествования. Так вот такие IDE и, допустим, Word — небо и земля. Хотя вордист может сказать «нажми в меню найти и заменить, да заменяй».

    Или вот. Для переводчиков тоже есть IDE. Где копятся их паттерны переводов (и потом используются — зачем переводить всё кучу раз). Где ты видишь параллельно 2 текста, в которых куски сопоставлены друг другу. При этом можно скопипастить перевод из гуглтранслейта и править его. Но это, опять же, будут небо и земля.

  18. #  Тормоз

    OK, и как часто возникают такие задачи? Я пока с ними не встречался, мне поиска хватало.

  19. # samlowry

    Тормоз: как часто возникает задача

    есть строка str_replace(‘one’, ‘two’, $text), а нам надо заменить всё содержимое внутри скобок

    ? У меня вообще никогда не возникала. Значит — мне не нужен VIM! :lol:

  20. # Тормоз: 

    Лоль сколько хочешь :)

  21. # seocoder

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

    Открой для себя netbeans, eclipse или zend studia.

    Твой подход в кодинге (отсутствие MVC идеологии) – как раз и говорит, о том что ты не понимаешь зачем IDE и всех убеждаешь. Это же быстро.
    VIM это текстовый редактор, как ни крути. Кодить в нём можно, но поклонение виму придумали линуксоиды, обделенные изначально каким либо значимым софтом и проблемами с иксами.
    И говорю я это не просто так.
    Я кодил когда то не на асме, а маш.кодах по спектрум в тетрадке и это тоже было удобно ))

  22. # VolCh: 

    Случайно забрёл, а тут такой холиварчик :) Внесу и свои 5 копеек:

    Неоднократно пытался использовать vim как IDE, но дальше правки конфигов дело не пошло, и то, если только нет nano на сервере. Максимум чего добился волевым усилием – редактирование в vim, операции с файлами и ftp в mc, всё остальное (svn например) в консоли. Месяц так пострадал, а потом ушёл обратно на NetBeans. Вроде читаешь про крутость vim’a – интересно, хочется освоить, не зря же многие хвалят, причём именно как IDE. А начинаешь работать – 100500 сочетаний клавиш никак не запомнить. Видимо что-то делаю не так.

    P.S. А почему в блоге нет даты комментов? Даже не не понять, некропостер ты или нет :)

  23. #  Тормоз

    И говорю я это не просто так.

    Не сомневаюсь. Говоришь это потому что Vim просто не осилил :) Ну и ладно.

    А начинаешь работать – 100500 сочетаний клавиш никак не запомнить. Видимо что-то делаю не так.

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

    Думаю, ты просто сворачивал с пути до критической точки «прозрения» что ли :)

    А почему в блоге нет даты комментов?

    Есть, просто она скрыта. Наведи курсор на значок #.

  24. # VolCh: 

    >Ты что-то путаешь. Сочетания клавиш в Emacs, наверно, у Vim команды,

    Если так важно, то терминологию путаю :) Но, кстати, не пытался понять логику их именования, то есть одно- двух- … – клавишные команды, в которых нельзя выделить явно слово для меня просто сочетания клавиш, которые надо зазубрить (как зазубривал, скажем, Ctrl+T в браузере). Точнее попытался в самом начале, но так и не смог понять логики hjkl или :Sex, так что забил на это дело.

    Недопёр мышку наводить, думал просто линк :)

    P.S. Сегодня попробовал снова, но установил рекомендованный пакет (у меня Ubuntu) ctags – как-то с ним получше стало кодить, хотя ещё не понял в чём подвох :-/

  25. #  Тормоз

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

  26. # Soeti

    Бесят умники, кричащие, что vim – говно. Особенно про «обделенных юниксоидов».
    Интересно, товарищи видели в глаза боевой сервер? Там определенно стоит навороченая IDE))

    Вот нужно мне написать скрипт, который будет обходить сеть и считывать статистику по коммутаторам в native влане. Логично, что мой ком находится в клиентском влане и я никак не смогу без проброса попасть в управляющий.
    И тут у меня выбор: заниматься пробросом влана на себя(и потом назад) или зайти на сервер с первым вланом, написать там скрипт и там же его затестить. При этом я не использую свой убогий комп, а юзаю скрипт на нормальном брендовом серваке, а потому могу не париться, что ЦПУ или оперативка уйдут в полку(и такое бывает).

    Вот там то vim и нужен.

    На многих ОС, которые встроенные в интеллектуальное железо, есть только он(vi). Если в нем не чихлить, можно забыть на нормальную настройку.

  27. # valenok: 

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

  28. #  Тормоз

    Ну да, наверно. Собственно, практически все холивары на этом построены и потому вечные :)

  29. # Soeti

    Я бы сказал, что многие из них оптимальны для какого-то вида задач.

    Абсолютно понятно, что никто не будет писать на vim крупный софт.

    Это emacs vs vim, bsd vs linux, opera vs ff, win vs *unix бла бла бла.

  30. # spec: 

    Soeti, а что значит крупный софт? Работая в SWsoft (ныне Parallels, именно у нас разрабатывалась Virtuozzo, Plesk, PEM and etc) сам пользовался вимом постоянно кодя в линуксе, да и не только я. Под виндой конечно есть учень удобные IDE, да и вообще не принятно работать в консоли, а под никсами это незаменимый редактор и если уметь им пользоваться то очень мощная вещь.

  31. # Soeti

    Если это сервер, то верю, что незаменимая, как и писал чуть выше, а если десктоп, то смысла его юзать нет.Сугубое имхо.
    ps
    Насчет «Паралельс» – это панель для хостинга их продукт? У меня домен хостится на базе такой штуки. Редкое глючное говно.Вы уж извините за прямоту. А хостер меня н*й послал, сказав, что это проблемы «Паралельс».

  32. # _Andrey_

    «есть строка str_replace(‘one’, ‘two’, $text), а нам надо заменить всё содержимое внутри скобок»

    Можно проще (курсор должен стоять где то внутри скобок): ci(

    «Захватить» и скобки: ca(

    Удалить внутри скобок: di(

    Удалить с «захватом» скобок: da(

    Вместо круглой скобки можно использовать: < [ { « ‘ `

  33. # Тормоз

    Спасибо, я не знал. Кстати, примерно в эту же тему недавно про классный плагин surround на Хабре писали.

Комментирование этой статьи закрыто.

Интересное Покупки ТехникаРазное Отдых Статьи Строительство Услуги Общество Хобби Культура Советы Уют