如何在Vim中粘贴文本时保留选项卡

12
我在Vim中使用Tab键来缩进Python代码。但是每当我复制和粘贴一个块时,Vim都会用四个空格替换每个制表符,这会导致“IndentationError”错误。
我尝试了设置:set paste,就像相关问题中建议的那样,但没有任何改变。
其他网站建议粘贴“没有Tab”的代码,并使用可视化编辑器重新缩进,但是对于大块代码来说这很麻烦。
是否有任何设置可以应用于Vim以在复制/粘贴过程中保留制表符?
谢谢任何帮助 :)
编辑:
我正在使用标准的gnome-terminal技术(ctrl + shift + c / 鼠标等)在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

我查了一下 ts -> Sets tab stops to n for text input 的含义,但不知道什么值可以保留制表符。


你是在vim内部粘贴,还是从vim粘贴到另一个程序中,或者从另一个程序粘贴到vim中? - Daniel Roseman
你的缩进设置是什么?tabstopexpandtabshiftwidthshiftroundautoindentcopyindent - romainl
3
实际上,使用4个空格缩进是推荐的方法。 - Winston Ewert
有没有一种设置可以将我的制表键解释为四个空格?我不喜欢每次需要缩进时都要敲击空格键的想法。 - Awalias
@WinstonEwert 哇,你的评论后没有开始战争,很奇怪... - Aus
显示剩余3条评论
4个回答

8

有关所有选项及其相互作用,请参见 :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进行"yank"操作,用pP进行"put"操作;可以选择使用特定的寄存器,如"ay/"ap来从内容@a中进行yank/put操作,或使用"+y/"+p来进行系统剪贴板的yank/paste操作(如果您的Vim支持剪贴板)。顺便说一句,您应该使用长格式名称设置,因为它们比短格式易读。您未来的自己会感谢您的。

6

我正在一个终端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会自动展开源文本中的制表符。


5

romainl所说的。另外,还有一些我觉得有用的设置。以下是我.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
首先,请确保您的缩进设置符合您的首选样式,如 romainl 在他的答案中所示。
如果您必须从 Vim 外部粘贴代码(例如从另一个终端的选择),则 :retab! 命令可以修复空格到制表符;对于粘贴的文本,完整的命令以及适当的范围为:
:'[,']retab!

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接