Vimの貼り付けでインデントが崩れるとき:pasteモード、bracketed paste、Neovim

2026年メンテナンス注:前半は、現在のVimとNeovimに対応したトラブルシューティングです。末尾の記録部分には、2019年のソースエクスポートを、語句、Markdown、コマンド、当時のStack Overflowリンクを含めて全文そのまま保存します。古い:set paste手順はVimの手動フォールバックとして今も有効ですが、現在のVimは端末のbracketed pasteを認識でき、Neovimは貼り付けを自動処理してpastetoggleを削除しています。三つを同じ手順として扱うことはできません。

最短の答え

端末からコードを貼り付けるたびに行が右へずれていくなら、まずエディタを確認します。

:version
:echo has('nvim')

次に、環境に合う経路を選びます。

環境対応
Vimで一度だけ崩れた:set pasteを実行し、Insertモードで貼り付け、直後に:set nopasteを実行する
Vimで繰り返し崩れる可能ならbracketed pasteを直す。難しければset pastetoggle=<F3>を手動フォールバックにする
Neovimpastetoggleを追加しない。すでに削除済みで、通常の端末・GUI貼り付けは自動処理される
クリップボードレジスタが使えるVim/NeovimInsertモードを抜けて"+pを使い、端末がキー入力として流し込む経路を避ける

Vimの設定にset pasteを常設してはいけません。pasteモードは、マッピング、略語、インデント、タブ、折り返し、整形の動作を意図的に無効化または変更します。一回の貼り付けを直す代わりに、通常編集を分かりにくく壊してしまいます。

コードが階段状にずれる理由

端末は貼り付けた文字列を、利用者が一文字ずつ入力したかのように渡す場合があります。エディタが貼り付けと通常入力を区別できないと、改行のたびにautoindentsmartindentcindentindentexpr、コメント継続などの整形規則が発動します。クリップボード内にすでにある字下げへ、新しく計算された字下げが加算され、次のような階段になります。

if condition:
    first_call()
        second_call()
            third_call()

Bracketed pasteは、この入力の分類問題を解決します。対応端末は貼り付け部分を開始・終了マーカーで囲みます。VimやNeovimは、そのブロックを通常入力ではなく貼り付けとして挿入できます。ただし、端末、SSH、tmuxなどのマルチプレクサ、エディタまでの経路全体がプロトコルを保持し、理解する必要があります。

Vim:手動paste手順

Vimでは、2019年の手順が今もフォールバックとして使えます。

:set paste

Insertモードに入り、貼り付けます。終了したらNormalモードへ戻り、通常動作を復元します。

:set nopaste

本当に頻繁に必要なら、現在のVimヘルプにもpastetoggleが記載されています。

set pastetoggle=<F3>

貼り付けの前後に<F3>を押します。pastetoggleは通常のInsertモード・マッピングとは異なります。Vimはpasteが有効な間、Insertモードのマッピングを無視するため、専用オプションならpasteモードを再びオフにできます。

現在の状態はいつでも確認できます。

:set paste?

貼り付け後にもVimがpasteと表示するなら、:set nopasteを実行します。Vim FAQも、このオプションを常時有効にしないよう明記しています。

現在のVim:まずbracketed paste

現在のVimは、bracketed pasteを:help xterm-bracketed-pasteで説明しています。端末プロトコルが利用できると、Vimは貼り付け境界を受け取り、内容をコマンドとして解釈せず、文字どおり挿入します。この経路が動けば、手動切り替えは不要です。

手動切り替えは古い端末経路や設定不良時に役立ちますが、最初から永続設定にするものではありません。Vimの文書は、bracketed pasteがセキュリティ保証ではないとも警告しています。端末ごとに実装差があるため、信頼できない文字列をエディタやコマンドラインへ貼る前に内容を確認してください。

Neovim:古い切り替え設定を削除する

現在のNeovim provider文書によれば、TUIの貼り付けは端末のbracketed-paste機能を利用し、端末が対応していれば自動で動きます。GUIはNeovimのpaste APIを呼びます。Neovim 0.9以降、pastetoggleは削除され、pasteオプションはobsoleteです。

したがって、次の古いVim設定を現在のNeovim設定へ入れてはいけません。

set pastetoggle=<F3>

init.vimでunknown optionエラーになるなら削除します。Neovimでも再インデントされたり、生のエスケープマーカーが入ったりする場合は、削除済みの切り替えを再現せず、端末、マルチプレクサ、GUI、設定の経路を調べます。

