Данная статья не раскрывает всех премудростей перемещения по тексту или его редактирования. Основные движения можно узнать в vimtutor, остальные комбинации изучаются в процессе работы. Некоторые из них, особо важные в процессе программирования, я освещу позже.
Я достаточно долгое время использовал sublime (около 4 лет) в качестве основной среды разработки, но в последнее время кое-что изменилось: я освоил слепой 9-ти пальцевый метод печати. В тот момент я начал понимать людей, которым неудобно тянуться к мышке или стрелочкам. Убирать пальцы с «домашних» позиций стало неестественно и непродуктивно. Тогда я включил vintage. Проблема, вроде бы, стала неактуальна, но чего-то не хватало. Не помню, что заставило меня пересесть за vim, но мне всегда нравилось, как в нем выделяются фигурные скобки (MatchParen) и как выглядит курсор :). Vim я пробовал и до этого, когда правил конфиги на сервере, правда, вся «магия» ограничивалась переходом в режим вставки и успешным сохранением/выходом из редактора.
Первое, что необходимо понять — vim из коробки годится разве что для правки конфигов, для комфортной работы с кодом необходимо установить несколько плагинов. Мне хватило 33. Я не ставил перед собой цель полностью копировать поведение sublime, скорее сделать работу в vim'е такой же простой и интуитивно понятной. Данное руководство описывает все установленные плагины, а также настройки, которые, по моему мнению, делают работу с плагинами и самим vim'ом более удобной. Нужные плагины вы можете найти на официальном сайте, хотя мне больше нравится vimawesome. В качестве окружения выступает Ubuntu 16.04 и консольный vim 7.4.
Все плагины находятся на github, где вы можете посмотреть краткое руководство по установке или использованию того или иного плагина, за подробным описанием стоит идти в help. Если из описания плагина не ясно, как его использовать, то, наверняка, нужная комбинация биндится в разделе горячих клавиш. Все настройки прописываем в ~/.vimrc или ~/.vim/vimrc, если файл не существует — создаем. Пожалуй, начнем.
Установленные плагины
// set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
// let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
// common
Plugin 'scrooloose/nerdtree'
Plugin 'valloric/youcompleteme'
Plugin 'xolox/vim-easytags'
Plugin 'majutsushi/tagbar'
Plugin 'tpope/vim-fugitive'
Plugin 'easymotion/vim-easymotion'
Plugin 'ctrlpvim/ctrlp.vim'
Plugin 'terryma/vim-multiple-cursors'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'scrooloose/nerdcommenter'
Plugin 'matze/vim-move'
Plugin 'raimondi/delimitmate'
Plugin 'mattn/emmet-vim'
Plugin 'scrooloose/syntastic'
Plugin 'tpope/vim-surround'
Plugin 'sirver/ultisnips'
Plugin 'honza/vim-snippets'
Plugin 'xolox/vim-session'
Plugin 'xolox/vim-misc'
Plugin 'SyntaxAttr.vim'
Plugin 'dyng/ctrlsf.vim'
Plugin 'rking/ag.vim'
Plugin 'godlygeek/tabular'
// php
Plugin 'stanangeloff/php.vim'
Plugin 'sumpygump/php-documentor-vim'
Plugin 'arnaud-lb/vim-php-namespace'
// javascript
Plugin 'pangloss/vim-javascript'
// html
Plugin 'othree/html5.vim'
// twig
Plugin 'evidens/vim-twig'
// css
Plugin 'mtscout6/vim-tagbar-css'
// colors
Plugin 'damage220/solas.vim'
Plugin 'nanotech/jellybeans.vim'
Plugin 'mhartington/oceanic-next'
call vundle#end()
Команды
// просмотр всех установленных плагинов
:PluginList
// устанавливаем плагины
:PluginInstall
// удаляем ненужные плагины
:PluginClean
// поиск необходимого плагина
:PluginSearch foo
Установка
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
Зависимости
git и curl
Пользовательские настройки
// биндим команды перемещения на <C-j> и <C-k>
let g:move_key_modifier = 'C'
Пользовательские настройки
// автоматически обновлять буфер после переименовывания файла
let NERDTreeAutoDeleteBuffer = 1
Команды
// поиск тега в текущем файле (аналог Ctrl + R в sublime)
:CtrlPBufTag
Полезные комбинации
<C-j> и <C-k> - для перемещения курсора вниз и вверх соответственно
<Enter> - открыть в текущем окне
<C-t> - открыть в новой вкладке
<C-v> - открыть файл слева/справа (зависит от настройки)
<C-x> - открыть файл сверху/снизу (зависит от настройки)
<C-d> - переключение режима поиска по имени файла или полному пути
Пользовательские настройки
// По умолчанию, CtrlP ищет файлы по их полному пути, что мне показалось странным, поскольку на запрос "repo", имея следующую структуру файлов:
// project/src/Repository/Repository.php
// project/src/Repository/Foo.php
// CtrlP может придать больший вес файлу Foo.php. К счастью, CtrlP, как и многие другие плагины для vim'a, имеет гибкую настройку. Для решения проблемы нужно прописать
let g:ctrlp_by_filename = 1
// откуда начинать поиск. w - ближайшая директория, которая содержит признаки наличия CVS (.git, .svn). r - текущая директория (pwd).
let g:ctrlp_working_path_mode = 'wr'
// по умолчанию, как не сложно догадаться, поиск активируется по нажатию <C-p>, но т.к. у меня стоит другая комбинация (далее по тексту), я решил сбросить стандартное поведение.
let g:ctrlp_map = ''
// убираем переменные из списка тегов
let g:ctrlp_buftag_types = {
'php': '--php-kinds=icdf'
}
Зависимости
Для поиска по тегам нужен ctags
Пользовательские настройки
// сортировать в том порядке, в котором тег появляется в коде, а не по имени
let g:tagbar_sort = 0
// замена стандартных стрелочек раскрытия/сворачивания группы тегов
let g:tagbar_iconchars = ['+', '-']
// обеспечиваем переключатель
let g:tagbar_map_close = '<C-m>'
// Убираем переменные из списка
let g:tagbar_type_php = {
'ctagstype': 'php',
'kinds': [
'i:interfaces',
'c:classes',
'd:constants',
'f:functions'
]
}
Зависимости
ctags
--langdef=css
--langmap=css:.css.less.scss
--regex-css=/^[ t]*@([A-Za-z0-9_-]+)/@1/v,var,variables/
--regex-css=/^[ t]*.([A-Za-z0-9_-]+)/.1/c,class,classes/
--regex-css=/^[ t]*#([A-Za-z0-9_-]+)/#1/i,id,ids/
--regex-css=/^[ t]*(([A-Za-z0-9_-]+[ tn,]+)+){/1/t,tag,tags/
--regex-css=/^[ t]*@medias+([A-Za-z0-9_-]+)/1/m,media,medias/
Зависимости
tagbar
Пользовательские настройки
// отключаем зависимость от регистра
let g:EasyMotion_smartcase = 1
// отключаем тень (в момент выбора цели весь текст помечается как комментарий)
let g:EasyMotion_do_shade = 0
// какой группой подсвечивать цели
hi link EasyMotionTarget Search
Примечание
Поскольку easymotion работает с буфером напрямую, постоянно изменяя его, местами может появляться неприятный баг, когда вы попытаетесь отменить все изменения. Vim сообщит, что вы восстановили первоначальное состояние, но при попытке выйти из редактора, появится предупреждение о несохраненном буфере.
Команды
// открыть сессию. Если вы закрыли терминал или случайно нажали <C-z>, необходимо добавить "!" в конце команды, например, "OpenSession! name"
:OpenSession name
// сохранить сессию
:SaveSession name
Пользовательские настройки
// открывать сессию при старте. Опция игнорируется, если мы передаем vim некие файлы
let g:session_autoload = 'yes'
// включить автосохранение
let g:session_autosave = 'yes'
// сохранять состояние каждые 5 минут
let g:session_autosave_periodic = 5
// не сообщать ничего при автосохранении
let g:session_autosave_silent = 1
// открывать последнюю рабочую сессию вместо стандартной
let g:session_default_to_last = 1
Зависимости
misc
Пользовательские настройки
// разворачивать аббревиатуру по нажатию на <C-e>
let g:user_emmet_expandabbr_key = '<C-e>'
Пользовательские настройки
// включить отступы по нажатию на enter
let delimitMate_expand_cr = 1
// включить отступы по нажатию на пробел. " |" превращается в " | "
let delimitMate_expand_space = 1
// для html, необходимо дописать >:<, чтобы выставлялись правильные отступы
au FileType vim,html let b:delimitMate_matchpairs = "(:),[:],{:},<:>,>:<"
Пользовательские настройки
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
Пользовательские настройки
// количество пробелов после символа(ов) комментария
let g:NERDSpaceDelims = 1
Пользовательские настройки
// solarized не входит в стандартную поставку, необходимо загрузить набор тем
let g:airline_theme='solarized'
// использовать пропатченные шрифты
let g:airline_powerline_fonts = 1
// включить управление табами
let g:airline#extensions#tabline#enabled = 1
// всегда показывать tabline
let g:airline#extensions#tabline#tab_min_count = 0
// такое же поведение, как и в sublime: если файл с уникальным именем - показывается только имя, если встречается файл с таким же именем, отображается также и директория
let g:airline#extensions#tabline#formatter = 'unique_tail'
// скрыть буферы
let g:airline#extensions#tabline#show_buffers = 0
// имя файла + расширение :help filename-modifiers
let g:airline#extensions#tabline#fnamemod = ':t'
// убираем раздражающие ненужные красные панели с предупреждениями или ошибками. Предупреждения, как по мне, не нужны, поскольку ругаются даже на trailing-spaces и разные отступы: например табы и пробелы (привет от phpDoc). Для ошибок и так открывается дополнительное окно. Впрочем, вам решать.
let g:airline_section_warning = ''
let g:airline_section_error = ''
// убираем "X" для закрытия вкладки мышью (мышью!?)
let g:airline#extensions#tabline#show_close_button = 0
// убираем разделитель для вкладок
let g:airline#extensions#tabline#left_alt_sep = ''
// отключаем tagbar
let g:airline#extensions#tagbar#enabled = 0
// показывать номер вкладки
let g:airline#extensions#tabline#show_tab_nr = 1
// показывать только номер вкладки
let g:airline#extensions#tabline#tab_nr_type = 1
Пользовательские настройки
// ycm сам определяет подходящую версию интерпретатора, но, почему-то, с 3 версией дополнения не показываются - ставим вторую.
let g:ycm_server_python_interpreter='python'
// закрыть превью после ввода, например, при нажатии на закрывающую скобку ")"
let g:ycm_autoclose_preview_window_after_completion = 1
// позволяем ultisnips использовать tab для раскрытия сниппетов
let g:ycm_key_list_select_completion = ['<Down>']
Установка
Помимо установки самого плагина, необходимо запустить "install.py" с необходимыми флагами, подробнее в help.
Команды
// выделить все вхождения
:MultipleCursorsFind pattern
Полезные комбинации
<C-n> - выделение следующего слова под курсором
<C-p> - выделение предыдущего слова под курсором
<C-x> - пропустить текущее слово и перейти к следующему
// После того, как вы выделили все слова, можно приступить к редактированию:
c - удалить и перейти в режим редактирования
I - вставить в начало
A - вставить в конец
Команды
:CtrlSF foo *.php
Полезные комбинации
<C-j> и <С-k> - перейти к следующему и предыдущему вхождению
Пользовательские настройки
// перемещаем окно вправо
let g:ctrlsf_position = 'right'
Зависимости
ack или ag
Зависимости
ctags, сгенерированный тег-файл.
Полезные комбинации
ds' - удалить одинарные кавычки
dst - удалить обрамляющий тег
cs'" - заменить одинарные кавычки на двойные
ysiw" - поместить слово в двойные кавычки
ysiw<a> - поместить текст в тег <a>
Команды
// выравнивает текст по символу "|"
:Tabularize /|
Полезные ключи
// список поддерживаемых языков
--list-languages
// список тегов для конкретного языка
--list-kinds=lang
Установка
Ищите в своих репозиториях пакет со схожим именем. Например, в ubuntu - это exuberant-ctags
Примечание
Для крупных проектов имеет смысл создать какой-нибудь "tags.vendor" и добавить этот файл в переменную "tags"
Пользовательские настройки
// записываем теги локально для каждого проекта, вместо ~/.vimtags
let g:easytags_file = './tags'
// отключаем подсветку тегов
let g:easytags_auto_highlight = 0
// события (:help autocmd-events), которые слушает easytags
let g:easytags_events = ['BufWritePost']
// не блокировать vim во время обновления тег-файла
let g:easytags_async = 1
Зависимости
ctags
Довольно сложно описать каждый плагин подробно, да и незачем, наверное. Нет никакого смысла перечислять все команды, я лишь описал те, которые сам использовал, но и без того статья получилась весьма объемной. Теперь давайте рассмотрим возможности самого редактора.
// Для работы с табами, вместо пробелов, присвойте tabstop и shiftwidth одинаковые значения
set tabstop=4
set shiftwidth=4
set softtabstop=4
// автоматически обновлять файл при его изменении
set autoread
// настраиваем отступы
set autoindent
set smartindent
// показывать относительные номера строк. Удобно тем, что можно легко переходить к нужной строке командой 10j, например
set rnu
// всегда показывать строку статуса
set laststatus=2
// Время, которое vim ждет для ввода следующего символа комбинации клавиш.
// Например, если в vim'e существует комбинация "df", то после ввода символа "d" у вас есть пол секунды,
// чтобы ввести "f", иначе в буфер вставиться символ "d".
set timeoutlen=500
// эту команду я плохо понимаю. В документации написано, что это время ожидания для ввода последовательностей клавиш,
// в таком случае, я не знаю в чем отличие от предыдущей команды. Тем не менее, когда ожидание равно нулю, то при нажатии <Esc>
// для выхода из визуального режима или закрытия всплывающего меню, нет никакой заминки, что весьма приятно.
set ttimeoutlen=0
// более удобная работа с кириллицей. При нажатии <C-6> в режиме вставки, vim изменит режим с "Insert" на "Insert (lang)",
// после чего будут вводиться русские символы. Если вернуться в нормальный режим, то все команды будут работать.
set keymap=russian-jcukenwin
set iminsert=0
set imsearch=0
// Выставляем кодировку
set encoding=utf-8
set termencoding=utf-8
// Отключаем swap-файлы. Ставьте на свое усмотрение, мне эта возможность чаще мешала
set noswapfile
// Если в течении этого времени, вы не будете перемещать курсор или печатать, vim обновит swap-файл,
// а также активирует событие CursorHold. Некоторые плагины, вроде tagbar, слушают это событие для обновления состояния.
// Так как swap-файлы я не использую, решил сделать значение поменьше (по умолчанию - 4000).
set updatetime=500
// :vsplit открывает окна справа
set splitright
// :split открывает окна снизу
set splitbelow
// убираем совместимость с vi
set nocompatible
// ищем тег-файл в текущей директории
set tags=./tags;
// Игнорировать регистр при поиске. Намного удобнее вводить команды без учета регистра, например ctrlsf, вместо CtrlSF.
// Для поиска с учетом регистра, нужно поместить C в любое место искомой строки
set ignorecase
// например, при переходе к тегу, vim может ругаться, что текущий буфер не сохранен, hidden решает эту проблему
set hidden
// подсвечивать все совпадения при поиске
set hlsearch
// подсвечивать совпадение во время поиска на лету
set incsearch
// выделять строку, на которой находится курсор
set cursorline
// количество cтрок в всплывающем окне
set pumheight=10
// использовать пробелы в качестве разделителей окон. Не забудьте поставить в конце строки символ пробела
set fillchars+=vert:
// меняем mapleader на ",", по умолчанию - ""
let mapleader=","
// рекомендуемые настройки для Vundle
filetype off
filetype plugin on
filetype plugin indent on
// включить подсветку синтаксиса
syntax enable
// выбираем темный фон
set background=dark
// выбираем цветовую схему
colorscheme solas
[[mode]nore]map keys command
где mode — режим или окружение, где работает комбинация
nore (non-recursive) — не «раскрывать» комбинацию, а использовать значение по умолчанию
:map j gg // j = gg
:map Q j // Q = gg
:noremap W j // W = j
<CR> - enter
<C> - Ctrl
Подробнее про назначение комбинаций
// выходим в "нормальный" режим по df. "d" используется гораздо чаще, чем "j"
// наверное, забиндить "jj" было бы куда уместнее, но я уже привык, к тому же так быстрее
imap df <Esc>l
// часто нужно отделять блоки кода пустой строкой, например, перед return
nnoremap 2o o<CR>
// тоже самое, что и предыдущая команда, только в другом направлении
nnoremap 2O O<Esc>O
// передвинуть текущую вкладку вправо
nnoremap tm :tabm +1<CR>
// передвинуть текущую вкладку влево
nnoremap tM :tabm -1<CR>
// убрать подсветку найденных совпадений
nnoremap <C-h> :noh<CR>
// комментируем фрагмент кода
map <C-?> <plug>NERDCommenterComment
// комментируем строку, повторное нажатие убирает комментарий
map <C-_> <plug>NERDCommenterToggle
// создаем phpDoc для функций, классов, свойств
nnoremap <C-d> :call PhpDoc()<CR>
// показать окно с тегами
nnoremap <C-m> :TagbarToggle<CR>
// показать дерево проекта
nnoremap <C-p> :NERDTreeToggle<CR>
// показать syntax group для участка кода, а также цвет этой группы. Удобно при создании своей цветовой схемы
nnoremap <C-g> :call SyntaxAttr()<CR>
// мне гораздо удобнее нажать <C-j> и <C-k> для выбора последующего и предыдущего значения, чем <C-n> и <C-p>
inoremap <C-j> <C-n>
inoremap <C-k> <C-p>
cnoremap <C-j> <C-n>
cnoremap <C-k> <C-p>
// прописываем use
autocmd FileType php noremap <C-u> :call PhpInsertUse()<CR>
// открыть ~/.vimrc
nnoremap <F4> :tabe ~/.vimrc<CR>:tabm 0<CR>
// сохранить ~/.vimrc и применить изменения
nnoremap <F5> :w<CR>:so $MYVIMRC<CR>
Мне не нравится идея менять стандартное поведение клавиш, но следующие комбинации я нашел весьма удобными для себя. Я редко пользуюсь поиском символа в строке (f и F), а такие команды, как J и K, я ни разу так и не использовал.
// переместиться в начало видимой области
nnoremap K H
// переместиться в конец видимой области
nnoremap J L
// открыть предыдущее окно
nnoremap H gT
// открыть следующее окно
nnoremap L gt
// окно поиска файлов
nnoremap F :CtrlP<CR>
nnoremap ff :CtrlP<CR>
// find tag - нечеткий поиск тега в файле
nnoremap ft :CtrlPBufTag<CR>
// find buffer - нечеткий поиск буфера
nnoremap fb :CtrlPBuffer<CR>
// find symbol - переместиться к любому символу в файле
nmap fs <Plug>(easymotion-s)
// find line - переместиться к любому символу в строке
nmap fl <Plug>(easymotion-sl)
// find current - найти текущий файл в дереве проекта
nnoremap fc :NERDTreeFind<CR>
// find pattern - поиск слова в проекте
nnoremap fp :CtrlSF
Самой сложной задачей для меня оказалась установка youcompleteme настройка переключения вкладок <Alt-n>, на которую я потратил часов 5 (5, Карл!). Как я только не писал: <Alt-1>, <A-1>, <M-1>, ^[1 — escape-последовательность (<C-v>, потом Alt + 1). Читал :help :map-alt-keys, создавал файл ~/.inputrc с содержанием set convert-meta on. Забавно, но в xterm всё работало. Gnome-terminal преподнес мне уйму незабываемых ощущений, пока я не наткнулся на этот ответ на SO. Должен признаться, я почти сразу нашел этот ответ, но мне показалось, что программировать комбинацию клавиш, хм, слишком. Немного изменив пример, получаем:
for c in range(1, 9)
exec "set <A-".c.">=e".c
exec "map e".c." <A-".c.">"
let n = c - '0'
exec "map <M-". n ."> ". n ."gt"
endfor
Это какой-то мазохизм, и я верю, что есть что-то более адекватное (напишите в комментариях, если это так, пожалуйста), просто в тот момент я был рад любому решению.
// вставка из системного буфера. Нужен vim, скомпилированный с флагом "clipboard". Чтобы проверить, наберите vim --version | grep "+clipboard" в вашем терминале
<C-r> *
// центрировать экран на текущей строке
zz
// перейти к определению тега (необходим тег-файл)
<C-]>
// вернуться на уровень выше по стеку вызовов команды <C-]>
<C-t>
// вставка последнего удаленного(d) или скопированного(y) текста. Удобно использовать в режиме вставки или в режиме командной строки
<C-r> "
Заключение: vim дает свободу, несравнимую ни с чем. Возможно, emacs может составить конкуренцию, но с ним пока не работал. Переход от sublime'a к vim'у напоминает мне переучивание с 4-х пальцевой (насколько я помню) печати на 9-ти пальцевую. Не поймите меня неправильно, sublime замечательный редактор, речь о том, что поначалу вы теряете привычную скорость; проходит время, продуктивность возвращается до прежнего уровня и начиная с этого момента вы наращиваете скорость. Все основные функции, которыми я пользовался в sublime, перекочевали в vim в том или ином виде. Самое время отрабатывать комбинации и расширять стандартные возможности редактора с помощью viml. Есть еще одна особенность, которая напоминает мне смену основной ОС с Windows на Ubuntu. В Windows я пользовался терминалом, наверное, раз 10 за всё время. Я не могу сказать, что мне чего-то не хватало, вполне всё устраивало. Но когда переходишь на linux, то волей-неволей начинаешь использовать консольные команды. Не осознанно (и это важно) вы получаете инструмент (bash) для решения определенных задач. В vim'e приходится постоянно что-то гуглить в поисках решения тех или иных проблем. Очень часто я вижу решения, которые отличаются от привычной настройки sublime или похожих редакторов в стиле key:value. Вы в буквальном смысле программируете свой редактор. Почти сразу вы видите, как инициализировать переменную, чуть позже — как применить ту или иную настройку для определенного типа файлов, еще позже — как слушать события или создавать циклы. По крупицам информации вы получаете представление про viml и, возможно, скоро напишите свой первый плагин. Конечно, всё это можно узнать просто открыв документацию к языку, но, должен сказать, желания освоить python или api sublime у меня так и не появилось. Лично я уверен, что vim приберег для меня еще немало приятных сюрпризов, а мой .vimrc, похоже, будет меняться всё время, пока я работаю с этим редактором.
2. В readme nerdtree сказано, что можно изменить символ открытия/закрытия директории прописав g:NERDTreeDirArrowExpandable и g:NERDTreeDirArrowCollapsible. Однако, при попытке выставить "+" и "-", nerdtree падает. Кто-нибудь пробовал починить?
3. Как подружить youcompleteme и omnicompletion? Приходится идти напрямую, нажимая <C-x><C-o>.
4. В начале каждого php-скрипта стоит "<?php", когда курсор находится над "<", то vim ищет ближайший ">". Как отключить подсветку этого символа для php-файлов? Что-то на подобии:
au FileType php set matchparen-=<
" set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' " common Plugin 'scrooloose/nerdtree' Plugin 'valloric/youcompleteme' Plugin 'xolox/vim-easytags' Plugin 'majutsushi/tagbar' Plugin 'tpope/vim-fugitive' Plugin 'easymotion/vim-easymotion' Plugin 'ctrlpvim/ctrlp.vim' Plugin 'terryma/vim-multiple-cursors' Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' Plugin 'scrooloose/nerdcommenter' Plugin 'matze/vim-move' Plugin 'raimondi/delimitmate' Plugin 'mattn/emmet-vim' Plugin 'scrooloose/syntastic' Plugin 'tpope/vim-surround' Plugin 'sirver/ultisnips' Plugin 'honza/vim-snippets' Plugin 'xolox/vim-session' Plugin 'xolox/vim-misc' Plugin 'SyntaxAttr.vim' Plugin 'dyng/ctrlsf.vim' Plugin 'rking/ag.vim' Plugin 'godlygeek/tabular' " php Plugin 'stanangeloff/php.vim' Plugin 'sumpygump/php-documentor-vim' Plugin 'arnaud-lb/vim-php-namespace' " javascript Plugin 'pangloss/vim-javascript' " html Plugin 'othree/html5.vim' " twig Plugin 'evidens/vim-twig' " css Plugin 'mtscout6/vim-tagbar-css' " colors Plugin 'damage220/solas.vim' Plugin 'nanotech/jellybeans.vim' Plugin 'mhartington/oceanic-next' call vundle#end() " settings set tabstop=4 set softtabstop=4 set shiftwidth=4 set autoread set autoindent set smartindent set rnu set laststatus=2 set timeoutlen=500 set ttimeoutlen=0 set keymap=russian-jcukenwin set iminsert=0 set imsearch=0 set encoding=utf-8 set termencoding=utf-8 set updatetime=500 set noswapfile set splitright set splitbelow set nocompatible set tags=./tags; set ignorecase set hidden set hlsearch set incsearch set cursorline set pumheight=10 set fillchars+=vert: let mapleader="," filetype off filetype plugin on filetype plugin indent on " autocmd CompleteDone * pclose " color syntax enable set background=dark colorscheme solas " abbreviations abbr help tab help " mappings imap df <Esc>l nnoremap 2o o<CR> nnoremap 2O O<Esc>O nnoremap tm :tabm +1<CR> nnoremap tM :tabm -1<CR> nnoremap K H nnoremap J L nnoremap H gT nnoremap L gt nnoremap F :CtrlP<CR> nnoremap ff :CtrlP<CR> nnoremap ft :CtrlPBufTag<CR> nnoremap fb :CtrlPBuffer<CR> nmap fs <Plug>(easymotion-s) nmap fl <Plug>(easymotion-sl) nnoremap fc :NERDTreeFind<CR> nnoremap fp :CtrlSF nnoremap <C-h> :noh<CR> map <C-?> <plug>NERDCommenterComment map <C-_> <plug>NERDCommenterToggle nnoremap <C-d> :call PhpDoc()<CR> nnoremap <C-m> :TagbarToggle<CR> nnoremap <C-p> :NERDTreeToggle<CR> nnoremap <C-g> :call SyntaxAttr()<CR> inoremap <C-j> <C-n> inoremap <C-k> <C-p> cnoremap <C-j> <C-n> cnoremap <C-k> <C-p> autocmd FileType php noremap <C-u> :call PhpInsertUse()<CR> nnoremap <F4> :tabe ~/.vimrc<CR>:tabm 0<CR> nnoremap <F5> :w<CR>:so $MYVIMRC<CR> " map <alt+n> to navigate through tabs for c in range(1, 9) exec "set <A-".c.">=e".c exec "map e".c." <A-".c.">" let n = c - '0' exec "map <M-". n ."> ". n ."gt" endfor " nerdtree let NERDTreeAutoDeleteBuffer = 1 " move let g:move_key_modifier = 'C' " youcompleteme let g:ycm_server_python_interpreter='python' let g:ycm_autoclose_preview_window_after_completion = 1 let g:ycm_key_list_select_completion = ['<Down>'] " emmet let g:user_emmet_expandabbr_key = '<C-e>' " airline let g:airline_theme='solarized' let g:airline_powerline_fonts = 1 let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#tab_min_count = 0 let g:airline#extensions#tabline#formatter = 'unique_tail' let g:airline#extensions#tabline#show_buffers = 0 let g:airline#extensions#tabline#fnamemod = ':t' let g:airline_section_warning = '' let g:airline_section_error = '' let g:airline#extensions#tabline#show_close_button = 0 let g:airline#extensions#tabline#left_alt_sep = '' let g:airline#extensions#tagbar#enabled = 0 let g:airline#extensions#tabline#show_tab_nr = 1 let g:airline#extensions#tabline#tab_nr_type = 1 " easymotion let g:EasyMotion_smartcase = 1 let g:EasyMotion_do_shade = 0 hi link EasyMotionTarget Search hi EasyMotionTarget2First ctermfg=202 ctermbg=None cterm=None hi EasyMotionTarget2Second ctermfg=202 ctermbg=None cterm=None " session let g:session_autoload = 'yes' let g:session_autosave = 'yes' let g:session_autosave_periodic = 5 let g:session_autosave_silent = 1 let g:session_default_to_last = 1 " NERDCommenter let g:NERDSpaceDelims = 1 " html au BufNewFile,BufRead *.tpl set filetype=html syntax=php " syntastic let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0 " tagbar let g:tagbar_sort = 0 let g:tagbar_width = 35 let g:tagbar_iconchars = ['+', '-'] let g:tagbar_map_close = '<C-m>' let g:tagbar_type_php = { 'ctagstype': 'php', 'kinds': [ 'i:interfaces', 'c:classes', 'd:constants', 'f:functions' ] } let g:tagbar_type_javascript = { 'ctagstype':'JavaScript', 'kinds' : [ 'f:functions', 'c:classes', 'm:methods', 'p:properties' ] } " delimitmate let delimitMate_expand_cr = 1 let delimitMate_expand_space = 1 au FileType vim,html let b:delimitMate_matchpairs = "(:),[:],{:},<:>,>:<" " NERDTree " let g:NERDTreeDirArrowExpandable = '+' " let g:NERDTreeDirArrowCollapsible = '-' " ctrlp let g:ctrlp_by_filename = 1 let g:ctrlp_working_path_mode = 'wr' let g:ctrlp_map = '' let g:ctrlp_buftag_types = { 'php': '--php-kinds=icdf' } " ctrlsf let g:ctrlsf_position = 'right' " easytags let g:easytags_file = './tags' let g:easytags_auto_highlight = 0 let g:easytags_events = ['BufWritePost'] let g:easytags_async = 1
Если вы заядлый vim'ер, то вам могут понравиться следующие расширения для chrome:
PS: вместо родного символа комментария viml (двойная кавычка), я решил использовать "//", поскольку viml на хабре нет, и я не знаю, есть ли язык со схожим комментированием кода.
PS2: некоторые комбинации экранированы символом "", дабы парсер не считал их за html-теги. Тег «pre» — блочный, решил, что лучше уж так.
Автор: daMage