어떻게 실행할 수 있습니까? 줄의 일부만 대체하지 마십시오.


15

나는 이와 같은 줄을 가지고있다 :

function my_function(argument, another argument, but there are spaces)

공백 문자 (인수 이름 안에)를 밑줄로 바꾸고 싶습니다. 따라서 사용하고 싶습니다 :

:s/\ /_/g

그러나 전체 줄에 적용하지 않고 커서 위치에서 시작하여 어떻게 선택할 수 있습니까? (또는 세번째 단어)?


4
정규식에서 현재 커서 위치를 설명하기 위해 atom을 사용할 수 있습니다 \%#. 따라서 다음을 사용할 수 있습니다 :s/\v(%#.*)@<= /_/g.. @<=커서 위치 다음 에 ( ) 문자가 앞에 오는 공백으로 설명 할 수 있습니다 .
— user9433424

1
당신과 Statox는 둘 다 \%#트릭을 제안했습니다. 하나를 쓰지 않으면 그의 대답을 받아 들일 것입니다 ...하지만 둘 중 하나를 좀 더 명시 적으로 설명 할 수 있습니까?
— Feffe

답변:


15

다음과 같은 솔루션을 사용할 수 있습니다.

먼저 v$커서에서 줄 끝까지 텍스트를 선택하는 데 사용 합니다. 그런 다음 다음 명령을 사용하십시오.

:s/\%V\ /_/g

는 \%V참조 시각 이전 선택 영역에서 텍스트를 변경 나타낸다 :h /\%V.

내가 당신의 모범을 보이면 :

function my_function(argument, another argument, but there are spaces)

내 커서가 40 번째 열에 있고 방금 쓴 명령을 사용하면 다음과 같이 나타납니다.

function my_function(argument, another argument,_but_there_are_spaces)

귀하의 의견에 대한 답변으로도 사용할 수 있습니다

  • \%# 커서 위치에서 일치하는
  • \%>23c 이는 23 번째 열 이후와 일치합니다.
  • \%>'m 마크의 위치와 일치하는

를 참조하십시오 :h /\%#, :h /\%>c하고 :h /\%>'m.

@ User9433424는 \%#자신의 의견 에 사용할 수있는 방법을 제공 했습니다. 마크가있는 패턴의 경우 재치로 설정 ma하고 다음을 사용할 수 있습니다.

:s/\%>'a /_/g

@ User9433424가 제공 한 패턴에 대한 설명은 다음과 같습니다.

:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores

당신이보고 싶은 것 :h \v하고:h /\@<=


잘 작동합니다! 하지만 저는 시각적 인 선택에 익숙하지 않고 전체 프로세스가 약간 "무거운 것"으로 보입니다. 더 빠른 것이있을 수 있다고 생각하십니까?
— Feffe

예, 답변을 업데이트하겠습니다 :)
— statox

User9433424가 바로 전에 힌트를 주었지만, 대답하면 괜찮다면 대답을 받아 들일 것입니다. 그가 사용하는 정규 표현식 패턴을 좀 더 설명해 주시겠습니까? 나는 아직도 이것으로 어려움을 겪고있다 ...
— Feffe

가능한 한 명확하게 답변을 만들려고했지만 @ User9433424가 자신의 답변을 쓰는 ​​경우 주저하지 말고 수락하십시오.
— statox

1
정규 표현식에 대한 아주 좋은 설명, 감사합니다! 답변을 수락 한 사람에 대한 귀하의 의견에 감사드립니다 :)
— Feffe

5

뒤에 보이기 ( :h \@<=)를 사용하여 앞에 '(')가 있고 단어의 끝 경계 ( :h \>)가 있는지 확인하여 대체가 원하는 위치에 있는지 확인할 수 있습니다.

따라서 텍스트와 함께 :

function my_function(argument, another argument, but there are spaces)

명령을 실행 :

:s/\((.*\)\@<=\> /_/g

생산할 것이다 :

function my_function(argument, another_argument, but_there_are_spaces)

대체에 항상 알려진 시작점이 있으면 매번 커서를 배치하는 것보다 쉬울 수 있습니다.


2
대체가 항상 알려진 출발점을 가지고있는 것은 아닙니다. 그것은 단지 ... 내가 만든 일련의 이상한 오타를 바로 잡는 것입니다. 그럼에도 불구하고 귀하의 답변은 흥미 롭습니다. 감사합니다!
— Feffe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.