From d281dd16ad196f8e7dd58a94f42e870955f6560b Mon Sep 17 00:00:00 2001 From: Daniel Moch Date: Fri, 11 Nov 2016 20:16:49 -0500 Subject: [PATCH] Implement an initial solution for a preview buffer The buffer is used to show the output of the make command while it is running. This will be useful for longer running jobs, and approximates the behavior of :make without stealing focus from the active buffer. Desirable improvements include: 1. A handler to receive stdout/stderr messages and write them to the preview buffer, setting and un-setting the modifiable boolean as necessary. 2. Local buffer flags for the preview buffer (e.g., noswapfile) --- README.md | 15 ++++++++++----- doc/makejob.txt | 4 +++- plugin/makejob.vim | 15 ++++++++------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e74a1be..5b6accf 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,14 @@ Most other plugin managers will resemble one of these two. ## Usage ### The Short Version Vim has `:make` and `:lmake`. Replace those calls with `:MakeJob` and -`:LmakeJob`. Call it a day. If `:MakeJob` reports findings, use `:copen` -to view them, and likewise `:lopen` for `:LmakeJob`. +`:LmakeJob`. A buffer will open showing the command output, which will +be parsed into the Quickfix or LocationList window when the job +completes. Bask in your newfound freedom to do as you please in Vim +while MakeJob runs. + +If `:MakeJob` reports findings, use `:copen` to view the QuickFix window +(in the case of MakeJob), and likewise `:lopen` to open the LocationList +for `:LmakeJob`. ### The Less Short Version Users of Syntastic may not be aware that Vim offers many of the same @@ -49,9 +55,8 @@ they abstract away the work of remembering the `errorformat`, they're extendable, and many are already included in Vim. _MakeJob_ uses compilers. -Also, it's possible to use `autocmd` to set the compiler of your choice - automatically. Just for the sake of completeness, an example of that - trick would like like this: +It's also possible to use `autocmd` to set the compiler of your choice + automatically. An example of that trick would like like this: `autocmd! FileType python compiler pylint` diff --git a/doc/makejob.txt b/doc/makejob.txt index 8b4cd9f..1c18761 100644 --- a/doc/makejob.txt +++ b/doc/makejob.txt @@ -8,7 +8,7 @@ INTRODUCTION *makejob* *vim-makejob* There are plenty of other build solutions for Vim and Vim, many of them offering feature sets that overlap with those the editor already offers. With minimalism as a goal, MakeJob implements asynchronous |:make| and -|:lmake| for Vim in just over 100 lines of Vimscript. +|:lmake| for Vim in under 100 lines of Vimscript. Here are your new make commands. @@ -22,6 +22,8 @@ MakeJob [{bufname}] Start a makejob on the specified buffer, the special character % (see |_%|). |autowrite|, |QuickFixCmdPre|, and |QuickFixCmdPost| all work as expected. + While the job runs, output will be directed + to a preview buffer below the active buffer. *makejob-LmakeJob* LmakeJob [{bufname}] Same as ":MakeJob", except the location list for diff --git a/plugin/makejob.vim b/plugin/makejob.vim index 499bf75..190d5ab 100644 --- a/plugin/makejob.vim +++ b/plugin/makejob.vim @@ -18,10 +18,8 @@ endfunction function! s:JobHandler(channel) abort let is_lmake = s:jobinfo[split(a:channel)[1]]['lmake'] - let output = [] - while ch_status(a:channel, {'part': 'out'}) == 'buffered' - let output += [ch_read(a:channel)] - endwhile + let output = getbufline('MakeJob', 1, '$') + silent bdelete! MakeJob " For reasons I don't understand, copying and re-writing " errorformat fixes a lot of parsing errors @@ -51,7 +49,7 @@ function! s:JobHandler(channel) abort silent doautocmd QuickFixCmdPost make endif - echo s:jobinfo[split(a:channel)[1]]['prog']." ended with " + echomsg s:jobinfo[split(a:channel)[1]]['prog']." ended with " \ .makeoutput." findings" endfunction @@ -64,7 +62,8 @@ function! s:MakeJob(lmake, ...) let make = make.' '.a:1 endif endif - let opts = { 'close_cb' : s:Function('s:JobHandler') } + let opts = { 'close_cb' : s:Function('s:JobHandler'), + \ 'out_io': 'buffer', 'out_name': 'MakeJob' } if a:lmake silent doautocmd QuickFixCmdPre lmake @@ -76,9 +75,11 @@ function! s:MakeJob(lmake, ...) silent write endif + silent belowright pedit MakeJob + let job = job_start(make, opts) let s:jobinfo[split(job_getchannel(job))[1]] = {'prog': split(make)[0],'lmake': a:lmake} - echo s:jobinfo[split(job_getchannel(job))[1]]['prog'].' started' + echomsg s:jobinfo[split(job_getchannel(job))[1]]['prog'].' started' endfunction command! -nargs=? MakeJob call s:MakeJob(0,)