Vimが貼り付けたコードを誤ってインデントするのはなぜですか?


100

Vimでこのスクリプトを貼り付けると:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

私はこれらの奇妙な結果を得る:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

ハッシュ記号(#)とタブが表示されています。どうして?


31
これはvi.stackexchange.comのより良い質問かもしれません
エリックRenouf

@EricRenoufなぜですか?(正直な質問)
Qix

3
私の考えは、これは* nixの上で使用される一般的なツールをどのようにvimの作品についての質問、あるだった@qixが、* nixのは、Vimを使用するための要件ではありません
エリックRenouf

1
@JaredBurrows私はそれがそれを願っていることを確認します
エリックRenouf

1
貼り付けはどのようにトリガーしますか?マウスで?
ベンフォークト

回答:


122

2つの理由があります。

vim自動インデントが有効なときに貼り付けるには、次のように入力して貼り付けモードに変更する必要があります。

:set paste

その後、挿入モードに変更してコードを貼り付けることができます。貼り付けが完了したら、次を入力します。

:set nopaste

貼り付けモードをオフにします。これは一般的で頻繁なアクションなので、vim貼り付けモードの切り替えを提供します。

set pastetoggle=<F2>

F2好きなキーに変更でき、貼り付けのオン/オフを簡単に切り替えることができます。


コメントの自動挿入をオフにするには、これらの行をvimrcに追加できます。

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimまた、システムクリップボードからテキストを貼り付けるための貼り付けレジスタも提供します。システムを使用する"*p"+p、システムに依存します。OSXやWindowsなど、X11のないシステムでは、*レジスタを使用する必要があります。LinuxなどのX11システムでは、両方を使用できます。

参考文献


2
私はずっとVimを使っていますが、これについては知りませんでした。どうもありがとう。
カハ

最新のグラフィカルターミナルエミュレータは、「ブラケットペーストモード」と呼ばれる機能をサポートしています。Vimはこのモードを有効にするよう端末に要求できます。このモードでは、貼り付けられたテキストが特定のエスケープシーケンスで囲まれます。Vimはこれを認識し、貼り付けの間は折り返し/インデントをオフにすることができます。長い話:貼り付けは「期待どおりに機能します」。私はvimユーザーではありませんが、簡単なウェブ検索でこのモードの設定方法を確認できます。
エグモント

2
@MichaelDurrant set pasteは決してvimrcに入れないでください。挿入モードマッピング、コマンドラインマッピング、略語、textwidth、wrapmargin、autoindent、smartindent、softtabstop、formatoptions、indentexpr、その他いくつかを含む、多くのものを無効またはリセットします。:h pasteリスト全体があります。ほとんどの人は、これらの一部またはすべてを使用し、なぜ設定が無視されるのか疑問に思います。
FDinoff

4
私は通常、:r!cat逐語的に貼り付けるために使用します。
サイモンリヒター

1
set mouseマウスクリックで貼り付けたときに自動的に貼り付けモードを開始および終了できる、との相互作用について説明する価値があります。
ベンフォークト

36

vimペーストを使用します。クリップボードバッファにあるものを貼り付けたい "+p

これによりが選択さ+れ、所定の位置に貼り付けられます。

Linuxを使用している場合*は、X /中クリックバッファー(最後に選択したテキスト)です。

そして、vimはそれがペーストであることを知っています。

それ以外の場合、vimは貼り付けられたキーを入力したと判断し、(コピーしたインデントの上に)貼り付けの最後まで独自の自動インデントを実行します。

これがSSHで動作するための注意として、共有するクリップボードのオプションを設定する必要があります -Y

詳細man sshを参照してください。


4
これは実際には正解の私見
クリストファーサルストーガード

これは、グラフィカルvim(gvim)でのみ機能するようです。ターミナルエミュレーターで実行されているvimは、最後に削除されたテキストを、現在の選択ではなく「* p」で貼り付けます。
wurtel15年

gvimは使用せず、ターミナルvimのみを使用します。あなたのマウスの設定は何ですか?私のマウス設定はcです。マウスの選択が許可されている場合の動作がわかりません。set mouse?
-exussum

2
またvim --version、クリップボードのサポート付きでコンパイルされたかどうかを確認+xterm_clipboardして、出力に含める必要があります
-exussum

@wurtel:クリップボードにunnamed文字列を設定したのかもしれません。
クオンルム

8

自動インデントがオンになっているため、タブが挿入されました:set noai。ターミナルに貼り付ける前に自動インデント()をオフにすることで、この動作を無効にできます。

コメント行は自動コメントによって生成され、オフにすることで無効にできます。

これらの代わりに、トグルを使用して目的の動作を取得し、:set pasteフォーマットされたコードを貼り付けて、:set nopaste通常の動作を復元する必要があります 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.