user15964
user15964

Reputation: 2639

How to use regex to indent code in notepad++

for example I have the following code

Module MPI
    Use MPI
    !
! MPI info
    If (true) Then
        Print *, ''
! empty line 1
! empty line 2
    End If
    Integer ithread, nthread, ierr
End Module MPI

The lines start with ! sign which is comment lines in fortran. I want those comment lines have the same indent as their previous line indent.

That is I want this format

Module MPI
    Use MPI
    !
    ! MPI info
    If (true) Then
        Print *, ''
        ! empty line 1
        ! empty line 2
    End If
    Integer ithread, nthread, ierr
End Module MPI

I want to do this in notepad++ using regex. But if there are better choice feel free to answer.

Here is what I have tried: replace ^(\s*)(.*?\r\n)\s*\! as $1$2$1!. However it produce

Module MPI
    Use MPI
    !
! MPI info
    If (true) Then
        Print *, ''
        ! empty line 1
! empty line 2
    End If
    Integer ithread, nthread, ierr
End Module MPI

There is still two lines not right. It seems that though the pattern ^(\s*)(.*?\r\n)\s*\! matches this line, however, it just skip it for the regex engine already matched previous lines.

My question is how to solve this indent problem with regex?

Upvotes: 0

Views: 815

Answers (2)

logi-kal
logi-kal

Reputation: 7880

Since the engine is already passed on a comment line to indent it, I think it is impossible to use the same entire edited line for the next match to get the number of spaces. So I think you have to repeat the same replacement more times. Try with:

^(\s*)([^!\s].*?\r\n(\1\!.*?\r\n)*)\s*\!

always replacing it with $1$2$1!.

Like I said in the comment, if you have at most N consecutive comment lines, you will click on the "replace all" button N times

Upvotes: 1

AdrianHHH
AdrianHHH

Reputation: 14038

Using the search text ^( +)(.*\R)(!) and the replace text \1\2\1\3 then clicking on "Replace all" twice does what is wanted on the sample text. I cannot see a way of doing this in one pass.

The expression looks for a line with leading spaces followed by a line starting with a !. The capture groups are the leading spaces in \1, the rest of that line including the newline in \2 and the leading ! in \3. The replacement just assembles the captures in the right order. Note that you could omit the capture group around the ! and just have an explicit `! in the replacement, but I like to use captures in such contexts as they often allow for shorter replacements (although not in this case) and easier enhancements.

Upvotes: 3

Related Questions