
私はtmux 2.3を使用しており、システムクリップボードに貼り付けバッファを送信するコマンドを定義したいと思います。以下のコマンドと私が考えることができるすべてのバリエーションを試しましたが、実行しようとすると終了コード1を返したというメッセージが表示されます。 shでコマンドを実行すると正常に動作し、xclip部分を削除してもエラーは発生しません。エラーの原因をどのようにデバッグできますか?私は正しい命令を持っていると信じています。
bind-key b run-shell "tmux show-buffer | xclip -sel clip -i > /dev/null"
答え1
注:元の質問では
tmux
バージョン2.3に言及していましたが、これらすべてがそのバージョンと3.2aに適用されることを確認しました。
私にとっては、これは通常tmux
環境変数を設定せずにセッションを開始することによって発生します。DISPLAY
これはxclip
Xサーバーとの通信方法がわからないことを意味します。このAskUbuntuの答えはSSHに焦点を当てていますが、便利な段落が含まれています。:
X11転送が有効になっていることを確認するには、DISPLAY環境変数の値を確認してください
echo $DISPLAY
。localhost:10
[...]に似た値が表示されます。DISPLAY
設定しないと手動で設定することは役に立ちません [... ]
SSH以外のローカルセッションでは、次のようになりますtmux
。
$ echo "${DISPLAY:?}"
:0
次のような結果が出たら、DISPLAY
変数は設定されていません。
$ echo "${DISPLAY:?}"
sh: 1: DISPLAY: parameter null or not set
Xサーバーセッション内でセッションを開始する方法を理解するのが最善ですが、tmux
Xサーバーセッション内で端末を起動できる場合は、DISPLAY
変数が何であるかを確認し、セッションで一時的に設定してtmux
確認することが便利です。工場:
export DISPLAY=':0'
Ubuntu Community Wikiには、シェル変数の短いが詳細な紹介があります。(これは言及されていますが、ほとんどbash
の情報はPOSIX_compileと互換性がない、およびを除いてほとんどcsh
のtcsh
シェルに適用されます。)に注意してください。fish
DISPLAY
export VARIABLE_NAME=value
このStack Exchangeの質問には、環境変数を設定する方法の詳細な説明があります。
通常、ターミナルアプリケーションを起動し、ターミナルのシェルを使用してコマンドラインプログラムを実行して、Xサーバーセッションでコマンドラインプログラムを起動できます。
GNOMEでは、次のようになります。
- アカウントにログイン
- ターミナルスタート
tmux new-session
端末でコマンドとして実行(場合によってはすでに実行中のセッションに接続する場合もあります)
起動すると、tmux
シェルはDISPLAY
環境変数が設定された状態で起動してxclip
動作します。
$ xclip -verbose -out
Connecting to X server.
Using UTF8_STRING.
他のコンテンツが表示される場合があり、クリップボードにすでにコンテンツが含まれている場合は、そのコンテンツが端末に表示されます。実行する前に、一部のテキストをコピー、強調表示、または選択してください。
代わりに、次のように表示されます。
xclip: command not found
xclip
これは、インストールされていないか見つからないことを意味します。
機能している場合は、xclip
コマンドをキーバインディングとして設定できますtmux
(この実行はすでにセッション内にある場合にのみ機能できますtmux
)。
tmux bind-key -T prefix b run-shell "tmux show-buffer | xclip -se c -i > /dev/null"
Runは、
tmux list-keys | less
主キーバインディングと構成ファイルでこれを設定する構文を示しています。
prefix
テーブルにキーバインディングを明示的に追加しました。tmux
表のコマンド(またはキーボードショートカット)は、デフォルトで+または構文のCbである先行prefix
キーシーケンスを最初に押して実行されます。Ctrl+を押してから(Cb b)コマンドを実行する必要があります。プレフィックスキーの組み合わせを押す必要があることを示すために使用します。btmux
Ctrlbbprefix
エラーが発生しました。tmux
コンテンツコピーモードをオンにします'tmux show-buffer | xclip -se c -i > /dev/null' returned 1
。
実行するコマンドがrun-shell
stdoutに出力を印刷する場合は、tmux
現在のウィンドウでコピーモードをオンにしてその出力を表示します。シェルコマンドが失敗した場合、戻りコードまたは終了コードを説明する行も表示されます。prefixこれでデフォルトでは
qコピーモードが終了します。
tmux
多くのプログラムは 's を含む stdout ではなく stderr にエラーを出力するため、show-buffer
エラー情報が失われます。これをキャッチするには、シェルパイプを廃棄してシェルリダイレクトを変更できます。
$ tmux show-buffer
no buffers
$ echo $? # prints 1 if the previous command failed
1
$ tmux run-shell "tmux show-buffer"
'tmux show-buffer' returned 1
$ tmux run-shell "tmux show-buffer 2>&1"
no buffers
'tmux show-buffer 2>&1' returned 1
tmux
起動時にデフォルトではバッファがないため、このエラーメッセージが返されます。
バッファがある場合、次のコマンドはこれらのバッファとその内容を表示します(デフォルトではprefixthenにバインドされています=)。
tmux choose-buffer
バッファがない場合、このコマンドは出力なしですぐに返されます。バッファーがある場合は、choose-buffer
最後の使用時間に基づいてソートされたすべてのバッファーのリストが表示されます。を押すとリストがスクロールし、 を押すと↑選択したバッファの内容が現在のウィンドウに貼り付けられ、終了します。↓Enterq
バッファを生成するには、次のset-buffer
コマンドを使用します。
$ tmux set-buffer "test content"
$ tmux save-buffer - && echo
test content
注:
&& echo
バッファーの内容が改行文字で終わらないため必要です。
1つ以上のバッファの場合、このshow-buffer
コマンドは最後に設定されたバッファの内容を使用してコピーモードをオンにします。
上記のシェルセッションでは、save-buffer
コマンドは最後に設定されたバッファの内容をファイルに印刷するか、ファイル名が指定されている-
場合はstdoutに印刷します。
元の構成は次のようにする必要があります。*:
bind-key b run-shell "tmux save-buffer - | xclip -sel clip -i"
*tmux
システムクリップボードに何かをコピーしようとしているようです。
通常、tmux
まずコピーモードに入り、テキストを選択します。デフォルトではこれはprefixthenにバインドされます[。tmux
コピーモードでEmacsスタイルのキーバインディングを使用するデフォルト設定を使用します。バージョン2.3では、tmux
これらのキーバインディングを表示に使用できますtmux list-keys -temacs-copy
。バージョン2.3以降では、このlist-keys
コマンドはデフォルトですべてのテーブルのキーバインディングを表示します。
注:
vi
-styleキーバインディングは、または代わりにすべてのemacs-copy
コマンドと構成で置き換えることができます。vi-copy
copy-mode-vi
copy-mode
選択したテキストをシステムクリップボードとバッファにコピーできますtmux
。バージョン 2.3 では、tmux
次の方法でこれを実現できます。
bind-key -temacs-copy M-w copy-pipe "xclip -selection clipboard -in"
選択したテキストをバッファにコピーするだけでなく、選択したAltテキストをパイプするコピーモードのデフォルトの動作を上書きします。wxclip
tmux
バージョン 2.3 以降で同等の構成は次のとおりです。
bind-key -T copy-mode M-w send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -in"
どちらのバージョンでも、以下はXサーバークリップボードの内容でバッファを作成し、最新のバッファを貼り付けてデフォルトのprefix動作を置き換えます。]tmux
bind-key -T prefix ']' run-shell 'tmux set-buffer "$(xclip -selection clipboard -out)"' \; paste-buffer
気づくxclip
これにより、状況によっては奇妙に動作する可能性があります。
バージョン2.3は2016年にリリースされ、したがって、ほとんどのパッケージストアには最新バージョンが必要です。
どちらにしてもお勧めします。tmux-yank
これは、複製操作をうまく管理するためですtmux
。
誤った構成の原因をデバッグする場合は、tmux
通常、これをより簡単にするために実行できるいくつかの作業があります。
- セッション内端末でコマンドを実行
tmux
(可能な場合) - 一時構成ファイルの生成
- メッセージをより長く表示
セッション内端末でコマンドを実行tmux
(可能な場合)
tmux
設定ファイルに配置できるほとんどのコマンドは、単にコマンドラインの前に付けてセッション内で実行することもできます。ほとんどのシェルは特定の文字を具体的に解釈するので、コマンド文字を順番に実行するときにこれらの文字を引用することに注意してくださいtmux
。上記のコマンドはすべて、変更なしで設定ファイルにプレフィックスが付いていると機能します。[
]
;
&
"
'
tmux
tmux
tmux
たとえば、コピーモードでシェルセッションが利用できない場合、これらのコマンドを実行できない可能性があります。
可能であれば、これはコマンドの各部分で正確に何が起こっているのかを診断するのに役立ちます。
tmux
場合によっては、コマンドプロンプトからコマンドを実行できます(prefixデフォルト:)。構成ファイルと同様に、コマンドを入力して「実行」をEnterクリックします。
たとえば、コピーモードでをタップし、ステータスバーを内容とカーソルがある黄色にprefix変更します。このコマンドを入力してキーを押すと、ステータスバーの内容がに設定されます。終了するには、端末のBreakキーの組み合わせを押します(ほとんどの端末ではデフォルト値は+で、同様の内容が表示されることがあります)。::
display-message test
Entertest
Ctrlcstty -a
intr = ^C
注:これらのメッセージがステータスバーに表示される時間を増やすには、「メッセージ表示期間の延長」セクションを参照してください。
注:
tmux
2.4以降では、コマンドプロンプトからコピーモードコマンドを実行できますsend-keys -X begin-selection
。たとえば、2.4より前のバージョンでは、これを行う方法がわかりません。
一時構成ファイルの生成
デバッグを支援するために、次の名前のファイルに潜在的な設定変更を追加できますtmux_debug.conf
。
# -q: do not return an error if the file doesn't exist
source-file -q /etc/tmux.conf
source-file -q ~/.tmux.conf
# add any experimental configuration below here
そして、以下を実行してくださいtmux
:
tmux -f ./tmux_debug.conf
起動すると、デフォルトで2つtmux
の設定ファイルが読み込まれます。 このオプションはそれを無視してカスタムファイルをロードするように指示します。私たちはこれら2つの構成に依存する可能性があるため、存在する場合は構成を取得します。これにより、永続的な変更なしに現在の構成を維持できます。/etc/tmux.conf
~/.tmux.conf
-f
一時構成ファイルをすばやくリロードするためのキーバインディングを追加することもできます。
bind-key -T prefix C-r source-file ./tmux_debug.conf \; display-message "sourced configuration"
prefixこれによりキーシーケンスが設定され、Ctrl+が起動ディレクトリのファイルをr再ロードしてからステータスバーにテキストが表示されます。tmux
tmux_debug.conf
tmux
sourced configuration
tmux
メッセージをより長く表示
前のコマンドはステータスバーにメッセージを表示します。デフォルトでは、tmux
メッセージは750ミリ秒の間だけステータスバーに表示されるため、残念です。
設定ファイルに次の行を追加すると、キーが押されるまでテキストが表示されます。
set -g display-time 0
注:キーストロークは、フォーカスを取得したばかりのウィンドウまたはウィンドウで実行中のアイテムに送信されます。