web-dev-qa-db-ja.com

コンソールからコピーする場合の末尾のスペース

これは、私がときどき経験しているこの厄介な動作です。コンソールでマウスを使ってテキストを選択(つまり、コピー)すると、貼り付けて、各行の終わりに余分なスペースがあることに気付きます。あれは、

line 1                                                                          
line 2                                                                          

の代わりに

line 1
line 2

つまり、各行の終わりに1つのスペースだけではありません。

問題を確実に再現することができず、答えを見つけることができませんでした。一部のソフトウェアでは、それはしばらくしてから現れます。

しかし、私が気付いたのは、同じファイルをvimで、最初にコンソールから、次にtmuxから開くと、前者の場合にうまく機能することです。後者にはありません。コンソールのTERM=xterm-256colortmuxTERM=screen-256colorを考えると、これはターミナルが適切に実行していないか、アプリケーションが正しく実行できないことに関係していると推測されます。かなり漠然とした推測だと思います。それで、最初の質問は「それを正確に何が引き起こしているのですか?

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

vimからtmuxTERM=xterm-256color vimで実行すると、動作がおかしくなります。テキストがないところに背景を描かないように。そして、TERM変数を変更することは、私には大丈夫ではないようです(ソフトウェアに他の端末を処理していると思わせます)。

ローカルファイルを編集するときは、通常:!gedit %を使用します。

9
x-yuri

アプリケーションがその場所にスペースを表示した場合、端末から選択してコピーすると、行の終わりにスペースができます。アプリケーションは、以前にあったものを消去するためにスペースを表示する場合があります。端末には、行全体を削除するか、カーソルの右側の文字を削除するコマンドがあります。アプリケーションは、最も効率的であると見なされるものに基づいて、それとスペースの表示のどちらかを選択します。たとえば、プロンプトで何かを入力してからBackspaceキーを押すと、アプリケーション(シェルなど)が最後の文字をスペースで上書きする可能性があります。

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

実験的に、Vimはスペースで終わる行を表示しないように苦労しているようです(バッファーにスペースで終わる行が含まれている場合でも)。そのため、X11接続がない場合は、そこからコピーすることもできます。

別の方法は、コピー後に後処理することです。

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

これは実際にはいくつかの質問であり、答えはどれも興味深い部分をざっと見ているだけです。

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

ほとんどの端末(xtermなど)は、選択可能なデータを保存しますon画面。その背後には、アプリケーションが背景を塗りつぶすつもりであることを端末に伝える非表示の部分はありません。

アプリケーションは、カーソルを移動し、テキスト(実際のスペースが含まれる場合があります。または、端末がスペースとしてrendersとなっているタブ)を書き込み、画面の一部を消去することにより、画面を更新します。

多くの端末(xtermなど)が現在の色(背景色)で画面の消去された領域をfill//消去するため、消去は(選択/貼り付けの)特別な問題です。端末の説明にある消去(bce)機能)。ただし、同時に、消去された領域では、画面のこれらの位置に文字が保存されなくなります。画面表示を使用するターミナルでは、消去された領域を除くすべてを選択できます。 (特別なケースとして、端末couldは、テキストで囲まれた領域を消去しました。これは、選択用のスペースであるかのようです)。

これらはすべて厄介な問題であり、ずっと前にxtermは末尾のスペースを無視する機能を提供していました。他のほとんどの端末はそれを提供していません。また、これはオプションであるため、たまたまxtermを実行した場合はオンにならない可能性があります。 xtermの機能をコピーするほとんどの端末開発者は、オプションをコピーしません。

Tmuxに行く:それはbce機能をサポートしていません。その開発者たちはそうしないことに決めました。したがって、tmuxで実行されている通常のアプリケーションは、末尾の空白を生成します。端末の説明をオーバーライドすると、背景がクリアされるとvimが実際に想定していることがわからないため、tmuxが混乱しますsing現在の色。消去するだけです。色なし。

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

