" @Author:      Tom Link (micathom AT gmail com?subject=[vim])
" @Website:     http://www.vim.org/account/profile.php?user_id=4037
" @License:     GPL (see http://www.gnu.org/licenses/gpl.txt)
" @Revision:    58


let g:tlib#cmd#last_output = []


function! tlib#cmd#OutputAsList(command) "{{{3
    " TLogVAR a:command
    if exists('s:redir_lines')
        redir END
        let cache = s:redir_lines
    endif
    let s:redir_lines = ''
    redir =>> s:redir_lines
    silent! exec a:command
    redir END
    let g:tlib#cmd#last_output = split(s:redir_lines, '\n')
    unlet s:redir_lines
    if exists('cache')
        let s:redir_lines = cache
        redir =>> s:redir_lines
    endif
    return g:tlib#cmd#last_output
endf


" See |:TBrowseOutput|.
function! tlib#cmd#BrowseOutput(command) "{{{3
    call tlib#cmd#BrowseOutputWithCallback("tlib#cmd#DefaultBrowseOutput", a:command)
endf

" :def: function! tlib#cmd#BrowseOutputWithCallback(callback, command)
" Execute COMMAND and present its output in a |tlib#input#List()|;
" when a line is selected, execute the function named as the CALLBACK
" and pass in that line as an argument.
"
" The CALLBACK function gives you an opportunity to massage the COMMAND output
" and possibly act on it in a meaningful way. For example, if COMMAND listed
" all URIs found in the current buffer, CALLBACK could validate and then open
" the selected URI in the system's default browser.
"
" This function is meant to be a tool to help compose the implementations of
" powerful commands that use |tlib#input#List()| as a common interface. See
" |TBrowseScriptnames| as an example.
"
" EXAMPLES: >
"   call tlib#cmd#BrowseOutputWithCallback('tlib#cmd#ParseScriptname', 'scriptnames')
function! tlib#cmd#BrowseOutputWithCallback(callback, command) "{{{3
    let list = tlib#cmd#OutputAsList(a:command)
    let cmds = tlib#input#List('m', 'Output of: '. a:command, list)
    if !empty(cmds)
        for cmd in cmds
            let Callback = function(a:callback)
            call call(Callback, [cmd])
        endfor
    endif
endf

function! tlib#cmd#DefaultBrowseOutput(cmd) "{{{3
    call feedkeys(':'. a:cmd)
endf

function! tlib#cmd#ParseScriptname(line) "{{{3
    " let parsedValue = substitute(a:line, '^.\{-}\/', '/', '')
    let parsedValue = matchstr(a:line, '^\s*\d\+:\s*\zs.*$')
    exe 'drop '. fnameescape(parsedValue)
endf


function! tlib#cmd#TBrowseScriptnames() abort "{{{3
   call tlib#cmd#BrowseOutputWithCallback("tlib#cmd#ParseScriptname", "scriptnames")
endf


" :def: function! tlib#cmd#UseVertical(?rx='')
" Look at the history whether the command was called with vertical. If 
" an rx is provided check first if the last entry in the history matches 
" this rx.
function! tlib#cmd#UseVertical(...) "{{{3
    TVarArg ['rx']
    let h0 = histget(':')
    let rx0 = '\C\<vert\%[ical]\>\s\+'
    if !empty(rx)
        let rx0 .= '.\{-}'.rx
    endif
    " TLogVAR h0, rx0
    return h0 =~ rx0
endf


" Print the time in seconds or milliseconds (if your version of VIM 
" has |+reltime|) a command takes.
function! tlib#cmd#Time(cmd) "{{{3
    if has('reltime')
        let start = tlib#time#Now()
        exec a:cmd
        let end = tlib#time#Now()
        let diff = string(tlib#time#Diff(end, start)) .'ms'
    else
        let start = localtime()
        exec a:cmd
        let diff = (localtime() - start) .'s'
    endif
    echom 'Time: '. diff .': '. a:cmd
endf


function! tlib#cmd#Capture(cmd) "{{{3
    redir => s
    silent exec a:cmd
    redir END
    return s
endf

