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:
John Helmert
2019-06-08 15:18:15 -05:00
parent e545c7052c
commit 7423a43e50
4 changed files with 22 additions and 49 deletions

View File

@@ -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 sys.platform == 'darwin':
copy_osx(text)
else:
# For Linux, BSD, cygwin, etc.
copy_linux(text)
# 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':
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())

View File

@@ -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(

View File

@@ -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