Module: RuVim::Clipboard

Defined in:
lib/ruvim/clipboard.rb

Class Method Summary collapse

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


9
10
11
# File 'lib/ruvim/clipboard.rb', line 9

def available?
  !backend.nil?
end

.backendObject



42
43
44
# File 'lib/ruvim/clipboard.rb', line 42

def backend
  @backend ||= detect_backend
end

.command_available?(name) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
# File 'lib/ruvim/clipboard.rb', line 71

def command_available?(name)
  system("which", name, out: File::NULL, err: File::NULL)
end

.detect_backendObject



46
47
48
49
50
51
52
53
# File 'lib/ruvim/clipboard.rb', line 46

def detect_backend
  return pbcopy_backend if command_available?("pbcopy") && command_available?("pbpaste")
  return wayland_backend if command_available?("wl-copy") && command_available?("wl-paste")
  return xclip_backend if command_available?("xclip")
  return xsel_backend if command_available?("xsel")

  nil
end

.pbcopy_backendObject



55
56
57
# File 'lib/ruvim/clipboard.rb', line 55

def pbcopy_backend
  { write: %w[pbcopy], read: %w[pbpaste] }
end

.readObject



13
14
15
16
17
18
19
20
21
22
23
# File 'lib/ruvim/clipboard.rb', line 13

def read
  cmd = backend&.dig(:read)
  return nil unless cmd

  out, status = Open3.capture2(*cmd)
  return nil unless status.success?

  out
rescue StandardError
  nil
end

.reset_backend!Object



38
39
40
# File 'lib/ruvim/clipboard.rb', line 38

def reset_backend!
  @backend = nil
end

.wayland_backendObject



59
60
61
# File 'lib/ruvim/clipboard.rb', line 59

def wayland_backend
  { write: %w[wl-copy], read: %w[wl-paste -n] }
end

.write(text) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/ruvim/clipboard.rb', line 25

def write(text)
  cmd = backend&.dig(:write)
  return false unless cmd

  Open3.popen2(*cmd) do |stdin, _stdout, wait|
    stdin.write(text.to_s)
    stdin.close
    return wait.value.success?
  end
rescue StandardError
  false
end

.xclip_backendObject



63
64
65
# File 'lib/ruvim/clipboard.rb', line 63

def xclip_backend
  { write: %w[xclip -selection clipboard -in], read: %w[xclip -selection clipboard -out] }
end

.xsel_backendObject



67
68
69
# File 'lib/ruvim/clipboard.rb', line 67

def xsel_backend
  { write: %w[xsel --clipboard --input], read: %w[xsel --clipboard --output] }
end