参考文献:

  • 背景色の消去をサポート(bce)[旧:Vimのコピーと末尾のスペースの貼り付けの問題]#109 (tmuxバグレポート)
  • 私の端末には色のないスペースが表示されます (ncurses FAQ)
  • 端末の問題 (このトピックに関する有用な議論)
  • highlightSelection (xtermマニュアル)
  • trimSelection (xtermマニュアル)

    HighlightSelectionを設定すると、末尾のスペースを含め、選択されたテキストを表示できます。画面(または線)をクリアすると、スペースを含まない状態にリセットされます。一部の行には、アプリケーションが画面に書き込むときに末尾のスペースが含まれる場合があります。ただし、末尾にスペースがある行を貼り付けたくない場合があります。このリソースがtrueの場合、xtermは選択されたテキストから末尾のスペースを削除します。行が折り返されるスペースには影響しません。また、選択範囲から末尾の改行を削除しません。デフォルトは「false」です。

  • パッチ#105-1999/6/5-XFree86 3.9Pp (xterm changelog)

    新しいリソースtrimSelectionを実装します。これにより、xtermは選択した行から末尾の空白を削除できます。これは強調表示には影響しません。

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

    このパッチは、私の長期的な不満の1つを修正します。xtermの選択では、何が選択されているかが明確に表示されません(Davidの要求によると、リソースによって制御され、デフォルトでは古い動作になります)。

3
Thomas Dickey

端末画面からのコピーと貼り付けは、元のソース素材の代わりに画面出力を処理するため、完全に信頼できるとは限りません。一部のアプリケーションが異常な方法で端末にテキストをエコーし​​、その結果、端末が元のテキストが何であるかを推測できない場合は、おそらくあなたや端末ができることはほとんどありません。

端末にレンダリングすると、元のテキストに関する多くの情報が失われる可能性があります。たとえば、空白の領域がタブによって生成されたか、一連のスペースによって生成されたか、または2行のテキストが元々1つの長いものであったかどうか折り返された行または2つの別々の行。

端末は、端末にエコーされた元のテキストをコピー&ペーストできるように最善を尽くしますが、常に認識できるとは限りません。

実験として、これを試してください:

  • lessを使用して、複数の端末回線にまたがる非常に長い行を含むファイルを表示します。
  • それらの行の1つをトリプルクリックします(select-whole-lineの場合)。 lessは、複数の物理行にまたがる論理行全体を選択し、他の場所に貼り付けた場合は、1つの長い行として保持されます。
  • 押す j その長い行のpartが画面の上部から消えるようにいくつかの行を追加します。
  • 押す k 論理行全体をスクロールして表示するために1回以上。
  • 論理行をもう一度トリプルクリックします。今回は1つの物理回線のみが選択されています。これは、lessが画面の物理行を物理行ごとに再描画し、端末が物理行が一緒に接続されたことを知る方法がなくなったためです。
  • 論理行全体を手動でドラッグして選択し、別の場所に貼り付けると、改行が埋め込まれていることがわかります。

あなたの端末(またはlessのバージョン)は私のものよりも多少賢いかもしれないので、その実験のYMMV。

一般的に、出力を生成したソフトウェアが奇妙であるほど、元の資料を正確にコピーして貼り付けることができる可能性が高くなります。cat(1つには)なるほど。(もちろん、「ダム」は褒め言葉だと理解しています!)

tmuxの下の行の終わりに余分なスペース文字が表示される場合、それはおそらくtmuxが実際にその文字をエコーし​​ているためです。 tmuxは独自の端末エミュレーションを実行し、新しい端末シーケンスを再発行して、基礎となる端末にレンダリングすることに注意してください。ある場合には、そこにあると思われる他の文字を上書きする必要があるかもしれないと考えているので、おそらくそれはその空白文字を反映しています。理由が何であれ、端末はおそらくスペース文字が元のコンテンツの一部ではないことを知る方法がありません。

2
Celada

最近の多くのターミナルアプリケーションでは、マウス/コピーオプションに「末尾のスペースをトリムする」などの設定があります。 Konsole(KDE)とYakuakeにあります。

2
Aram

Fedora 17 Linuxとkonsoleターミナルウィンドウを使用して、syntastic 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カーソル)をコピーする行から離してください。その場合、余分なスペースはその1行に表示されません。

これらの問題を引き起こしているのは、構文と色の強調表示アドオンだと思います。

1
Eric Leschinski

xterm-256colorは正しく動作するようになり(フルカラーで背景の描画の問題はありません)、BCE(背景色の消去)機能を備えています。これを~/.tmux.confに入れると、tmuxで有効にできます。

set -g default-terminal "xterm-256color"

0
user48052

私はxterm-256colorも使用しており、たとえば2つのリモートサーバー間でファイル全体をコピーする場合など、端末間でコピーするときは常に末尾のスペースが好きではありませんでした。私が最も簡単だと思うのは、ファイル全体をコピーしてから、宛先で実行することです。

:%s/\s\+$//g

これにより、ファイル全体からすべての末尾の空白が削除されます。それは速くて簡単です。

0
Kamil