Замена многострочного регулярного выражения с помощью Autohotkey

Не могу понять правильное регулярное выражение!

МОЯ ЦЕЛЬ

  • добавить по 2 пробела в каждую строку выделенного блока текста

МОЙ КОНТЕКСТ

  • некоторым инструментам уценки, которые я использовал, нужно 2 пробела в конце каждой строки для правильного управления списками и т. д.
  • если файл редактируется несколько раз, я не хочу, чтобы строки заканчивались 4+ пробелами
  • блок текста может быть строкой, абзацем, всем содержимым файла, как показано в редакторе
  • У меня есть какой-то макрос в Notepad ++, который помогает, но я хочу сделать то же самое с Autohotkey, чтобы он не зависел от редактора.

МОЙ ПРИМЕР

----

# 2020-03-17

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.

In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,

МОЙ СНИППЕТ ТАК ДАЛЕКО

; CTL+SHIFT+F12
^+F12::
    Clipboard = ; Empty the clipboard so that ClipWait has something to detect
    SendInput, ^c ; Copy selected text
    ClipWait
    OutputText := ""
    Loop, parse, Clipboard, `n, `r
    {
        OutputText .= RegExReplace(A_LoopField,"m)^(.*) *$","$1  `r`n")
    }    
    SendRaw % OutputText
return

МОЯ ПРОБЛЕМА

Между символом, игнорируемым при зацикливании, тем, что я пытаюсь сопоставить, и тем, чем я пытаюсь заменить группу, я получаю гораздо больше строк и пробелов, чем необходимо.

ТЕКУЩИЙ ВЫХОД

----





    # 2020-03-17





        Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.





            Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.





                In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,





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

----  

# 2020-03-17  

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.  

Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.  

In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,  


person projetnumero9    schedule 17.03.2020    source источник
comment
Я не вижу проблемы, за исключением, может быть, немного глупого подхода. После тестирования вашего кода я, кажется, получил желаемый результат: два пробела и CR + LR в конце каждой строки. Хотя я действительно не смог понять ваше описание проблемы. Не могли бы вы попытаться лучше описать проблему и включить пример ввода в паре с желаемым выводом.   -  person 0x464e    schedule 18.03.2020
comment
Я был бы открыт для другого подхода к достижению моей цели, моим предпочтительным инструментом в данном случае является AHK.   -  person projetnumero9    schedule 18.03.2020


Ответы (1)


Вы получаете слишком много строк в выводе, потому что команда send не работает из-за возврата каретки, который в любом случае там не нужен. Я действительно не знаю, почему это происходит, и меня не беспокоит, чтобы выяснить, почему, поскольку подход в любом случае не хорош.
А также ваш отступ портится, потому что ваш текстовый редактор автоматически добавляет отступ на основе на предыдущей строке.

Но в любом случае отправка такого (длинного) ввода никогда не является хорошей идеей.
Воспользуйтесь буфером обмена и просто отправьте ctrl + v, чтобы мгновенно и надежно вставить текст.
Вот пример этого в другом направлении чтобы добавить пробелы в конце:

inp := "
(
----

# 2020-03-17

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.

In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
)"

Loop, Parse, inp, `n, `r
    OutputText .= (A_LoopField = "" ? "" : RTrim(A_LoopField) "  ") "`n"
Clipboard := OutputText
SendInput, ^v

Тернарный A_LoopField = "" ? "" : RTrim(A_LoopField) " " возвращает истину, если строка была пустой, а затем два пробела не добавлялись в конце.
Я думаю, что вы поступали именно так.
И _ 3_ используется для удаления любых конечных пробелов (или табуляций) в конце, поэтому мы обязательно останемся только два, которые мы хотим.
И, конечно же, в конце любой строки мы добавляем один перевод строки `n.

Кроме того, ваш подход Regex был просто прекрасен, и сначала мне это просто казалось неуместным, но что ж, вот еще один способ. И я думаю, это было бы более эффективно, хотя вам придется работать с очень большими входами и / или медленным оборудованием, чтобы это имело какое-либо значимое значение, ха-ха.

person 0x464e    schedule 19.03.2020
comment
Спасибо за уточнения и исправления, снайпер работает как надо. - person projetnumero9; 20.03.2020