2013-07-08 5 views
3

파일이있어서 다음과 같이하고 싶습니다.vim의 줄 번호로 채우기

- copy every n lines starting from m (m,m+n,m+2n, ...) 
- copy line number 2, 5, 27, ... by specifying line numbers. 

덕분에 당신은 라인을 선택하는 식으로 :global을 사용할 수 있습니다

답변

7

모든 N 라인을 복사하려면 : 명시 라인에 대한

:let @a = '' 
:g/^/if line('.') % 3 == 0 | yank A | endif 

을, 나는 순차적으로 :yank 명령을 부를 것이다 :

2yank a | 5yank A | 27yank A 

대문자 reg에 yanking을 사용합니다. 그것을 추가 할소서.

+0

고맙습니다. 하지만 1. 첫 번째 코드에서 n과 m은 어디에 있습니까? 2.두 번째 코드에서 a와 a의 차이점은 무엇입니까? – eli

+0

당신의 예제에서 n = 3이라고 생각합니다. – eli

+0

네, n = 3을 선택했고 오프셋을 추가 할 수 있습니다 :'(line ('.') + 1) % 3'; 조금만 실험하면 알게 될 것입니다. –

1

:g 해결책 외에 Ingo가 게시 한 :s 명령을 사용할 수도 있습니다.

먼저 패턴을 준비해야합니다.

예를 명시 적 등이 패턴 \%3l\|\%6l\|\%9l을 사용할 수 있습니다 모든 세 번째 줄,

을 그래서 일단의가 (우리가 처음 100 개 라인을 고려, 그것을 조금 단순화하기 위해) 변수 내에서 생성 된 패턴을 저장할 수와 일치하는

:let lines=range(3,100,3) 

이 당신이 어떤 arithemtic 규칙을 따르지 않는 어떤 특별한 줄 번호를 필요로하는 경우, 단순히이 같은 목록을 정의, 참고, 3에서 시작하여 3 씩 증가, 모든 행 번호의 목록을 만듭니다 :

:let lines=[2,5,26,57,99] 
:call map(lines, '''\%''.v:val.''l''') 

이 양식 \%l의 패턴에 줄 번호를 번역 :그런 다음 우리는 우리가 :s 명령 내에서 사용할 수있는 그것에서 패턴을 생성해야합니다. 그래서 우리는 원하는 각 라인과 일치하는 패턴을 가지고 있지만, 우선은 결과 목록 변수 initalize해야합니다

:let result = [] 

우리는 지금 :s 명령이 공급할 수 :

:exe ":%s/". join(lines, '.*\|'). '/\=add(result, submatch(0))/n' 

일치하는 모든 라인이 지금을 목록 result에 포함되어 있으며 예 :

:new +exe\ append(0,result) 

(참고, EXE와 APPEND 통화 사이의 공간을 탈출해야한다는) :

:let @+=join(result, "\n") 

을하거나 스크래치 버퍼에 붙여 넣을 수 있습니다 : 사용하여 클립 보드에 복사 할 수.

또한 내가이 방법을 사용하는 것 중 하나 또는 하나 잉고 지적 상황에 따라 Vim Patch 7.3.627

적어도이 솔루션이 요구하는, 유의하시기 바랍니다.