将代码粘贴到vim时如何保持代码的原始来源格式?


37

当我从网页中复制一些代码并将其粘贴到VIM时,我发现它变成了像梯子一样的混乱样式,如下所示

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

由于它经常乱七八糟,所以我认为我的问题可能.vimrc如下:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

通常我会在VIM中编写python,我们将不胜感激。


1
谢谢。这让我很生气,多年以来,我从未无所事事地问任何人。+1。
DevSolar 2010年

Answers:


50

在执行此操作之前:

:set paste

然后:

:set nopaste

不需要gvim; 粘贴时会自动打开和关闭这些功能。
本杰明·班尼尔

知道为什么吗?
内森·费尔曼

1
只是猜测:纯vim仅是命令行,并不“了解”剪贴板。它以“粘贴”作为输入字符序列,并应用自动缩进。支持GUI的gvim可能“知道”传入的数据来自剪贴板,因此为此目的禁用了自动缩进。
DevSolar 2010年

没错 终端将“粘贴”操作视为原始字符输入。
伊格纳西奥·巴斯克斯

这并不是纯粹的vim问题-您可以在命令提示符下粘贴到旧的DOS编辑器中获得类似的效果。Windows 7 64位似乎缺少该程序-大概是因为它确实是一个旧的16位DOS应用程序,因此不值得进行更新的麻烦。但是,它在Windows XP中,并且粘贴到(1)的过程非常缓慢,逐个字符地执行输入,而(2)则造成了混乱。
2012年

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

切换自动缩进以粘贴代码

背景

如果使用Vim命令粘贴文本,则不会发生任何意外情况。仅当从另一个应用程序粘贴时才出现此问题,并且仅当您未使用Vim的GUI版本时才出现。在Vim的控制台或终端版本中,没有标准的过程可以粘贴其他应用程序中的文本。相反,终端可以通过将文本插入键盘缓冲区来模拟粘贴,因此Vim认为文本已由用户键入。每行结束后,Vim可能会移动光标,因此下一行以与最后一行相同的缩进开始。但是,这将更改已粘贴文本中的缩进。

粘贴切换

将以下内容放入vimrc中(更改为所需的键):

set pastetoggle=<F2>

要从另一个应用程序粘贴:

  • 开始插入模式。
  • 按F2(启用“粘贴”选项)。
  • 使用终端从剪贴板粘贴文本。
  • 按F2(关闭“粘贴”选项)。

然后,将保留粘贴文本的现有缩进。

您不必首先启动插入模式,但是如果您处于正常模式并且具有F2的映射,则将应用该映射,并且“ pastetoggle”功能将无法运行。

有些人喜欢通过vimrc的以下替代方法在状态行中显示视觉反馈:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

第一行设置了一个映射,以便在正常模式下按F2键将反转“粘贴”选项,然后显示该选项的值。第二行允许您在插入模式下按F2键来打开和关闭“粘贴”。第三行可以显示在插入模式下是否打开“粘贴”功能。


1
+1为热键解决方案。对于已经将F键映射到其他事物(例如我)的VIM中不太稳定的公司(<C-F2>)应为Ctrl-F2 ...
DevSolar 2010年


为什么不仅仅映射粘贴键以自动执行此操作(例如<S-Insert>或<Ctrl + V>)及其原始功能?或者,编写一个在几秒钟内将多个输入字符写入缓冲区时禁用粘贴的功能,这只是一个主意,当然,对我来说,我几乎将所有键都映射到了其他东西,所以很痛苦,我什至有一个键盘,它带有12个F键和+ 15个其他F键(G键),并带有三个级别,这仍然不够:)但这仅是我。唯一的问题是,右键单击菜单,没有发送任何esc seqs来表示开始粘贴操作……
osirisgothra,2014年

2

是自动缩进让您感到困惑。

set autoindent
set smartindent

剪切和粘贴代码时,请尝试禁用它们,然后在完成后再次启用它们。


-2

实现这一目标所需的最低努力是(可以放入.vimrc):

:set paste

然后粘贴您的代码。


3
'paste'选项从未打算永久设置。它禁用了许多功能,包括映射和缩写。此外,先前的答案已经涵盖了该'paste'选项。
Heptite '16

2
欢迎来到超级用户!这将复制现有答案,并且不添加任何新内容。除非您确实有新的贡献,否则请不要发布答案。
Toby Speight,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.