Skip to content

Instantly share code, notes, and snippets.

@tweekmonster
Last active February 5, 2017 02:22
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tweekmonster/8f9cfb36a56d7d1bb6a73e0f9589d81f to your computer and use it in GitHub Desktop.
Save tweekmonster/8f9cfb36a56d7d1bb6a73e0f9589d81f to your computer and use it in GitHub Desktop.
.nvimrc script for Neovim development using Neomake
if !has('nvim')
finish
endif
let s:path = expand('<sfile>:p:h')
let s:target = 'all'
let s:error_path = s:path.'/tmp/errors.json'
let s:errors_url = 'https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint/errors.json'
let g:neomake_make_maker = {
\ 'exe': 'make',
\ 'args': ['VERBOSE=1', 'dev'],
\ 'errorformat': '%.%#../%f:%l:%c: %t%.%#: %m',
\ }
" Add `clang` if you use deoplete-clang2 (electric boogaloo)
" https://github.com/tweekmonster/deoplete-clang2
let g:neomake_c_enabled_makers = ['clint']
function! s:clint_args(...) abort
return ['--suppress-errors='.s:path.'/tmp/errors.json', expand('%')]
endfunction
let g:neomake_c_clint_maker = {
\ 'exe': s:path.'/src/clint.py',
\ 'append_file': 0,
\ 'args': function('s:clint_args'),
\ 'cwd': s:path,
\ 'errorformat': '%f:%l: %m',
\ }
let g:neomake_c_nvimtags_maker = {
\ 'exe': 'ctags',
\ 'append_file': 0,
\ 'args': ['--languages=C,C++,Lua', '-R', '-I', 'EXTERN', '-I', 'INIT',
\ '--exclude=.git*', 'src', 'build/include', 'build/src/nvim/auto',
\ '.deps/build/src'],
\ 'cwd': s:path,
\ }
let g:neomake_lua_testlint_maker = {
\ 'exe': 'make testlint',
\ }
function! s:dl_handler(job, data, event) dict abort
if a:event == 'stdout'
for line in a:data
if line =~? '^Content-Length:'
let self.remote_size = str2nr(matchstr(line, '\d\+'))
endif
endfor
elseif a:event == 'exit'
if self.size != self.remote_size
echomsg 'Updating errors.json'
call jobstart('curl -sSL "'.s:errors_url.'" > "'.s:error_path.'"')
else
echomsg 'errors.json is up to date'
endif
endif
endfunction
function! s:download_errors_json() abort
let opts = {'size': 0, 'remote_size': 0,
\ 'on_stdout': function('s:dl_handler'),
\ 'on_exit': function('s:dl_handler')}
if filereadable(s:error_path)
let opts.size = getfsize(s:error_path)
endif
call jobstart(['curl', '-sI', s:errors_url], opts)
endfunction
function! s:setup_c() abort
setlocal expandtab shiftwidth=2 softtabstop=2 textwidth=80
setlocal modelines=0 cinoptions=0(
setlocal comments=:///,://
endfunction
function! s:neomake_project_finished(mode) abort
if !a:mode && len(filter(getqflist(), 'v:val.valid'))
let buf = getqflist()[0].bufnr
if buf != winbufnr(0)
if exists('s:last_win') && winbufnr(s:last_win) == buf
let win = s:last_win
else
let win = bufwinnr(buf)
endif
execute win 'wincmd w'
endif
belowright cwindow 5
let w:quickfix_title = 'Neomake!'
wincmd p
endif
unlet! s:last_win
endfunction
augroup nvimrc
autocmd!
autocmd VimEnter * call s:download_errors_json()
autocmd User NeomakeFinished call s:neomake_project_finished(g:neomake_hook_context.file_mode)
" autocmd BufWritePost *.c,*.h,*.vim if !exists('s:last_win') | let s:last_win = winnr() | cclose | Neomake! make | endif
autocmd BufRead,BufNewFile *.h set filetype=c
autocmd FileType c call s:setup_c()
" autocmd BufWritePost * Neomake
" autocmd VimLeave * let g:neomake_verbose = 0
augroup END
.PHONY: .release-vars .dev-vars dev local-install
CMAKE_EXTRA_FLAGS := -DBUSTED_OUTPUT_TYPE=gtest
.dev-vars:
@-grep 'Configuration: Release' build/rules.ninja && $(MAKE) distclean
$(eval CMAKE_BUILD_TYPE = Debug)
$(eval CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE))
# \$(eval CMAKE_EXTRA_FLAGS = -DCMAKE_INSTALL_PREFIX=$(PWD)/build)
$(eval CMAKE_EXTRA_FLAGS = "-DCLANG_ASAN_UBSAN=ON -DCMAKE_INSTALL_PREFIX=$(HOME)/tmp/nvim")
rm -f tags
test ! -f tags.lock && \
touch tags.lock && \
ctags --languages=C,C++,Lua -R -I EXTERN -I INIT --exclude='.git*' \
src build/include build/src/nvim/auto .deps/build/src && \
rm -f tags.lock
.release-vars:
@-grep 'Configuration: Debug' build/rules.ninja && $(MAKE) distclean
# $(eval CMAKE_BUILD_TYPE = Release)
$(eval CMAKE_BUILD_TYPE = RelWithDebInfo)
$(eval CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE))
$(eval CMAKE_EXTRA_FLAGS = "-DCMAKE_INSTALL_PREFIX=$(HOME)/.local")
dev: .dev-vars nvim
local-install: .release-vars nvim install
#!/usr/bin/env bash
DEV=$PWD
# export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-3.8/bin/llvm-symbolizer
# export ASAN_OPTIONS="log_path=${HOME}/.logs/asan"
# export MSAN_SYMBOLIZER_PATH=/usr/lib/llvm-3.8/bin/llvm-symbolizer
# export TSAN_OPTIONS="external_symbolizer_path=/usr/lib/llvm-3.8/bin/llvm-symbolizer log_path=${HOME}/.logs/tsan"
cd tmp && exec env VIMRUNTIME=$DEV/runtime $DEV/build/bin/nvim "$@"
# cd tmp && exec env VIMRUNTIME=$DEV/runtime gdb -ex run --args $DEV/build/bin/nvim "$@"
@tweekmonster
Copy link
Author

make lint downloads errors.json every time it's ran, this downloads and caches it, and runs clint.py directly when the buffer is saved.

Requires 'exrc' option. The two commented autocmd lines are there for an example. They are already setup in my default configs.

@romgrk
Copy link

romgrk commented Aug 8, 2016

Isn't 'exrc' evil®? Checkout https://github.com/MarcWeber/vim-addon-local-vimrc
Otherwise looks helpful! Thanks

@teto
Copy link

teto commented Jan 23, 2017

You should make a plugin out of it :) !
On startup; I have "Using not in a script context: s:dl_handler" .
I tried changing replacing the mentions with Funcref in let opts = {'size': 0, 'remote_size': 0, \ 'on_stdout': 's:dl_handler', 'on_exit': 's:dl_handler'} but then it triggered other errors. Any idea ?

@tweekmonster
Copy link
Author

@teto Fixed.

@tweekmonster
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment