LoginSignup
5

tmuxのコピペとクリップボード

Last updated at Posted at 2023-05-28

はじめに

古い macbook に Linux Mint 21 をインストールして復活させました。普段は仕事で macOS を使っているので、Linux Mint に行ったりきたりしやすいように工夫を試みています。その一環として可能な限り OS を問わずに共通の設定で neovimtmux を使えるように取り組んでいます。今回は、「tmux の コピペ と クリップボード」について調べてわかったことをメモします。

世の中にはいろんな OS が存在しますが、ここでは macOS と Linux Mint しか登場しません。Linux Mint の中身は Ubuntu らしいので、Linux Mint は 多分 Ubuntu と読み替えてもいいと思います。

linux_mint_on_mac

クリップボード

クリップボード(英: clipboard)は、コンピュータ上で、一時的にデータを保存できる共有のメモリ領域のことである。複数の異なるプログラムからアクセス可能であり、単一のアプリケーションだけでなく異なったアプリケーション間のデータの受け渡しにも使用される。

日頃何も考えずに使っているクリップボードですが、実はこれはクリップボードを操作するためのプログラムとアプリとがうまく連携していないとスムーズなコピペができないようです。

コピペのショートカット

キーボードでコピペする技です。macOS でも Linux Mint でもアルファベットのキーは同じですが、一緒に押すキーが異なります。キーを変更することもできるのでしょうが、慣れた方が早い気がします。

macOS

やりたいこと ショートカット
切取 + X
複写 + C
貼付 + V

Linux Mint

Linux Mintターミナルでは Shift を押さないといけないので要注意。最初は戸惑いますが、慣れれば大丈夫。郷に入れば郷に従います。

やりたいこと ショートカット
切取 Ctrl + X
複写 Ctrl + C
貼付 Ctrl + V
ターミナルで 切取 Ctrl + Shift + X
ターミナルで 複写 Ctrl + Shift + C
ターミナルで 貼付 Ctrl + Shift + V

コピペのコマンド

プログラムからクリップボードを操作するためのコマンドが存在します。いい感じにまとまっている記事がありました。ありがとうございます。OS によって使用可能なプログラムが異なります。

macOS

macOS では コマンドが備えついているので特に悩むことはありません。

コマンド 機能
pbcopy 標準出力を受け取ってクリップボードにコピー
pbpaste クリップボードのデータをターミナルに出力
echo "闘魂" | pbcopy

pbpaste

Linux Mint

Linux Mint にはクリップボードを操作するコマンドを自分でインストールする必要があります。また、いくつか選択肢があります。中でも xselxclip がよく利用されている様子です。ネット検索をしていて、「両方入れた方がいいよ!」との話があったので、深く考えず両方インストールしました。アプリにより、相性があるのではないかと想像しています。

sudo apt install xclip xsel

両方とも機能は似ています。

コピー先

ここで注意が必要なのがコピー先です。macOS のコマンドと異なり3種類あるので、クリップボードを操作するときにはコピー先がクリップボードと明示しておかないとどこにコピーしたのかわからなくなります。省略できるオプションもありますが、後々わかりやすいように明示しておくのが得策かもしれません。

  • clipboard
  • primary
  • secondary

xsel でコピペ

echo "闘魂" | xsel --clipboard --input

xsel --clipboard --output

詳しくはドキュメントをご参照ください。

man xsel

xclip でコピペ

echo "闘魂" | xclip -selection clipboard -in

xclip -selection clipboard -out

詳しくはドキュメントをご参照ください。

man xclip

neovim でクリップボードにヤンク(コピー)

vim 用語で copy のことを yank と言います。neovim でコピペするためにはいくつか条件を満たす必要があるようです。以下の記事にヒントがあります。

                                  *clipboard-tool*
The presence of a working clipboard tool implicitly enables the '+' and '*'
registers. Nvim looks for these clipboard tools, in order of priority:

  - |g:clipboard|
  - pbcopy, pbpaste (macOS)
  - wl-copy, wl-paste (if $WAYLAND_DISPLAY is set)
  - xclip (if $DISPLAY is set)
  - xsel (if $DISPLAY is set)
  - lemonade (for SSH) https://github.com/pocke/lemonade
  - doitclient (for SSH) http://www.chiark.greenend.org.uk/~sgtatham/doit/
  - win32yank (Windows)
  - tmux (if $TMUX is set)

neovim はリストの上から順にクリップボード用のプログラムを探すようです。環境変数に依存する部分があるのでそこも注意が必要です。

tmux のコピーモード

tmux にはターミナル内で vim 風の操作をできるようにするコピーモードがあります。コピペできるだけでなくターミナル内を高速に移動できるようになり便利です。

しかしながら、クリップボードとの連携に若干の癖がありました。しっかり準備をしないとイゴきません。

いくつか参考になる記事がありましたが、当時の tmux から設定方法が一部変わっているので注意が必要です。アイデアをありがたく頂きつつ、最後は原典に当たるのが一番です。

man tmux

現時点(2023 年 5 月)で最新は tmux 3.3a です。tmux 3.2 から copy-command オプションが導入されました。他にも書き方が変わっている部分がいくつかあります。

色々試行錯誤した結果、~/tmux.conf の設定は以下の通りに落ち着きました。関連する部分を抜粋します。Linux Mint と macOS とでクリップボードのコマンドが違うので、条件分岐します。OS の種類の確認が厳密ではありませんが、自分用の設定なので問題ありません。

