---
author: ''
category: 技术
comments_data:
- date: '2019-03-31 21:04:45'
  message: 原始链接已改变 - solicomo.com/vim/vim-copy-paste.html
  postip: 42.200.200.180
  username: 来自香港的 Chrome 72.0|Windows 10 用户
count:
  commentnum: 1
  favtimes: 1
  likes: 0
  sharetimes: 0
  viewnum: 13623
date: '2012-07-25 08:21:00'
editorchoice: false
excerpt: "原文：Vim 复制粘帖格式错乱问题的解决办法\r\n\r\n有时候，复制文本（尤其是代码）到 Vim，会出现格式错乱的问题。看样子，应该是自动缩进惹得祸。本文不去深究原因，直接给出解决方法。\r\n1.
  paste 模式\r\n运行如下命令，进  ..."
fromurl: ''
id: 704
islctt: false
largepic: /images/p/201610/12/095124vr9cmdgilii8rrwr.png
permalink: /article-704-1.html
pic: https://img.linux.net.cn/static/image/common/nophoto.png
related: []
reviewer: ''
selector: ''
summary: "原文：Vim 复制粘帖格式错乱问题的解决办法\r\n\r\n有时候，复制文本（尤其是代码）到 Vim，会出现格式错乱的问题。看样子，应该是自动缩进惹得祸。本文不去深究原因，直接给出解决方法。\r\n1.
  paste 模式\r\n运行如下命令，进  ..."
tags:
- Vim
- 复制
- 粘帖
- 解决办法
thumb: false
title: Vim 复制粘帖格式错乱问题的解决办法
titlepic: false
translator: ''
updated: '2012-07-25 08:21:00'
---

原文：[Vim 复制粘帖格式错乱问题的解决办法](http://www.cbug.org/2012/07/23/vim-copy-paste.html)


 


有时候，复制文本（尤其是代码）到 Vim，会出现格式错乱的问题。看样子，应该是自动缩进惹得祸。本文不去深究原因，直接给出解决方法。
1. paste 模式
-----------


运行如下命令，进入 paste 模式：


```
:set paste
```


进入 paste 模式后，按 i 键进入插入模式，然后再粘帖，文本格式不会错乱了。但粘帖后还需要按 进入普通模式并执行如下命令结束 paste 模式：


```
:set nopaste
```


显然，这样非常麻烦。下面我们进行改进。
2. 快捷键一
-------


我们可以利用设置快捷键来简化上面的两个命令。在 ~/.vimrc 中加入如下两行：


```
map  :set paste
map  :set nopaste
```


这样，在普通模式下按 F10 （你也可以用自己喜欢的按键）就会进入 paste 模式，按 i 进入插入模式后粘帖，然后按 回到普通模式，再按 F11 结束 paste 模式。
这样虽然方便了，但占用了两个按键。下面我们继续改进。
3. 快捷键二
-------


在 ~/.vimrc 中加入如下内容：


```
set pastetoggle=
```


这样就可以把上面的 F10 和 F11 合并为一个快捷键来切换 paste 模式了。
还有更好的办法么？当然！
4. Vim 寄存器一
-----------


关于 Vim 寄存器的详细信息请执行命令 “:help registers” 查看。
对于“剪切板”这个概念，Linux 下有两个东西：一个叫做选择缓冲区(X11 selection buffer)，另一个才是剪切板(clipboard)。鼠标或键盘选择内容时，内容实时进入缓冲区，然后按中键将内容插入光标所在位置；鼠标或键盘选择内容后，按Ctrl-C（或Shift-Ctrl-C）或菜单中的“复制”，内容进入剪切板，然后按Ctrl-V（或Shift-Ctrl-V）或菜单中的“粘帖”将内容插入光标所在位置。关于这两者的详细信息，请自行搜索，此处不深究。
Vim 的寄存器 "\* 对应系统缓冲区， 寄存器 "+ 对应系统剪切板。
如果你是把选择的内容（在系统缓冲区中）粘帖到 Vim ，只需在普通模式下执行如下命令：


```
"*p
```


对应的，如果你是把复制的内容（在系统剪切板中）粘帖到 Vim，只需在普通模式下执行如下命令：


```
"+p
```


怎么样？格式没有错乱了吧？
这样虽然简便很多了，但还是需要输入三个字母，并且这三个字母都得使用右手小拇指输入，甚至其中的两个字母还需要 shift 键配合！
还有更简单的办法。
5. Vim 寄存器二
-----------


在 ~/.vimrc 里加入如下内容：


```
set clipboard=unnamed
```


然后只需在普通模式下按 p 即可把系统缓冲区中的内容粘帖到 Vim 中，就像粘帖用 yy 命令得到的内容一样，并且格式不错乱。
如果把上面的一行换成如下内容：


```
set clipboard=unnamedplus
```


普通模式下按 p 粘帖的内容就是系统剪切板里的内容了。
这已经足够简便了。在搜索此问题的过程中，我还看到了另外一些办法。
6. 快捷键三
-------


在 ~/.vimrc 里加入如下内容：


```
inoremap  :setl pastegi+:setl nopastegi
```


这样，你就可以在插入模式下使用 Shift-Insert 快捷键在粘帖系统剪贴板中的内容了。
把上面一行替换成如下内容同样可以达到相同的效果：


```
inoremap  "+p`]a
```


注意，这可是在插入模式下哦！比起第 5 节提到的方法，这种方法省去了一次 按键进入普通模式和一次 i 按键重新回到插入模式。
至此，你需要做的只是：
 a. 复制你想要的内容；  
 b. 回到 Vim 并按 Shift-Insert 快捷键；  
 c. 继续编辑其他内容。

参考
--



* [Vim 复制粘贴探秘](http://www.worldhello.net/2010/12/08/2190.html)
* [Vim: Pasting from clipboard and automatically toggling :set paste](http://stackoverflow.com/questions/2555559/vim-pasting-from-clipboard-and-automatically-toggling-set-paste)
* [寄存器::Vim进阶索引[4]](http://blah.blogsome.com/2006/04/27/vim_tut_register/)