WSL上でEmacs使ってるんで、pure Waylandのほうが性能よいのかなあ?と思ってnixでemacs30-pgtkを入れて動かしてみている。まあ、そこそこX用と遜色ないくらいに動く。たまに落ちるけど。

問題点としてすぐに気付くのはWindows側との相互のコピペができないこと。 で、これはEmacsWikiのCopyAndPasteに対応策が書いてある。

  ;; credit: yorickvP on Github
  (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
                                        :noquery t))
    (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)

これでコピペができるようになって助かった……という話だけならわざわざこんなarticleは書かない。

これだとTRAMPでssh先のファイルを編集している時はうまく動かないのである。

shell-commandはfile-name-handler-alistをチェックして現在対象のバッファのそこにヒットするなら、そこにあるhandler経由でshell-commandを実行する。grepとかはfindとかはリモートで実行しないとダメだから。

それはわかる、わかるが、でもwl-pasteがremoteが実行されても何も得られないのである。

問題に気付いてしまえば対策は簡単で↓とでもすればよい。

  (let ((default-directory (getenv "TEMP")))
    (shell-command-to-string "wl-paste -n | tr -d \r"))