다음 명령을 시도 할 수 있습니다.
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
먼저 변수 c
( let c=0
)를 초기화 한 다음 전역 명령 g
을 실행 하여 패턴 ^*
(줄의 시작, 별표 및 공백) 을 찾습니다 .
이 패턴을 포함하는 행이 발견 될 때마다 전역 명령은 명령을 실행합니다.
let c+=1 | s//\=c.'. '
변수를 증가시키고 c
( let c+=1
), |
( s
) 이전에 검색된 패턴 ( //
)을 표현식 평가 ( )로 대체 합니다 ( \=
) : 연결된
변수의 내용 문자열이있는 c
( .
)'. '
버퍼에서 모든 행을 수정하지 않고 특정 단락 만 수정하려는 경우 전역 명령에 범위를 전달할 수 있습니다. 예를 들어, 번호가 5와 10 사이 인 행만 수정하려면 다음을 수행하십시오.
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
변환하려는 여러 유사한 목록이 포함 된 파일이있는 경우 예를 들면 다음과 같습니다.
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
some other random stuff some other random stuff
==>
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
* qux 4. qux
some other random stuff some other random stuff
다음 명령으로이를 수행 할 수 있습니다.
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
다른 명령으로 c
전환 할 때 변수를 재설정하는 이전 명령의 변형 일뿐 입니다. 다른 목록에 있는지 여부를 감지하기 위해 변수 d
는 대체 된 마지막 행의 번호를 저장하는 데 사용됩니다.
전역 명령은 현재 줄 번호 ( line('.')
) 를와 비교합니다 d+1
. 그들은 같은 경우는 우리가 전에 지금과 같은 목록에있는 의미 c
(증가 c+1
때문에, 그렇지 않으면 우리가 다른 목록에 의미) c
리셋은 ( 1
).
함수 내에서 다음과 같이 명령 let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
을 다시 작성할 수 있습니다.
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
또는 이렇게 :
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
일부 키 입력을 저장하기 위해 사용자 지정 명령을 정의 할 수도 있습니다.이 명령 :NumberedLists
은 기본값이 1,$
( -range=%
) 인 범위를 허용합니다 .
command! -range=% NumberedLists let [c,d]=[0,0] | <line1>,<line2>g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
경우는 :NumberedLists
실행됩니다, <line1>
그리고 <line2>
자동으로 사용 범위로 대체됩니다.
따라서 버퍼의 모든 목록을 변환하려면 다음을 입력하십시오. :NumberedLists
10 행과 20 행 사이의 목록 만 : :10,20NumberedLists
시각적 선택 만 : :'<,'>NumberedLists
자세한 내용은 다음을 참조하십시오.
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command