Vim 配置以及 Vim 与 Notepad++ 之间的制表符不一致问题

通用配置

可以通过运行以下命令安装一套完整的 Vim 配置:

git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_awesome_vimrc.sh

如果想添加自定义配置,请编辑:

vim ~/.vim_runtime/my_configs.vim

用于保持缩进一致的基础 Vim 配置如下:

set shiftwidth=4             " used by >>, << and tab.
set tabstop=4                " number of space characters used when displaying TAB
set expandtab                " replace TAB by spaces
set softtabstop=4            " will erase 4 spaces at once when using BS in the beginning of lines only

这些选项的含义是:

  • shiftwidth=4:使用 >><< 或自动缩进等命令缩进时使用四个空格。
  • tabstop=4:将一个实际的制表符显示为四列宽。
  • expandtab:按下 Tab 键时插入空格,而不是插入真正的制表符。
  • softtabstop=4:让编辑体验表现为一个缩进层级等于四个空格,包括用 Backspace 删除缩进时也是如此。

如果这是一个已有文件,并且想按照当前设置规范化缩进,可以在 Vim 中运行:

:%retab

启用 expandtab 时,这会把制表符转换为空格。在大型文件上使用之前,最好事后检查 diff,因为缩进变更在版本控制中可能会产生大量噪声。

Python

对于 Python,四个空格是标准缩进宽度。同样的设置很适合:

set shiftwidth=4
set tabstop=4
set expandtab
set softtabstop=4

也可以通过添加 autocmd,让这些设置只应用于 Python 文件:

autocmd FileType python setlocal shiftwidth=4 tabstop=4 expandtab softtabstop=4

使用 setlocal 会把设置限制在当前缓冲区内,因此不会意外影响其他文件类型。

C

C 项目可能使用制表符、空格,或项目特定的混合方式。转换缩进之前,应先检查项目采用的风格。

对于使用空格的四空格 C 风格:

autocmd FileType c setlocal shiftwidth=4 tabstop=4 expandtab softtabstop=4

对于基于制表符的 C 风格,并且一个制表符显示为八列:

autocmd FileType c setlocal shiftwidth=8 tabstop=8 noexpandtab softtabstop=8

重点是让 Vim 的缩进设置与项目现有风格保持一致。

Vim 与 Notepad++ 的不一致

Vim 和 Notepad++ 之间常见的不一致,通常来自对制表符的不同处理。一个编辑器可能把真正的制表符显示为四列,而另一个编辑器显示为八列。这样同一个文件可能在一个编辑器中看起来对齐,在另一个编辑器中却是错乱的。

要在 Vim 中检查文件是否包含真正的制表符,可以运行:

:set list

要再次隐藏标记:

:set nolist

如果文件包含八个空格组成的连续空格组,并且你想把每组替换成四个空格,可以使用:

:%s/        /    /g

该命令会在整个文件中把八个实际空格替换为四个实际空格。它不会替换制表符。如果文件包含真正的制表符,而目标是按照当前 Vim 缩进设置进行转换,请使用:

:%retab

一个实用工作流是:

:set tabstop=4 shiftwidth=4 expandtab softtabstop=4
:%retab
:w

然后在 Notepad++ 中重新打开文件,并将其制表符宽度配置为与项目风格一致。保持一致比具体数字更重要,因此应先选定一种缩进规则,并在用于编辑该文件的每个编辑器中应用它。

Leave a Reply