상태로 대체해야합니다. SO에 대한 이러한 종류의 문제에 대한 (/ 여러?) 완전한 솔루션 을 제공 한 것을 기억 합니다.
다음은 또 다른 방법입니다 (1). 이제 2 단계로 진행하겠습니다.
- 내가 사용할 더럽고 복잡한 트릭에 필요한 더미 목록 변수
- 이 더미 배열의 len을 삽입하는 치환은 각 일치하는 항목을 채 웁니다.
다음을 제공합니다.
:let t=[]
:%s/#\zs\d\+\(\.\d\+\)\=\ze/\=len(add(t,1))/g
정규 표현식을 vim하는 데 익숙하지 않은 경우 일치하는 하위 패턴을 사용 :h /\zs
하고 \ze
지정하기 위해 가능한 한 일련의 숫자와 점 및 기타 숫자가 일치합니다. 이것은 부동 소수점 숫자에 완벽하지는 않지만 여기서는 충분합니다.
참고 : 간단한 인터페이스를 위해서는 몇 가지 기능 + 명령으로 마무리해야합니다. 다시, SO / vim ( here , here , here ) 에 대한 예가 있습니다. 요즘에는이 트릭을 명령에 래핑하는 것에 신경 쓰지 않을 정도로 vim이 충분하다는 것을 알고 있습니다. 실제로 첫 번째 시도 에서이 명령을 작성할 수 있지만 명령의 이름을 기억하는 데 몇 분이 걸립니다.
(1) 목표는 대체 사이의 상태를 유지하고 현재 발생을 현재 상태에 의존하는 것으로 대체하는 것입니다.
덕분에 :s\=
계산 결과를 삽입 할 수 있습니다.
국가의 문제를 유지합니다. 외부 상태를 관리하는 함수를 정의하거나 외부 상태를 업데이트합니다. C (및 관련 언어)에서는 length++
or 와 같은 것을 사용할 수 있습니다 length+=1
. 불행히도, vim 스크립트에서는 +=
즉시 사용할 수 없습니다. 그것은 함께 사용될 수 필요 :set
하거나 함께 :let
. 즉 :let length+=1
, 숫자 가 증가하지만 아무것도 반환하지 않습니다. 우리는 쓸 수 없습니다 :s/pattern/\=(length+=1)
. 우리는 다른 것이 필요합니다.
뮤팅 기능이 필요합니다. 즉, 입력을 변경하는 기능. 우리는이 setreg()
, map()
, add()
아마 더합니다. 그들부터 시작합시다.
setreg()
레지스터를 변경합니다. 완전한. setreg('a',@a+1)
@Doktor OSwaldo의 솔루션에서와 같이 작성할 수 있습니다 . 그러나 이것은 충분하지 않습니다. setreg()
(Pascal, Ada ...를 아는 사람들 중) 이것은 아무것도 반환하지 않음을 의미합니다. 실제로는 무언가를 반환합니다. 명목 이탈 (예 : 비 예외 이탈)은 항상 무언가를 반환합니다. 기본적으로 무언가를 반환하는 것을 잊었을 때 0이 반환 되며 내장 함수에도 적용됩니다. 그래서 그의 솔루션에서 대체 표현은 실제로 \=@a+setreg(...)
입니다. 까다 롭지 않습니까?
map()
또한 사용될 수있었습니다. 단일 0 ( :let single_length=[0]
) 으로 목록에서 시작 하면로 인해 증가 할 수 있습니다 map(single_length, 'v:val + 1')
. 그런 다음 새 길이를 반환해야합니다. 달리 setreg()
, map()
그 돌연변이 입력을 반환합니다. 완벽합니다. 길이는 목록의 첫 번째 (고유 한 마지막 위치) 위치에 저장됩니다. 대체 표현식은입니다 \=map(...)[0]
.
add()
내가 습관적으로 자주 사용하는 것입니다 map()
. 아이디어 add()
는 목록을 현재 상태로 사용하고 각 대체 전에 끝에 무언가를 추가하는 것입니다. 나는 종종 새로운 값을 목록의 끝에 저장하고 대체를 위해 사용합니다. 으로 add()
또한 돌연변이 입력 목록을 반환, 우리가 사용할 수 있습니다 \=add(state, Func(state[-1], submatch(0)))[-1]
. OP의 경우 지금까지 몇 개의 일치 항목이 감지되었는지 기억하면됩니다. 이 상태 목록의 길이를 반환하면 충분합니다. 따라서 내 \=len(add(state, whatever))
.
perldo
사용할 수 있습니다:%perldo s/#\K\d+(\.\d+)?/++$i/ge