rcmdnk's blog
Last update

一行恐怖

GNU screenではコピーモード時にYを押すと一行だけコピーして コピーモードを終了してくれるのですが、 tmuxではそのようなコマンドが無いの出来るだけ簡単にコピーできる様に キーバインドを設定してみました。

コピーモード時のキーバインドの制限

tmuxでのコピーモード時のキーバインドは、bind-key設定で -t vi-copy(emacsモードを使ってるなら-t emacs-copy)を渡した上で設定を行います 1

これが通常のキーバインドと同じような使い方ですが、 通常の-t無しの場合と違い、複数のコマンドを\;で繋げる事は出来ません。

linux - tmux combine multiple commands to one vi-copy command or tmux command to yank a line - Super User

複数コマンドが使えればワンキーで簡単に出来る事が増えるので、 tmuxに是非改善して欲しい点。

設定

tmuxのコピーモードには

  • 0(start-of-line:行頭へジャンプ)
  • D(copy-end-of-line:現在のカーソル位置から行末までをコピーして終了)

と言うショートカット(コマンド)があります。

なので0 Dと打てば一行コピーできるのですが、 これだと結構面倒なので

bind-key -t vi-copy a start-of-line
bind-key -t vi-copy s copy-end-of-line

としておいてa sでラインコピー出来る様にしました。 (これらのキーはデフォルトではコピーモード時には割り当てがありません。)

これらのキーバインドはman tmuxで見ると直接コマンド名が載ってませんが、 WINDOWS AND PANESの項目にあるFunction名を全て小文字にした上での チェインケース(-(ハイフン)で繋げる)になってる様です。

1つ注意が必要なのは、GNU screenの場合はラインコピーすると 最後に改行が入りませんが、 tmuxの場合だと最後に改行が入ってしまうみたいです。

なので、適当なコマンド行を取ってきて、取り敢えずペーストしてから 編集、みたいなことをしようとするとコピーした瞬間に実行されてしまいます。

コレを回避するためには更に行末まで行った後に一文字左に戻って。。。 みたいなことをしないと行けませんが、 上に書いたとおり各コマンドに対して1つのキーが必要なので現実的ではありません。

コピーはtmux/screenを使う上での重要な要素で、 その中でも一行だけコピーするような事は結構あると思うのですが、 ちょっと使いづらい。。。

tmuxの問題点としてコピーモード時に何故か上下移動すると必ず 行末へ移動してしまう、と言う点があります。 これが無ければ、移動するときに左の方へ寄っていて、 たどり着いたらDだけでコピー、とか出来るのですが、 必ず末尾に居るのでそこが面倒なポイントでもあります。

追記: 2015/01/08

@syui__さんに教えてもらいましたが、tmuxのコマンドでsend-keysというコマンドがあって、 これは任意のキー入力をtmux側に送ることが出来るコマンドです。

コピーモード時にも通常のPrefix-のキー入力が使えるので (そう言えばscreenでもコピーモード中でもWindowの切替とか出来ますね)、 これを使って

bind-key Y run "tmux send-keys V Left Enter"

と設定してあげると、コピーモード中にPrefix-Y で現在居る行を最後の改行無しでコピーできる様になります。

send-keyskey-bind等と同様キー入力に直接係るコマンドなので、 直接bind-key Y send-keys..とか書いても上手く動いてくれないので run-shellコマンドを使ってtmuxを呼ぶ必要があります。

追記ここまで

Sponsored Links
Sponsored Links

« tmux/GNU ScreenでC-hにキーバインドする tmuxとscreenのそれぞれの優れてる点 »

}