web-dev-qa-db-ja.com

`xdotoolstype`はキャリッジリターンをマングルします

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

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

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

これは機能します...しかし、特定のアプリに対してのみです(そして悲しいことに、VNCはそれらの一部ではありません、残酷な世界です!)。

  • これを使用して、ローカルホストのviで実行されているxtermにテキストを貼り付けると、これは完全に機能します。ファイルのコンテンツは期待どおりに保持され、書き込まれます。これもgnome-terminalで問題なく機能しているようです。
  • vixfce4-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; }'

キャリッジリターンが「機能」するようになりました。この回避策はタブを壊してしまいますが、最終的なキャリッジリターンが常に必要になるとは限らないため、すべての場合で問題になります(たとえば、すぐに送信せずにWebフォームフィールドに入力する場合)。

this guy と同じ問題があると思いますが、残念ながらスレッドには説明がありません。

問題はどこにありますか?どうすればこれを機能させることができますか?または、何らかの理由でこれが不可能な場合、最初のニーズに対応する別の軽量代替手段はありますか?

2
WhiteWinterWolf

歴史的な理由から、改行を表す2つの文字があります。改行(通常はLF、\n\012、Ctrl + J、…として表されます)とキャリッジリターン(CR、\r)です。 、\015、Ctrl + M)。 Unixは行末記号としてLFを使用しますが、キーボードを押すとCRを送信します Return。一部のアプリケーションは Linefeed キー(PC市場向けに作られていないいくつかの珍しいキーボードに存在します)が、それはまれです。

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

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

回避策を機能させることもできます。 IFSを空の値に設定します。そうしないと、readが各行の先頭と末尾の空白を取り除きます(これがタブが消える理由です)。そして、送信しないでください Return 最後の行の後。 (これは、コマンド置換方法と厳密には同等ではありません。コマンド置換を使用すると、末尾の空の行がすべて削除されます。次の方法では、最後の改行が1つだけ無視されます。)

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で何も試したことがないので、マイレージは異なる場合があります。