: g / ^ / norm 및 : % norm을 통한 라인 참조 차이 이해


8

다음과 같은 매우 간단한 파일이 있다고 가정 해 봅시다.

a
b
c
d
e

각 줄 뒤에 빈 줄을 추가하기로 결정했습니다. 몇 가지 다른 방법이 즉시 내 마음으로 뛰어 넘습니다. 우리는 단지 그렇게 할 수 있습니다 (따라서 실패를 받아들입니다). 매크로를 기록하고 qqo<ESC>jq여러 번 반복 할 수 있습니다.

당시 다른 두 가지 방법이 더 분명해 보였습니다.

먼저 각 줄마다 :norm명령 o을 내릴 것이라고 생각했습니다 . 그래서 나는 달린다 :%norm o. 그러나 실제로 발생하는 것은 5 개의 빈 줄과 그 뒤에 분리되지 않은 줄이 오는 것입니다. 나는 이것을 %normvim이 실제로이 다섯 줄 파일의 처음 다섯 줄에서 다음과 같은 명령을 내리는 메시지를 선택 한다는 것을 의미하는 것으로 해석한다 . 이 o명령은 새로운 줄을 만들고 vim은 실제로 다른 식별자가 아니라 줄 번호로 참조한다는 의미에서 "dumb"입니다.

글쎄, 나는 당황했다. 확실한. 위의 방법을 작동시킬 수 있는지 확인하기 위해 몇 가지 다른 것을 시도했지만 슬프게도 할 수 없었습니다. 호기심으로, 나는 다른 가장 좋아하는 대량 적용 방법을 시도했습니다. 이것은 나를 시도하게했다 :g/^/norm o. 놀랍게도, 이것은 잘 작동합니다! 그래서 내 눈에 vim은 위와 같은 방식으로 "멍청한"것이 아니며 단순한 행 번호 이상의 행을 참조합니다.

정확히 무슨 일이야?


2
참고 사항 : 다음과 같이 :%s/$/\r/또는 다음과 같이 할 수도 있습니다 :%s/\n/\r\r/. 테이크 아웃은 개행을와 일치시킬 수 \n있지만 \r대체 값 으로 작성해야 합니다.
lcd047

답변:


9

음, %줄임말입니다 1,$(첫 번째 줄부터 마지막 ​​줄까지). 보낸 사람 :he :%:

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number
        .               the current line                          :.
        $               the last line in the file                 :$
        %               equal to 1,$ (the entire file)            :%

그리고위한 :global:

The global commands work by first scanning through the [range] lines and
marking each line where a match occurs (for a multi-line pattern, only the
start of the match matters).
In a second scan the [cmd] is executed for each marked line with its line
number prepended.  For ":v" and ":g!" the command is executed for each not
marked line.  If a line is deleted its mark disappears.

따라서 첫 번째 경우는 목록을 수정하는 동안 목록을 탐색하는 것과 같으므로 목록 요소의 카운터가 유효하지 않게됩니다. 두 번째 경우에는 한 번에 대상으로 지정할 요소를 표시하므로 두 번째 단계에서 목록이 수정 되더라도 작업 할 요소를 여전히 알 수 있습니다.


아, 글로벌 도움말 파일에도 있습니다. 내가 얼마나 바보 야. 감사합니다
davidlowryduda

남자- g 과잉 미친 유용합니다. 내가 파워 유저로 평균 VI의 사용자의 이동에 더 많은 시간을 할애 해
javadba의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.