다음과 같은 텍스트 파일이 있습니다 (Windows에서 gVim 사용).
foo bar baz quux corge grault garply waldo fred plugh [...150 more lines...] xyzzy thud
파일의 각 줄에 숫자를 추가하고 싶습니다. :set number
를 사용하지 않고 다음과 같이 각 줄 앞에 텍스트로 숫자를 추가하여 숫자가 파일의 일부가되도록합니다.
1. foo bar baz quux 2. corge grault garply 3. waldo fred plugh [...~150 more lines...] 155. xyzzy thud
댓글
영구 ” ot는 버퍼가 수정되고 숫자가 없음을 나타냅니다. ‘ t 순전히 시각적 인 것 (당신과 동일). Windows에서 gvim을 지정하는 이유는cat
또는nl
와 같은 외부 유틸리티를 피하는 것입니다. = “3ab99f7668”> Windows에서는 일반적으로 사용할 수 없습니다 (OP가awk
에 대한 의견에서 알 수 있듯이). 상위 두 가지 솔루션은 순수한 Vim입니다. 마지막으로 모든 라인 대 1 파라는 범위 선택의 문제입니다. 분명 큰 문제는 아닙니다.
답변
순수한 Vim 방식 :
:%s/^/\=line(".").". "
설명 :
:%s/^/ " the substitution will be applied to the beginning of every line \= " the rest of the replacement part is an expression line(".").". " " the expression returns the current line number concatenated with a dot and a space
:help \=
및 :help line()
.
교체 부분에 표현식을 사용하는 것은 매우 강력하며 FWIW는 vimscript에 대한 진입 점입니다.
댓글
- 이 매우 유용한 명령을 vimrc의 키맵에 어떻게 추가 할 수 있습니까?
- 대체를위한 vim 도움말 항목을 보려면 :
:help sub-replace-expression
답변
Vim 매크로의 한 가지 좋은 점은 재귀 할 수 있다는 것입니다. ) :
- 레지스터 q 삭제 :
qqq
- 첫 번째 줄에 번호 추가 :
ggI1.
(공백을 잊지 마세요!) - 줄의 시작으로 돌아가 매크로 기록 시작 :
0qq
- 번호 복사 :
- 줄 아래로 이동하여 번호 붙여 넣기 :
+P
- 줄의 시작 부분으로 다시 이동 그리고 숫자를 늘립니다.
0<c-a>
- 줄의 시작 부분으로 다시 이동합니다 (그러면 매크로가 두 숫자가 될 때 끊어지지 않습니다!).
0
- 매크로를 한 번 호출하여 재귀 적으로 만듭니다. 이 시점에서 레지스터 q에는 여전히 아무것도 없으므로
@q
는 아무 일도 일어나지 않습니다. - 매크로 저장 :
q
- 매크로를 한 번 더 호출하고 불꽃이 날아가는 것을 지켜보세요! :
@@
매크로는 그런 다음 파일 끝에 도달 할 때까지 계속 자체 호출합니다.
다른 유사한 문제에 대해 재귀 매크로 트릭을 사용할 수 있으므로 “알아두면 좋은 문제입니다.
어떤 이유로 재귀 매크로를 사용하지 않으려면 1 단계와 8 단계를 생략하고 count 를 사용하여 매크로를 여러 번 실행할 수 있습니다. 100@q
는 매크로 q
를 100 번 실행합니다.
댓글
- 강력한 것, 당신의 숙달에 절합니다. 매크로는 저에게 흑마 법과 같습니다 …
- @ropata, 매크로는 (대부분) 일반 모드 명령의 시퀀스 일뿐입니다.
- @romainl 제 생각에는 ‘을 키 입력 의 시퀀스로 생각하는 것이 좋습니다.
- @Rich, ex 명령을 포함하여 여러 가지의 시퀀스가 될 수 있습니다.
- @romainl 예, ‘이 ‘ 키 입력으로 생각하는 것이 가장 좋다고 생각하는 이유입니다. 키보드에 입력 한 내용 (예 : ex 명령 포함)을 모두 수동으로 입력 한 것처럼 정확하게 재생합니다.
답변
이러한 작업을 수행하기 위해 vim 전역 명령을 사용하고 싶습니다. 이것은 줄의 시작 부분에 반복을 추가하거나 텍스트의 기호를 수정하는 데 적용됩니다. 다른 솔루션보다 복잡해 보이지만 편리 할 때 사용할 수있는 매우 유연한 패턴이며 많은 생각없이 쉽게 수정할 수 있습니다.
먼저 범위를 선택하십시오. 이것을 적용하고 싶습니다). 나는 보통 마크 (예 :첫 번째 줄에 ma
, 두 번째 줄에 mb
를 입력합니다.하지만 줄 번호 나 시각적 선택을 사용할 수도 있습니다.) 다음 명령 (현재 사용 사례에 맞게 조정 됨)
:let i=1|"a,"bg/^/s/^/\=i.". "/|let i=i+1
해체
:let i=1
이렇게하면 시작 값으로 변수 i
가 설정됩니다. 일반적으로 목록은 1로 시작하므로 i를 1로 설정합니다.
|
바는 새 명령을 시작합니다.
"a,"b
다음 명령의 범위를 설정합니다. 마크 a
에서 마크 b
로 이동합니다. , 목록의 첫 번째 줄과 마지막 줄에 설정됩니다.
g/^/
이것은 전역 명령입니다. 파일 (또는 범위)에서 주어진 정규식을 검색하고 일치하는 줄의 각 에서 나머지 명령 줄을 실행합니다. “줄 시작”을 검색하여 모든 줄을 일치시킵니다.
Item some txt other text Item second item whatever Item third
와 같은 텍스트가 있고 이러한 레이블을 Item
다른 줄은 무시하고 대신 g/Item/
또는 g/^Item/
를 수행하십시오 (리터럴 항목 텍스트가 )
s/^/\=i.". "/
정규식을 실행하여 줄의 시작 부분을 다음과 연결된 i
값으로 바꿉니다. .
. 일반적으로이 작업은 무엇이든 할 수 있습니다 (예 : Item
라벨을 숫자로 대체).
|let i=i+1
바가 새 명령을 시작하더라도 전역이 완료된 후가 아니라 전역 명령 내에서 실행되도록 두 번째 명령을 설정합니다. 결과는 증가합니다. div id = “d0466aceaa”>
다음 줄이 g에 의해 처리되기 전입니다. 여기에 또 다른 유연성이 있습니다. i의 수정은 무엇이든 될 수 있습니다 (증가 피보나치 수열의 다음 요소를 생성하는 함수를 호출합니다.
Answer
모든 행
:%!nl -ba
또는 :%!cat -n
명령은 모든 줄에 줄 번호를 추가합니다.
Windows에서는 “Cygwin / MSYS / SUA를 설치해야합니다.
선택한 줄에 번호 추가
선택한 줄에만 번호를 추가하려면 다음에서 선택하십시오. 비주얼 모드 ( v 및 커서), 완료되면 다음 명령을 실행합니다. :%!nl
(빈 줄 무시) 또는 :%!cat -n
(빈 줄 포함).
서식
추가 공백을 제거하려면 시각적 블록에서 선택합니다 ( Ctrl + v ) 제거 ( x ).
일부 문자 추가 (.
, :
, ) 번호 뒤의 숫자를 시각적 블록 ( Ctrl + v )에서 선택한 다음 문자 ( A )를 추가합니다. , 문자를 입력 한 다음 Esc )로 마칩니다.
설명
- 주어진 것과 동일한 형식을 제공하지 않습니다. 질문에. 하지만 솔루션의 단순함이 마음에 듭니다.
- @KarlYngveLerv å g 감사합니다. 답변에 포함했습니다.
답변
romainl의 답변 수정 :
:%s/^\(\d\+\. \)\?/\=line(".").". "
이것은 줄 번호를 추가 하는 것이 아니라 기존에있는 줄 번호를 대체 합니다. 중간에 줄을 삽입하면 예상대로 모든 번호가 다시 매겨집니다.
이것은 숫자 다음에.를 추가하고 줄의 시작 부분에있는 공백을 새 숫자로 바꾸는 방식으로 작동합니다. . 이미이 패턴으로 시작하는 줄이 있으면 분명히 깨질 것이므로 생각을 가지고 사용하세요.
추가 된 부분 :
-
^
-줄 시작 -
\(
-새 하위 그룹 시작 -
\d\+
-숫자를 한 번 이상 일치 -
\.
-점 일치 (
.
) 및 공백.
-
\)
-하위 그룹 종료 -
\?
-그룹을 선택 사항으로 만들어이 줄에 아직 숫자가없는 경우 이전처럼 작동합니다.
보너스 힌트 :
줄 번호를 제거 하려면 repalce 부분이 비어있는 동일한 패턴을 사용할 수 있습니다.
:%s/^\(\d\+\. \)\?//
Answer
I1. <esc>^qqyWjP^<C-a>q
이것은 처음 두 줄에 번호를 매기 며 @q
다음 줄에 번호를 매기거나 ex. 18@q
총 20 줄을 작성하려는 경우).
설명 :
I1. <esc> Number the first line hqq Go back to the start of the line and start recording a macro yWjP Copy the line number to the next line ^<C-a> Increment the next line"s line number q Finish recording
이것의 장점은 외부 명령이 필요하지 않다는 것입니다. 예를 들어 Windows에서 Vim으로 작업 할 수 있습니다.
댓글
-
1. <esc>h
를 입력하면 첫 번째 열이 아닌 두 번째 열입니다.h
를0
로 바꾸고 나면 솔루션이 매우 좋을 것이라고 생각합니다. - @KarlYngveLerv å g 오타입니다. 감사합니다. 문제를 해결했습니다.
- 문제 없습니다. 그러나 아직 설명을 업데이트하지 않았습니다. 또한 많은 키보드에서
^
는^a -> â
와 같은 입력 조합을 허용하기 위해 두 번째 문자를 기다립니다. 나는 여전히 최선의 해결책에 동의하지만 이것도 언급되어야한다고 생각합니다.
답변
나 선택한 답변이 최고라고 생각하지만 다양성을 염두에두고 외부 프로그램을 사용하여 대안을 제공하겠습니다.
:%!cat -n
외부 프로그램 cat
를 통한 버퍼 (%
로 표시됨), 여기서 -n
flag는 각 입력 줄 앞에 줄 번호를 붙입니다.
물론, 이것은 cat
가 설치되어 있어야합니다. 이것은 (아마도) 모든 유닉스에 해당됩니다. 유사 시스템.
외부 프로그램을 통한 필터링에 대한 자세한 내용은 :help :range!
를 확인하세요.
댓글
답변
약간 해킹적인 해결책은 다음과 같습니다 (< 및>는 Ctrl + v 를 누른 후 삽입됩니다.
:%normal :redir @"<Enter>:-=<Enter>:redir END<Enter>I<C-R>".<Tab><Esc>kdd
해체
:%normal {commands}
범위로 지정된 각 줄 (이 경우 모든 줄)에서 일반 모드 명령을 실행합니다.
:redir @"
ex 명령에 의해 생성 된 모든 출력을 명명되지 않은 버퍼로 리디렉션합니다.
:.=
는 현재 줄을 출력하는 ex 명령입니다. 번호 (안타깝게도 앞에 줄 바꿈이 있음)
:redir END
이름이 지정되지 않은 버퍼로의 리디렉션을 중지합니다.
I<C-R>".<Tab><Esc>
이름이 지정되지 않은 버퍼의 내용을. 탭을 각 줄의 맨 앞으로 이동하고 삽입 모드를 종료합니다.
kdd
한 줄 위로 이동하고 :의 결과 인 줄 바꿈을 제거합니다. = 명령.
awk
가이 작업을위한 도구 일 것입니다. 하지만 저는 ‘ Windows를 사용하고 있습니다 (한숨).