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
またはを使用できます。"+p
OSXや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