Skip to content

Commit

Permalink
Merge pull request #51 from coot/vim
Browse files Browse the repository at this point in the history
jobs & other goodies
  • Loading branch information
FrigoEU authored Jun 9, 2017
2 parents 29fe53e + 66ab668 commit 5cf979f
Show file tree
Hide file tree
Showing 4 changed files with 1,219 additions and 524 deletions.
20 changes: 9 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,7 @@ This plugin provides two kinds of syntax checking with syntastic. Controlling wh
* :PSCIDEcaseSplit : Splits variables in a function declaration into its different constructors. Will probably get improved soon so you don't have to input the type yourself

![:PSCIDEcaseSplit gif](http://frigoeu.github.io/gifs/casesplit.gif)
* :PSCIDEremoveImportQualifications : Remove all qualifications from your imports

![:PSCIDEremoveimport gif](http://frigoeu.github.io/gifs/removeimport.gif)
* :PSCIDEaddImportQualifications : Applies all import qualification suggestions in one go. Same as :PSCIDEapplySuggestion, but applies it to every line starting with "import"

![:PSCIDEaddimport gif](http://frigoeu.github.io/gifs/addimport.gif)
Expand All @@ -53,15 +51,15 @@ This plugin provides two kinds of syntax checking with syntastic. Controlling wh
No custom mappings are provided, but it's easy to map the above commands to any key mapping you want. My personal setup:

```
au FileType purescript nmap <leader>t :PSCIDEtype<CR>
au FileType purescript nmap <leader>s :PSCIDEapplySuggestion<CR>
au FileType purescript nmap <leader>a :PSCIDEaddTypeAnnotation<CR>
au FileType purescript nmap <leader>i :PSCIDEimportIdentifier<CR>
au FileType purescript nmap <leader>r :PSCIDEload<CR>
au FileType purescript nmap <leader>p :PSCIDEpursuit<CR>
au FileType purescript nmap <leader>c :PSCIDEcaseSplit<CR>
au FileType purescript nmap <leader>qd :PSCIDEremoveImportQualifications<CR>
au FileType purescript nmap <leader>qa :PSCIDEaddImportQualifications<CR>
au FileType purescript nmap <buffer> <leader>t :<C-U>PSCIDEtype<CR>
au FileType purescript nmap <buffer> <leader>s :<C-U>PSCIDEapplySuggestion<CR>
au FileType purescript nmap <buffer> <leader>a :<C-U>PSCIDEaddTypeAnnotation<CR>
au FileType purescript nmap <buffer> <leader>i :<C-U>PSCIDEimportIdentifier<CR>
au FileType purescript nmap <buffer> <leader>r :<C-U>PSCIDEload<CR>
au FileType purescript nmap <buffer> <leader>p :<C-U>PSCIDEpursuit<CR>
au FileType purescript nmap <buffer> <leader>c :<C-U>PSCIDEcaseSplit<CR>
au FileType purescript nmap <buffer> <leader>qd :<C-U>PSCIDEremoveImportQualifications<CR>
au FileType purescript nmap <buffer> <leader>qa :<C-U>PSCIDEaddImportQualifications<CR>
```


Expand Down
182 changes: 182 additions & 0 deletions autoload/async/job.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
" Author: Prabir Shrestha <mail at prabir dot me>
" License: The MIT License
" Website: https://github.com/prabirshrestha/async.vim

let s:save_cpo = &cpo
set cpo&vim

let s:jobidseq = 0
let s:jobs = {} " { job, opts, type: 'vimjob|nvimjob'}
let s:job_type_nvimjob = 'nvimjob'
let s:job_type_vimjob = 'vimjob'
let s:job_error_unsupported_job_type = -2 " unsupported job type

function! s:job_supported_types() abort
let l:supported_types = []
if has('nvim')
let l:supported_types += [s:job_type_nvimjob]
endif
if !has('nvim') && has('job') && has('channel') && has('lambda')
let l:supported_types += [s:job_type_vimjob]
endif
return l:supported_types
endfunction

function! s:job_supports_type(type) abort
return index(s:job_supported_types(), a:type) >= 0
endfunction

function! s:out_cb(job, data, jobid, opts) abort
if has_key(a:opts, 'on_stdout')
call a:opts.on_stdout(a:jobid, split(a:data, "\n", 1), 'stdout')
endif
endfunction

function! s:err_cb(job, data, jobid, opts) abort
if has_key(a:opts, 'on_stderr')
call a:opts.on_stderr(a:jobid, split(a:data, "\n", 1), 'stderr')
endif
endfunction

function! s:exit_cb(job, status, jobid, opts) abort
if has_key(a:opts, 'on_exit')
call a:opts.on_exit(a:jobid, a:status, 'exit')
endif
if has_key(s:jobs, a:jobid)
call remove(s:jobs, a:jobid)
endif
endfunction

function! s:on_stdout(jobid, data, event) abort
if has_key(s:jobs, a:jobid)
let l:jobinfo = s:jobs[a:jobid]
if has_key(l:jobinfo.opts, 'on_stdout')
call l:jobinfo.opts.on_stdout(a:jobid, a:data, a:event)
else
echom "No on_stdout"
endif
endif
endfunction

function! s:on_stderr(jobid, data, event) abort
if has_key(s:jobs, a:jobid)
let l:jobinfo = s:jobs[a:jobid]
if has_key(l:jobinfo.opts, 'on_stderr')
call l:jobinfo.opts.on_stderr(a:jobid, a:data, a:event)
endif
endif
endfunction

function! s:on_exit(jobid, status, event) abort
if has_key(s:jobs, a:jobid)
let l:jobinfo = s:jobs[a:jobid]
if has_key(l:jobinfo.opts, 'on_exit')
call l:jobinfo.opts.on_exit(a:jobid, a:status, a:event)
endif
endif
endfunction

function! s:job_start(cmd, opts) abort
let l:jobtypes = s:job_supported_types()
let l:jobtype = ''

if has_key(a:opts, 'type')
if type(a:opts.type) == type('')
if !s:job_supports_type(a:opts.type)
return s:job_error_unsupported_job_type
endif
let l:jobtype = a:opts.type
else
let l:jobtypes = a:opts.type
endif
endif

if empty(l:jobtype)
" find the best jobtype
for l:jobtype2 in l:jobtypes
if s:job_supports_type(l:jobtype2)
let l:jobtype = l:jobtype2
endif
endfor
endif

if l:jobtype == ''
return s:job_error_unsupported_job_type
endif

if l:jobtype == s:job_type_nvimjob
let l:job = jobstart(a:cmd, {
\ 'on_stdout': function('s:on_stdout'),
\ 'on_stderr': function('s:on_stderr'),
\ 'on_exit': function('s:on_exit'),
\})
if l:job <= 0
return l:job
endif
let l:jobid = l:job " nvimjobid and internal jobid is same
let s:jobs[l:jobid] = {
\ 'type': s:job_type_nvimjob,
\ 'opts': a:opts,
\ }
let s:jobs[l:jobid].job = l:job
elseif l:jobtype == s:job_type_vimjob
let s:jobidseq = s:jobidseq + 1
let l:jobid = s:jobidseq
let l:job = job_start(a:cmd, {
\ 'out_cb': {job,data->s:out_cb(job, data, l:jobid, a:opts)},
\ 'err_cb': {job,data->s:err_cb(job, data, l:jobid, a:opts)},
\ 'exit_cb': {job,data->s:exit_cb(job, data, l:jobid, a:opts)},
\ 'mode': 'raw',
\})
if job_status(l:job) != 'run'
return -1
endif
let s:jobs[l:jobid] = {
\ 'type': s:job_type_vimjob,
\ 'opts': a:opts,
\ 'job': l:job,
\ 'channel': job_getchannel(l:job)
\ }
else
return s:job_error_unsupported_job_type
endif

return l:jobid
endfunction

function! s:job_stop(jobid) abort
if has_key(s:jobs, a:jobid)
let l:jobinfo = s:jobs[a:jobid]
if l:jobinfo.type == s:job_type_nvimjob
call jobstop(a:jobid)
elseif l:jobinfo.type == s:job_type_vimjob
call job_stop(s:jobs[a:jobid].job)
endif
if has_key(s:jobs, a:jobid)
call remove(s:jobs, a:jobid)
endif
endif
endfunction

function! s:job_send(jobid, data) abort
let l:jobinfo = s:jobs[a:jobid]
if l:jobinfo.type == s:job_type_nvimjob
return jobsend(a:jobid, a:data)
elseif l:jobinfo.type == s:job_type_vimjob
return ch_sendraw(l:jobinfo.channel, a:data)
endif
endfunction

" public apis {{{
function! async#job#start(cmd, opts) abort
return s:job_start(a:cmd, a:opts)
endfunction

function! async#job#stop(jobid) abort
call s:job_stop(a:jobid)
endfunction

function! async#job#send(jobid, data) abort
return s:job_send(a:jobid, a:data)
endfunction
" }}}
Loading

0 comments on commit 5cf979f

Please sign in to comment.