-
-
Save yorickvP/6132f237fbc289a45c808d8d75e0e1fb to your computer and use it in GitHub Desktop.
(setq wl-copy-process nil) | |
(defun wl-copy (text) | |
(setq wl-copy-process (make-process :name "wl-copy" | |
:buffer nil | |
:command '("wl-copy" "-f" "-n") | |
:connection-type 'pipe)) | |
(process-send-string wl-copy-process text) | |
(process-send-eof wl-copy-process)) | |
(defun wl-paste () | |
(if (and wl-copy-process (process-live-p wl-copy-process)) | |
nil ; should return nil if we're the current paste owner | |
(shell-command-to-string "wl-paste -n | tr -d \r"))) | |
(setq interprogram-cut-function 'wl-copy) | |
(setq interprogram-paste-function 'wl-paste) |
I'm now using emacs-pgtk, which has native wayland support. It's in https://github.com/nix-community/emacs-overlay
@yorickvP I am using emacs-pgtk, but pasting into emacs still doesn't work a lot of the time.
The value of (gui-selection-value)
is different from the wl-paste
output.
Your snippet works 👍
@yorickvP It seems like you don't need this anymore, however I still find wl-copy/wl-paste useful when running emacsclient over waypipe (since I want to have copy/paste between host where the emacsclient is displaying & emacs). So I reused bits of this in https://gitlab.freedesktop.org/sochotnicky/waypipe-mode.el
Thanks for this!
I only wanted copying (since my terminal emulator already does pasting just fine), so I simplified the code a bit, for anyone who's interested:
(when (executable-find "wl-copy")
(defun wl-copy (text)
(let ((p (make-process :name "wl-copy"
:command '("wl-copy")
:connection-type 'pipe)))
(process-send-string p text)
(process-send-eof p)))
(setq interprogram-cut-function 'wl-copy))
@yorickvP You still need this when running Emacs in a terminal.
I improved the snippet a bit to limit the use of wl-copy
and wl-paste
to Emacs running in terminal only:
;; Set up wl-copy and wl-paste in terminal Emacs
(when (and (string= (getenv "XDG_SESSION_TYPE") "wayland")
(executable-find "wl-copy")
(executable-find "wl-paste"))
(defun my-wl-copy (text)
"Copy with wl-copy if in terminal, otherwise use the original value of `interprogram-cut-function'."
(if (display-graphic-p)
(gui-select-text text)
(let ((wl-copy-process
(make-process :name "wl-copy"
:buffer nil
:command '("wl-copy")
:connection-type 'pipe)))
(process-send-string wl-copy-process text)
(process-send-eof wl-copy-process))))
(defun my-wl-paste ()
"Paste with wl-paste if in terminal, otherwise use the original value of `interprogram-paste-function'."
(if (display-graphic-p)
(gui-selection-value)
(shell-command-to-string "wl-paste --no-newline")))
(setq interprogram-cut-function #'my-wl-copy)
(setq interprogram-paste-function #'my-wl-paste))
Hi, thanks for that!
From my emacs (using emacsclient in alacritty terminal) I need to set WAYLAND_DISPLAY variable to get this working.
M-x setenv