如何在 Vim 或 Linux 中将空格转换为制表符?

新手上路,请多包涵

我已经查看了有关 Stack Overflow 的几个问题,以了解如何将空格转换为制表符而没有找到我需要的内容。关于如何将制表符转换为空格似乎还有更多问题,但我正试图做相反的事情。

Vim 我尝试过 :retab:retab! 没有运气,但我相信这些实际上是为了从制表符到空格。

我在命令提示符下尝试了 expandunexpand 没有任何运气。

这是有问题的文件:

http://gdata-python-client.googlecode.com/hg-history/a9ed9edefd61a0ba0e18c43e448472051821003a/samples/docs/docs_v3_example.py

如何使用 Vim 或 shell 将 前导 空格转换为制表符?

原文由 cwd 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 717
2 个回答

Using Vim to expand all leading spaces (wider than 'tabstop' ), you were right to use retab but first ensure 'expandtab' is reset ( :verbose set ts? et? 是你的朋友)。 retab 需要一个 _范围_,所以我通常指定 % 表示“整个文件”。

 :set tabstop=2      " To match the sample file
:set noexpandtab    " Use tabs, not spaces
:%retab!            " Retabulate the whole file

在做这样的事情之前(特别是使用 Python 文件!),我通常设置 'list' ,这样我就可以 看到 空格并进行更改。

为此, 我的 .vimrc 中有以下映射:

 nnoremap    <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>

原文由 johnsyweb 发布,翻译遵循 CC BY-SA 3.0 许可协议

1 - 如果你有空格并且想要标签。

首先,您需要确定一个制表符有多少个空格。也就是说,假设您有前导 4 个空格或 8 个空格的行…比您意识到您可能希望制表符为 4 个空格。现在有了这些信息,您可以:

 :set ts=4
:set noet
:%retab!

这里有问题!这一系列命令将查找您的所有文本,而不仅仅是行首的空格。这意味着像这样的字符串: "Hey,␣this␣␣␣␣is␣4␣spaces" 将变为 "Hey,␣this⇥is␣4␣spaces" ,但不是!它是一个标签!

为了解决这个小问题,我推荐一个 search ,而不是 retab

 :%s/^\(^I*\)␣␣␣␣/\1^I/g

此搜索将在整个文件中查找以任意数量的制表符开头的任何行,后跟 4 个空格,并将其替换为找到的任何数量的制表符加一。

不幸的是,这不会立即运行!

首先,该文件将包含以空格开头的行。然后搜索将仅将前 4 个空格转换为制表符,并让以下…

您需要重复该命令。多少次?直到你得到 pattern not found 。我还想不出一种方法来自动化这个过程。但如果你这样做:

 `10@:`

你可能已经完成了。此命令重复最后一次搜索/替换 10 次。您的程序不太可能有这么多缩进。如果有,请再次重复 @@

现在,只是为了完成答案。我知道您要求相反,但您永远不知道何时需要撤消操作。

2 - 你有标签并想要空格。

首先,确定您希望将选项卡转换为多少个空格。假设您希望每个选项卡为 2 个空格。然后你做:

 :set ts=2
:set et
:%retab!

这对字符串会有同样的问题。但由于它更好的编程风格是不在字符串中使用硬制表符,所以你实际上在这里做了一件好事。如果您确实需要在字符串中使用制表符,请使用 \t

原文由 DrBeco 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题