Подтвердить что ты не робот

Инструмент/трюк для замены вкладок во всех файлах всего VS-решения

Мое решение (проект 30+) немного бесполезно, когда речь идет о смешивании вкладок и пробелов, и я хочу исправить это одним простым шагом.

Кто-нибудь знает трюк/инструмент, чтобы сделать это за один шаг для всего решения?

EDIT: Не совсем то, что я имел в виду. Я хочу, чтобы документы были хорошо отформатированы. Просто найти/заменить не будет.. документы все равно будут беспорядок. Мне нужно что-то вроде команды Format → Advanced → Format Document

4b9b3361

Ответ 1

Если ваши файлы содержат пробелы в виде вкладок равной ширины по всему решению (т.е. 4 пробела на вкладку), вы должны использовать простой инструмент VS Quick replace. Чтобы следовать правилам форматирования StyleCop, вы должны использовать пробелы вместо вкладок, поэтому перейдите к Quick replace (CTRL-h), выберите Use wildcard, а затем в поле Find what вы можете использовать символ \t, заменив он имеет 4 пробела для всего решения (поле Look in).

Но, если ваши файлы решений содержат вкладки из пробелов различной ширины или вы хотите применить форматирование однострочного стиля, то вам определенно следует использовать Resharper для переформатирования кода. Эта функция называется Очистка кода. Чтобы применить code cleanup к целому решению или выбранному проекту, перейдите в проводник решений и выберите Cleanup code в контекстном меню. Но перед тем, как начать переформатирование всего решения, попробуйте и настройте его в одном файле, в настройках Resharper есть много вариантов.

Ответ 2

там вы идете:

using System;
using System.IO;

class _Runner {
  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.ReadAllText(path);
      var replaced = content.Replace("    ", "\t");
      if (replaced == content) { 
        continue;
      }

      ++updated;
      Console.WriteLine("fixing " + path);
      File.WriteAllText(path, replaced);
    }

    Console.WriteLine("fixed {0} files", updated);  
  }
}

Сохранить как spaces-to-tabs.cs и запустить:

C:>c:\Windows\Microsoft.NET\Framework\v3.5\csc spaces-to-tab.cs
C:>spaces-to-tabs.exe C:\path\to\your\solution

Ответ 3

Я держу каталог инструментов unix на моем пути при работе в Windows, для таких чрезвычайных ситуаций. Например, это заменит все вкладки четырьмя пробелами в любых .cs файлах в каталоге c:\myproject или в его подкаталогах.

find c:\myproject -name *.cs -exec sed -i -e "\"s/\t/    /g\"" {} ";"

Ответ 4

Простым и быстрым способом является открытие файла в блокноте ++ и его замена вручную (включение "показать все символы" и вкладки будут выделены) или заменить его автоматически (нужно играть с "настройками" )

Ответ 5

Не идеальное решение, но расширение "Fix Mixed Tabs" - огромная помощь https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.FixMixedTabs

В основном, когда вы открываете файл с смешанными пробелами/пробелами пробелов, он отображает панель инструментов в верхней части файла, чтобы вы могли нормализовать ее.

Ответ 6

ctrl-h, установите "Искать в:" на "полное решение"

Также вы можете записать макрос.

Ответ 7

Используя ту же логику, предложенную Кеном Эгози, здесь приведен код для очистки только начальной части каждой строки:

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);
                }
            }

            Console.WriteLine("fixed {0} files", updated);
        }


        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;
        }
    }
}