29 June 2008

эффективное использование vim: «incredibly tips, part I»

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


tips 1:

Я забыл какой именно файл я редактирую…


просмотреть имя файла — CTRL-G
«php.ini» 1255 lines --1%--
детальную информацию — gCTRL-G
Col 1 of 71; Line 18 of 1255; Word 79 of 6980; Byte 563 of 44684


tips 2:

Ты не используешь gi ?????????


gi — очень полезна
вы пишите в 143й строке файла php.ini, выходите из режима вставки, смотрите другой файл\буффер, нажимаете gi и продолжаете редактировать 143ю строку php.ini.


tips 3:

Девушка, нам повторить!



пряность 1, единичный повтор


CTRL-E, СTRL-Y в режиме команд сдвиг экрана на 1-ну строчку ниже\выше
в режиме вставки вставляет символы из нижней\высшей строки


пример:
имеет строку:
$i->love()->mylove()->because->sheis->VerySuccessfully();
нужно напечатать
$i->love()->mylove()->because->sheis->VerySexy();
все что выделено черным напечатано при помощи CTRL-Y,
те реально печатали только VerySexy();

пряность 2, повторить последний ввод


СRTL-A — вставляет последние введенное предложение (в режиме вставки!)

пример:
имеет строку:
$i->love()->mylove()->because->sheis->VerySilly();
хотим ее тутже посторить:
СRTL-A (и все, не нужно переходить в другой режим копировать ее и тп)
$i->love()->mylove()->because->sheis->VerySilly();

пряность 3, зачем считать, зачем страдать, когда есть CTRL-R=
режим вставки:
CRTL+R=5*5+25 — вставит 50;



пряность 4


:read !date — вставит текущею дату
:read !cat file — вставит содержимое файла file
:grep -iR «TODO» * + copen — пожет все TODO в проекте
:read !cat /dev/random — выдаст пароль администатора\текущего пользователя (ТОЛЬКО ДЛЯ true unix users!?) главное не забываем CTRL+C нажать


пряность 5, абзацы



CRTL-T, CRTL-D вставка абзацев в режиме редактирования


Поиск — это естественно


*/# — поиск следующей/предыдущей позиции слова
[I, ]I — показывает все линии в которых содержаться слово под курсором
хм…
для более удобного использования давайте сделаем:
:nmap [I:let nr = input(«Which one: „) exe “ normal ». nr ."[\t"

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

Поиск в vim — это естественно



повторение — мать учения


/ — ищет след вхождение ? — ищет пред вхождение n — повторить последний поиск
N — повторить последний поиск в противоположном направлении


итак:

хотелось бы затронуть тему регулярных выражений ( бл*, пи****=)


к сожелению язык регулярных это тема для целой книги.
тут я хочу показать примеры, которые использую чаще других:
d/^# — удалить все от текущей строки до первого комметария
10d/^# — соотвественно до 10-го

y/^class/;function выделит все от текущей позиции до первного вхождения function в классе класс.
:%s/foo/bar — заменяет foo на bar во всем файле (эквивалентно :1,$s/foo/bar/ )
:.,/<\/body>/s,
, < br/ > ,gc
— правит тег
от текущей строки до тега
, cпрашивая о потверждении без пробелов, это хаброэффект
(c — «cautios», предостерегать)
аффтар был настолько пьян… что оставил возможность читателю прокоментировать след. выражение:
:-23,'ts/wow/WOW/
?
& — повторить последнию замену в текущей строке
:&& — повторить последнию замену в текущей строке c темиже флагами
g& — повторить замену для всего файла


shift+влево влево влево двигаются руки notepad'овца
aw,iw,as,ap,a{ — поет душа vim'овца



идем в вируальный режим:
iw, iW — выделить слово
aw, aW — выделить слово, пробельные символы не учитываться
as, is — выделить последовательность слов (as, is — разница есть, см — iw, aw)
ap, ip — выделить параграф
a{, i{ — выделить весь блок {..} или текст внутри него
a(, i( — выделить весь блок (..) или текст внутри него
a<, i< — выделить весь блок (..) или текст внутри него
a', i' — выделить одноковычную стоку или текст внутри нее
a", i" — выделить двухковычнкую сточку или текст внутри нее
(vim знает что \" учитывать не нужно )
at, it — выделить весь тег или текст внутри него (привет XML & HTML)

примеры:
das — удалить последовательность, включая пробельные символы после нее.
ci( — заменить текст внутри (...)
yat — скопировать весь тег внутри которого находиться курсор
gU' — sql запросы пишем в вверхнем регистре! (меняет регистр в одноковычной строке на верхний)
vip — выделит весь параграф без пробельных символов


умная вставка


:set autoindent — Отформатирует абзац при вставке новой строки.
]p, ]P — вставить до\после и отформатирует отступы
не всегда удобно (
:nnoremap P P'[v']=
:nnoremap P P'[v']=
до ] — не дотягиваюсь, поэтому использую

работа с регистрами


частично была описано в пред — habrahabr.ru/blog/vim/45414.html
хотелось бы добавить:
«0 — последний скопированый текст, который не был занесен в регистр
»1 — последний удаленный текст, который не был занесен в регистер
(" — и был длинее одной строки)

«2 — »9 удаленный текст для 2,9й команды
". — последний вставленный текст
"% — название текущего файла
"_ — регистер черный ящик (его использование ни как не влияет на другие регистры)
:reg — выводит значение всех текущий регистров


запись макросов


q начала записи макроса, последовательное q останавливает запись
@ выполняет макрос
@@ выполняет последний исполненый макрос


думаю тут можно привести небольшой пример
раньше в коде писал
global $db;
теперь стиль немного поменялся и я стал писать
$db = Database::get();
такого кода довольно много, хотя он и совсем небольшой

какие мне нужный действия для замены?
1.найти global $db;
2.заменить global $db;
3.на $db = Database::get();

теперь через vim;
1й пункт — :grep -iR «global $db;» *
2,3-й постораюсь сделать ввиде макроса:
итак, после 1-го пункта, режим команд, жмем qa, d2W, i
вводим $db = Database::get();
q.
записали макрос
:copen
ищем след вхождение global $db;
теперь просто жмем @a
идем к след вхождению

ps прощу заметить, что это что-то вроде hello world для макросов, те совсем простейший пример.

Thourht time in the past


наверное еще одна из возможностей vim'a которая меня поражает =)
g-/g+ — скользим между более старым/новым текстом
:earler Ns,m,h — вернуть содержание файла, которое было s,m,h «time» спустя
:later — соотвественно наоборот, вернуть содержание файла, которое было s,m,h «time» после
:ealer 60m — блин, ну и вино мне продали сегодня =)

всем спасибо за внимание…
ps есть вопросы? пишите, коллективный разум поможет вам!
Tags:vimeditors
Hubs: VIM
+39
5.2k 109
Comments 72