Следующее примерно, что я пытаюсь сделать в энергии
: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 в начале третьей строки в моем буфере и так далее.
Я надеюсь, что сделал меня более ясным теперь.
Можно использовать :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 (включительно).
Вы, возможно, должны определить функцию:
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