Home > Blockchain >  TextMate transform to replace single character in matched repetitive group
TextMate transform to replace single character in matched repetitive group

Time:12-22

TL;DR show me a general vscode snippet to transform "/home/me/projects/project/src/Commands/Interfaces/Whatever" to "Commands\Interfaces\Whatever"

Hi all, I'm using Vscode and trying to figure out a simple transform of the file directory to insert the PHP namespace. So far i could not figure out a simple, general solution to this seemingly mundane problem:

  • Is there a way to transform PART of the TM_DIRECTORY variable in a snippet, so that every forward slash becomes a backward slash?

This seems so trivial at first, right? start from

${TM_DIRECTORY/\\//\\\\/}

Then buid up from there. Problem is, I want to catch only part of the filename, THEN transform slashes on the catched group, without resorting to a fixed/maximum number of filename components (in that case, there is an ugly, lengthy solution)

Is the following in the right direction? If so, what replacement string results in group $1 but with slashes reverted?

${TM_DIRECTORY/.*\\/src(\\/([^\\/] )) $/??????/}

Thanks in advance, an acceptable response is "there is just no way unless you relax your requirements", this is more of a theoretical question on the power of regexes.

Edit:

Kudos to @WiktorStribiżew who found the simplest solution, after I posted the question I came up with a far more complicated expression than his:

${TM_DIRECTORY/(([^\\/] )\\/?(?=.*\\/src\\/))|(\\/src\\/)|((?<=\\/src\\/.*)\\/?([^\\/] ))/${5: \\\\}$5/g}

CodePudding user response:

You can use

"${TM_DIRECTORY/^.*?[\\\\\\/]src[\\\\\\/]|([\\\\\\/])/${1: \\\\}/g}"

See the regex demo (there is an extra \ at the start of the resulting string as there is no way to introduce the conditional replacement pattern as in VS Code).

Details:

  • ^ - start of string
  • .*? - any zero or more chars other than line break chars, as few as possible
  • [\\\/] - / or \ char
  • src - the directory name up to which you need to remove the subdirs
  • [\\\/] - a / or \ char
  • | - or
  • ([\\\/]) - Group 1: a / or \ char.

The ${1: \\} replacement means we replace with \ only when Group 1 match occurs.

Note the backslashes need doubling, and g at the end replaces all occurrences.

  • Related