Update build#dir() to open a popup_menu()
Use `popup_menu()` in `build#dir()` when the `:BuildDir` command is uses without an argument to specify a build directory. If there are no build directories, print an error message. If there is a single build directory, use it. If there are multiple build directories use `popup_menu()` to prompt the user to select the desired build directory. Update `build#targets()` and `build#run()` with comments and error messages.
This commit is contained in:
parent
c94bc3ba90
commit
aaa8acf5a2
@ -1,27 +1,75 @@
|
|||||||
function! build#dir(dir) abort
|
function! build#dir(...) abort
|
||||||
let l:cwd = getcwd()
|
if a:0 == 0
|
||||||
let $BUILD_DIR = l:cwd.'/'.a:dir
|
" No arguments, find build directories.
|
||||||
let g:ycm_clangd_args = ['--compile-commands-dir='.$BUILD_DIR]
|
let s:dirs = split(substitute(globpath('.', 'build*'), '\.\/', '', 'g'), '\n')
|
||||||
YcmRestartServer
|
let l:len = len(s:dirs)
|
||||||
|
if l:len == 0
|
||||||
|
echoerr 'no build directories found'
|
||||||
|
elseif l:len == 1
|
||||||
|
" One build directory found, use it.
|
||||||
|
let l:dir = s:dirs[0]
|
||||||
|
unlet s:dirs
|
||||||
|
else
|
||||||
|
" Multiple build directories found, create popup menu to select one.
|
||||||
|
" Set the callback to this function on completion, handled below.
|
||||||
|
call popup_menu(s:dirs, #{
|
||||||
|
\ filter: 'popup_filter_menu',
|
||||||
|
\ callback: 'build#dir',
|
||||||
|
\ })
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
if a:0 == 1
|
||||||
|
" Single argument, invoked by :BuildDir.
|
||||||
|
let l:dir = a:1
|
||||||
|
elseif a:0 == 2
|
||||||
|
" Two arguments, called back by popup_menu().
|
||||||
|
let l:dirs = s:dirs
|
||||||
|
unlet s:dirs
|
||||||
|
if a:2 == -1
|
||||||
|
" Selection in popup_menu() was cancelled.
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let l:dir = l:dirs[a:2 - 1]
|
||||||
|
else
|
||||||
|
echoerr 'build#dir called with too many arguments'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
if exists('l:dir')
|
||||||
|
" Set build directory and restart YouCompleteMe.
|
||||||
|
let $BUILD_DIR = getcwd().'/'.substitute(l:dir, '\/$', '', '')
|
||||||
|
let g:ycm_clangd_args = ['--compile-commands-dir='.$BUILD_DIR]
|
||||||
|
YcmRestartServer
|
||||||
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! build#targets(ArgLead, CmdLine, CursorPos) abort
|
function! build#targets(ArgLead, CmdLine, CursorPos) abort
|
||||||
|
if !exists('$BUILD_DIR')
|
||||||
|
echoerr 'build directory not set'
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
let l:targets = []
|
let l:targets = []
|
||||||
if filereadable($BUILD_DIR.'/build.ninja')
|
if filereadable($BUILD_DIR.'/build.ninja')
|
||||||
|
" Ask ninja for the list of targets and prepare for returning.
|
||||||
for l:target in split(system('ninja -C '.$BUILD_DIR.' -t targets'), '\n')
|
for l:target in split(system('ninja -C '.$BUILD_DIR.' -t targets'), '\n')
|
||||||
call add(l:targets, substitute(l:target, ':.*$', '', ''))
|
call add(l:targets, substitute(l:target, ':.*$', '', ''))
|
||||||
endfor
|
endfor
|
||||||
elseif filereadable($BUILD_DIR.'/Makefile')
|
elseif filereadable($BUILD_DIR.'/Makefile')
|
||||||
" TODO: support make
|
" TODO: Support make, it's much less straight forwards than ninja.
|
||||||
endif
|
endif
|
||||||
return join(l:targets, "\n")
|
return join(l:targets, "\n")
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! build#run(...) abort
|
function! build#run(...) abort
|
||||||
let l:build_dir = substitute($BUILD_DIR, '\/$', '', '')
|
if !exists('$BUILD_DIR')
|
||||||
|
call echo#error('build directory not set')
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let l:build_dir = $BUILD_DIR
|
||||||
if filereadable($BUILD_DIR.'/build.ninja')
|
if filereadable($BUILD_DIR.'/build.ninja')
|
||||||
|
" Execute ninja in a terminal window.
|
||||||
execute 'terminal ninja -C '.l:build_dir.' '.join(a:000, ' ')
|
execute 'terminal ninja -C '.l:build_dir.' '.join(a:000, ' ')
|
||||||
elseif filereadable($BUILD_DIR.'/Makefile')
|
elseif filereadable($BUILD_DIR.'/Makefile')
|
||||||
|
" Execute make in a terminal window.
|
||||||
execute 'terminal make -C '.l:build_dir.' '.join(a:000, ' ')
|
execute 'terminal make -C '.l:build_dir.' '.join(a:000, ' ')
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
@ -31,5 +31,5 @@ command! -nargs=+ -complete=file Debug call do#debug(<f-args>)
|
|||||||
command! TodoFile lvimgrep /todo/ %
|
command! TodoFile lvimgrep /todo/ %
|
||||||
|
|
||||||
" Change build directory
|
" Change build directory
|
||||||
command! -nargs=1 -complete=dir BuildDir call build#dir(<f-args>)
|
command! -nargs=? -complete=dir BuildDir call build#dir(<f-args>)
|
||||||
command! -nargs=* -complete=custom,build#targets Build call build#run(<f-args>)
|
command! -nargs=* -complete=custom,build#targets Build call build#run(<f-args>)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user