web-dev-qa-db-ja.com

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

私はVimを学ぶように努力しています。

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

line
  line
    line

私はあなたが自動インデントをオフにすることができます知っているが、私はいくつかの他の設定が競合したり(私の.vimrcにかなり明白に見えるが、私はそれらを取る際には関係していないようです)何か持っているので、私はそれを動作させることはできません。

コードを貼り付けたときに自動インデントをオフにしても、コードを書いているときに自動インデントを有効にするにはどうすればよいですか。これが私の.vimrcファイルです。

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

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

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

タイプ

:set paste

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

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

:set nopaste

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

set pastetoggle=<F3>
1851
P Shved

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

set paste

あなたの.vimrcに持っているのに便利なコマンドは、set pastetoggle=<F10>または他のボタンで、ペーストとnopasteを簡単に切り替えることができます。

253
Jacob R

私はたいてい:r! catを使ってから( shift + insert )CTRL+Dを貼り付けています。

有効化および無効化する必要はありません。直接使用します。

123
thegeek

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

"+p

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

もちろん、リモートで作業している場合(SSH経由のコンソールなど)、これは機能しません。他の場所で説明しているように、:set noai、挿入モード、コンソールに貼り付け、insertmodeのまま、:set aiの順に進む必要があります。

83
thomasrutter

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

:r !pbpaste
37
maniacalrobot

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(Windows 10サブシステムfor Linux)では機能しません。誰かがWSLのための解決策を持っているなら、この答えを更新するか、またはコメントにそれを追加してください。

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

31
thdoan

これは投稿です 貼り付けイベントを再マップして貼り付けモードを自動的にオンにしてからオフにする方法を考え出した人によるものです。 MacOSX上のtmux/iTermで私のために働きます。

19
Von

これをあなたの~/.vimrcに追加すれば、貼り付ける前後に F2 を押すだけで済みます。

set pastetoggle=<F2>
12
anh_ng8

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

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

9
studgeek

私はちょうど私の.vimrcにset clipboard=unnamedを入れます。これにより、デフォルトの貼り付けバッファはXのクリップボードにマップされます。

ですから、端末にテキストを少し印を付けたら、pを押すだけでそれをvimに貼り付けることができます。同様に、私はものをvimでヤンクし(例えば現在の行をバッファにヤンクするためにYY)そしてそれをペーストするために任意のウィンドウ内で中クリックすることができる。

ダンノ。私はそれが超便利だと思います。

9
Soren

これをあなたの〜/ .vimrcに貼り付けて幸せにしてください。

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

編集:熟考すると、:r !catは短くて意味的で、カスタムのvimrcを必要としないので、はるかに良いアプローチです。代わりにそれを使ってください。

7
Dergachev

:pastetoggleまたは:pasteおよび:nopasteはうまく機能するはずですが(実装されている場合 - 議論からわかるように常にではありません)、直接アプローチ"+pまたは"*pを使用して"+rまたは"*rを使用することを強くお勧めします。

Vimは10種類のレジスタ(:help registers)にアクセスでき、質問者はsectionのquotestarquoteplusに興味があります。

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

これらのレジスタを使用して、GUI用に選択されたテキストを保存および取得します。 quotestarquoteplusを参照してください。クリップボードが利用できない場合や機能していない場合は、代わりに名前なしレジスタが使用されます。 Unixシステムの場合、クリップボードは+ xterm_clipboard機能が存在する場合にのみ利用可能です。 {Viにはない}

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

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

                                                  quoteplus quote+

3つの文書化されたXの選択があります:PRIMARY(現在の視覚的選択を表すことが期待されます - Vimのビジュアルモードのように)、SECONDARY(これは定義されていません)およびCLIPBOARD(カット、コピーおよびペースト操作に使用されることが期待されます).

これら3つのうち、Vimは "*"レジスタの読み書き時にPRIMARYを使用し(したがってX11選択が利用可能な場合、Vimは 'autoselect'の 'clipboard'のデフォルト値を設定する)、 "+"レジスタの読み書き時にCLIPBOARDを使用する。 VimはSECONDARY選択にアクセスしない。

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

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

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

  • Vimでテキストを選択して "+ y。マウスをドラッグしてテキストフィールド内のテキストを選択します。右マウスボタンを使用してポップアップメニューから"貼り付け "を選択します。 "+"レジスタのテキストはビジュアル選択をしても利用可能なままで、他のテキストは "*"レジスタで利用可能になります。これは選択されたテキストを上書きすることを可能にします。
3
codingdave

これは私のために動作します(+レジスタの場合、私はAPS間の交換バッファのように使用するもの):

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

あなたがMacを使っているのであれば、macvimはペーストをトグルしなくてもうまく扱えるようです。

brew install macvim --override-system-vim

2
Marcus Ericsson

ネイティブペースト/ブラケットペーストは、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. Autoindentを使用してクリーンなvim 8以降を起動します。

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

  3. 通常モードでシステムのクリップボード(ctrl+shift+Vまたはcmd+V)から貼り付けます。挿入モードではiを押さないでください。 aおよびbは、単一のタブインデントに揃える必要があります。リモートマシンへのssh-ing中にこれを行うこともできます(リモートマシンにはvim 8+が必要です)。

  4. 次に、古い方法を試してください。2番目の行に余分なタブが自動的にインデントされます。挿入モードの場合は、iを押します。次に、ctrl+shift+Vまたはcmd+Vを使用して貼り付けます。 abの位置がずれています。


Vim 8のインストール

2
wisbucky

Vimから:]p

外部から:"*]pまたは"+]p

1
Bruno

ワンショットペーストのためにペースト - 挿入モードにすばやく行くために私が知っている最も速い方法はtpopeの unimpaired であり、これはyoyOを特徴とします。 「あなたが開く」のために。それらは彼のvimdocで以下のように文書化されているだけです:

単独挿入の折り返しの典型的な使用例は非常に無駄が多いので、 '貼り付け'にトグルは用意されていません。2回トグルしますが、1回だけ貼り付ける(YOPO)代わりに、 'または'を押して 'または'を呼び出して、 '貼り付け'をすでに設定してください。挿入モードを終了すると、自動的に「nopaste」が設定されます。

1
Micah Elliott

この記事を読んでください: コード貼り付けのための自動インデントの切り替え

あなたのvimrcの代わりに次のようにステータスラインに表示される視覚的なフィードバックが好きな人もいます。

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
1
d.danailov

別の貼り付け方法は、<CR>を使用してレジスタの内容(ここではグローバルレジスタ)を削除することです。 :h i_ctrl-rh 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に貼り付けるには、ほとんどのUNIXシステムで<CR><CO>*を使用してください。

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

0
TheChetan

悲しいことに、私はiTerm2 3.0.15で動いていないと述べられているvimプラグインを見つけました(これが古いバージョンではうまくいかなかったかどうかはわかりません) - しかし代わりにこのハックを見つけました。

ITerm2 Vimキーを使用して貼り付けるためにcommand-pをマップします。明らかにこれはiTerm2のためにだけ働く。

使い方。私は "jk"を使ってエスケープモードに入ります。

:inoremap jk

あなたの.vimrcに。

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

enter image description here

0
Neil McGill

私が今まで見なかったもう一つの答え:

:se paste noai
0
sjas