コンソールからコピーするときの末尾のスペース

コンソールからコピーするときの末尾のスペース

私が時々経験する迷惑な動作は次のとおりです。コンソールでマウスでテキストを選択(コピーなど)して貼り付けると、各行の末尾に余分なスペースが表示されます。それは、

line 1                                                                          
line 2                                                                          

変える

line 1
line 2

したがって、各行の末尾には空白だけがあるわけではありません。

問題を確実に再現できず、回答が見つかりません。私はいくつかのソフトウェアでは、しばらくしてから明らかになると信じています。

しかし、ちょうど同じファイルをから開くと、vim最初はコンソールで開き、次にはで開くと前者tmuxの場合は正しく動作することがわかりました。後者はそうではありません。TERM=xterm-256colorコンソールとTERM=screen-256colorそれを考慮すると、tmux端末がこの操作を正しく実行していないか、アプリケーションが正しく実行できないことに関連しているようです。私はこれがやや曖昧な推測だと思います。それで、最初の質問は「この問題の原因は正確に何ですか?」です。

もう一つの質問は「どうすればいいですか?」です。最悪のシナリオは、ファイルがリモートにあるということです。私はそれをローカルにコピーしてから最新のものに開いたgedit。これで、新しいコンソールで開き(主にtmuxセッションで作業するため)、そこからコピーするオプションが必要です。これをもっと簡単にできますか?

私が逃げたらvim変にtmux行動TERM=xterm-256color vimします。テキストがなければ、背景が描かれていないようです。私にとっては、変数を変更するのは適切ではないようですTERM(ソフトウェアが他の端末を扱っていると思うようにします)。

私は通常ローカルファイルを編集するときにこれを行います:!gedit %

答え1

アプリケーションがそこにスペースを表示している場合は、ターミナルで選択してコピーすると、行の末尾にスペースが表示されます。アプリケーションは、古いコンテンツを削除するためにスペースを表示できます。端末には行全体を削除するか、カーソルの右側にある文字を削除するコマンドがあります。アプリケーションは、最も効率的であると考えているものに基づいて、表示スペースと表示スペースの中から選択します。たとえば、プロンプトで何かを入力してバックスペースキーを押すと、アプリケーション(シェルなど)が最後の文字を空白で上書きできます。

X11接続がある場合は、ファイルを使用するxselか、ローカルクリップボードにコピーできます。xclip

実験的に、Vimは(バッファに空白で終わる行があっても)空白で終わる行を表示しないように努力しているようです。したがって、X11接続がない場合は、X11接続からコピーすることを選択できます。

もう1つの方法は、コピー後に後処理することです。

xsel | sed 's/  *$//' | xsel

答え2

これは実際にはいくつかの質問であり、答えの中で興味深い部分をスキップする答えはありません。

  • コンソールでマウスでテキストを選択(コピーなど)して貼り付けると、各行の末尾に余分なスペースがあることがわかります。
  • TERM = xterm-256color vimを使用してtmuxでvimを実行すると、奇妙に動作します。

xtermなどのほとんどの端末は、選択可能なデータを保存します。存在する画面。後ろに隠された部分がない場合は、アプリが背景を埋めるように意図されていることを端末に通知します。

アプリケーションはカーソルを移動し、テキスト(ターミナルに表示される実際のスペースやタブを含めることができます)を作成して画面を更新します。表現スペースで)画面の一部を消去します。