Linux 用クリップボードのプログラムとして xsel を使います。xclip より xsel の方が tmux との相性がいいようです。もちろん xsel コマンドがインストールされていることが前提です。

set-clipboardcopy-pipe が競合する場合があるそうです。ドキュメントの指示に従い set-clipboard を無効にします。

tmux のコピーモードの mode-keysemacsvi か選択できます。ここでは vi を使います。

コピーモード(vi)の初期設定ではコピーは Enter キーで実行するようになっています。Vimmer にとっては y でヤンクする方が自然なのでそれができるようにカスタマイズします。

tmux.conf
# マウス有効化
set -g mouse on

# コピーモード(vi)を有効化
set-window-option -g mode-keys vi

# OS が Linux の時は xsel を使う
if-shell -b '[ "$(uname)" = "Linux" ]' {
  set -s copy-command "xsel --clipboard --input"
  display "using xsel as copy-command"
}

# OS が Darwin の時は pbcopy を使う
if-shell -b '[ "$(uname)" = "Darwin" ]' {
  set -s copy-command "pbcopy"
  display "using pbcopy as copy-command"
}

# copy-pipe と競合する場合があるので無効化
set -s set-clipboard off

# コピーモード中に Vim 風に v で選択範囲を定める
bind -Tcopy-mode-vi v send -X begin-selection

# コピーモード中に Vim 風に y で選択範囲をヤンクしてコピーモードを終了する
bind -Tcopy-mode-vi y send -X copy-pipe-and-cancel

# マウスをドラッグして選択範囲を定め、それをヤンクしてコピーモードを終了する
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel

copy-command などの tmux の設定値を確認したい時は tmux show が便利です。

tmux show copy-command

コピーモードのショートカットの初期設定は man tmux を打てば出てきます。

The following commands are supported in copy mode:

           Command                                      vi              emacs
           append-selection
           append-selection-and-cancel                  A
           back-to-indentation                          ^               M-m
           begin-selection                              Space           C-Space
           bottom-line                                  L
           cancel                                       q               Escape
           clear-selection                              Escape          C-g
           copy-end-of-line [<prefix>]
           copy-end-of-line-and-cancel [<prefix>]
           copy-pipe-end-of-line [<command>] [<prefix>]
           copy-pipe-end-of-line-and-cancel [<command>] [<prefix>]
                                                        D               C-k
           copy-line [<prefix>]
           copy-line-and-cancel [<prefix>]
           copy-pipe-line [<command>] [<prefix>]
           copy-pipe-line-and-cancel [<command>] [<prefix>]

           copy-pipe [<command>] [<prefix>]
           copy-pipe-no-clear [<command>] [<prefix>]
           copy-pipe-and-cancel [<command>] [<prefix>]
           copy-selection [<prefix>]
           copy-selection-no-clear [<prefix>]
           copy-selection-and-cancel [<prefix>]         Enter           M-w
           cursor-down                                  j               Down
           cursor-down-and-cancel
           cursor-left                                  h               Left
           cursor-right                                 l               Right
           cursor-up                                    k               Up
           end-of-line                                  $               C-e
           goto-line <line>                             :               g
           halfpage-down                                C-d             M-Down
           halfpage-down-and-cancel
           halfpage-up                                  C-u             M-Up
           history-bottom                               G               M->
           history-top                                  g               M-<
           jump-again                                   ;               ;
           jump-backward <to>                           F               F
           jump-forward <to>                            f               f
           jump-reverse                                 ,               ,
           jump-to-backward <to>                        T
           jump-to-forward <to>                         t
           jump-to-mark                                 M-x             M-x
           middle-line                                  M               M-r
           next-matching-bracket                        %               M-C-f
           next-paragraph                               }               M-}
           next-space                                   W
           next-space-end                               E
           next-word                                    w
           next-word-end                                e               M-f
           other-end                                    o
           page-down                                    C-f             PageDown
           page-down-and-cancel
           page-up                                      C-b             PageUp
           pipe [<command>] [<prefix>]
           pipe-no-clear [<command>] [<prefix>]
           pipe-and-cancel [<command>] [<prefix>]
           previous-matching-bracket                                    M-C-b
           previous-paragraph                           {               M-{
           previous-space                               B
           previous-word                                b               M-b
           rectangle-on
           rectangle-off
           rectangle-toggle                             v               R
           refresh-from-pane                            r               r
           scroll-down                                  C-e             C-Down
           scroll-down-and-cancel
           scroll-up                                    C-y             C-Up
           search-again                                 n               n
           search-backward <for>                        ?
           search-backward-incremental <for>                            C-r
           search-backward-text <for>
           search-forward <for>                         /
           search-forward-incremental <for>                             C-s
           search-forward-text <for>
           search-reverse                               N               N
           select-line                                  V
           select-word
           set-mark                                     X               X
           start-of-line                                0               C-a
           stop-selection
           toggle-position                              P               P
           top-line                                     H               M-R

さいごに

最終的にコンパクトにまとまって満足しています。Linux Mint がどんどん好きになってきました。

モクモク會

本記事は以下のモクモク會での成果です。みなさんから刺激と元氣をいただき、ありがとうございました。

もしご興味のある方はお氣輕にご參加ください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5