Make the clipboard command user-configurable
Add config item clipboard_cmd, with a default of 'pbcopy w' on Darwin and 'xclip' on everything else. This will allow the user to use any command for the clipboard, including 'wl-copy' for Wayland (addressing issue #693 on Github). With his change, significant simplifications could be made to clipboard.py - the copy_*() functions have been removed and combined into copy(). With this simplification, the old OSX test is obsolete, and new OSX tests are needed (need a way to simulate sys.platform).
This commit is contained in:
@@ -4,48 +4,22 @@ from __future__ import unicode_literals
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
from .exceptions import ProgramError
|
||||
|
||||
|
||||
def _subprocess_copy(text, args_list):
|
||||
p = subprocess.Popen(args_list, stdin=subprocess.PIPE, close_fds=True)
|
||||
p.communicate(input=text.encode('utf-8'))
|
||||
|
||||
|
||||
def copy(text):
|
||||
def copy(text, cmd):
|
||||
"""
|
||||
Copy text to OS clipboard.
|
||||
"""
|
||||
|
||||
# If no command is specified (i.e. the config option is empty) try
|
||||
# to find a reasonable default based on the operating system
|
||||
if cmd is None:
|
||||
if sys.platform == 'darwin':
|
||||
copy_osx(text)
|
||||
else:
|
||||
# For Linux, BSD, cygwin, etc.
|
||||
copy_linux(text)
|
||||
cmd = 'pbcopy w'
|
||||
else: # For Linux, BSD, cygwin, etc.
|
||||
cmd = 'xclip'
|
||||
|
||||
|
||||
def copy_osx(text):
|
||||
_subprocess_copy(text, ['pbcopy', 'w'])
|
||||
|
||||
|
||||
def copy_linux(text):
|
||||
|
||||
def get_command_name():
|
||||
# Checks for the installation of xsel or xclip
|
||||
for cmd in ['xsel', 'xclip']:
|
||||
cmd_exists = subprocess.call(
|
||||
['which', cmd],
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
|
||||
if cmd_exists:
|
||||
return cmd
|
||||
return None
|
||||
|
||||
cmd_args = {
|
||||
'xsel': ['xsel', '-b', '-i'],
|
||||
'xclip': ['xclip', '-selection', 'c']}
|
||||
cmd_name = get_command_name()
|
||||
|
||||
if cmd_name is None:
|
||||
raise ProgramError("External copy application not found")
|
||||
|
||||
_subprocess_copy(text, cmd_args.get(cmd_name))
|
||||
_subprocess_copy(text, cmd.split())
|
||||
|
||||
@@ -542,7 +542,7 @@ class Page(object):
|
||||
return
|
||||
|
||||
try:
|
||||
clipboard_copy(url)
|
||||
clipboard_copy(url, self.config['clipboard_cmd'])
|
||||
except (ProgramError, OSError) as e:
|
||||
_logger.exception(e)
|
||||
self.term.show_notification(
|
||||
|
||||
@@ -16,6 +16,12 @@ ascii = False
|
||||
; Turn on monochrome mode to disable color.
|
||||
monochrome = False
|
||||
|
||||
; Data being copied is piped into this command
|
||||
;clipboard_cmd = xclip
|
||||
;clipboard_cmd = xsel -b -i
|
||||
;clipboard_cmd = wl-copy
|
||||
;clipboard_cmd = pbcopy w
|
||||
|
||||
; Flash when an invalid action is executed.
|
||||
flash = True
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ from __future__ import unicode_literals
|
||||
|
||||
import pytest
|
||||
|
||||
from rtv.clipboard import copy_linux, copy_osx
|
||||
from rtv.clipboard import copy
|
||||
from rtv.exceptions import ProgramError
|
||||
|
||||
|
||||
@@ -23,20 +23,13 @@ def test_copy():
|
||||
p.communicate = mock.Mock()
|
||||
Popen.return_value = p
|
||||
|
||||
# If the `which` command can't find a program to use
|
||||
call.return_value = 1 # Returns an error code
|
||||
with pytest.raises(ProgramError):
|
||||
copy_linux('test')
|
||||
|
||||
call.return_value = 0
|
||||
copy_linux('test')
|
||||
copy('test', 'xsel -b -i')
|
||||
assert Popen.call_args[0][0] == ['xsel', '-b', '-i']
|
||||
p.communicate.assert_called_with(input='test'.encode('utf-8'))
|
||||
copy_linux('test ❤')
|
||||
|
||||
copy('test ❤', 'xclip')
|
||||
assert Popen.call_args[0][0] == ['xclip']
|
||||
p.communicate.assert_called_with(input='test ❤'.encode('utf-8'))
|
||||
|
||||
copy_osx('test')
|
||||
assert Popen.call_args[0][0] == ['pbcopy', 'w']
|
||||
p.communicate.assert_called_with(input='test'.encode('utf-8'))
|
||||
copy_osx('test ❤')
|
||||
p.communicate.assert_called_with(input='test ❤'.encode('utf-8'))
|
||||
# Need OSX tests, can't simulate sys.platform
|
||||
|
||||
Reference in New Issue
Block a user