多くの端末(xtermなど)が削除を実行するため、削除は選択/貼り付けの特定の問題です。いっぱい画面の消去部分を現在の色で(端末の説明の背景色を消去する(bce)機能)が、同時に消去された領域はもはや画面上のその位置に文字を保存しません。端末の画面表現を使用すると、消去された領域を除くすべてを選択できます。 (特別なケースでは、あなたの端末はできる選択可能なスペースのように見えるテキストで囲まれた領域を削除しました。

これらすべては頭が痛いことです。 xterm は長い間、末尾の空白を無視する機能を提供しました。他のほとんどの端末はこの機能を提供しません。オプションなので、xtermを実行している場合はオンにならない可能性があります。 xterm機能をコピーするほとんどの端末開発者はオプションをコピーしません。

tmuxに移動します。 bce 機能をサポートしていません。開発者はこれをしないことにしました。したがって、tmux で実行される汎用アプリケーションは末尾の空白を生成します。端末の説明を無視すると、vimは背景が消去されると仮定することを知らないため、tmuxを混乱させます。使用現在の色。削除してください。色がありません。

一方、GNU画面開発者はしばらく前にこの機能をサポートすることにしました。これはオプションです...

追加資料:

  • 背景色の削除のサポート(bce)(tmuxエラー報告)
  • 私の端末に着色されていないスペースが表示されます。(ncurses FAQ)
  • 端末の問題(このトピックに関する有用な議論)
  • highlightSelection(xterm マニュアル)
  • trimSelection(xterm マニュアル)

    ハイライト選択を設定すると、末尾のスペースを含む選択したテキストを表示できます。画面(または行)を消去すると、空白のない状態にリセットされます。アプリケーションが画面に特定の行を書き込む場合、一部の行には末尾のスペースを含めることができます。ただし、後ろにスペースがある行を貼り付けたくない場合があります。このリソースが true の場合、xterm は選択したテキストから末尾のスペースを削除します。改行を引き起こすスペースには影響を与えず、選択項目の末尾の改行を切り捨てることもありません。デフォルトは「False」です。

  • パッチ #105 - 1999/6/5 - XFree86 3.9Pp(xterm 変更ログ)

    新しいリソースの実装trimSelection, xterm が選択した行の末尾のスペースを切り捨てることができます。これは強調表示には影響しません。

  • パッチ #27 - 1996/8/21 - XFree86 3.1.2Ek(xterm 変更ログはhighlightSelection)

    このパッチは私の長い苦情の1つを解決します。 xtermの選択は選択された項目を明確に表示しません(Davidの要求に応じてリソースが制御され、デフォルトは以前の動作に設定されます)。

答え3

端末画面からコピーして貼り付けることは、元のソース素材ではなく画面出力を扱うため、決して完全に信頼できません。一部のアプリケーションが端末が元のテキストが何であるかを推測できないようにするための異常な方法でテキストを端末にエコーする場合、ユーザーや端末がこれを行うことができることはおそらくありません。

元のテキストが端末にレンダリングされると、元のテキストに関する多くの情報が失われる可能性があります。たとえば、スペースがタブ文字または一連のスペースで作成されたか、2行のテキストが元の1行であったかなどです。 1行または2つの別々の行で囲まれたテキスト。

端末は、端末にエコーされた元のテキストをコピーして貼り付けることができるように最善を尽くしますが、常にわかりません。

実験的に以下を試してください。

  • less複数の端末行にまたがる非常に長い行を含むファイルを表示するのに役立ちます。
  • 行のいずれかを3回クリックします(すべての行を選択)。less複数の物理行にまたがる論理行全体を選択し、別の場所に貼り付けると、1つの長い行になります。
  • j数行だけ部分その長い行の一部が画面の上部から消えました。
  • 1回または複数回押すと、論理行k全体が再びビューにスクロールされます。
  • 論理行をもう一度クリックします。今回は物理的なラインだけが選択されました。これはless、画面の物理線が1つずつ再描画され、端末は、もはや物理線が互いに接続されていることがわからないからである。
  • これで、論理行全体を手動でドラッグして別の場所に貼り付けると、改行が含まれていることがわかります。

あなたの端末(またはそのバージョンless)が私よりもやや賢くなる可能性があるため、YMMVはこの実験に反対の表を投げました。

一般に、出力を生成するソフトウェアが愚かなほど、元の素材を正確にコピーして貼り付ける可能性が高くなります。 cat一方ではほとんど愚かです。(もちろん、あなたは「愚かな」が賞賛であることを理解しています!)

下の行の最後に余分な空白文字が表示されると、その文字が実際にエコーされているtmux可能性があります。独自の端末エミュレーションを実行してから、新しい端末シーケンスを再発行して基本端末にレンダリングすることにtmux注意してください。tmux場合によっては、存在する可能性があると思われる他の文字を上書きする必要があるかもしれないと思うので、その空白文字を反映することができます。何らかの理由で、端末は、空白文字が実際に元のコンテンツの一部ではないことを知らないかもしれません。

答え4

Fedora 17 Linuxおよびkonsoleターミナルウィンドウを使用して構文vimプラグインを使用してvimを開き、このエラーを一貫して再現できました。次の3行のPythonコードをvimに入れました。

a = "generic assignment"
b = "cursor is on this line"
c = "generic assignment"

その後、視覚的に行を選択してここに貼り付けました。

a = "generic assignment"
b = "cursor is on this line"                                                                                     
c = "generic assignment"

2行目でスペースがどのように複製されるかを確認してください。これは迷惑な仕事であるにちがいない。

1行と3行は期待どおりにコピーされますが、2行目は端末ウィンドウの一番右にスペースをコピーします。

解決策:

マウスで選択する前に、強調表示された行(vimカーソル)をコピーしたい行から離してください。これにより、この行に余分なスペースが表示されません。

私の考えでは、構文と色の強調プラグインがこれらの問題を引き起こしているようです。

関連情報