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

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

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"
#                                                       

ポンド記号(#)とタブ文字があります。なぜ?

答え1

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またはを使用できます。"+pOSXやWindowsなど、X11のないシステムではレジスタを使用する必要があります*。 X11システム(Linuxなど)では、2つを同時に使用できます。

追加読書

答え2

vimを使って貼り付けてください。必要なのは、クリップボードバッファの内容を貼り付けることです。 "+p

これにより、対応する項目が選択され+て貼り付けられます。

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

それからvimはこれがペースであることを知ります。

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

SSHを介してこれを行うには、クリップボードを共有するオプションを設定する必要があります。-Y

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

答え3

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

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

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

答え4

その理由については、他のブロガーが明確に説明しました。ここでは、このような状況を自動的に処理できるソリューションを提供したいと思います。

次のコンテンツから~\.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

自動インデントを気にせずに自由に貼り付けることができます。

tmuxで作業している場合は、次のものを作成する必要があります。

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

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

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

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

ソースはコーダーウォールもっと読みたい場合。

同等の改行関数を使用する場合は、screen次のようになります。

function! WrapForScreen(s)
  if exists('$TMUX') || match($TERM, "screen")==-1
    return a:s
  endif

  let screen_start = "\<Esc>P"
  let screen_end = "\<Esc>\\"

  return screen_start . a:s . screen_end
endfunction

発見中ステイフェルバーグの.vimrc

関連情報