From 29e02792a4d8dce436dae46cb5a9f676318a66a0 Mon Sep 17 00:00:00 2001 From: Iblis Lin Date: Sun, 6 Aug 2017 16:35:25 +0800 Subject: [PATCH 1/2] interactiveutil: clipboard for FreeBSD The xsel implementation is different from Linux's. Ref: http://bsdforge.com/projects/x11/xsel/ --- base/interactiveutil.jl | 42 +++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/base/interactiveutil.jl b/base/interactiveutil.jl index 4ad8d2795ad6f..231f7a47a513c 100644 --- a/base/interactiveutil.jl +++ b/base/interactiveutil.jl @@ -134,30 +134,60 @@ if Sys.isapple() end clipboard() = read(`pbpaste`, String) -elseif Sys.islinux() +elseif Sys.islinux() || Sys.KERNEL === :FreeBSD _clipboardcmd = nothing + const _clipboardcmds = if Sys.islinux() + Dict( + :copy => Dict( + :xsel => `xsel --nodetach --input --clipboard`, + :xclip => `xclip -silent -in -selection clipboard`, + ), + :paste => Dict( + :xsel => `xsel --nodetach --output --clipboard`, + :xclip => `xclip -quiet -out -selection clipboard`, + ) + ) + elseif Sys.KERNEL === :FreeBSD + Dict( + :copy => Dict( + :xsel => `xsel -c`, + :xclip => `xclip -silent -in -selection clipboard`, + ), + :paste => Dict( + :xsel => `xsel -p`, + :xclip => `xclip -quiet -out -selection clipboard`, + ) + ) + end function clipboardcmd() global _clipboardcmd _clipboardcmd !== nothing && return _clipboardcmd for cmd in (:xclip, :xsel) success(pipeline(`which $cmd`, DevNull)) && return _clipboardcmd = cmd end - error("no clipboard command found, please install xsel or xclip") + pkgs = @static if Sys.islinux() + "xsel or xclip" + elseif Sys.KERNEL === :FreeBSD + "x11/xsel or x11/xclip" + end + error("no clipboard command found, please install $pkgs") end function clipboard(x) c = clipboardcmd() - cmd = c == :xsel ? `xsel --nodetach --input --clipboard` : - c == :xclip ? `xclip -silent -in -selection clipboard` : + cmd = get(_clipboardcmds[:copy], c, nothing) + if cmd === nothing error("unexpected clipboard command: $c") + end open(pipeline(cmd, stderr=STDERR), "w") do io print(io, x) end end function clipboard() c = clipboardcmd() - cmd = c == :xsel ? `xsel --nodetach --output --clipboard` : - c == :xclip ? `xclip -quiet -out -selection clipboard` : + cmd = get(_clipboardcmds[:paste], c, nothing) + if cmd === nothing error("unexpected clipboard command: $c") + end read(pipeline(cmd, stderr=STDERR), String) end From 7383081c14f0d12ca29b8bcdd7028c5109384aea Mon Sep 17 00:00:00 2001 From: Iblis Lin Date: Mon, 7 Aug 2017 11:33:34 +0800 Subject: [PATCH 2/2] interactiveutil: not repeat xclip command --- base/interactiveutil.jl | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/base/interactiveutil.jl b/base/interactiveutil.jl index 231f7a47a513c..69edbd4e77503 100644 --- a/base/interactiveutil.jl +++ b/base/interactiveutil.jl @@ -136,29 +136,18 @@ if Sys.isapple() elseif Sys.islinux() || Sys.KERNEL === :FreeBSD _clipboardcmd = nothing - const _clipboardcmds = if Sys.islinux() - Dict( - :copy => Dict( - :xsel => `xsel --nodetach --input --clipboard`, - :xclip => `xclip -silent -in -selection clipboard`, - ), - :paste => Dict( - :xsel => `xsel --nodetach --output --clipboard`, - :xclip => `xclip -quiet -out -selection clipboard`, - ) + const _clipboardcmds = Dict( + :copy => Dict( + :xsel => Sys.islinux() ? + `xsel --nodetach --input --clipboard` : `xsel -c`, + :xclip => `xclip -silent -in -selection clipboard`, + ), + :paste => Dict( + :xsel => Sys.islinux() ? + `xsel --nodetach --output --clipboard` : `xsel -p`, + :xclip => `xclip -quiet -out -selection clipboard`, ) - elseif Sys.KERNEL === :FreeBSD - Dict( - :copy => Dict( - :xsel => `xsel -c`, - :xclip => `xclip -silent -in -selection clipboard`, - ), - :paste => Dict( - :xsel => `xsel -p`, - :xclip => `xclip -quiet -out -selection clipboard`, - ) - ) - end + ) function clipboardcmd() global _clipboardcmd _clipboardcmd !== nothing && return _clipboardcmd