Данная статья не раскрывает всех премудростей перемещения по тексту или его редактирования. Основные движения можно узнать в 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_-]+[ \t\n,]+)+)\{/\1/t,tag,tags/
--regex-css=/^[ \t]*@media\s+([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
Самой сложной задачей для меня оказалась 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» — блочный, решил, что лучше уж так.
UPD: добавлена поддержка gui для solas.
Комментарии (110)
ruFog
17.06.2016 12:06+1Спасибо за опыт! Есть ли какой наглядный отладчик и инструмент для работы с БД?
Amareis
17.06.2016 12:24+30Эх, когда же у меня скорость набора текста будет узким местом? :(
А то, бывает, напишешь за день сотню строчек и уже хорошо.greabock
19.06.2016 14:37Верно лишь отчасти. Быстрее печатаешь => чаще пробуешь варианты => чаще получаешь результат => быстрее получаешь опыт => быстрее прокачиваешь скилл.
Так что, скорость печати поднимать никогда не рано.
izyk
17.06.2016 12:25+10А что за беда случилась с вашим десятым пальцем?
sefus
17.06.2016 13:38+1У меня тоже выходит 9-ти пальцевый. Я пробел только одним большим пальцем жму.
mlg
17.06.2016 13:45+1Вспомнился эпизод из
'Сеньор Президент' Мигеля Анхеля Астуриаса«Многоуважаемая сеньора, – начала она читать вслух другое анонимное письмо, – я узнал от одного из своих друзей, что в ночь расстрела вашего мужа вы стояли, прижав ухо к стене тюрьмы, и считали выстрелы – девять выстрелов за стеной, – но не знаете, какой из них вырвал из мира живых лиценциата Карвахаля, богом благословенного. Под вымышленным именем, – в наше время не доверишься бумаге, – и после долгих колебаний, как бы не причинить вам боль, я все же решился сообщить, что об этом знаю, так как был свидетелем кровавой расправы.
…
Очутившись в патио и увидев перед собой взвод солдат, он провел тыльной стороной руки по глазам, чтобы лучше осознать то, что увидел.
…
Присутствие собратьев по несчастью, тоже полураздетых, вернуло ему самообладание. Когда закончили чтение смертного приговора, он поднял голову, бросил страдальческий взгляд на штыки и что-то сказал, совсем тихо.…
В тот же момент в стенах тюрьмы уже стегал себя собственным эхом голос: «Именем нации!…» Один, два, три четыре, пять, шесть, семь, восемь, девять залпов следовали один за другим. Машинально я отсчитывал их по пальцам. С этой минуты я не могу отделаться от странного чувства, что один палец у меня лишний.daMage
17.06.2016 18:19Пока не смог приучить свой правый большой палец нажимать на пробел.
bodqhrohro
17.06.2016 22:35Меня даже Шахиджанян приучить не смог (но левый). Пока набирал в основном тексты на человеческих языках — ещё худо-бедно думал, с какой стороны последний символ перед пробелом. Особо мозг выносили знаки препинания, они где-то ниже сознания. К автоматизму даже не приблизился. А потом в какой-то момент прыгать перестал, когда заметил — было уже поздно. Вообще, при всём том, что слепой десятипальцевый метод избавляет от необходимости думать — а каким бы пальцем нажать t, например, кошерность прыгания по пробелу выглядит дикостью. С точки зрения здоровья рук полезно, пожалуй, но не более. Что характерно, левый большой при этом без дела не остаётся — Alt зажимает, Mod4, иногда также Fn и Ctrl вместо мизинца. Правый же кроме пробела жмёт только AltGr (переключение раскладки). ДА, КАПс я юзАЮ ПО назначЕНИЮ.
daMage
17.06.2016 23:41А как вам набирать «Ф» или «A» латинскую? Для меня самая боль — нажать на правый shift мизинцем правой руки. Приходится либо смещать правую руку, либо нажимать на краешек кнопки. Клавиатура у меня мембранная, часто «съедает» нажатие.
bodqhrohro
18.06.2016 00:19В случае с далёкими и не очень клавишами растягиваю пальцы гармошкой. Указательный так обычно остаётся на месте.
klirichek
19.06.2016 13:42+1У 9-пальцевого перед 10-пальцевым есть пара недостатков, но они достаточно несущественные.
1). Стирается место на пробеле, в которое нажимаешь. Сперва полируется, а потом там возникает ощутимая вдавленность. Но чтобы эффект возник, нужно набрать порядка 10М текста на человеческом языке. За это время уже сменишь клавиатуру, а то и компьютер целиком!
2) При больших объёмах рабочий большой палец таки устаёт! Но большие объёмы — это 5-7 часов набора со скоростью ~300-400 символов в минуту, с небольшими перерывами каждый час. Если вы не зарабатываете синхронным стенографированием гуманитарных лекций, то с этой проблемой не столкнётесь.bodqhrohro
19.06.2016 13:54Для стенографирования, к слову, есть специальный аккордный метод ввода. К нему в идеале клавиатура специальная нужна, но для тренировки и повседневного использования можно и на кверти. Вот свободная реализация, например.
bitfroster
17.06.2016 12:26+4для комфортной работы с кодом необходимо установить несколько плагинов. Мне хватило 33.
За список плагинов спасибо, возможно когда-то переползу на vim полностью. Но текст для людей малознакомых с vim звучит шокирующе, т.к. 33 != несколько.maks1mm
17.06.2016 18:22В том же Atom по умолчанию уже установлена целая куча плагинов, всё отличие только в том что здесь после установки их вообще нет.
elmigranto
19.06.2016 05:18+1> В том же Atom по умолчанию уже установлена целая куча плагинов
Разница в том, что всё это дело установлено из коробки и является плагинами по совсем другой причине, нежели в виме.
Delphinum
17.06.2016 18:30+1Но текст для людей малознакомых с vim звучит шокирующе, т.к. 33 != несколько
Я вам могу обернуть их в один плагин, будете друзьям говорить — Vim легчайший редактор, накатил 1 плагин и у тебя полноценная среда для разработки.
daMage
17.06.2016 18:33Всё зависит от ваших потребностей. Мне вот нужно 33, кому-то нужно меньше. Вообще, я хотел облегчить людям, не знакомым с vim'ом, переход на этот редактор, предоставив им весь набор инструментов, которые они привыкли видеть в других редакторах. С минимальными усилиями получить среду для разработки, а уже потом решить надо оно им или нет. Ведь мало у кого есть желание тратить дни на допиливание редактора, когда сроки поджимают.
Delphinum
17.06.2016 18:34+3Вы предлагаете людям переходить на Vim когда у них сроки поджимают? Вас не Люцефером звать?
daMage
17.06.2016 18:50+1Предлагаю людям поиграться с редактором, а дальше решить, нужен он им или нет.
VolCh
18.06.2016 12:28Сроки всегда поджимают, поэтому выделить неделю-две на базовую настройку редактора параллельно с обучением работы в нём мало кто может себе позволить, а вот если уже настроен, то времени займёт гораздо меньше.
BelBES
18.06.2016 12:45+1Практика показывает, что такие редакторы лучше изучать "с читого листа"… проще самому добавлять необходимые плагины, чем искать в чужом конфиге то, как сделать ту или иную вещь.
VolCh
18.06.2016 23:55Не сказал бы. С чистого лица можно вообще не догадаться о существовании плагинов, или догадаться о них, но не знать, что их можно конфигурировать, или просто выбрать неудачный плагин для своей задачи.
moveax3
17.06.2016 14:07+3опять пугают народ кучами плагинов сразу
всем, кто интересуется вимом, настоятельно рекомендую сначала прочесть например Drew Nei — Practical Vim, или нечто подобное, что бы понимать редактор, а плагины — дело десятое и их лучше подбирать самому по мере необходимости.
и не надо путать скорость набора текста и скорость редактирования, нам, программистам, нужно второе — постоянные перемещения между кавычками, скобками, функциями, блоками кода, поверхностный рефакторинг — все это можно делать в vim вообще без каких либо плагинов вообще, эффективнее чем в любом классическом редакторе (emacs + evil уже не классический редактор :) )daMage
17.06.2016 19:27Предполагается, что читатель знаком с основными движениями. Это ведь первое, что привлекает внимание, когда человек знакомится с vim'ом. По крайней мере, у меня так было.
Vkil
18.06.2016 00:21Я бы еще посоветовал Learn Vim Progressively, как наглядное пособие для плавного перехода с обычного редактора.
(http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/)
VolCh
18.06.2016 12:30постоянные перемещения между кавычками, скобками, функциями, блоками кода, поверхностный рефакторинг
я бы добавил и файлами. Без удобной навигации по файлам проще использовать mc+mcedit чем с vim разбираться.moveax3
18.06.2016 12:37довод мол проще не разбираться, чем разбираться воистину неопровержим, проще только вообще ничего не делать )
по навигации по файлам — файловая система неплохо работает, а если у вас в проекте 10000 файлов со сложными взаимосвязями, и что бы во всем этом разобраться, нужны специальные инструменты — возможно стоит пересмотреть архитектуру, или, в случае, если это невозможно, сесть на идею/эклипсы/другие комбаины. Но мне все же ближе мнения, что если с проектом невозможно разобраться с помощью vim, cd, ls и grep и чтения документации, значит с проектом что то не так.VolCh
19.06.2016 00:03+1Да нет сложных взаимосвязей — обычные для PHP. Другое дело, что регулярками их сложно анализировать — такой уж синтаксис, например
<?php
namespace A\B\C;
use A\D\E as F;
$obj = new F;
И с последней строки очень хочется перейти на файл ../../D/E.php, где строки class F нет.
raidhon
17.06.2016 14:29+15Когда то я тоже кроме Gedit ( хотя конечно Sublime и Vim превосходят по возможностям Gedit ) ничего не признавал.
А потом поставил IDEA и все понял.
Теперь сложно смотреть на все эти свистопляски серьезно.
P. S
Это только мое мнение!BelBES
17.06.2016 15:24+1А я вот в свое время перешел с Visual Studio на Emacs, и не хватает мне в нем разве что продвинутой навигации по коду (автокомплит, переходы к объявлению и т.п. в emacs реализованы фигово и судя по всему не могут быть качественно реализованы в связи с однопоточностью самого emacs)… а так возможностей вполне хватает для комфортной работы.
lampslave
17.06.2016 15:40+1Аналогично. Кто хочет — пусть ковыряется с 33 плагинами и теряет скорость ради призрачной «свободы», а мы пока дело делать будем. Сколько статей про настройку VIM не читал, везде вижу только «я поставил 100500 плагинов чтобы повторить редактор N» и нигде «моя производительность выросла в 3 раза за счёт фичи N, которая есть только в VIM».
BelBES
17.06.2016 16:08+1С аскетичными редакторами все так-же, как и с, например, Linux: кто-то постоянно крутит настройки доводя инстурмент до совершенства, а кто-то один раз настраивает и пользуется потому, что удобно. Ну а статьи пишут как раз те, что идейные и используют vim/emacs ради кастомизуемости..
raidhon
18.06.2016 00:41Хотя я и программирую в IDE, а не в редакторе, моя операционная система Debian.
И дело тут не в кастомизируемости, а в скорости и удобстве работы.
В комплекте с SSD, i7 и ядром от Zen дает самое быстрое индексирование моих проектов.
И самое главное я живу в той среде под которую пишу софт!
Да и такая IDE как IDEA от JetBrains кастомизируется ничуть не хуже Vim или Emacs.
Тысячи плагинов и гибкие настройки превращают её в то что вам захочется.
И делает это она гораздо проще чем любой редактор, а по большей части и другие IDE.
Delphinum
17.06.2016 17:08+1Моя производительность выросла в 3 раза благодаря normal mode, UltiSnips и vim_templates, которые есть только в Vim.
lampslave
17.06.2016 17:23Поздравляю вас, даже несмотря на то, что сниппеты и шаблоны есть в любой IDE, а в некоторых ещё и VIM-овская навигация присутствует.
Delphinum
17.06.2016 17:31+1Вы правда хотите об этом со мной посморить? )
lampslave
17.06.2016 17:50Спасибо, я своё отхоливарил. Я не отрицаю (хотя бы из соображений экономии времени), что некоторых ситуациях VIM может быть мощнее, чем всё остальное, но предлагаю задуматься, стоит ли игра свеч. Выросла ли производительность в абсолютных значениях или только в относительных (т.е., что было бы, если бы вы взяли готовую IDE и всё потраченное на VIM время использовали для совершенствования своего программистского скилла)?
moveax3
18.06.2016 12:51прикол в том, что один раз изучив vim, его потом можно использовать везде — на серверах в качестве переносимого редактора, просто клонируя свой конфиг, в той же идее посредством плагина(в очень многих редакторах есть подобное), в браузерах посредством vimium и вимператоров всяких, в консоли посредством включения vim mode и т.д.
lampslave
18.06.2016 13:10Править конфиги можно научиться за час или два, а чтобы «один раз изучить VIM» времени нужно, скажем так, «чуть больше».
bodqhrohro
17.06.2016 23:17-1Фича Vim? Да пожалуйста. Как подобное воспроизвести в ${idename}?
P. S. Имитаторы Vim-управления не предлагать, это слишком просто :)Delphinum
17.06.2016 23:18Плагин написать?
bodqhrohro
17.06.2016 23:26Ошибка: плагин для открытия двери в туалет конфликтует с плагином контроля кипения чайника. Бида-бида, теперь придётся это всё руками делать! Хотя нет, на такой случай где-то валялся плагин для контроля открытия крышки чайника, можно попробовать приспособить… да ну в баню, мне же работать надо — лучше руками. И так годами…
vitalybaev
17.06.2016 19:33Я долго в последнее время прыгал с редактора на редактор. Долгое время работал в Coda (Mac OS only)
Со временем мне надоело, что разработчики почти ничего не делают, поставил Atom, потенциально очень крутой редактор, но после недели работы надоела скорость WebView. Поставил Sublime, это были счастливые 2 недели, настроил под себя, все круто, но понял, что хочу большего, умного автокомплита. Да и развитие самого Sublime и его сообщества удручает.
И вот уже месяц на PHPStorm, и тоже не могу представить жизнь без полноценной IDE
firexonix
17.06.2016 14:31В свое время накидал sh скрипт, для разворачивания vim, как IDE для разработки на python3 (в репозитории был только с поддержкой python2)
Конфиг и необходимые прилагается, может кому будет интересно
github.com/Lucidyan/vpyde3
kstep
17.06.2016 14:48+2Мне vim-plug больше по нраву тем, что умеет всякие хуки (типа пересборки либ при обновлении YCM) и условную загрузку плагинов (а у меня их очень много), так что некоторые плагины у меня подгружаются только для определённых типов файлов или при попытке использовать определённые команды.
rhamdeew
17.06.2016 14:58Пара слов про мой конфиг Vim — https://hmdw.me/vim/#more
Возможно кому то пригодится что-то.
Если честно так и не пересел полностью на Vim и в Sublime Text разработка пока быстрее и удобнее получается. Чуть ли не каждый год предпринимаю попытку пересесть на Vim и настраиваю его. В итоге все заканчивается одним и тем же — выкидываю свой vimrc и оставляю дефолтный.
Думаю было бы лучше если бы вы залили свой vimrc на GitHub или Gist.
valililili
17.06.2016 15:05+1Первое, что необходимо понять — vim из коробки годится разве что для правки конфигов, для комфортной работы с кодом необходимо
установить несколько плагинов. Мне хватило 33.
Не пугайте людей.
1. Из коробки он достаточно хорош. На своих многочисленных рабочих местах далеко не всегда отступаю от типовой конфигурации — для небольших изменений кода вполне хватает и дефолтных настроек.
2. В ряде случаев хватает весьма небольшого количества плагинов. По крайней мере у меня их точно намного меньше даже 10 (разработчик на Go), думаю, ближе к 4.
unclechu
17.06.2016 18:28Для комфортной работы с кодом необходимо установить несколько плагинов. Мне хватило 33.
У автора хорошо с чувством юмора. У себя насчитал около 50-и, ну это с учётом разностороннего набора ЯП. Для старта можно и в 10 спокойно уложиться, и постепенно наращивать, по мере ощущения что вот такой-то фичи не достаёт.
Но главное, что меня заинтриговало, — это:
слепой 9-ти пальцевый метод печати.
Что это за метод такой? У автора не достаёт пальца? Очередная шутка? Или действительно есть какой-то такой способ?daMage
17.06.2016 19:11Похоже, вы единственный, кто заметил тут шутку) Ну ладно, не все шутки хорошие.
Нет такого метода, насколько я знаю, просто считаю, что неправильно называть свою печать 10-ти пальцевой, когда задействованы только 9.unclechu
17.06.2016 19:28Имеется в виду, что не используется правый большой палец? Я вот иногда использую, хоть и очень редко, несмотря на то что пытался вытренировать рефлекс перекрёстного нажатия, когда перед этим символ был на другую руку, в итоге счёл непрактичным затраты на это дело. Мой метод печати в таком случае наверное можно назвать 9,5-пальцевым, вот это каламбур!
daMage
17.06.2016 19:37в итоге счёл непрактичным затраты на это дело
По той же причине и я забросил. Думал, что это увеличит мою скорость и снизит количество ошибок, но потом увидел несколько видео топовых клавогонщиков, которые также не использовали правый большой палец, и поубавил свой пыл.
klirichek
19.06.2016 13:51Тренировать этот рефлекс имеет смысл если приходится набирать МНОГО текста. Скажем, от 200К в день. Тогда рабочий палец начинает под конец уставать, а нерабочий — наоборот, ныть и затекать (из-за того, что его непроизвольно оттопыриваешь, чтобы не мешался).
А при типичных программерских объёмах, исчисляемых десятками кб в день или меньше, оно того не стоит.
Tireo
17.06.2016 19:02Полезный набор плагинов. А метод в общем случае все-таки 10-ти пальцевый, просто на пробел большинство людей чаще (но не всегда) нажимают либо левым большим пальцем, либо правым. Хотя скорость печати в программировании не самое узкое место )) Кстати, на гиктаймсе была занятная статья о скорости набора — geektimes.ru/post/270858
unclechu
17.06.2016 19:38Не могу не согласиться, скорость печати — дело третье, это помогает разве что в чатиках каких-нибудь изьясняться, чтобы текст поспевал за мыслью. А вот рефлексы каких-нибудь комплексных команд в редакторе — полезный навык, и вим предоставляет кучу возможностей для этого. Многих отталкивают всякие 5-и ступенчатые комбо, но когда они словно сами отбиваются в burst mode, — давление рутины ощущается меньше.
outcoldman
17.06.2016 21:03Когда я начинал знакомиться с Vim тоже начинал с около 30 плагинов. Каждые полгода потом приходилось уделять кучу времени на то, чтобы искать из-за какого плагина опять все тормозит. В итоге пришел обратно к 6 плагинам и просто своим очень простым настройкам над Vim.
По теме https://www.reddit.com/r/vim/comments/4l93l0/dat_moment_when_you_customize_vim/daMage
17.06.2016 22:41Тормоза в загрузке или в работе с редактором? Из всех плагинов заметно замедляют загрузку только 2: youcompleteme и session. В самой работе лагов никаких не замечаю, пока всё устраивает.
outcoldman
17.06.2016 22:57И то и то. Помню много проблем было с pymode и со всякими анализаторами кода.
outcoldman
17.06.2016 22:58> В самой работе лагов никаких не замечаю, пока всё устраивает.
Огромное количество народа не замечают что их zsh грузится по 5 секунд на каждое открытие таба (oh-my-zsh и autozsh), а я когда вижу больше 200ms загрузки начинаю профилировать.
Так что это дело привычки, наверное.daMage
17.06.2016 23:30Просто вы сделали акцент на количестве плагинов, и что причина тормозов в этом. Если отключить те 2 плагина, о которых я писал, то vim загружается почти также быстро, как и в «голом» состоянии. Тут либо отказываться от функционала, либо терпеть. Мне, например, гораздо проще подождать 0.5с, пока восстановится прежняя сессия, чем открывать все файлы, с которыми я работал, а ведь там и положение курсора восстанавливается и много чего еще. Я не уверен, будет ли оно ощутимо быстрее работать, если использовать стандартные команды vim'a (:mksession), но вопросом оптимизации, скорее всего, займусь позже.
BelBES
17.06.2016 21:30Ctags создает тег-файл, в котором содержатся названия классов, функций, переменных, ..., а также их позиции.
Стоит заметить, что ctag не делает семантического анализа, а тупо расставляет теги на все встреченные совпадения. Т.ч. частенько grep'ом быстрее получается по коду ходить, чем ctag'ом…
psykeonfarm
17.06.2016 22:29+1Понимаю автора поста. Около года создал себе собственную раскладку клавиатуры на основании Workman и изучил с ней слепую печать. На Vim перейти так и не решился но чувство неполноценности от прерывания к мышке не давало покоя. В итоге сделал себе хоткеи перемещения на Autohotkey в Windows и на Karabiner в OSX.
Суть в том, что клавиши IJKL (стандартные для QWERTY клавиатуры) с нажатым LAlt работают как стрелки в играх WASD, U/O — Home/End, M/, — Backspace/Delete. Под катом пример на Autohotkey
Скрытый текст;;;
;;; Right alt tabs
;;;
*>!Tab::SendInput ^{Tab}
*+>!Tab::SendInput +^{Tab}
;;;
;;; Arrows
;;;
*
; Alt + Shift +…
+
+
+
+
+
+
+
+
; Alt + Win +…
#
#
#
#
#
#
#
#
; Alt + Ctrl +…
; Alt + Alt right +…
!u::SendInput !{Up}
!n::SendInput !{Left}
!e::SendInput !{Down}
!o::SendInput !{Right}
!p::SendInput !{End}
!f::SendInput !{Home}
!b::SendInput !{Delete}
!l::SendInput !{Backspace}
+
+
+
+
+
+
+
+
+!u::SendInput +!{Up}
+!n::SendInput +!{Left}
+!e::SendInput +!{Down}
+!o::SendInput +!{Right}
+!p::SendInput +!{End}
+!f::SendInput +!{Home}
+!b::SendInput +!{Delete}
+!l::SendInput +!{Backspace}
!^u::SendInput ^!{Up}
!^n::SendInput ^!{Left}
!^e::SendInput ^!{Down}
!^o::SendInput ^!{Right}
!^p::SendInput ^!{End}
!^f::SendInput ^!{Home}
!^b::SendInput ^!{Delete}
!^l::SendInput ^!{Backspace}
+!^u::SendInput +!^{Up}
+!^n::SendInput +!^{Left}
+!^e::SendInput +!^{Down}
+!^o::SendInput +!^{Right}
+!^p::SendInput +!^{End}
+!^f::SendInput +!^{Home}
+!^b::SendInput +!^{Delete}
+!^l::SendInput +!^{Backspace}
Немного избыточно, но по какой-то причине на моём Thinkpad не работает wildcard оператор и пришлось написать то, что есть. Да я и сильно не пытался оптимизировать, оставил первую рабочую версию и забыл (уже почти год работает без багов).
Ещё и поделюсь скриншотом раскладки, а это состояние с shift. Стоит заметить, что на месте CapsLock у меня CTRL, а на месте CTRL — RAlt.
Кто-то обязательно скажет «Зачем это возня, поставил Vim и нет проблем» — я и не спорю! Но у моего подхода есть преимущество — эти хоткеи работают и во всех других приложениях. A в комбинации с трекпадом на моём Thinkpad — дают полную свободу от мышки, на все 100%, даже при работе с браузером. Эти хоткеи работают и в Vim.
К слову в Karabiner есть готовая опция использования Vim-подобных хоткеев на уровне системы.daMage
17.06.2016 22:30Спрячьте под спойлер, пожалуйста.
psykeonfarm
18.06.2016 05:231. При публикации код был под спойлером, в предпросмотре отображался нормально (видимо <pre>/<source> не хватило и парсер сломался)
2. Я не могу редактировать свой первый комментарий к посту (так как он уходит на модерацию), к сожалению. Автор может удалить текущий поломанный и я его опубликую заново.
3. Чтобы не шалить с парсером, пример залил на pastebin
bodyawm
19.06.2016 05:22Использвоал Vi(не Vim) когда настраивал ppp на freebsd.
Вообще для написания кода использую Geany(даже и незнаю как у vim'а с питоном) благодая удобному автокомплиту, быстрой подсветкой(заслуга scintilla) и очень низким потреблением ресурсов.
Но после скриншота в этой статье я польщен, очень симпатично, думаю можно поюзать для пыхи.
А есть плагин для дин. подгрузки функций/классов из инклюжнов?daMage
19.06.2016 05:31У vim'a с питоном всё хорошо, посмотрите тут.
А есть плагин для дин. подгрузки функций/классов из инклюжнов?
Речь про автокомлит?bodyawm
19.06.2016 19:45Да, как к примеру в GUI редакторах задефайнил функцию:
def myfunction():
print "Hello, world!"
а в автодополнении появился вариант «myfunction» и его список аргументов.
хабрапарсер порезал табуляциюdaMage
19.06.2016 23:49Youcompleteme умеет в семантику. К примеру, в php можно писать так
Думается, что и с питоном всё нормально, но, боюсь, вам придется погуглить на это счет или установить несколько плагинов самому на тот случай, если простой установки youcompleteme будет недостаточно, так как с питоном я вообще не знаком.
Вот еще полезная ссылка, удачи.
bo883
19.06.2016 21:58Выложили бы свой конфиг vim'а — скачал и поставил. Настаивать влом, но к vim'у тяготею.
voischev
21.06.2016 11:47+1У меня был подобный опыт перехода. Был похожий vim конфиг. Было время когда держал конфиг Sublime Text вместе в vim. Совсем недавно удалил все про саблайм. Но со временем и большим изучением vim, я начал избавляться плагинов, что никак не ухудшало работу с vim. Вот тут можно посмотреть иторию коммитов voischev/dotfiles Надеюсь кому то будет полезно
daMage
21.06.2016 12:09Не понял вас. Как без плагинов можно пользоваться fuzzy поиском по файлам? Как работать с деревом каталога или получить (улучшенную) поддержку определенного языка? Я согласен с тем, что от некоторых плагинов, вроде surround или tabular, можно отказаться, но далеко не от всех. Я к тому, что плагины создаются для того, чтобы облегчить жизнь и тут либо писать нужный функционал с нуля, либо использовать готовое.
voischev
21.06.2016 21:24Я тоже так думал, но оно как то само отмирает. Vim все чаще для меня — хорош и без плагинов.
На счет
Ctrl+P
плагина. Он хороший и по этому он все еще установлен у меня. Он даже расширен более быстрым поиском и доп. функциями. Но есть альтернатива в видеack
илиgrep
, с ними бывает быстрее.
Есть печальная история с "улучшенными поддержками языка". Например
vim-javascript
тормозит работу Vim если работаешь с файлами в 150000 строк. А мне приходится такие, как минимум, просматривать.
daMage
21.06.2016 12:20Посмотрел историю изменений. Допустим, fugitive можно удалить и работать напрямую с git, но чем вы заменили nerdtree и syntastic?
voischev
21.06.2016 21:29С
syntastic
все хорошо, :) но его заменили обычные cli утилиты запускаемые в нужное мне время. Так уж устроен рабочий флоу. Отпал за ненадобностьюdaMage
21.06.2016 22:34Странный вы) Разве не удобнее, когда ошибка всплывает сразу, когда в памяти еще хранятся детали реализации и вносить изменения проще всего, а не через несколько часов/вечером (или как там у вас процесс настроен)?
Например vim-javascript тормозит работу Vim если работаешь с файлами в 150000 строк
Как по мне, это не повод отказываться от постоянных удобств в угоду очень редким правкам. Возможно, стоит отключить загрузку плагина в рантайм на время работы с таким файлом, или, выставить в буфере неизвестный тип файла, чтобы не работала подсветка.
Вообще, я согласен с тем, что vim из коробки я знаю достаточно плохо. Мне хотелось сделать работу в vim'е более комфортной, неважно достигается это за счет плагинов или настройки самого vim'а. Более того, само наличие плагина наводит на мысль, что из коробки vim такое не умеет или умеет хуже, и у меня не было никаких оснований думать иначе. Если вы знаете еще какие-нибудь команды, касательно статьи, вроде стандартного файлового менеджера, пожалуйста, напишите.
mpakep
22.06.2016 11:47Третий день набиваю навыки работы с вимом. Обнаружил очень неприятную ошибку которую не знаю как исправить. После редактирования на удаленном сервере слабым местом оказывается сеть проявляя себя в регулярных задержках. При попытке открыть файл по ssh
vim scp://server.ru//var/www/host/file.txt
после сохранения слетает подсветка синтаксиса. Закрытие и открытие файла редактируемого синтаксис восстанавливается. Подскажите кто с подобным сталкивался как можно обойти ошибку? Со временем дискомфорт уходит и если удастся обойти эту сложность вим имеет большие шенсы стать основным редактором. Во всяком случае все, что мне не хватало в редакторе я в нем нашел. Работаю на ubuntu matepoxu
22.06.2016 12:03Маленький вопрос. А чего вам не хватало в редакторе?
mpakep
22.06.2016 12:12В обычном? До этого я долго использовал kwrite потом kate отличные редакторы. Не все сделаешь только с клавиатуры. Есть функции, которые требуют дотягиваться до мышки и перемещать курсор по экрану. Не хватает также возможности написать сценарий. В некоторые моменты простой сценарий может сэкономить часы работы. Нашел для себя отличную возможность открытия двух окон на одном экране :sp и :wsp ни один из используемых мной до этого редакторов такого не позволял. Прав был написавший ранее комментатор — разобравшись один раз возможности расширяются на всю оставшуюся жизнь.
poxu
24.06.2016 14:08Насколько я понимаю возможности у вима примерно такие же, как у любого другого продвинутого текстового редактора с возможностью писать плагины. Что в виме реально круто — так это нормальный режим, режим редактирования и режим выделения и то, что можно делать с их помощью.
Нередко люди в виме постоянно пребывают в режиме редактирования текста и используют стрелки для навигации.
Вы уже пользуетесь режимами, или делаете в режиме редактирования всё?mpakep
24.06.2016 18:07Я ползуюсь режимами. Сложно представить ситуацию в которой можно отказаться от использования режимов. Я записывал сценарии. Попробовал. Очень понравилось. Даже сформировал для себя методику в которой будет оставаться сессия между домом и работой. Сервер перезагружается редко и я открываю вим в скрине $screen -S vim. Осваиваю другие возможности. Пока доволен функционалом редактора.
daMage
23.06.2016 02:40Не смог воспроизвести баг, у меня тема не слетает. Но vim создает временный файл, а потом загружает его на сервер. Возможно, после первого сохранения, он пытается работать с этим файлом? Файл сохраняется в /tmp/vIhh6rh/4. Но вообще, это довольно бредово звучит. Может имеет смысл скопировать конфиг на удаленный сервер и работать на нем? Если, конечно, их не десятки. Либо монтировать директорию.
mpakep
24.06.2016 10:15Серверов не десятки. Возможно четыре — пять. Копирование конфига как правило не представляет трудностей. Сложность которую ощутил при работе на сервере это задержки в интернете. Реакция редактора на горячие клавиши становится заметно дольше, ведь работа идет по сети. Как на работе так и дома сеть достаточно загружена и провалы в сети частое явление. Вот и подумал что открытие по scp было бы для меня лучшим решением. Возможно это связано с нестандартным расширением файлов? В конфигурационном файле я изменил расцветку файлов с расширением *.tpl на схему php возможно с этим связано. Вот настройки моего ~/.vimrc
set number
set tabstop=3
set softtabstop=0
set shiftwidth=3
set autoindent
set smartindent
set noexpandtab
set list
set listchars=tab:?\ ,eol:¬
set encoding=utf8
set filetype=php
syntax on
au BufRead,BufNewFile *.tpl set filetype=phpdaMage
24.06.2016 10:51Проверил с вашими настройками — аналогично всё работает. Боюсь, я не тот, кто вам нужен, опыта у меня немного. Vim последней версии стоит?
mpakep
24.06.2016 13:40Самая последняя из репы.
~ VIM — Vi IMproved (улучшенный Vi)
~
~ версия 7.4.1689
~ Брам Мооленаар и другие
gearbox
А вот за это отдельное спасибо! Теоретики, честно говоря подутомили уже.