UFO ET IT

vim — 파일에서 현재 버퍼로 줄 범위를 읽는 방법

ufoet 2021. 1. 17. 11:37
반응형

vim — 파일에서 현재 버퍼로 줄 범위를 읽는 방법


foo.c 파일에서 현재 버퍼로 n1-> n2 줄을 읽고 싶습니다.

나는 시도했다 : 147,227r /path/to/foo/foo.c

하지만 "E16 : 유효하지 않은 범위"라는 메시지가 표시되지만 foo.c에 1000 개 이상의 행이 포함되어 있다고 확신합니다.


:r! sed -n 147,227p /path/to/foo/foo.c

sed와 같은 외부 도구를 사용하지 않고도 순수한 Vimscript에서 할 수 있습니다.

:put =readfile('/path/to/foo/foo.c')[146:226]

배열은 0부터 시작하고 줄 번호는 1부터 시작하므로 줄 번호에서 1줄여야 합니다 .

단점 :이 솔루션은 허용 된 답변보다 7 자 더 길며 다른 파일의 크기에 비해 일시적으로 메모리를 소모합니다.


{range}는 소스 파일의 행 범위가 아니라 현재 파일의 대상을 나타냅니다.

약간의 실험 후

:147,227r /path/to/foo/foo.c

이 파일에서 227 행 뒤에 내용을 삽입하는/path/to/foo/foo.c 것을 의미 합니다. 즉 : 147을 무시합니다.


게시 된 다른 솔루션은 특정 라인 번호에 적합합니다. 다른 파일의 맨 위 또는 맨 아래에서 읽으려는 경우가 종종 있습니다. 이 경우 머리 또는 꼬리의 출력을 읽는 것이 매우 빠릅니다. 예를 들면-

:r !head -20 xyz.xml

xyz.xml에서 커서가있는 현재 버퍼로 처음 20 줄을 읽습니다.

:r !tail -10 xyz.xml 

xyz.xml에서 커서가있는 현재 버퍼로 마지막 10 줄을 읽습니다.

head 및 tail 명령은 매우 빠르므로 이들을 결합하는 것조차 매우 큰 파일에 대한 다른 접근 방식보다 훨씬 빠를 수 있습니다.

:r !head -700030 xyz.xml| tail -30

xyz.xml 파일에서 현재 버퍼로 700000에서 700030까지의 줄 번호를 읽습니다.

이 작업은 상당히 큰 파일의 경우에도 즉시 완료됩니다.


다음을 수행해야합니다.

:r /path/to/foo/foo.c
:d 228,$
:d 1,146

세 단계이지만 완료됩니다 ...


내 코드 프로젝트에서이 작업을 수행해야했고 다음과 같이했습니다.

열린 버퍼에서 /path/to/foo/foo.c:

:147,227w export.txt

버퍼에서 나는 다음과 같이 일하고 있습니다.

:r export.txt

내 책에서 훨씬 더 쉽게 ... 두 파일을 모두 열어야하지만, 한 세트의 행을 가져 오는 경우 일반적으로 두 파일을 모두 여는 것이 일반적입니다. 이 방법은 더 일반적이고 기억하기 쉽습니다 g/<search_criteria/:.w >> export.txt.


범위는 명령이 현재 버퍼의 라인 그룹에 적용되도록 허용합니다.

따라서 읽기 명령어의 범위는 현재 파일에서 내용을 삽입 할 위치를 의미하지만 읽으려는 파일 범위는 아닙니다.

참조 URL : https://stackoverflow.com/questions/240244/vim-how-to-read-range-of-lines-from-a-file-into-current-buffer

반응형