コードをvimに貼り付けるときに、元のソースとしてフォーマットされたコードを保持するにはどうすればよいですか?


37

WebページからコードをコピーしてVIMに貼り付けると、次のようにラダーのような混乱したスタイルになります

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

それはとても定期的に台無しになったので、多分私の何かが間違っていると思う .vimrc

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

通常、私はVIMでpythonを作成します。


1
ありがとう。これは何年も私をイライラさせました。+1。
DevSolar

回答:


50

前にこれを行います:

:set paste

後で:

:set nopaste

必要ありませんgvim。貼り付け時にこれらを自動的にオンおよびオフにします。
ベンジャミンバニエ

それがなぜなのか、何か考えはありますか?
ネイサンフェルマン

1
単なる推測:プレーンvimはコマンドラインのみであり、クリップボードを「認識」しません。「貼り付け」を入力文字シーケンスとして受け取り、自動インデントを適用します。GUI対応のgvimは、受信データがクリップボードからのものであることを「認識」し、そのために自動インデントを無効にします。
DevSolar

そのとおりです。端末は、「貼り付け」操作を生の文字入力として扱います。
イグナシオバスケス-エイブラムス

これは単なるvimの問題ではありません-コマンドプロンプトで古いDOSエディターに貼り付けると同様の効果が得られます。このプログラムは、Windows 7 64ビットでは欠落しているようです。これは、おそらく実際には古い16ビットDOSアプリであり、更新する手間をかける価値がなかったためです。しかし、それはWindows XPにあり、その中に貼り付けることは、(1)文字ごとの入力を演じる非常にゆっくり動作し、(2)本当に混乱します。
Steve314

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

コードペーストの自動インデントを切り替える

バックグラウンド

Vimコマンドを使用してテキストを貼り付けると、予期しないことは何も起こりません。この問題は、VimのGUIバージョンを使用していないときにのみ、別のアプリケーションから貼り付けるときにのみ発生します。Vimのコンソールまたはターミナルバージョンには、別のアプリケーションからテキストを貼り付けるための標準的な手順はありません。代わりに、端末はテキストをキーボードバッファーに挿入して貼り付けをエミュレートするため、Vimはユーザーがテキストを入力したと判断します。各行が終了すると、Vimはカーソルを移動して、次の行が最後と同じインデントで始まるようにします。ただし、これにより、貼り付けられたテキストのインデントが変更されます。

貼り付けの切り替え

vimrcに以下を入力します(必要なキーに変更します):

set pastetoggle=<F2>

別のアプリケーションから貼り付けるには:

  • 挿入モードを開始します。
  • F2を押します(「貼り付け」オプションをオンに切り替えます)。
  • 端末を使用して、クリップボードからテキストを貼り付けます。
  • F2を押します(「貼り付け」オプションをオフに切り替えます)。

次に、貼り付けられたテキストの既存のインデントが保持されます。

最初に挿入モードを開始する必要はありませんが、通常モードでF2のマッピングがある場合、そのマッピングが適用され、「pastetoggle」機能は動作しません。

一部の人々は、vimrcの次の代替案によってステータス行に表示される視覚的なフィードバックを好む:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

最初の行は、通常モードでF2を押すと「貼り付け」オプションが反転し、そのオプションの値が表示されるようにマッピングを設定します。2行目では、挿入モードでF2を押して、「貼り付け」のオンとオフを切り替えることができます。3行目では、挿入モードで「貼り付け」がオンになっているかどうかを表示できます。


1
ホットキーソリューションの場合は+1。すでに(私のような)何か他にF-キーをマッピングしている(私のような)VIM、<C-F2>ではない、あまりにも会社のため... Ctrlキーを押しながらF2だろう
DevSolar

優れた-私は今、これを使用しています
hoju

<S-Insert>や<Ctrl + V>のように、元の機能と共に、これを自動的に行うために貼り付けキーをマッピングするだけではどうですか?または、1秒の間にバッファにいくつかの入力文字が書き込まれたときに貼り付けを無効にする関数を作成します。これは単なるアイデアです。もちろん、私はほとんどすべてのキーを他のものにマッピングしているので苦痛です、12個のFキーと+ 15個以上のFキー(Gキー)を備えたキーボードもあり、それでも3つのレベルがありますが、それでも十分ではありません:)。唯一の問題は...、何のESC seqsは、スタート・オブ・ペーストOPを通知するために送信されません取得し、右クリックメニュー、である
osirisgothra

2

あなたを混乱させるのは自動インデントです。

set autoindent
set smartindent

コードをカットアンドペーストするときに無効にし、完了したら再び有効にしてください。


-2

これを達成するための最小の労力は.vimrc次のとおりです(に入れることができます)。

:set paste

次に、コードを貼り付けます。


3
この'paste'オプションは永久に設定されることを意図したものではありませんでした。マッピングや略語など、多くのことを無効にします。その上、以前の答えはすでに'paste'オプションをカバーしています。
ヘプタイト

2
スーパーユーザーへようこそ!これにより、既存の回答が複製され、新しいコンテンツは追加されません。実際に何か貢献できるものがない限り、回答を投稿しないでください。
トビーSpeight
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.