再現可能な切り分け手順

1. エディタと版を確認する

シェルでのコマンド名や画面の見た目ではなく、:versionを使います。VimとNeovimで設定を共有し、廃止オプションまで共有してしまう例は珍しくありません。

2. ユーザー設定を外して比較する

同じエディタをユーザー設定なしで起動します。

vim --clean
nvim --clean

短く安全なサンプルを貼り付けます。cleanセッションだけ正常なら、通常設定、filetypeプラグイン、インデントプラグイン、貼り付けマッピングを調べます。cleanでも失敗するなら、端末、SSH、マルチプレクサの経路がより有力です。ただし、この比較だけで原因は確定しません。端末設定を変える前に、tmuxやリモートセッションの内外で再試験します。

3. Vimのオプション状態と設定元を調べる

Vimでは次を実行します。

:verbose set paste?
:verbose set autoindent? smartindent? cindent? indentexpr?

verboseは、そのオプションを最後に変更したスクリプトを示す場合があります。pasteが残っていれば、貼り付け後にマッピングやインデントが消える理由になります。予期しないindentexprやfiletypeプラグインは、特定のファイル形式だけ変換される理由になりえます。

4. レジスタで端末貼り付けを迂回する

エディタからシステムクリップボードを利用できるなら、Normalモードで+レジスタから貼り付けます。

"+p

Insertモードからは、Ctrl-RCtrl-O+の順に入力します。文書化されたCTRL-R CTRL-O {register}は、レジスタを文字どおり、かつ自動インデントなしで挿入します。これにより、エディタのインデント問題と端末の貼り付けプロトコル問題を分けられます。

+レジスタが使えない場合、それはクリップボードproviderの問題であり、pasteモードの故障を示すものではありません。Neovimでは:checkhealthを実行します。組み込み検査にはクリップボードも含まれます。Vimでは:versionのclipboard機能を確認し、そのビルドとOSが対応する方法を使います。

5. 伝送経路を比較する

バッファに^[[200~のような文字が入るなら、bracketed-pasteマーカーが届いたのに認識されていません。tmux外、SSH外、別端末で挙動が変わるなら、Vimのインデント設定を変える前に各層を比較します。任意の端末エスケープコードを設定へコピーするのは避けてください。現在のVimはterminfoを利用でき、端末に合わない手動値は別の不具合を作ります。

症状と確認箇所

症状調べるべき境界最初の確認
貼り付けた行が順に右へずれる貼り付けが通常入力として解釈されているcleanセッション、次にVimの一時的な:set paste
貼り付け後、マッピング・略語・通常インデントが動かないVimがpasteモードのまま:set paste?、続いて:set nopaste
NeovimでpastetoggleがunknownになるVim専用の旧設定がNeovim設定にある削除し、自動貼り付けとnvim --cleanを試す
^[[200~^[[201~が文字として入る端末経路でマーカーが処理されなかったtmux/SSH外、別端末と比較する
"+pが失敗する、または+レジスタが空クリップボード機能/providerがないNeovimは:checkhealth、Vimは:version
一つのfiletypeだけで起きるfiletypeまたはインデントスクリプト:verbose set indentexpr? cindent? autoindent?

最小限の判断規則

  1. 現在のVimとNeovimでは、自動bracketed pasteを優先する。
  2. システムクリップボードのレジスタが動くなら、"+pを優先する。
  3. :set pasteから:set nopasteは、Vimのフォールバックに限る。
  4. pastetoggleはVimだけで、手動フォールバックが繰り返し必要な場合だけ使う。
  5. cleanセッションでも失敗するなら、インデントプラグインより先に端末伝送を調べる。

2019年ソース記録(原文を全文保存)

https://stackoverflow.com/questions/2514445/turning-off-auto-indent-when-pasting-text-into-vim

To turn off autoindent when you paste code, there’s a special “paste” mode.

Type

:set paste

Then paste your code. Note that the text in the tooltip now says -- INSERT (paste) --.

After you pasted your code, turn off the paste-mode, so that auto-indenting when you type works correctly again.

:set nopaste

However, I always found that cumbersome. That’s why I map <F3> such that it can switch between paste and nopaste modes while editing the text! I add this to .vimrc

set pastetoggle=<F3>

一次資料

Leave a Reply