在Vim中粘贴时如何保持标签

时间:2012-09-25 13:55:14

标签: python vim copy-paste vi

我使用tab键在Vim中缩进我的python代码,但每当我复制并粘贴一个块时,Vim会用4个空格替换每个选项卡,这会引发IndentationError

我尝试按照相关问题的建议设置:set paste,但没有区别

其他网站建议粘贴“tabless”代码并使用可视化编辑器进行重新缩进,但是这涉及到大块的麻烦

我是否可以将任何设置应用于vim以维护复制/粘贴标签?

感谢您对此有任何帮助:)

修改

我使用标准的gnome-terminal技术(ctrl + shift + c / mouse等)在vim中复制和粘贴。

我的.vimrc是:

syntax on
set ts=4
if has("terminfo")
let &t_Co=8
let &t_Sf="\e[3%p1%dm"
let &t_Sb="\e[4%p1%dm"
else
let &t_Co=8
let &t_Sf="\e[3%dm"
let &t_Sb="\e[4%dm"
endif

我抬头看着那个 - >将制表位设置为n以进行文本输入,但不知道哪个值将维护制表符

4 个答案:

答案 0 :(得分:6)

请参阅:h tabstop了解所有选项以及它们如何相互影响。

如果您更喜欢标签,这些都是不错的设置:

set tabstop=4
set shiftwidth=4
set noexpandtab

使用这些设置,您点击<Tab>即可获得<Tab>

如果你喜欢空格,这些都是很好的设置:

set tabstop=4
set shiftwidth=4
set expandtab

使用这些设置,您点击<Tab>即可获得<Space><Space><Space><Space>

无论您选择什么,都不应使用终端键绑定进行复制/粘贴。在Vim内部,您应该使用y“拽”并使用pP“放”;可选择使用"ay / "ap之类的特定注册来对@a"+y / "+p的内容进行抽取/放置,以便将其粘贴/粘贴到/从系统剪贴板(如果您的Vim是使用剪贴板支持构建的)。

作为旁注,您应该使用设置的长格式名称,因为它们比短序列更具可读性。你未来的自我会感谢你。

答案 1 :(得分:5)

What romainl said。此外,还有一些我认为有用的其他设置。以下是我的.vimrc的摘录:

set autoindent " always set autoindenting on"
set smartindent " use smart indent if there is no indent file"
set tabstop=4 " <tab> inserts 4 spaces"
set softtabstop=4 " <BS> over an autoindent deletes 4 spaces."
set smarttab " Handle tabs more intelligently"
set expandtab " Use spaces, not tabs, for autoindent/tab key."
set shiftwidth=4 " an indent level is 4 spaces wide."
set shiftround " rounds indent to a multiple of shiftwidth"

在vim中,为每个设置输入:h <setting>以详细了解他们的操作,

答案 2 :(得分:2)

首先,确保您的缩进设置代表您喜欢的样式,正如romainl在答案中所示。

如果必须从Vim外部粘贴代码(例如,从另一个终端选择),:retab!命令可以将空格固定到Tabs;对于粘贴的文本,具有适当范围的完整命令将是

:'[,']retab!

或者,您可以尝试使用"*]p命令粘贴,该命令会自动调整缩进到光标位置(请参阅:help ]p)。

答案 3 :(得分:2)

我在中间点击粘贴到终端vim实例中。我在我的vimrc中有这个:

set tabstop=2           " (ts)
set softtabstop=2       " (sts) Turned off with 0
set shiftwidth=2        " (sw)  Used for autoindent, and << and >>
set expandtab           " (et)  Expand tabs to spaces

我跑了

:set paste
:set noexpandtab

并且vim保留了源文本中的选项卡。如果不重写我的expandtab设置,vim会自动展开源文本中的标签。