: % s / \ = 및 | vim에서? = 1 :%s/^/\= g:ID | let g:ID =

다음은 대략 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)/


답변

<bar>대신 보십시오 |
:http://vim.wikia.com/wiki/Best_Vim_Tips


답변