最稳妥解法是用 :set paste 开启粘贴模式再粘贴。因 vim 默认自动缩进会扭曲原始缩进,paste 模式可禁用干扰项;建议绑定 f9 切换,并配置 expandtab 等统一空格缩进。

直接用 :set paste 开启粘贴模式,再粘贴就能保住原始缩进,这是最稳妥、最通用的解法。
为什么错乱?不是代码问题,是 Vim 在“帮忙”
Vim 默认开启自动缩进(autoindent)、智能缩进(smartindent)或 C 缩进(cindent),当你在插入模式下粘贴多行内容时,它会逐行分析上下文,给每一行额外加缩进——就像你在敲回车时那样。外部代码原本的缩进结构,就会被叠加扭曲,甚至整段变注释(尤其 shell 脚本里 # 开头的行触发注释模式)。
正确做法:用 paste 模式临时关闭自动行为
进入命令模式(按 Esc),执行:
-
:set paste—— 禁用自动缩进、自动补全、映射键、换行等干扰项 - 按 i 进入插入模式,再粘贴(Ctrl+V 或鼠标中键)
- 粘完后按 Esc 回到命令模式,执行
:set nopaste
注意:paste 模式下,状态栏通常显示 -- INSERT (paste) --,这是正常提示。
省事办法:绑定快捷键一键切换
编辑 ~/.vimrc,加一行:
-
set pastetoggle=<f9></f9>—— 按 F9 就能开关 paste 模式,插入/普通模式都有效 - 或者更灵活:
nnoremap <f10> :set paste<cr>i</cr></f10>,按 F10 直接进 paste + 插入,粘完 Esc 再按 F10 关闭
长期预防:统一空格缩进,避免 tab 混乱
外部代码常含 tab 字符,而 Vim 默认 tab 宽度为 8,CSDN、GitHub 等平台渲染不一致,看起来“坠落”。推荐在 ~/.vimrc 中固定为空格缩进:
-
set expandtab—— 输入 tab 时实际插入空格 set tabstop=4set softtabstop=4set shiftwidth=4
这样复制出去的代码缩进稳定,粘进来也不易因 tab 渲染差异而错位。
不复杂但容易忽略,关键是别跳过 paste 模式这一步。











