開啟 smartindent / autoindent 時,Vim 會在插入模式下根據語法自動縮排。但從外部複製代碼貼上 (如 Shift+Insert 或 Cmd+V) 時,Vim 會逐字元「輸入」並觸發自動縮排,導致原本正確的縮排錯亂、產生多餘空白行。
paste 選項[vim]
" 貼上前:開啟 paste 模式
:set paste
" 此時狀態列顯示 -- INSERT (paste) --
" 自動縮排、展開 tab 等干擾行為全部暫停
" 貼上完成後:關閉 paste 模式恢復正常
:set nopaste
" 狀態列恢復 -- INSERT --
在 .vimrc 加入映射,按 F2 (或自訂鍵) 一鍵切換:
[vim]
set pastetoggle=
" 或手動映射
nnoremap :set invpaste paste?
按 F2 開啟 → 貼上 → 按 F2 關閉,流程極順暢。
set paste 實際上將 'textwidth', 'wrapmargin', 'autoindent', 'smartindent', 'cindent', 'indentexpr' 等選項暫存並停用,同時設定 'paste' 旗標讓部分外掛知曉。normal 模式下的 p/P 貼上 (那些不經插入模式),僅針對插入模式下的逐字元輸入流 (如終端模擬器貼上、中鍵貼上)。pastetoggle 仍是好習慣。