it-roy-ru.com

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

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

Например, от случайной строки в файле (открытой в vim), скажем, Row-i, до случайной строки, скажем, Row-j, где Row-i <Row-j, есть способ генерировать числовую последовательность из строки -i до строки-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 пост похож, но не одинаков.

39
Sangeeth Saravanaraj

Wybierz kilka linii za pomocąV(Shift-v), в котором говорится:

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

Wpisz :help sub-replace-expression, aby przeczytać więcej.

46
kev

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

aaa
bbb
ccc

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

1 aaa
bbb
ccc

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

qq0yf 0j0P0<C-a>q

Объяснение:

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

это дает:

1 aaa
2 bbb
ccc

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

:.,$norm @q

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

27
hochl

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

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

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

Теперь, начиная со строки № 5, используйте Ctrl-v снова, чтобы выбрать все вставленные 1, кроме первого. Нажмите g Ctrl-a создать последовательность.

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 #1

Использование 2g Ctrl-a использовать количество шагов 2.


Вдохновленный пользователем soulthym : Вы можете сохранить несколько нажатий клавиш, запустив визуальный выбор в строке № 8. Выберите первый символ, вставьте 1, нажмите gv чтобы повторно применить прежний визуальный выбор, нажмите j пропустить первую 1 и нажать g Ctrl-a создать последовательность.

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

будет делать то, что вы хотите

если вам нужно считать = 2:

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

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

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

9
Kent

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

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

Вот подвох, но тогда жизнь состоит из них. :)

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

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

1
Noufal Ibrahim

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

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

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

let s2 = Series(0, 2)

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

1
dahu

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

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

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

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

Vimball плагина является здесь или здесь .

1
Gismo Ranas

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

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