aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Bobbin <jer@jer.cx>2020-07-11 09:17:00 -0700
committerMarc André Tanner <mat@brain-dump.org>2020-07-17 15:30:39 +0200
commit9cb69f746312efa7c01c1dd4185bface3b30bb6d (patch)
tree802abcd76e734f500b9f72aaf7fd6dc2a6efe0c6
parentf34f6d968e711f3cab019a12bb60da1bbf52161f (diff)
downloadvis-9cb69f746312efa7c01c1dd4185bface3b30bb6d.tar.gz
vis-9cb69f746312efa7c01c1dd4185bface3b30bb6d.tar.xz
support for primary clipboard
-rw-r--r--man/vis-clipboard.14
-rwxr-xr-xvis-clipboard44
-rw-r--r--vis-registers.c23
-rw-r--r--vis.c1
-rw-r--r--vis.h1
5 files changed, 54 insertions, 19 deletions
diff --git a/man/vis-clipboard.1 b/man/vis-clipboard.1
index e745588..8ed454c 100644
--- a/man/vis-clipboard.1
+++ b/man/vis-clipboard.1
@@ -12,9 +12,11 @@
.Pp
.Nm vis-clipboard
.Fl -copy
+.Op Fl -selection Ar selection
.Pp
.Nm vis-clipboard
.Fl -paste
+.Op Fl -selection Ar selection
.
.Sh DESCRIPTION
.Nm vis-clipboard
@@ -50,6 +52,8 @@ In this mode,
.Nm vis-clipboard
reads the content of the system clipboard,
and writes it to standard output.
+.It Fl -selection Ar selection
+specify which selection to use, options are "primary" or "clipboard"
.El
.
.Sh ENVIRONMENT
diff --git a/vis-clipboard b/vis-clipboard
index 098fa8c..8397ee2 100755
--- a/vis-clipboard
+++ b/vis-clipboard
@@ -8,7 +8,7 @@ vc_fatal() {
}
vc_usage() {
- vc_fatal "`basename $0` [--usable|--copy|--paste]"
+ vc_fatal "`basename $0` [--selection sel] [--usable|--copy|--paste]"
}
vc_determine_command() {
@@ -30,6 +30,10 @@ vc_determine_command() {
done
fi
+ if [ "$sel" = "primary" ]; then
+ vc_fatal "clipboard primary selection is not supported on your platform"
+ fi
+
if type pbcopy >/dev/null 2>&1; then
echo 'mac'
return 0
@@ -76,27 +80,35 @@ vc_paste() {
}
vc_wlclipboard_copy() {
- wl-copy -t TEXT
+ if [ "$sel" = "primary" ]; then
+ wl-copy --primary -t TEXT
+ else
+ wl-copy -t TEXT
+ fi
}
vc_wlclipboard_paste() {
- wl-paste -t text
+ if [ "$sel" = "primary" ]; then
+ wl-paste --primary -t text
+ else
+ wl-paste -t text
+ fi
}
vc_xsel_copy() {
- xsel -bi
+ xsel --"$sel" -bi
}
vc_xsel_paste() {
- xsel -bo
+ xsel --"$sel" -bo
}
vc_xclip_copy() {
- xclip -selection clipboard -i >/dev/null 2>&1
+ xclip -selection "$sel" -i >/dev/null 2>&1
}
vc_xclip_paste() {
- xclip -selection clipboard -o
+ xclip -selection "$sel" -o
}
vc_mac_copy() {
@@ -115,11 +127,17 @@ vc_cygwin_paste() {
cat /dev/clipboard
}
-case "$1" in
- --usable) vc_usable;;
- --copy) vc_copy;;
- --paste) vc_paste;;
- *) ;;
-esac
+while [ $# -gt 0 ]; do
+ case "$1" in
+ --usable) fn=vc_usable;;
+ --copy) fn=vc_copy;;
+ --paste) fn=vc_paste;;
+ --selection) shift; sel="$1";;
+ *) ;;
+ esac
+ shift
+done
+
+sel=${sel:-"clipboard"} $fn
vc_usage
diff --git a/vis-registers.c b/vis-registers.c
index 503c50b..58fc7ec 100644
--- a/vis-registers.c
+++ b/vis-registers.c
@@ -69,16 +69,21 @@ const char *register_slot_get(Vis *vis, Register *reg, size_t slot, size_t *len)
case REGISTER_CLIPBOARD:
{
Buffer buferr;
+ enum VisRegister id = reg - vis->registers;
+ const char *cmd[] = { VIS_CLIPBOARD, "--paste", "--selection", NULL, NULL };
buffer_init(&buferr);
Buffer *buf = array_get(&reg->values, slot);
if (!buf)
return NULL;
buffer_clear(buf);
+ if (id == VIS_REG_PRIMARY)
+ cmd[3] = "primary";
+ else
+ cmd[3] = "clipboard";
int status = vis_pipe(vis, vis->win->file,
&(Filerange){ .start = 0, .end = 0 },
- (const char*[]){ VIS_CLIPBOARD, "--paste", NULL },
- buf, read_buffer, &buferr, read_buffer);
+ cmd, buf, read_buffer, &buferr, read_buffer);
if (status != 0)
vis_info_show(vis, "Command failed %s", buffer_content0(&buferr));
@@ -152,11 +157,17 @@ bool register_slot_put_range(Vis *vis, Register *reg, size_t slot, Text *txt, Fi
case REGISTER_CLIPBOARD:
{
Buffer buferr;
+ const char *cmd[] = { VIS_CLIPBOARD, "--copy", "--selection", NULL, NULL };
+ enum VisRegister id = reg - vis->registers;
buffer_init(&buferr);
+ if (id == VIS_REG_PRIMARY)
+ cmd[3] = "primary";
+ else
+ cmd[3] = "clipboard";
+
int status = vis_pipe(vis, vis->win->file, range,
- (const char*[]){ VIS_CLIPBOARD, "--copy", NULL },
- NULL, NULL, &buferr, read_buffer);
+ cmd, NULL, NULL, &buferr, read_buffer);
if (status != 0)
vis_info_show(vis, "Command failed %s", buffer_content0(&buferr));
@@ -187,7 +198,6 @@ bool register_resize(Register *reg, size_t count) {
enum VisRegister vis_register_from(Vis *vis, char reg) {
switch (reg) {
- case '+': return VIS_REG_CLIPBOARD;
case '@': return VIS_MACRO_LAST_RECORDED;
}
@@ -275,7 +285,8 @@ const RegisterDef vis_registers[] = {
[VIS_REG_9] = { '9', VIS_HELP("9th sub-expression match") },
[VIS_REG_AMPERSAND] = { '&', VIS_HELP("Last regex match") },
[VIS_REG_BLACKHOLE] = { '_', VIS_HELP("/dev/null register") },
- [VIS_REG_CLIPBOARD] = { '*', VIS_HELP("System clipboard register, see vis-clipboard(1)") },
+ [VIS_REG_PRIMARY] = { '*', VIS_HELP("Primary clipboard register, see vis-clipboard(1)") },
+ [VIS_REG_CLIPBOARD] = { '+', VIS_HELP("System clipboard register, see vis-clipboard(1)") },
[VIS_REG_DOT] = { '.', VIS_HELP("Last inserted text") },
[VIS_REG_SEARCH] = { '/', VIS_HELP("Last search pattern") },
[VIS_REG_COMMAND] = { ':', VIS_HELP("Last :-command") },
diff --git a/vis.c b/vis.c
index 15011dc..c4e8fa1 100644
--- a/vis.c
+++ b/vis.c
@@ -675,6 +675,7 @@ Vis *vis_new(Ui *ui, VisEvent *event) {
register_init(&vis->registers[i]);
vis->registers[VIS_REG_BLACKHOLE].type = REGISTER_BLACKHOLE;
vis->registers[VIS_REG_CLIPBOARD].type = REGISTER_CLIPBOARD;
+ vis->registers[VIS_REG_PRIMARY].type = REGISTER_CLIPBOARD;
vis->registers[VIS_REG_NUMBER].type = REGISTER_NUMBER;
array_init(&vis->operators);
array_init(&vis->motions);
diff --git a/vis.h b/vis.h
index 419ba1c..0696194 100644
--- a/vis.h
+++ b/vis.h
@@ -731,6 +731,7 @@ enum VisRegister {
VIS_REG_9,
VIS_REG_BLACKHOLE, /* /dev/null register */
VIS_REG_CLIPBOARD, /* system clipboard register */
+ VIS_REG_PRIMARY, /* system primary clipboard register */
VIS_REG_DOT, /* last inserted text, copy of VIS_MACRO_OPERATOR */
VIS_REG_SEARCH, /* last used search pattern "/ */
VIS_REG_COMMAND, /* last used :-command ": */