Vim 정규 표현식 리터럴을 다른 마법 모드로 변환하는 방법이 있습니까?


14

문자열 리터럴에 magic Vim 정규식이 있으면 전체 정규식을 다른 마법 모드를 사용하는 대체 표현으로 변환하는 방법이 있습니까? 그래서 해당 정규식을 소스 코드에 붙여 넣을 수 있습니까?

예를 들어,이 마법 모드 패턴을 변환하려면 다음을 수행하십시오.

'\m-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>'

매우 읽기 쉬운 모드로 만들기 :

'\v-=<\d+L=>|0[xX][0-9a-fA-F]+>'

나는 종종 그것을 손으로 변환하려고 실수를합니다.


나도 몰라 항상 작은 따옴표로 묶을 계획입니까?
FDinoff

아마도 이것이 출발점 될 수 있습니다. 그러나 나는 거의 테스트하지 않았습니다.
Christian Brabandt

질문 제목에 관하여, 그것은 어렵다, 매우 마술 정규식 [0-9]+을 마술이 아닌 것으로 변환하는 것에 대해 생각하십시오 ... ;-)
Kent

그래서 나는 그것을 위해 플러그인 을 만들려고 노력 했지만, 그것은 효과가 있지만 완벽하지는 않습니다. 또한 참조를 위해 루비 / 펄 정규식을 Vim 정규식으로 변환하는 플러그인이 있습니다. 코드는 ... 거대합니다 : eregex
statox

1
@ MuMind 나는 당신이 찾고있는 비교 유형을 이해하지 못한다고 생각합니다 :-) 그리고 플러그인의 개선에 대해 github을 사용하여 버그를 알리거나 풀 요청을 제안하는 것을 망설이지 말고, 나는 기꺼이 그것을 볼 것이다!
statox

답변:


3

명령

:s\v\\(\W)/\1/

대부분의 패턴을 \v모드 로 변환하기에 충분해야합니다 . 그것은 lil ' \m마커를 바꾸지 않을 것입니다 -그리고 하나의 대체로는 불가능한 내 지식으로. 수동으로 입력 할 수있을 정도로 짧으면 :s/\\m/\\v모드 마커를 사용하면됩니다.

\W대한 속기 [^a-zA-Z0-9_]하는 매우 마법 모드가 작동 문자 (부정) 세트입니다. 이 문자 중 하나 바로 앞에있는 백 슬래시 만 삭제합니다. 알려진 문제 : 이 교체 할 \\에 내부 문자열을 \. 당신은 대체 할 수 \W와 함께 \c[^a-z0-9\_]이 문제를 완화하기 위해,하지만 엉망 여전히거야 정규식 리터럴 당신이 그것을 여러 번 실행하고 또한 (포함 이상 이스케이프 문자열에 실패 할 경우 \\\\, 예를 들어)

업데이트 : 원래 질문으로 \v다시 변환 해야하는지 확실하지 않지만 \m명령은 다음과 같습니다.

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.