clipboard: check for X on every invocation

xsel and xcopy may be available even if a valid X display is not. Also,
the availability of X may change at any time, so check on each
invocation.

Closes #1509.
This commit is contained in:
Justin M. Keyes 2014-11-22 20:01:28 +00:00
parent 412c714448
commit c10f7e1c62

View File

@ -4,6 +4,15 @@
let s:copy = ''
let s:paste = ''
function! s:try_cmd(cmd, ...)
let out = a:0 ? systemlist(a:cmd, a:1) : systemlist(a:cmd)
if v:shell_error
echo "clipboard: error: ".(len(out) ? out[0] : '')
return ''
endif
return out
endfunction
if executable('pbcopy')
let s:copy = 'pbcopy'
let s:paste = 'pbpaste'
@ -13,28 +22,21 @@ elseif executable('xsel')
elseif executable('xclip')
let s:copy = 'xclip -i -selection clipboard'
let s:paste = 'xclip -o -selection clipboard'
endif
if s:copy == ''
echom 'No shell command for communicating with the clipboard found.'
else
echom 'clipboard: No shell command for communicating with the clipboard found.'
finish
endif
let s:methods = {}
let s:clipboard = {}
function! s:ClipboardGet(...)
return systemlist(s:paste)
function! s:clipboard.get(...)
return s:try_cmd(s:paste)
endfunction
function! s:ClipboardSet(...)
call systemlist(s:copy, a:1)
function! s:clipboard.set(...)
call s:try_cmd(s:copy, a:1)
endfunction
let s:methods = {
\ 'get': function('s:ClipboardGet'),
\ 'set': function('s:ClipboardSet')
\ }
function! provider#clipboard#Call(method, args)
return s:methods[a:method](a:args)
return s:clipboard[a:method](a:args)
endfunction