テキストをvimに貼り付けるときの自動インデントをオフにする


1186

私はVimを学ぶために努力しています。

クリップボードからドキュメントにコードを貼り付けると、新しい各行の先頭に余分なスペースができます。

line
  line
    line

自動インデントをオフにできることはわかっていますが、他のいくつかの設定が競合しているため、動作しません。

コードを貼り付けるときに自動インデントをオフにするにはどうすればよいですか?これが私の.vimrcファイルです:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  

4
FWIW、vim 8.0.210では、括弧で囲まれた貼り付けのネイティブサポートが追加されているため、貼り付けられたテキストがインデントされることはありません
sh1 2017年

Vimのペーストをいじる避けるために、新しいファイルについては/あなたが行うことができますnopaste cat > mynewfile.txtキーを押してください、あなたのテキストを貼り付け、Enterキーを押して入力し、再び、その後、センター+ Dを保存します。これでファイルが作成され、で編集できますvim mynewfile.txt
ccpizza

回答:


2065

更新:ここでより良い答え:https : //stackoverflow.com/a/38258720/62202

コードを貼り付けるときに自動インデントをオフにするために、特別な「貼り付け」モードがあります。

タイプ

:set paste

次に、コードを貼り付けます。ツールチップのテキストにと表示されていることに注意してください-- INSERT (paste) --

コードを貼り付けたら、貼り付けモードをオフにして、入力時の自動インデントが再び正しく機能するようにします。

:set nopaste

しかし、私はいつもそれが面倒だと思っていました。そのため、テキストの編集中に<F3>貼り付けモードと貼り付けなしモード切り替えることができるようにマッピングします。 これを追加します.vimrc

set pastetoggle=<F3>

38
これは、:set noai後に続くより簡単ではありません:set ai。の提案:r! catは短いです。
Leopd

68
set paste間違いなく簡単だと思います。それははるかにセマンティックよりもnoai、さらにはnoautoindent「noai」を入力するときに、より重要である、とあなたはタッチのタイピストとして堪能十分にあるときの時間の同じわずかな量ほどかかる「ペースト」。
ビクターザマニアン2013

52
:set noaiOPに従って他のインデント関連設定がどのように構成されているかによっては、常に機能するとは限りません。 :set paste一度にいくつかの設定を簡略化したように見えます。
MarkHu 2013

13
パーティーには遅れset copyindentますが、これはシームレスに処理されます。
Matt Ryan、

33
:set pasteまた、ブレース補完などの他の機能も無効にします。これは、コードを貼り付けるときにも不要です。
Manuel Faux

263

貼り付け中の望ましくない影響を回避するには、設定する必要があるオプションがあります。

set paste

.vimrcにある便利なコマンドは、set pastetoggle=<F10>または他のボタンで、簡単に貼り付けとnopasteを切り替えることができます。


13
最終的に!私は:set paste /:set nopasteとタイプし続けました。THX。
imwilsonxu 2013

4
実用的な観点から見ると、あなたの答えは受け入れられた答えよりも有用です
Lynob

8
別のオプションは、あなたのvimrcにマクロを追加することです:nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR>
クリス

素晴らしい提案@Chris-インデントの問題なしに貼り付ける単一のキーシーケンス!
RichVel、2016年

貼り付けモードにしたくない場合はどうなりますか?永久に無効にする方法はありますか?
maxwell 2018

132

私は通常、コンテンツを使用:r! catして貼り付けます。( shift + insert )CTRL+D

有効化および無効化する必要はなく、直接使用できます。


この直接使用オプションが好きです。しかし、私はまだウェブページのvim構文を読む方法を学んでいます。あなたのステップはどういう意味ですか?特に、システムクリップボードに何かがあるとすると、vimのドキュメントに貼り付けるには何を押しますか?
jvriesem 2015年

9
この答えは、なぜ、どのように:r! cat機能するのかについての情報でより役立ちます 。
K Erlandsson 2016年

11
@KErlandsson、:rファイルのコンテンツを現在のドキュメントに 挿入します。!catつまり、基本的にstdin(* nixシェル)を開くcatを実行する(shift + insert)か、一部の端末では、マウスの右クリックでクリップボードの内容を端末のCTRL+Dファイルの終わりに貼り付け 、:r !catセッションを閉じます。
ダニエル

これは本当に「直接」ですか?pasteこの目的のためだけに作られたオプションを設定するよりも?@jvriesemこれは、あなたがその単語を理解していると私が思っていることが正しい場合、「直接的な」オプションではありません。
0xc0de 2017年

:r! catthen CTRL+SHIFT+Vを使用してターミナルに貼り付けることもできます(then CTRL+D)。
ポールルージュ

86

