`xdotools type`はキャリッジリターンを破壊します。

`xdotools type`はキャリッジリターンを破壊します。

コピーされたテキスト(スクリプトや構成ファイルなど)を、仮想ゲストやグラフィッククライアント(VNCなど)を実行するリモートセッションなど、あらゆる種類のアプリケーションに貼り付けることができる貼り付け機能を設定したいと思います。できません)。

これを達成するために、デスクトップマネージャのショートカットを次のコマンドに関連付けました。

sh -c 'sleep 1; xdotool type -- "$(xsel -bo)"'

これは機能しますが、特定のアプリケーションでのみ機能します(悲しいことに、VNCはアプリケーションの一部ではありません。残酷な世界です!)。

  • これを使用してlocalhostviの実行にテキストを貼り付けるとxterm完璧に動作します。ファイルの内容が期待どおりに保存され、作成されます。これはまたで完璧に動作するようですgnome-terminal
  • たとえば、localhostで実行され続けると、viすべてのキャリッジリターンが破損します。xfce4-terminal
  • 同様に、VNCを介して任意のアプリケーション(含む)にテキストを貼り付けようとすると、xtermテキストは正しく入力されますが、ここではすべて1行に表示されます。

奇妙なことは、次のコマンドを別のキーボードショートカットに追加することです。

sh -c 'sleep 1; xdotool key Return'

これにより、xdotoolすべてのアプリケーションにキャリッジリターン文字を入力できるため、技術的に可能です。

私はキャリッジリターンを強制する醜い解決策としてこれを構築しようとしました。

sh -c 'sleep 1; xsel -bo | { while read -r LINE; do xdotool type -- "$LINE"; xdotool key Return; done; }'

キャリッジリターンが「動作」しているので、この回避策はタブを破って常に最終キャリッジリターンを望んでいないので、すべての場合に気に入らないようになります。 。

私も同じ問題があるようです。この男しかし、残念ながらスレッドには説明がありません。

何が問題なの?どうすればいいですか?それとも何らかの理由で不可能であれば、他の方法はありませんか?初期要件に代わるものは何ですか?

ベストアンサー1

歴史的な理由で改行を表す2つの文字があります。つまり、改行文字(通常はLF、、、\nCtrl \012+ J、...と表示されます)とキャリッジリターン文字(CR、、、\rCtrl \015+ M)です。 UnixはLFを行終端として使用しますが、キーボードはを押すとCRを送信しますReturn。一部のアプリケーションでは、Linefeedキー(PC市場用に設計されていない一部のレアキーボードにあります)を認識できますが、これはまれです。

Linefeed実験的に、xdotoolは文字列に改行文字があるときにキーを送信します。一部のアプリがそれを認識しないという事実は驚くべきことではありません。Return改行をキャリッジリターンに置き換えて送信することができます。

sleep 1; xdotool type -- "$(xsel -bo | tr \\n \\r | sed s/\\r*\$//)"

解決策も効果があるかもしれません。IFSNULLに設定します。それ以外の場合は、read各行から前後のスペースが削除されます(タブが消えます)。そしてReturn最後の行以降は送らないでください。 (これはコマンド置換方法と厳密に同じではありません。コマンド置換を使用すると、すべての末尾の空白行が削除されます。次の方法では、最後の改行文字(存在する場合)のみが無視されます。

sleep 1
xsel -bo | {
  IFS= read -r LINE;
  xdotool type -- "$LINE";
  while IFS= read -r LINE; do
    xdotool key Return;
    xdotool type -- "$LINE";
  done;
}

注:VNCでは何も試していないため、状況が異なる場合があります。

おすすめ記事