다음은 대략 vim에서 수행하려는 작업입니다.
:let g:ID = 1
:%s/^/\= g:ID | let g:ID = g:ID * 1.2/
이제 vim이 막대 뒤의 모든 let g:ID = g:ID * 1.2
부분을 분해하는 것처럼 보입니다 (즉 부분).
물론 g : ID에 1.2를 곱하고 g : ID의 값을 반환하는 함수를 작성할 수는 있지만 이것을 포기하고 싶습니다.
고마워 르네
명확성을 위해 편집 :
vim-script 에서 막대 (|)를 사용하여 연결하면 한 줄 에 여러 명령문을 작성할 수 있습니다. 그래서 대신
let g:ID = 20
let g:ID = g:ID * 1.2
let g:ID = g:ID * 1.2
나는 또한 쓸 수 있었다
let g:ID = 20 | let g:ID = g:ID * 1.2 | let g:ID = g:ID * 1.2
이제 \ = 일을하면 정규 표현식을 vim 스크립트 표현식으로 대체 할 수 있습니다. 예를 들어, 나는 할 수 있습니다
:%s/ABC/\=line(".")/
현재 버퍼에서 ABC의 모든 발생을 찾은 줄 번호로 바꿉니다.
마찬가지로
:%s/^/\=g:ID/
내 버퍼의 각 줄 시작 부분에 현재 g : ID 값을 씁니다.
그것은 모두 훌륭하고 멋지지만 대체 부분에 둘 이상의 표현을 갖고 싶습니다. 그러한 표현을 막대와 연결하여 달성 할 수 있는지 궁금합니다. 제 경우에는 모든 대체 호출 후 g : ID를 조작하고 싶습니다.
:let g:ID=20
:s/^/\=g:ID|let g:ID=g:ID * 1.2/
내 버퍼의 첫 번째 줄의 시작 부분에 20, 내 버퍼의 두 번째 줄의 시작 부분에 24, 내 버퍼의 세 번째 줄의 시작 부분에 28.8 등을 쓰면됩니다.
나는 지금 나 자신을 더 명확하게했으면 좋겠다.
답변
:global
모든 라인에 대해 명령이 실행될 때 사용할 수 있습니다 .
:let g:ID = 1
:g//s//\=g:ID/ | let g:ID = g:ID + 1
교체를 제한하려면 :global
패턴으로 제한 하거나 :global
범위 접두사 또는 둘 다를 사용하십시오.
:10,20g/foo/s/^/\=g:ID/ | let g:ID = g:ID + 1
10 행에서 20 행 (포함) g:ID
과 일치하는 모든 행에 대해 증분 을 추가해야합니다 foo
.
답변
함수를 정의해야 할 수도 있습니다.
function! Accu(varname, mult)
let old = {a:varname}
let {a:varname} = {a:varname} * a:mult
return old
endfunction
이 방법으로 사용하십시오 :
:let g:ID = 1
:%s/^/\=Accu('g:ID', 1.2)/