title: “Turning off auto indent when pasting text into vim”
date: “2025-05-30”
categories:

  • 文本编辑
  • Vim编辑器
    tags:
  • 文本编辑
  • VimL
  • Vim
  • 关闭自动缩进
  • 粘贴文本
    author: ww
    filename: “2025-05-30.turning-off-auto-indent-when-pasting-text-into-vim”

Turning off auto indent when pasting text into vim

技术背景

在使用Vim编辑文本或代码时,其自动缩进功能可能会在粘贴内容时导致格式混乱。为了避免这种情况,需要在粘贴时关闭自动缩进。

实现步骤

手动切换粘贴模式

  • 开启粘贴模式:键入 :set paste,这时提示信息会显示 -- INSERT (paste) --
  • 粘贴代码。
  • 关闭粘贴模式:键入 :set nopaste,以恢复正常的自动缩进功能。

映射快捷键切换模式

.vimrc 文件中添加如下设置,可通过 F3 键在 pastenopaste 模式之间切换:

1
set pastetoggle=<F3>

自动切换粘贴模式

.vimrc 文件中添加以下代码,可在粘贴时自动切换粘贴模式:

1
2
3
4
5
6
7
8
9
10
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

其他粘贴方法

  • 使用命令 :r! cat,然后通过 shift + insert 粘贴内容,最后按 CTRL+D
  • 本地操作时,使用 "+p 从系统剪贴板粘贴。
  • 在插入模式下通过 <C-r><C-o>* 粘贴内容,避免自动缩进。可在 vimrc 中添加映射 inoremap <C-r> <C-r><C-o>,以 * 寄存器为例,使用 <C-r>* 正常粘贴内容而不自动缩进,但前提是 Vim 编译时包含 clipboard 功能。

插件方法

使用 vim-bracketed-paste 插件,它能检测终端的“bracketed paste mode”,自动处理粘贴操作,无需在粘贴前后手动按键。

系统级禁用自动缩进

如果想完全禁用系统级的自动缩进功能,可以:

  1. 备份 indent.vim 文件:
1
sudo mv /usr/share/vim/vim81/indent.vim /usr/share/vim/vim81/indent.vim.orig
  1. 创建一个新的空 indent.vim 文件:
1
sudo touch /usr/share/vim/vim81/indent.vim

Vim 8+ 的原生粘贴

  • 确认 Vim 版本为 8+:
1
vim --version | head -1
  • 在正常模式下使用操作系统的原生粘贴命令(如 ctrl+shift+Vcmd+V),无需先进入插入模式。

核心代码

以下是一些常用的配置代码示例:

  • 使用 F2 键切换粘贴模式
1
2
3
nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
  • VimL 中 <S-Insert> 键粘贴配置
1
inoremap <silent> <S-Insert> <Cmd>set paste<CR><C-r>+<Cmd>set nopaste<CR>
  • Neovim Lua 中 <S-Insert> 键粘贴配置
1
vim.keymap.set("i", "<S-Insert>", [[<Cmd>set paste<CR><C-r>+<Cmd>set nopaste<CR>]], { noremap = true, silent = true })
  • tmux 中 Vim 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if !has('gui_running') && &term =~ '^\%(screen\|tmux\)'
" Better mouse support, see :help 'ttymouse'
set ttymouse=sgr

" Enable true colors, see :help xterm-true-color
let &termguicolors = v:true
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"

" Enable bracketed paste mode, see :help xterm-bracketed-paste
let &t_BE = "\<Esc>[?2004h"
let &t_BD = "\<Esc>[?2004l"
let &t_PS = "\<Esc>[200~"
let &t_PE = "\<Esc>[201~"

" Enable focus event tracking, see :help xterm-focus-event
let &t_fe = "\<Esc>[?1004h"
let &t_fd = "\<Esc>[?1004l"

" Enable modified arrow keys, see :help xterm-modifier-keys
execute "silent! set <xUp>=\<Esc>[@;*A"
execute "silent! set <xDown>=\<Esc>[@;*B"
execute "silent! set <xRight>=\<Esc>[@;*C"
execute "silent! set <xLeft>=\<Esc>[@;*D"
endif

最佳实践

  • 根据个人使用习惯,选择合适的方法关闭自动缩进,如映射快捷键或使用插件,以提高效率。
  • 对于远程操作(如通过 SSH 连接),选择合适的粘贴方法,可参考上述不同使用场景下的方法说明。

常见问题

  • 插件不生效:检查插件的安装是否正确,以及终端是否支持相关功能。例如,某些插件可能依赖于特定的终端特性。
  • 映射快捷键无效:确认 .vimrc 文件的修改已保存,并且 Vim 已重新加载配置。可通过 :source ~/.vimrc 手动加载配置。
  • 远程操作粘贴问题:如果在远程操作时 "+p" 无法工作,可尝试使用 :set noai,进入插入模式,粘贴内容,退出插入模式,再使用 :set ai

https://119291.xyz/posts/turning-off-auto-indent-when-pasting-text-into-vim/
作者
ww
发布于
2025年5月30日
许可协议