ローカルで作業している場合は、キーシーケンスを使用してシステムクリップボードから貼り付けることができます。

"+p

これは適切なvimコマンドなので、最初に挿入モードに入ったり、自動インデントをオフにしたりすることを心配する必要はありません。

もちろん、リモートで作業している場合(たとえば、SSH経由のコンソール)、これは機能せず:set noai、、挿入モード、コンソールに貼り付け、挿入モードのままにして、:set ai他の場所で説明されているようにルーティングします。


10
この答えは何年も前に書いています。今日で私が使用:set pasteし、:set nopaste代わりに長くいるにもかかわらず、それは覚えておくことは簡単だと私は毎回それを見てする必要はありませんので!
thomasrutter 2013

6
一部の組み込みシステム(主にbusyboxベース):set pasteは実装されていないため、:set noai代わりに使用する必要があります。
jcarballo 2013

コピーするテキストが大きい場合は、代わりに+レジスタを使用した方が速くありませんか?
pedromanoel

1
ローカルでのみ機能する@pedromanoel。たとえば、ローカルに何かをコピーして、それをSSHセッションのvimに貼り付けたい場合は、SSH経由でvimにアクセスできません。
thomasrutter 2014

1
@thomasrutterですが、これを<leader>p..にマッピングしました。非常に便利です。
デーン

51

での貼り付けモードの設定paste/nopaste/pastetoggleは完璧ですが、貼り付ける前に手動で貼り付けモードを有効にし、貼り付け後に貼り付けモードを無効にする必要があります。私が怠け者なので、以下は私がこれまでに見つけた最良の解決策です。これは、貼り付けたときに自動的に貼り付けモードを切り替えます。

端末のブラケット付き貼り付けモードを使用して、貼り付け時にVimの貼り付けモードを自動的に設定/設定解除する小さなトリックを次に示します。以下を.vimrcに入れてください:

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

これで、貼り付けモードを明示的にオン/オフにすることなく貼り付けることができます-自動的に処理されます。

出典:Coderwall

注:このソリューションはWSL(LinuxのWindows 10サブシステム)では機能しません。誰かがWSLの解決策を持っている場合は、この回答を更新するか、コメントに追加してください。

Tmux tmuxを使用する場合、宣言はダブルエスケープする必要があります。このためのコードもCoderwallにあります


これは華麗です。ただし、1つずつ、すべてのペーストの最初に「0」(ゼロ)の文字が表示されます。そのためのヒントは?
ジュリアスŠ。

tmuxを使用している場合は、ダブルエスケープする必要があることにも注意してください。このためのコードは答えにCoderwallリンクである
Daithí

1
さらに怠惰で、上記のコードを.vimrcに貼り付けてコピーする場合は、関数XTermPasteBegin()のインデントに注意してください。
k1133

