vi - как сгенерировать числовую последовательность? - PullRequest
39 голосов
/ 28 марта 2012

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

Например, от случайной строки в файле (открытой в vim), скажем, Row-i, до случайной строки, скажем, Row-j, где Row-i

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

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.

Пожалуйста, обратите внимание:

Этот ТАК похож, но не тот же.

Ответы [ 10 ]

46 голосов
/ 28 марта 2012

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

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

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

27 голосов
/ 28 марта 2012

Вместо сложной конструкции вы можете просто использовать макрос с функцией 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-a CTRL-a вместо одного раза. Теперь вы можете применить этот макрос к последовательным строкам, например:

:.,$norm @q

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

18 голосов
/ 23 января 2018

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

Перейдите на строку # 4, используйте Ctrl-v , чтобы выбрать первый символ по очереди, нажмите Shift i , введите 1 (это 1 затем Пробел ) и 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.

9 голосов
/ 28 марта 2012
:4,8s/^/\=line(".")-3." "    

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

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

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

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

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

2 голосов
/ 28 марта 2012

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

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

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

2 голосов
/ 28 марта 2012

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

:'<,'>s/^/\=(line('.')-line("'<")+1).' '
1 голос
/ 15 января 2014

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

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

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

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

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

1 голос
/ 28 марта 2012

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

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

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

let s2 = Series(0, 2)

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

0 голосов
/ 23 января 2018

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

:perldo s/^/++$z . " "/e
0 голосов
/ 28 марта 2012

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

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

В этом примере я использую <C-v>, чтобы вставить начальный номер во все строки, которые вы хотите пронумеровать.1008 *4G<C-v>4jGI1 <Esc>gv:Renumber

Для использования двух шагов

:Renumber s2

...