мерзкое слово diff регулярное выражение странное поведение - PullRequest
3 голосов
/ 05 октября 2019

Я использую Git для версии прозы и пытаюсь git diff --word-diff увидеть изменения в строках. Я хочу использовать результаты, сгенерированные в скрипте.

Но способ по умолчанию, который --word-diff идентифицирует слово, кажется некорректным. Итак, я экспериментировал с --word-diff-regex= опциями.

Проблема

Вот два основных недостатка, с которыми я пытаюсь разобраться:

  1. Добавленные пробелы, похоже, игнорируются. Но пробелы могут быть весьма важны, если вы пытаетесь использовать результаты программно.

    Например, возьмите этот заголовок из файла Markdown (.md):

    # Test file
    

    Теперь давайте добавим немного текста в его конец:

    # Test file in Markdown
    

    Если я запускаю git diff --word-diff на этом:

    # Test file {+in Markdown+}
    

    Но пробелдо того, как слово «в» не было включено в состав diff.

  2. Пустые строки полностью игнорируются.

    Вот стандарт git diff для содержимого файла, в котором я удалил строку, а также добавил пару новых строк - одну пустую, другую с текстом «Вот новая строка».

     This is a test file to see how word diff responds in certain situations.
    -
     I'll try removing lines and adding them to see what happens.
    
     Here's another line so we can see what happens with line removals and additions. I want to see how `git diff --word-diff` handles it all!
    +
    +Here's a new line.
    

    Новот git diff --word-diff для того же содержимого:

    This is a test file to see how word diff responds in certain situations.
    
    I'll try removing lines and adding them to see what happens.
    
    Here's another line so we can see what happens with line removals and additions. I want to see how `git diff --word-diff` handles it all!
    
    {+Here's a new line.+}
    

    Удаленные и добавленные пустые строки полностью игнорируются.

Желаемые результаты

Соединение двух примеров выше. Вот что я хотел бы увидеть:

# Test file{+ in Markdown+}

This is a test file to see how word diff responds in certain situations.
{--}
I'll try removing lines and adding them to see what happens.

Here's another line so we can see what happens with line removals and additions. I want to see how `git diff --word-diff` handles it all!
{++}
{+Here's a new line.+}

То, что я пробовал:

  • git diff --word-diff-regex='.' кажется слишком гранулированным для случаев, когда новые слова разделяют символы с существующими словами
  • git diff --word-diff-regex='[^ ]+|[ ]', кажется, решил первую проблему, но, честно говоря, я не совсем уверен, почему.
  • git diff --word-diff-regex='[^ ]+|[ ]|^$' - Я надеялся, что ^$ на конце поможетзахватывать пустые строки - но это не так, и, что еще хуже, похоже, игнорирует последующее изменение.
  • git diff --word-diff-regex='[^ ]+|[ ]|.{0}' создает ту же проблему, что и предыдущая.

Буду признателен, если кто-нибудь сможет пролить свет на то, как это сделать, или хотя бы поделиться некоторыми знаниями о том, что происходит под капотом, с --word-diff-regex.

...