Это возможный объединиться: %s/\= и | в энергии?

Следующее примерно, что я пытаюсь сделать в энергии

:let g:ID = 1
:%s/^/\= g:ID | let g:ID = g:ID * 1.2/

Теперь, это похоже на энергию disregrads все после панели (который является let g:ID = g:ID * 1.2 часть.

Я мог, конечно, записать функцию, которая умножает g:ID с 1,2 и возвращает значение g:ID, но я хотел бы предшествовать этому.

Спасибо Rene

редактирование для ясности:

В сценарии энергии я могу записать несколько операторов на одной строке, если я использую панель (|) для объединения в цепочку их. Так, вместо

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

Теперь, \= штука позволяет мне заменять регулярным выражением с выражением сценария энергии. Например, я мог сделать a

:%s/ABC/\=line(".")/

который заменил бы каждое происшествие ABC в моем текущем буфере с номером строки, на котором это найдено.

Так же a

:%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
задан 06.11.2009, 11:39

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 (включительно).

3
ответ дан 08.12.2019, 00:39

Вы, возможно, должны определить функцию:

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)/
1
ответ дан 08.12.2019, 00:39

Попробовать <bar> вместо | Взгляните на: http://vim.wikia.com/wiki/Best_Vim_Tips

0
ответ дан 08.12.2019, 00:39
  • 1
    вместо | приводила к E15: недопустимое выражение: g:ID <панель> позволили g:ID =... и E121: панель – René Nyffenegger 06.11.2009, 12:21

Теги

Похожие вопросы