文章

tmux,emacs和剪切板

因为开发环境很多时候都是在服务器上,即便在本地搭建,也虚拟机,这也相当于是远程环境。虽然本地emacs也可以访问远程文件,不过我比较习惯在服务器上安装emacs,然后ssh登陆上去在TUI下用。然后再开一个tmux保持会话。

有时候需要在emacs中copy一些内容到本地,比如一段警告需要搜一下。或者一段日志之类。这时候这段内容就需要一个穿越过程:emacs到tmux到ssh到本地终端到本地剪切板。配置起来其实很简单,但配置之前却找了半天…

emacs上需要安装这个插件:

1
2
3
4
(use-package clipetty
  :ensure t
  :hook (after-init . global-clipetty-mode)
  )

同时tmux中需要配合的配置如下:

set -s set-clipboard on
set -ag update-environment "SSH_TTY"

当然tmux最好也打开鼠标支持,这样就可以用鼠标选择文本:

set -g mouse on

最后终端的term也需要支持,windows terminal和iterm2没有问题。

至此,当你在macos中通过iterm2 ssh到一台linux服务器上,打开了一个tmux会话,并在这个会话中运行emacs,在emacs中选择了一段文本。你可以粘贴到本地macos的应用中了。

如果在macos的本地也在tmux中开emacs使用,以上的配置会遇到问题。解决办法如下:

  • 安装reattach-to-user-namespace

    brew install reattach-to-user-namespace

  • 为emacs增加一段配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    (when (eq system-type 'darwin) 
    (defun copy-from-osx ()
      "Use OSX clipboard to paste."
      (shell-command-to-string "reattach-to-user-namespace pbpaste"))
    
    (defun paste-to-osx (text &optional push)
      "Add kill ring entries (TEXT) to OSX clipboard.  PUSH."
      (let ((process-connection-type nil))
        (let ((proc (start-process "pbcopy" "*Messages*" "reattach-to-user-namespace" "pbcopy")))
      (process-send-string proc text)
      (process-send-eof proc))))
    
    (setq interprogram-cut-function 'paste-to-osx)
    (setq interprogram-paste-function 'copy-from-osx))
    

这样,在macos本地的效果就和远程方式一样了。

参考:

clipetty tmux wiki

本文由作者按照 CC BY 4.0 进行授权