Я бы добавил (я сам пишу на С, так что выбор несколько своеобразный, да):
1 syntastic. Это мастхэвная вещь для того, чтобы проверить через splint косяки и ошибки прямо в редакторе. syntastic умеет проверять не только С/С++, а принципе, он и руби и питон с похапе обработать может. И bash тоже. Но для С/С++ это то, что я как доктор могу рекомендовать.
8 Для написания bash-скриптов (делаем скрипт сразу исполняемым):
" Settings for bash scripts.
" Проверяем запись shell-script. Если он не исполняемый, то делаем его
" исполняемым. Если уже исполняемый, то просто сохраняем.
au BufWritePost *.sh if FileExecutable("%") | if getline(1) =~ "^#!" | silent !chmod u+x % | endif | endif
" Проверка файла с расширением .sh на исполняемость.
function! FileExecutable(fname)
execute "silent! ! test -x" a:fname
return v:shell_error
endfunction
9 Про кодировки:
set enc=utf-8
set fileformat=unix
set ffs=unix,dos,mac
set termencoding=utf-8
set fileencodings=utf-8,koi8-r,cp1251,cp866
10 Для установки плагинов я лично использую pathogen, но это чисто моя такая вкусовщина.
Ну вот, как-то вот так…
P.S. Airline не использую, больно жирный вариант, IMHO. Я вот так:
" Статусная строка.
set laststatus=2
set statusline=%1*\ %f%m%r%h%w\%=%([%{&ff}\|%{(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\",B\":\"\")}%k\|%Y]%)\ %([%l,%v][%p%%]\ %)
P.P.S. SnipMate забыл и коллекцию сниппетов. Там под разные языки есть, в добавок коллекция настраиваемая, её можно пополнять своими сниппетами.
И vimwiki до кучи. Можно чисто локально вести заметки и справочники, со списком TODO, генерировать статические html и грузить на веб-сервер как такую статическую wiki прямо не выходя из vim.
vim как таковой сам по себе очень хорош, так ли уж нужно как-то особенно настраивать его?
Из плагинов мне нравится ctrlpvim/ctrlp.vim для открытия файлов, но, похоже, тут для этого есть fzf.
Yankring, чтобы легко вставлять из регистров.
NERDTree, NERDCommenter многие хвалят, я как-то не очень понял, чем они так хорошо. vim-fugitive хвалят тоже, но я использую git из командной строки. airline не очень понятно, зачем нужен.
Также я предпочитаю видеть результаты поиска только тогда, когда я по ним навигируюсь:
function! s:HlSearchOff()
if ( exists ("b:last_search") && b:last_search==@/ )
" need to clear
if ( exists("b:search_cleared") && b:search_cleared==1 )
" Do nothing
else
" nohlsearch " Does not work in autocmd and functions - see help
" redraw
set nohlsearch
let b:search_cleared=1
endif
else
let b:search_cleared=0
set hlsearch
endif
let b:last_search=@/
endfunction
function! s:HlSearchOn()
let b:search_cleared=0
set hlsearch
endfunction
autocmd! CursorMoved * call <SID>HlSearchOff()
nnoremap <silent> n n:call <SID>HlSearchOn()<CR>
nnoremap <silent> N N:call <SID>HlSearchOn()<CR>
с кучерявыми скобками сразу можно понять — закрытая всегда будет на сл строке, потому нет смысла лепить ее на той же, тут больше снипмате подходит и делает то что надо.
с круглыми, менее явно — открывая скобку я еще не окончательно уверен, что она там нужна, особенно с выражениями где приоритет действия важен или при нескольких условиях с комбинациями и/или, а там, где скобки будут точно, по крайней мере внешние — снова снипмате отыграет правильнее.
квадратные — ну, такое, почти такое же, как и кавычки, отказался по той же причине что и, собсно, с кавычками.
и, конечно, это все, так же как и у тебя, лишь личное мнение, ведь фломастеры, они у всех разные.
Я просто не только для С использую эти же настройки. Настройка она и для всех файлов, всех типов – и простого текста и маркдауна и С и javascript. Не хотелось под отдельные filetype отдельные настройки лепить.
Я ale даже не пробовал. У меня syntastic плотно завязан на splint (для оперативной проверки С/С++ кода на косяки и дырья), так что даже пробовать ale не буду скорее всего. splint это такой бесплатный аналог pvs-studio. Точнее, наоборот это pvs-studio аналог splint.
neomake - то же самое что :make, только асинхронно
ale и youcompleteme дублируют функциональность друг друга, можно оставить что-то одно. А еще лучше заменить оба на написанный на vimscript и не требующий никаких питонов vim-lsp. Кстати в новой версии neovim обещают запилить встроенный lsp клиент, вот тогда заживем.
Либо вписываем в свой .vimrc что-то типа let g:syntastic_c_include_dirs = [ '../my_include', 'another_include' ] если для С, для С++ соответственно будет syntastic_cpp_include_dirs.
Либо делаем в каталоге проекта файл .syntastic_cpp_config, где на каждой строке строго по отдельности вписываем:
-Ipath_1
-Ipath_2
...
-Ipath_N
Тогда в .vimrc можно указать для каждого своего проекта, например, let g:syntastic_cpp_config_file = '.my_custom_include_file_for_syntastic_project_1' (например).
Но вообще посмотрите: help syntastic-checkers и там конкретно по своему языку. Для С частенько конфиг один будет, для С++ – другой, для С# (и прочих) соответственно третьи.
Сам по себе syntastic штука крайне мощная, в особенности в паре со splint (для сишника), так что конфигурировать его надо крайне точно.
Наконец, приведу часть, касающуюся splint/syntastic из своего vimrc (она меняется от случая к случаю), вдруг кому сгодится в качестве примера:
" Syntastic settings.
" https://github.com/vim-syntastic/syntastic/wiki/C%3A---gcc
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
" Use syntastic on opening file and on saving/quitting.
" При открытии файл не проверяем -- пох, а вот при зарытии и
" сохранении -- в обязательном порядке!
let g:syntastic_check_on_open = 0
let g:syntastic_check_on_wq = 1
" Automatically jump to the first detected issue.
let g:syntastic_auto_jump = 1
" Include directory
"let g:syntastic_c_include_dirs = ['/usr/include/gtk-3.0/gtk','/usr/include/webkitgtk-4.0/webkit2']
let g:syntastic_c_check_header = 0
let g:syntastic_cpp_check_header = 0
let g:syntastic_c_no_include_search = 1
let g:syntastic_c_auto_refresh_includes = 1
let g:syntastic_c_no_default_include_dirs = 1
" Compiler's options:
" let g:syntastic_c_compiler_options = ' -std=gnu18'
"let b:syntastic_c_cflags = '-I/usr/include/gtk-3.0/gtk -I/usr/include/webkitgtk-4.0/webkit2'
" Опции можно указать и в конфигурационном файле:
" Создать данный файл можно так:
" pkg-config --cflags gtk+-3.0 glib-2.0 webkit2gtk-4.0 | tr ' ' '\n'
" >.syntastic_c_config
" И потом добавить -Wall, -Werror, -Wextra, -std=gnu18 по одной опции
" на строку.
let g:syntastic_c_config_file = '~/.vim/.syntastic_c_config'
" Syntax checkers.
let g:syntastic_c_checkers = ['make','splint','gcc']
" C-compiler.
let g:syntastic_c_compiler = 'gcc'
let g:syntastic_c_compiler_options = "-std=gnu99
\ -Wall -Wextra -Wshadow -Wpointer-arith
\ -Wcast-align -Wwrite-strings -Wmissing-prototypes
\ -Wmissing-declarations -Wredundant-decls -Wnested-externs
\ -Winline -Wno-long-long -Wuninitialized -Wconversion
\ -Wstrict-prototypes -pedantic"
" Конфигурационный файл splint.
" let g:syntastic_splint_config_file = '.syntastic_splint_config'
" Check syntax for bash:
let b:shell = 'bash'
" <F9> to open :Errors, <Ctrl+F9> to :lclose errors list.
map <F9> :Errors<CR>
map <C-F9> :lclose<CR>
highlight link SyntasticErrorSign SignColumn
highlight link SyntasticWarningSign SignColumn
highlight link SyntasticStyleErrorSign SignColumn
highlight link SyntasticStyleWarningSign SignColumn
Комменты там что к чему в принципе есть. Остальное – по ману.
Я не сравнивал splint с pvs-studio, но в паре splint+syntastic позволяют не насажать досадных ошибок типа «немытых рук», когда не со зла, по дурости косячишь. И за бесплатно.
В остальном да, syntastic штука офигенная, там ещё статические анализаторы для других языков можно как-то вроде подключать, я не пробовал, мне без надобности.
Пользуйтесь на здоровье, в общем, кому надо. =) Рад что понравилось.
Ещё годная настройка - подсветка вызова функций (странно, но дефолтно не подсвечивает):
$ cat ~/.vim/syntax/c.vim
syn match Function /\w\+ *\((\)\@=/
всё норм, но хотелось бы подсветку и в таких случаях:
...::подсвеченное_имя<неподсвеч_шаблон>();
Как закостылить? Я пытался написать, но пока не вышло, в виме, естественно :), свой синтаксис регулярок. Грубо греп аналог (но не совсем - шаблон тоже будет подсвечен):