Tmux run-shell xclipが機能しない

Tmux run-shell xclipが機能しない

私は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これはxclipXサーバーとの通信方法がわからないことを意味します。このAskUbuntuの答えはSSHに焦点を当てていますが、便利な段落が含まれています。:

X11転送が有効になっていることを確認するには、DISPLAY環境変数の値を確認してくださいecho $DISPLAYlocalhost:10[...]に似た値が表示されます。DISPLAY設定しないと手動で設定することは役に立ちません [... ]

SSH以外のローカルセッションでは、次のようになりますtmux

$ echo "${DISPLAY:?}"
:0

次のような結果が出たら、DISPLAY変数は設定されていません。

$ echo "${DISPLAY:?}"
sh: 1: DISPLAY: parameter null or not set

Xサーバーセッション内でセッションを開始する方法を理解するのが最善ですが、tmuxXサーバーセッション内で端末を起動できる場合は、DISPLAY変数が何であるかを確認し、セッションで一時的に設定してtmux確認することが便利です。工場:

export DISPLAY=':0'

Ubuntu Community Wikiには、シェル変数の短いが詳細な紹介があります。(これは言及されていますが、ほとんどbashの情報はPOSIX_compileと互換性がない、およびを除いてほとんどcshtcshシェルに適用されます。)に注意してください。fishDISPLAYexport VARIABLE_NAME=valueこのStack Exchangeの質問には、環境変数を設定する方法の詳細な説明があります。

通常、ターミナルアプリケーションを起動し、ターミナルのシェルを使用してコマンドラインプログラムを実行して、Xサーバーセッションでコマンドラインプログラムを起動できます。

GNOMEでは、次のようになります。

  1. アカウントにログイン
  2. ターミナルスタート
  3. 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)コマンドを実行する必要があります。プレフィックスキーの組み合わせを押す必要があることを示すために使用します。btmuxCtrlbbprefix

エラーが発生しました。tmuxコンテンツコピーモードをオンにします'tmux show-buffer | xclip -se c -i > /dev/null' returned 1

実行するコマンドがrun-shellstdoutに出力を印刷する場合は、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-copycopy-mode-vicopy-mode

選択したテキストをシステムクリップボードとバッファにコピーできますtmux 。バージョン 2.3 では、tmux次の方法でこれを実現できます。

bind-key -temacs-copy M-w copy-pipe "xclip -selection clipboard -in"

選択したテキストをバッファにコピーするだけでなく、選択したAltテキストをパイプするコピーモードのデフォルトの動作を上書きします。wxcliptmux

バージョン 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。上記のコマンドはすべて、変更なしで設定ファイルにプレフィックスが付いていると機能します。[ ] ; & " 'tmuxtmuxtmux

たとえば、コピーモードでシェルセッションが利用できない場合、これらのコマンドを実行できない可能性があります。

可能であれば、これはコマンドの各部分で正確に何が起こっているのかを診断するのに役立ちます。

tmux場合によっては、コマンドプロンプトからコマンドを実行できます(prefixデフォルト:)。構成ファイルと同様に、コマンドを入力して「実行」をEnterクリックします。

たとえば、コピーモードでをタップし、ステータスバーを内容とカーソルがある黄色にprefix変更します。このコマンドを入力してキーを押すと、ステータスバーの内容がに設定されます。終了するには、端末のBreakキーの組み合わせを押します(ほとんどの端末ではデフォルト値は+で、同様の内容が表示されることがあります)。::display-message testEntertestCtrlcstty -aintr = ^C

注:これらのメッセージがステータスバーに表示される時間を増やすには、「メッセージ表示期間の延長」セクションを参照してください。

注:tmux2.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再ロードしてからステータスバーにテキストが表示されます。tmuxtmux_debug.conftmuxsourced configurationtmux

メッセージをより長く表示

前のコマンドはステータスバーにメッセージを表示します。デフォルトでは、tmux メッセージは750ミリ秒の間だけステータスバーに表示されるため、残念です。

設定ファイルに次の行を追加すると、キーが押されるまでテキストが表示されます。

set -g display-time 0

注:キーストロークは、フォーカスを取得したばかりのウィンドウまたはウィンドウで実行中のアイテムに送信されます。

おすすめ記事