.vimrc для фронтендера

    Привет, я занимаюсь фронтенд разработкой, и как-то так сложилось, что в своей повседневной работе активно использую vim.

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

    Под катом я опишу основные фишки конфига. Vim использую в связке c iTerm и темой solarized, но конфиг с минимальными изменениями подходит для любого терминала и любой темы. Из-за подробного описания каждой опции он будет очень полезен для тех, кто по каким-то причинам решил перейти на вим недавно.

    Как ни странно — в статье много картинок ;)


    Фишки конфига


    Краткое описание каждой опции или плагина


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

    1. Как это настроить
    2. Как этим вашим вимом пользоваться (использование не настроенного вима добавляет много-много незабываемых минут на старте)

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

    Установка Плагинов


    В качестве менеджера плагинов используется vundle.
    При первом заходе в vim, он установится автоматически и поставит все необходимые плагины.
    Физически плагины будут находиться в

    ~/.vim/bundle

    Список самих плагинов находится в .vimrc файле.

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

    Bundle 'altercation/vim-colors-solarized'

    То оно автоматически разворачивается в путь до гитхаба.

    https://github.com/altercation/vim-colors-solarized

    После добавления какого-то нового плагина в список, нужно сказать vundle чтобы он поставил его, а заодно и обновил существующие. Это делается командой :BundleInstall

    Предустановленные полезные плагины


    Vim-snipmate + Vim-snippets

    Один из самых популярных плагинов для поддержки сниппетов, и куча стандартных сниппетов к нему. Подстановка происходит по нажатию на Tab.
    Например если напечатать fun и нажать Tab то fun раскроется в объявление функции, а курсор переместится на первый аргумент сниппета - function_name:

    Переход между аргументами сниппета происходит также по Tab
    Сразу есть очень много уже готовых сниппетов для целой кучи языков. Они находятся тут:

    ~/.vim/bundle/vim-snippets/snippets/

    Этот путь появляется после первого запуска vim.
    В файле с названием _.snippets находятся сниппеты, которые могут быть полезны независимо от языка — например сниппет вставляющий копирайт или рыбный текст.

    Syntastic

    Он позволяет подключить множество статических анализаторов и проверять код на ошибки при сохранении и открытии файла.
    По умолчанию вместе с конфигом устанавливается только jshint (для этого необходимо, чтобы у вас уже был установлен npm).

    При нахождении ошибки, слева в окне появляются метки, указывающие на строку с ошибкой, а если курсор уже находится на строке с ошибкой, то её текст пишется в строке состояния вима.


    Tcomment_vim

    Небольшой плагин, который добавляет хоткеи для работы с комментариями:

    • gcc — переключает состояние комментарий/не комментарий, для текущей строки
    • gc то же самое но для выделенного блока текста.


    NERDtree

    Добавляет в vim возможность отображать каталоги, как древовидную структуру.

    Их можно открывать в соседнем табе по нажатию на t или в текущем — по Enter

    Если выбрать какую-нибудь папку или файл, и нажать m то можно будет его удалить, переименовать, или сделать что-то еще, что мы обычно хотим делать с файлами.

    Конфиг добавляет несколько удобных хоткеев — например по \f можно открыть split-view, в котором будет выделен текущий файл.
    При выборе другого файла в этом split-view, он откроется в этом же окне. Этим удобно пользоваться при большом окне консоли.


    Fugitive

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

    • \b — посмотреть blame для текущей строки
    • \g — показывает в сплите статус текущей ветки
    • :Gdiff — показывает в splitview дифф сделанных изменений


    FuzzyFinder

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

    Хоткей для открытия ctrl+t

    Из серьезных недостатков — значительный лаг при первом поиске в больших каталогах.

    Другие плагины

    Из достаточно интересных, но до сих пор не названных, остались еще Vim-surround и Vim-unimpaired, кроме них есть еще несколько других, полный список можно найти в файле конфига.
    Все плагины уже готовы к работе.

    Разная форма крусора для insert и command mode


    Курсор в insert mode меняет свою форму с кирпичика, на пайп, тем самым экономя мне большое количество нервных клеток.

    Код специфичен для iTerm, но это можно настроить, наверное, для любого терминала

    Крутая и щадящая для глаз тема Solarized


    Использую светлую ее версию в связке с аналогичной темой для iterm
    Именно она видна на всех скриншотах в этом посте.

    Если по каким-то причинам она вам не подходит, или вы хотите поставить что-нибудь своё, ее всегда можно убрать из конфига удалив бандл 'altercation/vim-colors-solarized' и раздел с заголовком Solarized

    Мелкие полезные фишки


    • Показываются trailing spaces, табы и некоторые другие символы, которые в обычной ситуации не отображаются

    • Настроенны умные отступы, можно нажать == на выбранной строке и в 99 процентах случаев vim автоматически сделает все отступы правильными.
    • Подсветка найденных результатов сбрасывается при нажатии на Enter.
    • Отдельный хоткей для включения/выключения paste mode — \p. Этот режим нужен при вставке больших кусков кода из буфера обмена.
    • После повторного открытия файла позиция курсора в нем восстанавливается. То есть, если закончил его редактировать на 69 строке, при повторном открытии файл откроется именно на 69 строке.
    • Убраны большинство надоедливых предупреждений, на мой взгляд они только мешают.
    • При использовании vimdiff, не отображаются изменения в пробельных символах.


    В Планах


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

    Где взять? :)


    Посмотреть репозиторий и забрать конфиг можно тут: github.com/L0stSoul/vim-config
    Поделиться публикацией

    Похожие публикации

    Комментарии 30
      +1
      Если, честно то довольно стандартный конфиг. Ничего не вынес для себя нового. Расскажите про автокомлит для JS, интересно.
        0
        Когда сделаю, если все получится — напишу :) У меня просто уже был один подход — немного неудачный :(
        +2
        Использую практически всё то же самое. Пара исключений:
        • NERDCommenter от создателя NERDTree и Syntastic вместо Tcomment_vim;
        • YouCompleteMe для автодополнения. Для C/C++ ему равных нет, я считаю. К тому же здорово интегрируется с Synastic.

        Идея с курсором понравилась, утащу себе.
        Мой конфиг здесь: github.com/JIghtuse/dotvim

        Ну и ещё пара традиционных ссылок.
        Крутейшая книга по Vim: pragprog.com/book/dnvim/practical-vim
        Видео от создателя книги Drew Neil, тоже много полезного: vimcasts.org/
          0
          Конфиг, конечно, дело сугубо личное и порой даже интимное, но посмотрите в сторону github.com/spf13/spf13-vim и github.com/bling/dotvim.

          Лично мне больше нравится вариант от bling. Форкнул его и теперь подстраиваю под себя.
            0
            Я в них загляну и утащу что понаривтся себе. у bling придется посидеть и поизучать что он делает. Я нелюблю когда есть части которые просто зачем то :)
            0
            Отдельное спасибо за тему для iTerm.
              0
              Вижу вы используете minibufexplorer, поставьте vim-airline, и включите опции:

              " If you want to auto-completion to work stable in older vim, disable this option
              let g:airline#extensions#tabline#enabled = 1
              
              " Airline tabs settings
              let g:airline#extensions#tabline#fnamemod = ':t'
              


              так намного удобнее и красивее, получится так: habrastorage.org/storage3/376/ae8/838/376ae8838a324ca5d5ff70ffb2d52fc1.png

              P.S. мой конфиг, если интересно: github.com/aliev/vim
                0
                Спасибо, плагин крутой, кажется буду пользовать :) в конфиг тоже загляну как будет время, спасибо.
                  +1
                  Попробуйте еще вот это

                  Bundle 'marijnh/tern_for_vim'
                  


                  Работает полный автокомплит для JavaScript-а, и GoTo definition, рефакторинг и много много других вкусняшек :) Ссылка на проект: github.com/marijnh/tern_for_vim
                    0
                    На него сейчас смотрю да, спасибо :)
                0
                Динамический символ курсора не будет работать в gnome-terminal.
                Лучше тогда уж так:

                if !has("gui_running") && $COLORTERM == "gnome-terminal" && has("autocmd")
                    " Should work in gnome-terminal >= 2.26
                    autocmd InsertEnter          * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"
                    autocmd InsertLeave,VimLeave * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape block"
                elseif $TERM =~ "xterm"
                    let &t_SI = "\<Esc>]50;CursorShape=1\x7"
                    let &t_EI = "\<Esc>]50;CursorShape=0\x7"
                endif
                
                  0
                  Я в качестве термирнальной системы пользую мак, так что нет возможности нормально проверить эти изменения, я подумаю как можно вмержить аккуратно. Вынесу в issue :)
                  0
                  Да это ж почти мой конфиг!
                  Для JS поставил vim-javascript от pangloss, пока вполне хватает.
                    0
                    Спасибо, посмотрю на него!
                    0
                    Курсор в insert mode меняет свою форму с кирпичика, на пайп

                    Есть плагин отдельно.
                    Мой конфиг
                      0
                      Из полезного неупомянутого:

                      " Show a vertical line on a 80th character
                      set textwidth=80
                      set colorcolumn=+1
                      highlight ColorColumn ctermbg=DarkGrey
                      
                      " Mark tabs and trailing spaces
                      set list listchars=nbsp:·,tab:→\ ,trail:·,extends:>,precedes:<
                      
                      " Scroll the window so we can always see 10 lines around the cursor
                      set scrolloff=10


                      Для себя утащу «Disable highlighting search result on Enter key». Никак не доходили руки загуглить, спасибо :)

                      0
                      Вот эти два пункта в конфиге есть. :)
                      " Mark tabs and trailing spaces
                      " Scroll the window so we can always see 10 lines around the cursor
                      Только чуть с другими занчениями

                      Про vertical line наверное утащу себе, завел иссью чтобы не забыть, спасибо :)
                        0
                        Тоже Mac пользую. Поделитесь с какими опциями Vim компилировали, если помните конечно. И, интересно, из каких соображений запускаете в терминале, а не GUI? И, если GUI, чем бы лучше проэмулировать терминал в окне Vim не подскажете?
                          0
                          Привет! если честно я почти уверен что он был у меня с самого начала ( может быть после устнаовки command line tools (есть на developer.apple.com)
                          В терминале его запускаю, потому что много работы происходит на удаленных машинах по ssh(там соответсвенно тоже vim) и в консоли, и так просто удобнее не переключать контекст, открываю пару сплитов в iTerm и вперед :)
                          Чем проэмулировать к сожалению незнаю :( А какие плюсы у GUI вима? я никогда не пользовался просто.
                            +1
                            Привет. Я имею два экземпляра: один терминальный, скомпилированный примерно так ./configure --with-features=huge --with-mac-arch=intel --disable-darwin --disable-gui --without-x --WITHOUT\_X11=yes --disable-nls --disable-gpm --disable-netbeans --disable-arabic --disable-farsi --disable-cscope --disable-emacs\_tags --disable-keymap --disable-langmap --enable-feature=browse --with-tlib=ncurses --enable-multibyte --prefix=\#prefix --mandir=\#man и второй GUI просто взятый отсюда github.com/b4winckler/macvim. Если уж честно, пользуюсь редко. Просто не мой стакан чая. Повседневно, для SSH nano sshfs, а так sublimetext и p9p acme. acme любимый. macvim не то чтобы лучше консольного, а как darwin vs linux человечней. Спасибо за статью. Популяризацию Vim считаю благородной миссией. К Брему Мулленару отношусь с глубоким почтением.
                          +1
                          Спасибо, даже не за конкретный конфиг, а за инициацию масс обмена конфигами :)
                          Мой конфиг тут, хотя там всё более менее стандартно.
                            0
                            да, Vim редактор удивительный. сколько бы ты его на настраивал под себя, все равно найдешь что нибудь вкусное в чужих конфигурациях!!! :)
                              0
                              даа, полностью согласен :)
                              0
                              Я загляну как будет время, что понравится в чужих конфигах с этой страницы утащу себе, и потом может напишу о результатах :)
                              0
                              Спасибо за smartcase. Уж столько пользуюсь, а почему-то не знал. Теперь не нужен :se noic. :)

                              P.S. Все же знают, что инструкции можно сокращать? :se ic = :set ignorecase, :se nonu = :set nonumber, :setf html = :set filetype=html, и т.д.

                              P.P.S.
                              > Отдельный хоткей для включения/выключения past mode — \p
                              Сперва удивился новому режиму, а потом только дошло, что это paste, а не past
                                0
                                спасибо, поправил :)
                                  0
                                  P.S. Все же знают, что инструкции можно сокращать? :se ic = :set ignorecase, :se nonu = :set nonumber, :setf html = :set filetype=html, и т.д.
                                  Знают. Но я крайне не рекомендую сохранять такие сокращения где‐либо, кроме истории команд. Много времени это не сэкономит, но вернитесь к своим настройкам через месяц и попробуйте вспомнить, что такое ́set nojs. Некоторые часто употребимые сокращения вроде ft, syn или exe сложно забыть, но тут вступают соображения единообразности: я не сокращаю nnoremap до nn, потому что такие сокращения сложно запомнить, а function до fun, потому что я не сокращаю nnoremap.

                                  Также я не рекомендую писать их другим людям, потому что вы не знаете, какие сокращения другие люди знают. Запись set noignorecase намекает о сути настройки даже непосвящённым, запись set noic намекает только о том, что на VimL достаточно всего двух символов (token’ов — объектов различимых для парсера, в данном случае, парсера в мозгу человека), чтобы написать нечитаемый код.
                                    0
                                    Ну если бы речь шла про конфиг, то вместо noignorecase мне было бы достаточно не добавлять ignorecase ;)
                                    Я написал про некое «противопоставление» моим дефолтным настройкам из конфига в случае, когда мне требуется иное поведение редактора при поиске чего-либо, а разово вводить мне удобнее команды в сокращённом виде. Остальные сокращения упомянуты только для примера и применимы в основном на «ненастроенной/чужой машине». На filetype у меня хоткей+wildmenu, на number/nonumber у меня хоткей, а ignorecase всегда включен.


                                    я крайне не рекомендую

                                    У каждого свой подход. Кто-то пишет сокращения в конфиге и снабжает их кучей комментариев, кто-то просто не использует сокращений, кто-то пишет кучу комментариев в конфиге без сокращений, а у кого-то в конфиге каша из сокращений без комментов и полных команд с комментариями :)
                                    Если конфиг не планируется для паблика, то рекомендации будут бесполезны — кому-то nn запомнить окажется проще, чем nnoremap, а кому-то просто пофиг чего у него там в конфиге :)
                                      0
                                      Я тоже использую сокращённые формы при наборе в командной строке. Только если бы мне требовалось часто менять настройку ignorecase, то я использовал бы привязку и там была бы полная версия. Но когда нужно мне обычно легче использовать \c/\C (в основном потому, что я представляю, сколько авторов дополнений забывают учитывать ignorecase, но не хочу проверять, чем мне это грозит в тех дополнениях, которые я использую).

                                      Относительно ignorecase: эта настройка влияет на matchstr()/match()/matchlist()/matchend(), substitute(), search()/searchpair()/searchpairpos()/searchpos(), :substitute/:smagic/:snomagic, операторы сравнения для строк (=~/!~, ==/!=, is/isnot (если оба операнда — строки), </>/<=/>= (аналогично)), /, ?, :/, :?, *, #. Множество авторов пишут неправильные операторы сравнения (правильные — это те же самые, но с добавлением # или? на конце), зависимость функций от значения ignorecase же игнорируется почти всеми. Даже я не уверен, что у меня во всех дополнениях все функции работают правильно.

                                      Спасает только то, что чаще всего входные данные таковы, что значение ignorecase не влияет на выходные. Однако мне не нравится полагаться на это соображение.

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

                                Самое читаемое