私はこれがどのように機能するか興味を持っていたので、貼り付けブラケットを検索し、と変数が貼り付けブラケットを有効にして無効にしていることを説明するgitlab.com/gnachman/iterm2/-/wikis/Paste-Bracketingを見つけました。ブラケットの貼り付けがオンの場合、貼り付けられたテキストの前にが付き、後にが続きます。t_SIt_EIesc[200~esc[201~
PatS

37

Macユーザーは、以下を使用してペーストボードから直接読み取ることで、自動フォーマットを回避できます。

:r !pbpaste

3
これは素晴らしい応答です。ただし、これを行うと、ドキュメントは非表示になり(コマンドラインに戻ったように見えます)、テキストはクリップボードにあります。Enterキーを押すように求められるので、Enterキーを押すと、何も変更せずにドキュメントに戻ります。何が起こったのですか。
jvriesem 2015年

と入力するだけの場合:.!pbpaste、現在の行を貼り付けバッファーの出力で置き換えることで機能します。一般に、vimを使用すると、現在のファイル内のデータを別のプログラムにパイプして、テキストをコマンドの出力に置き換えることができます。したがって:1,3!pbpaste、ファイルの最初の3行を貼り付けバッファに置き換えます。私:.!ppjsonは非常に長い(フォーマットされていないJSON文字列)を使用してフォーマットし、長い文字列をフォーマットされた同等の文字列に置き換えます。ppjsonは、実行される単なるbashスクリプトですpython -m json.tool
PatS

19

これは、貼り付けイベントを再マッピングして自動的に貼り付けモードをオンにしてからオフにする方法を理解した人による投稿です。MacOSXのtmux / iTermで動作します。


1
先端をありがとう。また、その人が同様の機能をバンドルしたプラグインを追跡しました-stackoverflow.com/a/36512548/255961
studgeek

これにより、クリップボードからテキストを挿入すると、「eeeeeee」の文字列が発生するようです。
ジョンジャン

16

これを自分に追加すると、貼り付けの前後にF2~/.vimrcキーを押すだけで済みます。

set pastetoggle=<F2>

12

set clipboard=unnamedは自分の.vimrcに入れました。これにより、デフォルトの貼り付けバッファがXのクリップボードにマップされます。

したがって、ターミナルで少しテキストをマークした場合は、押すだけpでvimに貼り付けることができます。同様に、私はvim(例えばYYをヤンクして、現在の行をバッファーにヤンクして)、任意のウィンドウで中央クリックして貼り付けることができます。

ダンノ。とても便利だと思います。


私見、これが最良の答えです。F11(vimではデフォルトで事前設定されています)で切り替える必要はありません。これはMac OSXシステムで動作しますが、他のシステムについてはわかりません。
LightMan

9

端末内部で作業する場合、vim-bracketed-paste vimプラグインは、貼り付けの前後にキーストロークを必要とせずに自動的に貼り付けを処理します。

これは、iTerm2、gnome-terminal、およびlibvteを使用する他の端末などの「現代の」x-term互換端末によって送信されるエスケープシーケンスである括弧付きの貼り付けモードを検出することによって機能します。追加のボーナスとして、それはtmuxセッションでも機能します。Linuxサーバーに接続してtmuxを使用しているMac上のiTerm2で問題なく使用しています。


さらに注意すべき点に注意してください。残念ながら、これは、ターミナルに貼り付けたものに改行がある場合、入力バッファの内容も実行することを意味します。
0xc0de 2017年

1
@ 0xc0de、その引用はここでは関係ありません。これは、括弧付きの貼り付けモードをサポートしていない場合のシェルの動作について説明しています。これが、括弧付きの貼り付けモードのポイントです。これを防ぐためです。
sh1 2017年

これは、他のソリューションよりもはるかにうまく機能しました。ありがとう。
jjj 2017年

8

これを〜/ .vimrcに貼り付けて、満足してください:

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

編集:リフレクションで:r !catは、短く、セマンティックであり、カスタムvimrcを必要としないため、はるかに優れたアプローチです。代わりにそれを使用してください!


5

けれども:pastetoggle:paste:nopaste正常に動作する必要があります(実装されている場合-私たちは議論から見ることができるように、彼らは常にではありません)私は非常にrecomment貼り付け直接的なアプローチを使用し"+pたり"*pしてて読んで"+r"*r

VIMは、レジスタの10種類のアセスを有する(:help registers)と質問者が興味を持っているquotestarquoteplus部分から

  1. レジスタの選択とドロップ"*"+および "〜

これらのレジスターを使用して、GUIの選択したテキストを保管および検索します。見るquotestarおよびをquoteplus。クリップボードが使用できないか機能していない場合は、代わりに名前のないレジスタが使用されます。Unixシステムの場合、クリップボードは、+ xterm_clipboard機能が存在する場合にのみ使用できます。{Viにはない}

X11システムでは、「*」と「+」の違いのみがあることに注意してください。

:help x11-selection*との違いをさらに明確にします+

                                                  quoteplus quote+

文書化された3つのX選択があります。PRIMARY(現在のビジュアル選択を表すことが予想されます-Vimのビジュアルモードと同様)、SECONDARY(不適切な定義)、CLIPBOARD(カット、コピー、およびペースト操作に使用されることが予想されます) )。

これら3つのうち、Vimは「*レジスターの読み取りと書き込み時にPRIMARYを使用します(したがって、X11の選択が利用可能な場合、Vimは「自動選択」の「クリップボード」のデフォルト値を設定します)。VimはSECONDARYセレクションにはアクセスしません。

例:(デフォルトのオプション値を想定)

  • VimのビジュアルモードでURLを選択します。ブラウザに移動し、URLテキストフィールドでマウスの中央ボタンをクリックします。選択したテキストが挿入されます(うまくいけば!)。注:Firefoxでは、about:configでmiddlemouse.contentLoadURL設定をtrueに設定すると、ウィンドウのほとんどの場所でマウスの中央ボタンを押すと、選択したURLが使用されます。

  • マウスでドラッグして、ブラウザでテキストを選択します。Vimに移動し、マウスの中央ボタンを押します。選択したテキストが挿入されます。

  • Vimでテキストを選択して「+ y」を実行します。ブラウザに移動し、テキストフィールドでテキストをマウスでドラッグして選択します。次に、マウスの右ボタンを使用して、ポップアップメニューから[貼り付け]を選択します。選択したテキストは、 Vimからのテキスト。「+」レジスタ内のテキストはビジュアル選択を行っても引き続き使用可能であり、「*レジスタ」内の他のテキストを使用できることに注意してください。これにより、選択したテキストを上書きできます。

vimでミドルクリックを使用するとインデントがめちゃくちゃに表示されないので、これはアイデアかもしれません
Fuseteam

4

これは私にとってはうまくいきます(+レジスタの場合、aps間のバッファ交換のように私が使うもの):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>

2

Macを使用している場合、macvimは貼り付けを切り替えなくてもうまく処理できるようです。

brew install macvim --override-system-vim


.vimrcファイルにOPのディレクティブを含める場合はそうですか?
Drew Noakes 2014年

2

ネイティブペースト/ブラケットペーストは、vim 8(2016年にリリースされて)以来、最も簡単な方法です。SSHでも動作します!(ブラケットペーストはLinuxとMacでは機能しますが、Windows Git Bashでは機能しません)

  1. あなたがvim 8+を持っていることを確認してください(+clipboardまたは+xterm_clipboardオプションは必要ありません)。

    vim --version | head -1

  2. 通常モードでは、OSネイティブの貼り付けコマンド(ctrl+shift+Vまたはcmd+V)を使用するだけです。を押しiて挿入モードにしないでください。


テスト

  1. この出力(タブインデント付きの2行)をシステムクリップボードにコピー(ctrl+shift+Cまたはcmd+C)します。

    echo -e '\ta\n\tb'

  2. 自動インデントでクリーンなvim 8+を起動します。

    vim -u NONE --noplugin -c 'set autoindent'

  3. 通常モードでシステムのクリップボード(ctrl+shift+Vまたはcmd+V)から貼り付けます。を押しiて挿入モードにしないでください。aそしてb1つのタブインデントと一致する必要があります。これは、リモートマシンにsshを実行しているときにも実行できます(リモートマシンにはvim 8以降が必要です)。

  4. ここで、2行目を追加のタブで自動インデントする古い方法を試してくださいi。挿入モードで押す。次に、ctrl+shift+Vまたはを使用して貼り付けcmd+Vます。aそしてb今、ずれています。


Vim 8のインストール


1
最善かつ最も簡単な方法!また、Googleはそれを示唆したFeatured snippet私は、この答えは:)言及しただけで、キーワードを「タブ」を使用し、多分、ので、「はタブがVIMないコンテンツを貼り付ける」私の検索のために
デヴィッド・


