Vi - как сгенерировать последовательность чисел?

Есть ли способ генерации последовательности чисел в vi (m)?

Например, из случайной строки в файле (открыт в vim), скажем, Row-i - в случайную строку, скажем, Row-j, где Row-i < Row-j, есть способ генерировать числовую последовательность из Row-i в Row-j, начиная с номера 1, до номера j-i + 1 с шагом шага, как 1?

Скажем, у меня есть следующие строки в файле.

this is line #1
this is line #2
this is line #3
this is line #4
this is line #5
this is line #6
this is line #7
this is line #8
this is line #9
this is line #10

Я хочу префикс числовой последовательности из строки # 4 в строку # 8, начиная с номера 1 до номера 5. После операции результирующий файл должен быть следующим:

this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #10

Если это возможно, есть ли способ увеличить количество шагов? например, последовательность должна быть 2, 4, 6, 8, 10.. с шагом отсчета 2.

Обратите внимание:

Этот SO post похож, но не то же самое.

Ответ 1

Выберите несколько строк с помощью V (Shift-v), затем введите команду ниже:

:let i=1 | '<,'>g/^/ s//\=i . " "/ | let i+=2

Введите :help sub-replace-expression, чтобы узнать больше.

Ответ 2

Вместо сложной конструкции вы можете просто использовать макрос с функцией CTRL-a для увеличения ведущего числа. Пример данных:

aaa
bbb
ccc

сначала вставьте начальный номер и пробел:

1 aaa
bbb
ccc

затем запишите этот макрос в строке 1 (<C-a> означает нажмите CTRL-a):

qq0yf 0j0P0<C-a>q

Пояснение:

  • qq: записать макрос в регистр q
  • 0: перейдите в первый столбец.
  • yf: задержите все до и включите первое пространство (помните, что ваша первая строка имеет 1 и пробел).
  • 0jP: спуститесь и вставьте шаблон в начале строки.
  • 0<C-a>: перейдите к первому столбцу и добавьте число на единицу.
  • q: запись макроса конца.

это дает:

1 aaa
2 bbb
ccc

теперь вы можете применить этот макрос, используя @q столько, сколько захотите. Если вам нужно увеличить два, просто используйте CTRL-a CTRL-a вместо одного раза. Теперь вы можете применить этот макрос к последовательным строкам, например:

:.,$norm @q

добавит номера ведущих строк для остальной части вашего файла.

Ответ 3

С Vim 8.0 можно использовать g Ctrl-a, см. :help v_g_CTRL-A

Перейдите к строке № 4, используйте Ctrl-v, чтобы выбрать первый символ по блокам, перейдите на 4 строки, нажмите Shift i, введите 0 (это 0, затем Space) и Esc для выхода. режим вставки.

Теперь используйте gv, чтобы повторно выбрать ранее выбранную область. Нажмите g Ctrl-a, чтобы создать последовательность.

Я начинаю с 0 здесь, поэтому я могу выбрать заново gv. Если вы начинаете с 1, вам нужно выбрать заново вручную, опуская первый 1.

Используйте 2g Ctrl-a, чтобы использовать количество шагов 2.


screen capture demonstrating how to generate a number sequence

Ответ 4

:4,8s/^/\=line(".")-3." "    

сделает то, что вы хотите

если вам нужно count = 2:

:4,8s/^/\=2*(line(".")-3)." " 

это даст вам 2,4,6,8,10

номера строк жестко закодированы в моем примере, вы можете использовать V, чтобы выбрать те строки, которые хотите изменить.

Ответ 5

Выберите целевые строки в режиме Visual, затем запустите команду Ex

:'<,'>s/^/\=(line('.')-line("'<")+1).' '

Ответ 6

Здесь издевается грязный трюк, но потом жизнь.:)

ESC :r! for i in $(seq 1 10); do echo "This is line \#${i}"; done

Не перекрестная платформа.

Ответ 7

Плагин Nexus предоставляет тип Серии и объект s1 такого типа, который используется следующим образом:

:4,8s/^/\=s1.next().' '/

Nexus также поставляется с объектом s0 Series, который дает 0 в качестве своего первого результата .next(). Оба s0 ​​и s1 используют шаг в 1 шаг. Все объекты серии имеют метод .reset(), который возвращает их к их начальному значению. Объекты новой серии могут быть созданы следующим образом:

let s2 = Series(0, 2)

который создает двухэтапный объект, удовлетворяющий вашему второму запросу (уступающий: 2, 4, 6, 8...)

Ответ 8

Я думаю, что все предлагаемые решения слишком сложно запомнить, вы можете использовать их один раз, но тогда вам нужно входить во все подробности каждый раз, когда вы его используете (если вы используете его менее одного раза в день или около того).

Я нашел визуальный приращение script очень прост в установке и использовании. Как только он установлен в vim, вам просто нужно создать столбец из 0, выбрать его с помощью Ctrl-V и написать команду: I. Затем он автоматически генерирует все числа на каждой строке. Существуют и другие функции:

  • начните с номера, отличного от 0
  • цифры в левой или правой панели с 0 (например, 001,..., 015)
  • уменьшение или увеличение числа
  • увеличивается более чем на 1
  • (но вам нужен дополнительный плагин), буквы алфавита, дневные имена

Это решает более общую проблему, потому что она работает и в позиции, отличной от столбца 0, столбец должен быть выбран только с помощью Ctrl-V.

Виртуальный плагин плагина здесь или здесь.

Ответ 9

(если ваш vim имеет поддержку Perl - по умолчанию во многих дистрибутивах Linux): Выберите строки в визуальном режиме (V) и выполните

:perldo s/^/++$z . " "/e

Ответ 10

Менее гибким, но легко запоминающимся методом является использование перенумерующего плагина, такого как Renumber.vim http://www.vim.org/scripts/script.php?script_id=189

Если числа еще нет, как и в OP, некоторое число должно быть вставлено вместо них. Перенумеровать можно обрабатывать фактическое упорядочение, и оно выполняется на основе только первого номера.

В этом примере я использую <C-v>, чтобы вставить начальный номер во все строки, которые вы хотите пронумеровать.

4G<C-v>4jGI1 <Esc>gv:Renumber

Чтобы использовать шаги из двух

:Renumber s2