эффективное использование 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 есть вопросы? пишите, коллективный разум поможет вам!
+39
29 июня 2008, 23:51
86
cachealot 18,9

комментарии (72)

0
TermiT #
забавный стиль статьи :)
0
cachealot #
это хорошо или плохо?
+1
bubuq #
А вот, например, «:read !cat file» чем-либо лучше, чем просто «:r file», кроме того, что курсор в начале оставляет?
0
cachealot #
ничем =)
я думаю все будет зависит от ситуации, когда где положение курсора вам будет удобней

ps кстати по :r file не знал спасибо =)
0
shvechikov #
":read !cat filename" действительно не имеет смысла.
Есть команды ":read filename" - для вставки после курсора и ":0read filename" - до курсора.
(или их короткий вариант: ":r filename", ":0r filename"
0
Paul #
:0read это не перед курсором, а в начало файла. Чтобы прочитать перед курсором надо делать :-1read
0
TermiT #
хорошо! :)
0
TomasGops #
да, в туториале такого нет :)
0
nini #
Вау, вот это подборочка!
Однозначно в избранное!

У меня про vim тоже кое-что интересное есть, но даже на личный блог кармы нехватает - помогите, кому не жалко, пожалуйста.
0
cachealot #
на такое дело конечно поможем))
0
nini #
Спасибо!
И еще раз спасибо за подборку.
0
nini #
А вот кстати тогда вопрос сходу, раз уж на то пошло:
От открытой скобки к закрытой можно с помощью shift+% прыгать, а вот можно ли как-нибудь подобное с xml-тегами вытварять?
На счет последнего, вставка и nnoremap чего-то я не догнал - автоматически 2-ю скобку вставляет? Как то у меня не получилось...
0
cachealot #
попробуйте вот так
:nnoremap < Esc > P P'[v']=

почему-то хабрахабр съедает <, > несмотрят на то что я пишу их как & l t ; и & g t ;
(кто не верит - могу привести пример)

>а вот можно ли как-нибудь подобное с xml-тегами вытварять?
не работал с xml, но посмотрю
0
Qiwichupa #
на хабре надо не & l t ; и & g t ; юзать, а & #60; и & #62; =)
0
bubuq #
Вот это не поможет?
(http://shurl.org/ofsPb что же хабр с линками делает...)
0
google_fan #
http://www.vim.org/scripts/script.php?sc…
Позволяет не только по тегам скакать, но и по if/endif begin/end ну или что там у вас
0
Paul #
:help matchit-install
0
nini #
Спасибо!
+1
mahoro #
Спасибо, многих вещей не знал! :)

От себя пять копеек. В виме классно работать с табами, но по умолчанию к ним не привязано никаких удобных хоткеев. Я сделал F6/F7 и Ctrl-Right/Ctrl-Left, вот кусок из конфига:


function My_next_file()
    if v:version >= 700
        tabn
    else
        bn
    endif
endfunction

function My_prev_file()
    if v:version >= 700
        tabp
    else
        bp
    endif
endfunction

imap <silent><F6> <esc>:call My_prev_file()<cr>i
imap <silent><F7> <esc>:call My_next_file()<cr>i
nmap <silent><F6> :call My_prev_file()<cr>
nmap <silent><F7> :call My_next_file()<cr>

nmap <silent><C-Left> <F6>
nmap <silent><C-Right> <F7>




Еще нравится команда gf - открыть файл, имя которого находится под курсором. Чтобы вим открывал файл в новом табе, можно написать вот так:map gf :tabe <cfile><CR>
+1
shvechikov #
Назначать действия на стрелки и F1-F12 - не самая лучшая идея.
Одно из преимуществ Vim в том, что не приходится убирать пальцы с "основной позиции для слепой печати".
Лучше назначать действия на комбинацию близких клавиш.
Читай ":help <Leader>"

Кстати:
Стандартное сочетание для смены табов - gt(вперёд) и gT(надад) - достаточно удобны
0
mahoro #
Зато не приходится переходить в командный режим! Ctrl-O g t - это ж четыре клавиши вместо одной, кроме того Ctrl-O часто бывает занят mc.

Но, как я уже сказал, у меня есть еще привязка на сочетание Ctrl + стрелки. Поэтому клавишами F6-F7 я пользуюсь только в режиме вставки и то иногда.
0
shvechikov #
Судя по всему, вы используете Vim, как блокнот - стараетесь не выходить из режима вставки.
Основной режим в Vim - командный. Зачем нажимать Ctrl-O? Нажимайте Esc! Не нужно превращать Vim в Emacs!
Зачем переходить в другую вкладку не выходя из режима вставки? Режим вставки нужен только для вставки текста! :)
0
mahoro #
Не, вовсе не как блокнот. Дело в том, что мне достаточно часто приходится писать текст, подглядывая на другой файлик из соседней вкладки (какой-нибудь h-ник, например).

Кроме того, gt удобно использовать для перехода на одну вкладку влево, а как вы себе представляете переход на три вкладки? Мне тяжело дается повторение одних и тех же сочетаний, ситуацию усугубляет еще и то, что g и t нажимаются одним пальцем. Нет, это определенно изврат.
0
Paul #
Дело в том, что мне достаточно часто приходится писать текст, подглядывая на другой файлик из соседней вкладки (какой-нибудь h-ник, например).
В этом случае удобнее сделать :split, как мне кажется.
+1
shvechikov #
Для перехода на конкретную вкладку используйте:
gt{номер вкладки}.
gt5 - на пятую вкладку.

Чтобы видеть номера вкладок, воспользуйтесь статьёй http://habrahabr.ru/blog/vim/46911.html.

Да, и пользуйтесь :split/:vsplit.
0
mitry #
:tabe вроде бы не ищет файлы в path и не использует suffixesadd. Так что лучше применить стандартные <C-W>gf
0
Paul #
:tabe не ищет, ищет :tabf
0
mitry #
Я имею в виду, что, если хочется переопределить gf для открытия в новом табе, то лучше
:noremap gf <C-W>gf
0
drujebober #
автору спасибо, ждем когда же будет разбираться ~/.vimrc
0
cachealot #
спасибо, в скором будущем обязательно разберем
если честно - мне кажеться очень важны комметарии людей которые уже давно используют вим в разработке, как правило такие люди говорят мало (мое личное наблюдение), но когда говорят - попадают в точку =)

ps и возможно мне следует писать немного по другому....
+1
bubuq #
Вы бы иностранный язык в заголовке исправили. А лучше убрали бы вовсе.
0
cachealot #
хорошо, спасибо, учту
0
Qiwichupa #
А можно статью про вим для чайников? =) Про самые-самые основы, какие-нить фишки к которым лучше привыкнуть сразу. В общем чтобы чайник вошел в правильное русло. Лично я был бы крайне благодарен =)
0
bubuq #
1. Запускаете vim
2. Нажимаете :help<ввод>
3. Втыкаете до позеленения :)

На самом деле единственная основа это наличие трёх режимов (командный, редактирующий и навигационный), что всегда в навигационный можно попасть через [ Esc ], в командный через ":", а начать писать обычно можно через "i". Для чайников командный редко нужен, разве чтобы выйти без сохранения (":q!"), а c сохранением прямо из навигационного можно по "ZZ".
0
Qiwichupa #
о, сенкс. Основная проблема это в самом начале работы, когда оно запукается, а че куда жать, даже самое примитивное - непонятно нифига =). Посему пока юзаю нано, но как-то несолидно =), ну и не везде он установлен, а vi/vim — классика =)
0
cachealot #
начните с gvim
0
Qiwichupa #
Был невнимателен, уже читаю предыдущую статью =)
0
maniac #
пройди vimtutor
0
google_fan #
С ним поставляется отличная встроенная обучалка для чайников.
vimtutor
0
Holy_Cheater #
а проверки орфографии в vim нету ? :(
0
cachealot #
есть, aspell называется
0
nchaly #
начиная с версии 7, она встроенная
–1
Ronin #
Поддерживаю! Проверяйте орфографию перед тем как запостить статью. Прочитал первый абзац, читать дальше желание пропало.
0
redchrom #
Ёмаё, сколько лет использую vim, а всё время узнаю что-то новое. Конкретно спасибо за команды работы с визуальным режимом.
Добавлю что-нить от себя:
function! CMode()
imap { {}O
imap < <>
imap #m int main(int argc, char* argv[]){
iabbrev #d #define
iabbrev #i #include
set tags+=~/.cache/systags
endfunction

function! PyMode()
set makeprg=python\ -c\ \"import\ py_compile,sys;\ sys.stderr=sys.stdout;\ py_compile.compile(r'%')\"
set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
iabbrev imp import
endfunction

au FileType c call CMode()
au FileType cpp call CMode()
au FileType python call PyMode()

Включает дополнительные настройки для C/C++ и Python исходников.

inoremap pumvisible() ? "\" : "\u\

Позволяет выбирать ентером варианта предложенные C-n
0
redchrom #
Блин, скобки некоторые съелись :/
0
mastd #
ой... ужас какой.. попробуйте http://www.vim.org/scripts/script.php?script_id=1318 для сниппетов
0
redchrom #
снипеты поравились но и без них хорошо
0
urandom #
Ух ты. Спасибо!
0
a_vasyutin #
Хорошая статья:) Вообще, если тут есть гуру в vim, хотелось бы рассмотреть вопросы возможности использования этого редактора как stand-alone ide для Java (навигация по коду, автодополнение и все прочее, что есть в современных средах разработки)... Использовал когда-то давно vim как среду разработки для C++ было очень приятно.
0
h0rr0rr_drag0n #
мой vimrc, может кому пригодится:

http://paste.org/index.php?id=3185
0
Tishka17 #
Расскажите как открыть несколько файлов и все их редактировать, переключаться между ними и т.п....
Я все время забываю.
0
shvechikov #
Чтобы открыть несколько файлов в разных табах(вкладках):
$ vim -p file1 file2 file3 ...
+3
iMate #
для windows-версии VIM всё вышесказанное справедливо?

имеет ли смысл попробовать vim под win? :) и какие версии есть нормальные?
+1
mastd #
Да, конечно справедливо. http://www.vim.org/download.php#pc на странице перечислены все доступные сборки для windows.
+1
Paul #
В Vim под Win возможны небольшие отличия в поведении (подробнее читать в :h :behave и :h mswin.vim), но можно настроить так, чтобы отличий не было вовсе. Ну а пробовать обязательно имеет смысл :) Пользуйтесь gVim и знайте — шрифт по-умолчанию можно (и нужно) поменять (Edit->Select Font... или прямо из gVim :set guifont=*). Чтобы не менять каждый раз можно потом любимый шрифт в _gvimrc прописать.
+2
iMate #
спасибо :) окунусь в мир консольного shortcut-fighting'а =)
0
1x1 #
Прошу добавить во вторую часть работу с кодировками. Как-то оно не совсем понятно. :)
0
Paul #
0
the_bee #
Incredible tips.
А саму статью ещё не читал, но буду.
+1
ivanzoid #
Спасибо, любопытная статья.

