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

    Доброго всем времени суток
    стараясь сдержать свое обещанию, хочу опубликовать след. статью об редакторе 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 есть вопросы? пишите, коллективный разум поможет вам!

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 72

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

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

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

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

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

                        От себя пять копеек. В виме классно работать с табами, но по умолчанию к ним не привязано никаких удобных хоткеев. Я сделал 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
                          Назначать действия на стрелки и F1-F12 - не самая лучшая идея.
                          Одно из преимуществ Vim в том, что не приходится убирать пальцы с "основной позиции для слепой печати".
                          Лучше назначать действия на комбинацию близких клавиш.
                          Читай ":help <Leader>"

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

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

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

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

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

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

                                    На самом деле единственная основа это наличие трёх режимов (командный, редактирующий и навигационный), что всегда в навигационный можно попасть через [ Esc ], в командный через ":", а начать писать обычно можно через "i". Для чайников командный редко нужен, разве чтобы выйти без сохранения (":q!"), а c сохранением прямо из навигационного можно по "ZZ".
                                      0
                                      о, сенкс. Основная проблема это в самом начале работы, когда оно запукается, а че куда жать, даже самое примитивное - непонятно нифига =). Посему пока юзаю нано, но как-то несолидно =), ну и не везде он установлен, а vi/vim — классика =)
                                        0
                                        начните с gvim
                                      0
                                      Был невнимателен, уже читаю предыдущую статью =)
                                        0
                                        пройди vimtutor
                                        0
                                        С ним поставляется отличная встроенная обучалка для чайников.
                                        vimtutor
                                        0
                                        а проверки орфографии в vim нету ? :(
                                          0
                                          есть, aspell называется
                                            0
                                            начиная с версии 7, она встроенная
                                            –1
                                            Поддерживаю! Проверяйте орфографию перед тем как запостить статью. Прочитал первый абзац, читать дальше желание пропало.
                                            0
                                            Ёмаё, сколько лет использую 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
                                              Блин, скобки некоторые съелись :/
                                                0
                                                ой... ужас какой.. попробуйте http://www.vim.org/scripts/script.php?script_id=1318 для сниппетов
                                                  0
                                                  снипеты поравились но и без них хорошо
                                                0
                                                Ух ты. Спасибо!
                                                  0
                                                  Хорошая статья:) Вообще, если тут есть гуру в vim, хотелось бы рассмотреть вопросы возможности использования этого редактора как stand-alone ide для Java (навигация по коду, автодополнение и все прочее, что есть в современных средах разработки)... Использовал когда-то давно vim как среду разработки для C++ было очень приятно.
                                                  • UFO just landed and posted this here
                                                      0
                                                      Расскажите как открыть несколько файлов и все их редактировать, переключаться между ними и т.п....
                                                      Я все время забываю.
                                                        0
                                                        Чтобы открыть несколько файлов в разных табах(вкладках):
                                                        $ vim -p file1 file2 file3 ...
                                                        +3
                                                        для windows-версии VIM всё вышесказанное справедливо?

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

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

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

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

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

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

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

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

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

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

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

                                                                        Only users with full accounts can post comments. Log in, please.