Оптимальный выбор техники сильно зависит от реальных обстоятельств
трансформации. Есть как минимум две вариации
реализация:
Являются ли строки для работы единственными в файле? Если не,
диапазон строк, определенный контекстом (то есть разделенный пробелом)
строки, как абзац) или это произвольно и должно быть указано
Пользователь
Являются ли эти строки уже содержат числа, которые должны быть изменены или
Нужно ли вставлять новые, оставляя текст в строках в такте?
Поскольку информации для ответа на эти вопросы нет, ниже мы попытаемся
построить гибкое решение.
Общим решением является замена, действующая в начале строк
в диапазоне, указанном пользователем. Визуальный режим, наверное, самый простой способ
выбора произвольного диапазона линий, поэтому мы предполагаем, что границы
диапазон определяется визуальным отбором.
:'<,'>s/^\d\+/\=line(".")-line("''")+1/
Если необходимо пронумеровать каждую строку в буфере, команда может быть
упрощается следующим образом.
:%s/^\d\+/\=line('.')/
В любом случае, если номер должен быть просто вставлен в начале
линии (без изменения уже существующих), можно изменить
шаблон от ^\d\+
до ^
и, при необходимости, добавление разделителя:
:'<,'>s/^\d\+/\=(line(".")-line("''")+1).' '/
или
:%s/^/\=line('.').' '/
соответственно.
Для решения, основанного на инструментах командной строки, можно рассмотреть использование потока
редакторы, такие как Sed или инструменты для извлечения текста и отчетности, такие как AWK .
Для нумерации каждой строки в файле с помощью Sed выполните команды
$ sed = filename | sed 'N;s/\n/ /'
Чтобы сделать то же самое в AWK, используйте команду
$ awk '{print NR " " $0}' filename
, который можно легко изменить, чтобы ограничить нумерацию определенным диапазоном строк
удовлетворяющий определенному условию. Например, следующая команда нумерует
строки со второго по восьмой.
$ awk '{print (2<=NR && NR<=8 ? ++n " " : "") $0}' filename
Интересует, как команды похожи на команды из скрипта, связанного в
постановка вопроса реализована, можно использовать следующую команду как
ссылка.
vnoremap <leader>i :call EnumVisualBlock()<cr>
function! EnumVisualBlock() range
if visualmode() != "\<c-v>"
return
endif
let [l, r] = [virtcol("'<"), virtcol("'>")]
let [l, r] = [min([l, r]), max([l, r])]
let start = matchstr(getline("'<"), '^\d\+', col("'<")-1)
let off = start - line("'<")
let w = max(map([start, line("'>") + off], 'len("".v:val)'))
exe "'<,'>" 's/\%'.l.'v.*\%<'.(r+1).'v./'.
\ '\=printf("%'.w.'d",line(".")+off).repeat(" ",r-l+1-w)'
endfunction