PS. Может пропустить её через спеллчекер? ;) Ошибок немало, есть даже в командах.
0
jerom #
Надо поменять хотя бы CRTL на CTRL, убрать &rt; и тому подобную чистку сделать. Реально тяжело читать.
0
cc00ffee #
:earler Ns,m,h - вернуть содержание файла, которое было s,m,h "time" спустя // наверное, всё же "назад", так как "спустя" - это, как правило, потом (ср. "Мушкетёры 20 лет спустя").

Больше замечаний нет.
0
katremer #
На всякий случай сообщаю, что global $db; на $db = Database::get(); удобнее заменять через

:bufdo %s#global $db;#$db = Database::get();#|wn

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

А ещё в последнем абзаце статьи на самом деле говорится о том, что в Vim с седьмой версии запоминаются ВСЕ изменения файла, сделанные в течение сессии, и если вы отменили одно изменение и начали другое, то первое не потеряется, и вы сможете к нему вернуться через g-. Мегафишка.
0
ptiss #
я чего-то не понимаю, или тут полезнее sed?
0
katremer #
Если он есть, то это, конечно, прекрасно.
Но - то же самое можно сделать из Vim, в скриптах это может быть полезно.
Ну и в винде sed'а нет и использовать его, учитывая заморочки виндовой командной строки - мучение.

Ещё аргумент - поддержка многих кодировок.
0
ptiss #
Аргументы понятны, но для меня неактуальны. Винды нет, non-ASCII символов в исходниках нет.
0
cachealot #
спасибо за замечания
>:bufdo %s#global $db;#$db = Database::get();#|wn

>Кастуется это заклинание, когда все нужные файлы открыты в буферах (не знаю, открываются ли они по grep'у, чукча делает драгндропом).

grep работает и с неоткытимы буферам, поэтому в моем случае удобней был grep

за мега фишку - отельное спасибо, не знал =)
0
katremer #
Ну я полагал, что раз рассказали - то знали :) пояснил для читателей, а то не очень понятно было.

Насчет bufdo: если можно список файлов из grep или vimgrep открыть в буферах, то тогда с помощью bufdo можно сделать автоматическую поиск-замену во всез файлах сразу. Пока не знаю, можно ли так открыть файлы из Vim.
0
nullie #
А будет статья про то, как всё это запомнить и эффективно использовать?
+1
shvechikov #
Советую прочитать статью создателя Vim'a Брама Моленара "7 навыков/привычек эффективного редактирования текстов":
http://www.moolenaar.net/habits_ru.html
0
Paul #
Есть даже видео, правда на английском.
0
shvechikov #
Да. Видео тоже очень приятное!

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