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

Теперь \= thingy позволяет мне заменить регулярное выражение выражением сценария 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 в начале третьей строки в моем буфере и так далее.

Надеюсь, теперь я прояснил себя.

3 ответа3

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

Это должно предшествовать увеличенному g:ID для каждой строки, которая соответствует foo от строки 10 до 20 (включительно).

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

Попробуйте <bar> вместо | Посмотри на: http://vim.wikia.com/wiki/Best_Vim_Tips

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .