: % s / \ = 및 | vim에서?


3

다음은 대략 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 등을 쓰면됩니다.

나는 지금 나 자신을 더 명확하게했으면 좋겠다.


1
무엇을 이루고 싶은지는 즉각적으로 분명하지 않습니다 ...
akira

검색-복제 패턴 일치의 대체 부분에 두 개의 "명령"을 연결하려고합니다.
René Nyffenegger 2009

분명히 내가 무엇에 대해 분명히 않네 나는 이 코멘트 :없이 명확하게 귀하의 질문을 수정 : 말하려고 한
아키라

뒤에는 표현식 만 허용 \=됩니다. 아니면 정확히 하나의 표현입니다. |는 명령 구분 기호이며, 사용해야 let할 경우 함수가 필요하거나 (예 :에서 사용해야하는 경우 s/RE/\=EXPRESSION/g) :g@peth가 제안한대로입니다. 이것은 골프 골프 질문입니까? ;-)
화성인

답변:


3

: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.


감사합니다. "보다 직접적인"방법이 있기를 희망했지만 귀하의 답변은 내가 원하는 것에 가장 가깝습니다.
René Nyffenegger

1

함수를 정의해야 할 수도 있습니다.

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)/

예, 기능으로 가능하다는 것을 알고 있습니다. 그러나 때로는 함수를 쓸 가치가 없다고 생각합니다. 즉, 내가없이 갈 수 있다면 ...
René Nyffenegger

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.