是否存在解决方案范围内的Untabify整个文件的方法

时间:2012-08-07 12:33:16

标签: visual-studio-2010 refactoring

我已下载了一个项目,它全部使用Tab,但我总是使用Space。有一个选项“Edit-> Advanced-> Untabify”但是那时我必须逐个选择文件并为所有这些文件执行此操作,所以我想知道是否有一种方法可以将thzt应用于项目中的整个文件。我正在使用C#和VS2010 Pro。 我也安装了Resharper,以防它有一些可以提供帮助的东西。

2 个答案:

答案 0 :(得分:13)

最好的办法是使用文件中的查找和替换(ctrl-shift-h)。打开正则表达式,搜索\ t并用空格替换。您可以将文件过滤器设置为* .cs或您需要清理的任何文件类型。

答案 1 :(得分:0)

我创建了一个简单的控制台应用程序,该应用程序取消了基本目录中所有文件的列表。

https://github.com/idenardi/TabsToSpace

代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace TabToSpaces
{
    class Program
    {
        static void Main(string[] args)
        {
            var root = args[0];
            var filePaths = Directory.GetFiles(root, "*.cs", SearchOption.AllDirectories);

            int updated = 0;
            foreach (var path in filePaths)
            {
                var content = File.ReadAllLines(path);
                string[] newfile = new string[content.Length];

                int i = 0;
                var bChanged = false;

                foreach (var line in content)
                {
                    newfile[i] = ReplaceTabs(line, out var bChangedLine);
                    i++;

                    if (bChangedLine)
                        bChanged = true;
                }

                if (bChanged)
                {
                    ++updated;
                    Console.WriteLine("fixing " + path);
                    File.WriteAllLines(path, newfile, System.Text.Encoding.UTF8);
                }
            }

            Console.WriteLine("fixed {0} files", updated);
            var x = Console.ReadKey();
        }


        public static string ReplaceTabs(string line, out bool bChanged)
        {
            bChanged = false;
            var i = 0;
            var lstIndex = new List<int>();

            foreach(char c in line)
            {
                if (c == ' ')
                    continue;
                else if (c == '\t')
                    lstIndex.Add(i);
                else
                    break;

                i++;
            }

            var lstIndexOrdered = lstIndex.OrderByDescending(c => c);
            foreach (var index in lstIndexOrdered)
            {
                line = line.Remove(index, 1).Insert(index, "    ");
                bChanged = true;
            }

            return line;
        }
    }
}

要进行转换,您需要调用此应用程序并将基本目录作为第一个参数:

TabToSpace.exe C:\ Projects \ MyBaseDirectory

相关问题