2013-04-03 7 views
2

5 줄의 텍스트가 있다고 가정하면, vim이 각 줄을 처리하도록 명령을 입력하면 Vim은 텍스트를 한 줄씩, 첫 줄, 두 줄, ... 마지막 줄까지 처리합니다. Vim이 내 텍스트를 역순으로 처리하도록하고 싶습니다. 마지막 줄은 처음으로, 그 다음은 4 줄, 마지막 줄은 첫 줄입니다.Vim이 내 명령을 역방향으로 처리하는 방법은 무엇입니까?

왜 내가 이것을 필요로합니까? 나는 3 문자가 포함 된 라인에서 줄 바꿈 기호 (\ n을)를 제거하려면 다음 텍스트를

1234567890 
abc 
123 
def 
1234567890 
123456789 

있습니다. 이렇게 처리 한 후, 나는 다음과 같은 텍스트

1234567890 
abc123def1234567890 
123456789 

그것은 케이크 한 조각을 것 같다, 나는 다음과 같은 명령을 사용하여 얻을 것이다

:%s/\v(^\w{3})\n/\1/ 

하지만

1234567890 
abc123 
def1234567890 
1234567890 

왜 뭐가? vim이 두 번째 줄에서 \ n을 먼저 제거했다면이 줄에 abc123이라는 텍스트가있는 것 같습니다. 이제 vim은 123자를 제거하지 않을 것입니다. 이제는 3 자이 아니기 때문에 vim이 다음 줄 def를 처리하고 \ n을 제거합니다. 그게 내가 얻은 결과 야.

vim이 앞에서 뒤로 처리 할 수있는 경우에는 발생하지 않으며 원하는 결과를 얻을 수 있습니다.

나는 다른 방법으로 예상되는 결과를 얻을 수 있습니다. 가능한지 여부를 알고 싶습니다.

답변

2

명시 루프 거꾸로, 각 라인에서 명령을 실행한다. 나는 :join 여기에 대신 줄 바꿈과 :substitute을 사용했습니다 :

:for i in range(line("'>"), line("'<"), -1)| silent execute i . 'g/^\w\{3}$/join!' | endfor 
+0

이것은 gVim에서 작동하지만 Vim에서는 작동하지 않습니다 – zdd

+1

응? 나는 Vim에서의 성공적인 사용을 막을만한 것을 아무것도 보지 못했다. –

2

펄을 사용하여 달성 될 수있다 : 행 범위 (예컨대 시각 선택된 것들) 위에

while (<>) { 
    chomp if (/^...$/); 
    print; 
} 
+0

저는 Vim 만 사용하고 싶지 않습니다. – zdd

1

을이 라인을 결합하기 위하여 :global 명령을 사용하는 것이 더 쉽습니다이 경우.

명령 gJ은 공백을 삽입하지 않고 현재 행을 다음 행과 조인합니다. 위의 글로벌 명령은 각 행에 세 문자 만 들어있는 gJ을 호출합니다. 작업을 수행하기 전에 모든 일치 항목을 먼저 표시하여 루핑 문제를 피할 수 있습니다.

+0

이것이 작동하지 않으면 내 명령과 같은 결과를 얻습니다. – zdd

1

이 라인은 당신이 원하는 일을해야합니다

:%s/\v(\_^\w{3}\n)+/\=substitute(submatch(0),"\n","","g")/ 

것은 당신이 그것을 외부 명령을 간단하게, 예를 들어, 작업을 수행하려는 경우 awk, 다음과 같이 할 수 있습니다 :

%!awk '{printf "\%s", length($0)==3? $0:$0"\n"}' 
관련 문제