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


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.