diff --git a/autoload/docker_tools.vim b/autoload/docker_tools.vim index 929d33e..81988b5 100644 --- a/autoload/docker_tools.vim +++ b/autoload/docker_tools.vim @@ -8,6 +8,7 @@ function! docker_tools#GetHelp() abort let help .= "# p: pause container\n" let help .= "# u: unpause container\n" let help .= "# >: execute command to container\n" + let help .= "# <: show container logs\n" let help .= "# ?: toggle help\n" let help .= "# ------------------------------------------------------------------------------\n" silent! put =help @@ -17,3 +18,87 @@ function! docker_tools#ToggleHelp() abort let b:show_help = !b:show_help call LoadDockerPS() endfunction + +function! docker_tools#VDEcho(msg) abort + redraw + echom "vim-docker: " . a:msg +endfunction + +function! docker_tools#VDEchoError(msg) abort + echohl errormsg + call docker_tools#VDEcho(a:msg) + echohl normal +endfunction + +function! docker_tools#VDEchoWarning(msg) abort + echohl warningmsg + call docker_tools#VDEcho(a:msg) + echohl normal +endfunction + +function! docker_tools#VDExec(command) abort + call docker_tools#TerminalCommand(printf('docker exec -ti %s sh -c "%s"',FindContainerID(),a:command),FindContainerID()) +endfunction + +function! docker_tools#TerminalCommand(command,termname) abort + if has('nvim') + silent execute printf("botright %d split TERM",g:vdocker_term_splitsize) + call termopen(a:command) + elseif has('terminal') + silent execute printf("botright %d split TERM",g:vdocker_term_splitsize) + call term_start(a:command,{"term_finish":['open','close'][g:vdocker_term_closeonexit],"term_name":a:termname,"curwin":"1"}) + else + call docker_tools#VDEchoError('terminal is not supported') + endif +endfunction + +function! docker_tools#EchoContainerActionMessage(action,id) abort + if a:action=='start' + call docker_tools#VDEcho('Starting container '.a:id.'...') + elseif a:action=='stop' + call docker_tools#VDEcho('Stopping container '.a:id.'...') + elseif a:action=='rm' + call docker_tools#VDEcho('Removing container '.a:id.'...') + elseif a:action=='restart' + call docker_tools#VDEcho('Restarting container '.a:id.'...') + endif +endfunction + +function! docker_tools#ContainerAction(action,id,options) abort + call docker_tools#EchoContainerActionMessage(a:action,a:id) + if has('nvim') + call jobstart(printf('docker container %s %s %s',a:action,a:options,a:id),{'on_stdout': 'docker_tools#ActionCallBack','on_stderr': 'docker_tools#ErrCallBack'}) + elseif has('job') + call job_start(printf('docker container %s %s %s',a:action,a:options,a:id),{'out_cb': 'docker_tools#ActionCallBack','err_cb': 'docker_tools#ErrCallBack'}) + else + call system(printf('docker container %s %s %s',a:action,a:options,shellescape(a:id))) + endif +endfunction + +function! docker_tools#ActionCallBack(...) abort + if exists('g:vdocker_windowid') + let a:current_windowid = win_getid() + call win_gotoid(g:vdocker_windowid) + call LoadDockerPS() + call win_gotoid(a:current_windowid) + endif + if has('nvim') + call docker_tools#VDEcho(a:2[0]) + else + call docker_tools#VDEcho(a:2) + endif +endfunction + +function! docker_tools#LeaveVDSplit() abort + if exists('g:vdocker_windowid') + unlet g:vdocker_windowid + endif +endfunction + +function! docker_tools#ErrCallBack(...) abort + if has('nvim') + call docker_tools#VDEchoError(a:2[0]) + else + call docker_tools#VDEchoError(a:2) + endif +endfunction diff --git a/plugin/vim-docker-tools.vim b/plugin/vim-docker-tools.vim index dcbca56..c30b143 100644 --- a/plugin/vim-docker-tools.vim +++ b/plugin/vim-docker-tools.vim @@ -1,6 +1,7 @@ let g:vdocker_splitsize = 15 let g:vdocker_term_splitsize = 15 -let g:vdocker_term_closeonexit = 0 +let g:vdocker_term_closeonexit = 1 +let g:vdocker_logs_splitsize = 30 command! OpenVDSplit call OpenVDSplit() command! CloseVDSplit call CloseVDSplit() @@ -22,6 +23,7 @@ function! SetKeyMapping() abort nnoremap p :call VDContainerAction('pause',FindContainerID()) nnoremap u :call VDContainerAction('unpause',FindContainerID()) nnoremap > :call VDRunCommand() + nnoremap < :call VDContainerLogs(FindContainerID()) nnoremap ? :call docker_tools#ToggleHelp() endfunction @@ -39,7 +41,7 @@ function! OpenVDSplit() abort setlocal nobuflisted let g:vdocker_windowid = win_getid() - autocmd BufWinLeave call LeaveVDSplit() + autocmd BufWinLeave call docker_tools#LeaveVDSplit() autocmd CursorHold call LoadDockerPS() call SetKeyMapping() else @@ -62,12 +64,6 @@ function! ToggleVDSplit() abort endif endfunction -function! LeaveVDSplit() abort - if exists('g:vdocker_windowid') - unlet g:vdocker_windowid - endif -endfunction - function! LoadDockerPS() abort setlocal modifiable let a:save_cursor = getcurpos() @@ -94,7 +90,7 @@ function! FindContainerID() abort call search("CONTAINER ID") let a:current_cursor = getcurpos() if a:current_cursor[1] !=# b:first_row - call VDEchoError("No container ID found") + call docker_tools#VDEchoError("No container ID found") return "" endif let a:current_cursor[1] = a:row_num @@ -102,91 +98,22 @@ function! FindContainerID() abort return expand('') endfunction -function! ContainerAction(action,id,options) abort - call EchoContainerActionMessage(a:action,a:id) - if has('nvim') - call jobstart(printf('docker container %s %s %s',a:action,a:options,a:id),{'on_stdout': 'ActionCallBack','on_stderr': 'ErrCallBack'}) - elseif has('job') - call job_start(printf('docker container %s %s %s',a:action,a:options,a:id),{'out_cb': 'ActionCallBack','err_cb': 'ErrCallBack'}) - else - call system(printf('docker container %s %s %s',a:action,a:options,shellescape(a:id))) - endif -endfunction - -function! EchoContainerActionMessage(action,id) abort - if a:action=='start' - call VDEcho('Starting container '.a:id.'...') - elseif a:action=='stop' - call VDEcho('Stopping container '.a:id.'...') - elseif a:action=='rm' - call VDEcho('Removing container '.a:id.'...') - elseif a:action=='restart' - call VDEcho('Restarting container '.a:id.'...') - endif -endfunction - -function! ActionCallBack(...) abort - if exists('g:vdocker_windowid') - let a:current_windowid = win_getid() - call win_gotoid(g:vdocker_windowid) - call LoadDockerPS() - call win_gotoid(a:current_windowid) - endif - if has('nvim') - call VDEcho(a:2[0]) - else - call VDEcho(a:2) - endif -endfunction - -function! ErrCallBack(...) abort - if has('nvim') - call VDEchoError(a:2[0]) - else - call VDEchoError(a:2) - endif -endfunction - function! VDContainerAction(action,id,...) abort if a:id !=# "" - call ContainerAction(a:action,a:id,join(a:000,' ')) + call docker_tools#ContainerAction(a:action,a:id,join(a:000,' ')) endif endfunction -function! TerminalCommand(command,termname) abort - if has('nvim') - silent execute printf("botright %d split TERM",g:vdocker_term_splitsize) - call termopen(a:command) - elseif has('terminal') - silent execute printf("botright %d split TERM",g:vdocker_term_splitsize) - call term_start(a:command,{"term_finish":['open','close'][g:vdocker_term_closeonexit],"term_name":a:termname,"curwin":"1"}) - else - call VDEchoError('terminal is not supported') - endif -endfunction - -function! VDExec(command) abort - call TerminalCommand(printf('docker exec -ti %s sh -c "%s"',FindContainerID(),a:command),FindContainerID()) +function! VDContainerLogs(id) abort + silent execute printf("botright %d split %s_LOGS",g:vdocker_logs_splitsize,a:id) + setlocal buftype=nofile + setlocal cursorline + setlocal nobuflisted + silent execute printf("read ! docker container logs %s",a:id) + silent 1d endfunction function! VDRunCommand() abort let command = input('Enter command: ') - call VDExec(command) -endfunction - -function! VDEcho(msg) abort - redraw - echom "vim-docker: " . a:msg -endfunction - -function! VDEchoError(msg) abort - echohl errormsg - call VDEcho(a:msg) - echohl normal -endfunction - -function! VDEchoWarning(msg) abort - echohl warningmsg - call VDEcho(a:msg) - echohl normal + call docker_tools#VDExec(command) endfunction