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

在Vim中,我尝试过:retab和:retab!没有运气,但我相信这些实际上是用来从制表符到空格的。

我在命令提示符下尝试了展开和取消展开,但没有任何运气。

以下是该文件:

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

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


当前回答

在GNU coreutils的shell中: unexpand -t2——first-only originalFile > newFile 解释: Unexpand:将空格转换为制表符的命令 -t2:把2个空格变成1个制表符 ——first-only:只修改行首的空白(包括混合制表符和空格),不修改行中和行尾的空白

它的倒数是expand它只需要一个简单的-i而不是-first-only, -t2不变

Johnsyweb流行的绿色检查答案是完全错误的,因为它修改了到处的空白!!

附:这篇文章的疯狂格式并不能反映内容的质量。它反映了如何stackoverflow不支持我的浏览器。谢谢你!

其他回答

Linux:使用unexpand(和expand)

这里有一个非常好的解决方案:https://stackoverflow.com/a/11094620/1115187,主要是因为它使用*nix-utilities:

Unexpand - Spaces ->选项卡 Expand - tabs ->空格

Linux:自定义脚本

我最初的回答

在。/app文件夹中的所有.py文件中替换4-空格缩进(脚本中有两个{4})的Bash代码片段(递归):

find ./app -iname '*.py' -type f \
    -exec awk -i inplace \
    '{ match($0, /^(( {4})*)(.*?)$/, arr); gsub(/ {4}/, "\t", arr[1]) }; { print arr[1] arr[3] }' {} \; 

它不会在中间或结尾修改4-空格。

在Ubuntu 16.0x和Linux Mint 18下测试

使用Vim重新标签一组文件(例如,所有的*。从2个空格到4个空格,你可以尝试从命令行:

find . -name '*.ts' -print0 | xargs -0 -n1 vim -e '+set ts=2 noet | retab! | set ts=4 et | retab | wq'

它所做的是使用find将所有匹配的文件传递给xargs (find上的-print0选项与xargs上的-0选项一起工作,以便处理名称中带有空格的文件)。

Xargs以ex模式(-e)对每个文件运行vim,执行给定的ex命令(实际上是几个命令),将现有的前导空格更改为制表符,重置制表位并将制表符更改为空格,最后保存并退出。

在ex模式下运行可以防止:Vim:警告:每个文件的输入不是来自一个终端。

简单Python脚本:

import os

SOURCE_ROOT = "ROOT DIRECTORY - WILL CONVERT ALL UNDERNEATH"

for root, dirs, files in os.walk(SOURCE_ROOT):
    for f in files:
        fpath = os.path.join(root,f)
        assert os.path.exists(fpath)
        data = open(fpath, "r").read()
        data = data.replace("    ", "\t")
        outfile = open(fpath, "w")
        outfile.write(data)
        outfile.close()

将所有空格改为制表符 : % s / \ / \ t / g

在GNU coreutils的shell中: unexpand -t2——first-only originalFile > newFile 解释: Unexpand:将空格转换为制表符的命令 -t2:把2个空格变成1个制表符 ——first-only:只修改行首的空白(包括混合制表符和空格),不修改行中和行尾的空白

它的倒数是expand它只需要一个简单的-i而不是-first-only, -t2不变

Johnsyweb流行的绿色检查答案是完全错误的,因为它修改了到处的空白!!

附:这篇文章的疯狂格式并不能反映内容的质量。它反映了如何stackoverflow不支持我的浏览器。谢谢你!