1

私はすぐにに気づいてよ最速の方法は、ペースト、インサートに行くワンショットペーストするモードでtpopeのある健常、どの機能yoyO、「あなたは、オープン」のため、おそらくニーモニック。次のように、彼のvimdocにのみ文書化されています。

単一挿入のラッピングの一般的な使用例は非常に無駄であるので、「貼り付け」のトグルは提供されていません。2回切り替えますが、1回だけ貼り付けます(YOPO)。代わりに、yoまたはyOを押して、 'paste'が設定された状態でoまたはOを呼び出します。挿入モードを終了すると、「nopaste」が自動的に設定されます。


1

貼り付ける別の方法<CR>は、レジスター(ここではグローバル・レジスター)の内容を介してドロップすることです。参照::h i_ctrl-rおよびh i_CTRL-R_CTRL-O

vimヘルプドキュメントから:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

したがって、自動インデントなしでコンテンツをvimに貼り付けるには<CR><CO>*、ほとんどのUNIXシステムで使用します。

注:これはvimがでコンパイルされている場合にのみ機能しclipboardます。



1

私が今まで見なかった別の答え:

:se paste noai

0

悲しいことに、vimプラグインがiTerm2 3.0.15で動作しないことがわかりました(公平にするために、これが古いバージョンで壊れたかどうかはわかりません)-代わりにこのハックを見つけました。

貼り付けを行うためにcommand-pをマップし、iTerm2 vimキーを使用します。明らかに、これはiTerm2でのみ機能します。

使い方。「jk」を使用してエスケープモードに入るので、次も必要になります。

:inoremap jk

あなたの.vimrcに。

次に、Pを呼び出して貼り付けモードに入り、「+ pでクリップボードから貼り付け、Pで貼り付けモードを無効にします。hth。

ここに画像の説明を入力してください


1
ちょっと待って、これに 'jk'を使いますか?
0xc0de 2017年

そうそう、私はそのことを忘れていました。":inoremap jk <esc>"を.vimrcに追加するだけです。なぜ私がjkを使用するの、なぜAppleに質問するのか、そしてなぜ彼らは移動して物理的なエスケープキーを取り除く必要性を感じたのか。8(
Neil McGill

ところで、トレーニングは必要ですが、しばらくするとjkの方が速く感じられ、今ではエスケープよりも優先したいと思います... iTerm2がここでも<ESC>を受け入れるかどうかを知るのは興味深いことです。
Neil McGill

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