Как добавить номера строк в диапазон строк в Vim?

Как я могу добавить номера строк к диапазону строк в файле, открытом в Vim? Не так, как в :set nu — это просто отображает номера строк, — но действительно ли они должны быть добавлены к каждой строке в файле?


person dkretz    schedule 31.10.2008    source источник
comment
Этот вопрос должен относиться к любому файлу с маркерами конца строки, а не только к файлам с исходным кодом.   -  person Ana Nimbus    schedule 22.01.2019


Ответы (7)


С

:%s/^/\=line('.')/

РЕДАКТИРОВАТЬ: подвести итоги комментариев.

Эту команду можно настроить так, как вы хотите.


Допустим, вы хотите добавить числа перед строками из визуального выделения (V + перемещение) и хотите, чтобы нумерация начиналась с 42.

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

Если вы хотите добавить строку между числом и старым текстом из строки, просто соедините ее (с . в VimL) с числовым выражением:

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

Если вам нужно это для сортировки текста, вы можете обнулить результаты, что можно сделать, используя printf для 0001, 0002... вместо 1, 2... например:

:%s/^/\=printf('%04d', line('.'))/

В любом случае, если вам нужна дополнительная информация, просто откройте vim help: :h :s и перейдите по ссылкам (|subreplace-special|, ..., |submatch()|)

person Luc Hermitte    schedule 31.10.2008
comment
Пытался сделать это при визуальном выборе (где 1 будет первой строкой в ​​выборе), однако он начинает номер с этого номера строки в файле. Есть ли способ изменить стартовый номер? Спасибо! - person Jason; 08.12.2009
comment
@Джейсон offset может быть 1-line("'<"). Интересно, почему такой старый вопрос появился в моем RSS. - person ZyX; 13.01.2011
comment
Я предполагаю, что это из-за этого нового ответа: stackoverflow.com/questions/252766/add-line-numbers-in-vim/ - person Luc Hermitte; 13.01.2011
comment
Вы можете попробовать: - документацию (:help :s здесь), советы по vim (vim.wikia.com), плагины, написанные другими, vim_use (официальный список рассылки) и форумами, подобными этому. - person Luc Hermitte; 11.02.2011
comment
Я не могу найти =line в справке. Мне интересно, какие другие команды вы можете использовать в качестве замены при замене. - person dsg; 12.02.2011
comment
Переходите по ссылкам из :h :s -> subreplace-special - person Luc Hermitte; 12.02.2011
comment
на всякий случай, если кому-то еще нужно знать, чтобы добавить строку после числа, сделайте :%s/^/\=line('.') . 'string'/. в моем случае мне нужна была запятая, так как я нумеровал строки в CSV-файле, поэтому я сделал :%s/^/\=line('.') . ','/ - person katy lavallee; 22.10.2011
comment
Помимо визуального режима, вы можете вручную указать диапазон, например. 2,11s/^/\=line('.')/ - person David C. Rankin; 08.07.2014

cat -n добавляет к входным данным номера строк. Вы можете передать текущий файл в cat -n и заменить текущий буфер тем, что он выводит на стандартный вывод. К счастью, это запутанное решение занимает менее 10 символов в vim:

 :%!cat -n

Или, если вам нужен только подвыбор, визуально выберите область и введите следующее:

 :!cat -n

Это автоматически поместит маркеры визуального выбора и будет выглядеть так после того, как вы наберете его:

 :'<,'>!cat -n

Чтобы стереть номера строк, я рекомендую использовать control-v, что позволит вам визуально выделить прямоугольник, затем вы можете удалить этот прямоугольник с помощью x.

person Jerub    schedule 31.10.2008
comment
Что делать, если вы хотите, чтобы номера строк начинались с 0 вместо 1? - person Nils; 11.05.2011
comment
Удалить первую строку, остальные пронумеровать. Затем прочитайте первую строку с начальным «0». ;) - person sjas; 20.07.2012
comment
ЭТО ответ! - person user3751385; 28.07.2017

В системе GNU: с внешним двоичным файлом nl:

:%!nl
person Martin v. Löwis    schedule 31.10.2008
comment
cool nl -v позволяет вам указать, где должна начинаться нумерация, поэтому, если вы хотите, чтобы первая строка была строкой 0 вместо 1, используйте nl -v 0 - person Nils; 11.05.2011

В Unix-подобной среде вы можете использовать cat или awk для простого создания номера строки, поскольку vim имеет удобный интерфейс с оболочкой, поэтому все работает в vim так же, как и в оболочке.
From Vim Tip28:

:%!cat -n

or

:%!awk '{print NR,$0}'

Но, если вы используете vim в MS-DOS, win9x, win2000, вы теряете этот инструментарий. вот очень простой способ заархивировать это только с помощью vim:

fu! LineIt()
  exe ":s/^/".line(".")."/"
endf

Или последовательность, составленная из алфавита, так же проста, как и выше:

exe "s/^/".nr2char(line("."))."/" 

Вы также можете использовать subst:

:g/^/exe ":s/^/".line(".")."^I/"

Вы также можете распечатать только строки, не добавляя их в файл:

"Иногда это может быть полезно, особенно при редактировании больших исходных файлов, чтобы распечатать номера строк на бумаге.
Для этого вы можете использовать опцию :set printoptions=number:y для активации и :set printoptions=number:n для деактивации этой функции.
Если номер строки должен печататься всегда, поместите строку set printoptions=number:y в vimrc."

person VonC    schedule 31.10.2008
comment
Вы имели в виду «кот» вместо «звонок» в первом примере? - person Lance Roberts; 12.01.2011
comment
@Lance: два года спустя, я не совсем уверен: 3-я редакция этого поста показывает, что я возвращаю исправление с cat на call... (источник, вероятно, Vim tip28, как в neuron.tuke.sk/~hudecm/VimTips-OFFLINE-nov02.txt) - person VonC; 12.01.2011
comment
Хорошо, строка awk была тем, что мне было нужно в любом случае. Вы знаете, как бы я это реализовал, чтобы он давал мне 3-х или 4-х буквенные числа, например, начиная со 100 или 1000? - person Lance Roberts; 12.01.2011
comment
После ссылок создается впечатление, что это должен быть кот. Я нашел оператор awk, чтобы дать мне больше цифр: :%!awk '{print 1000+NR*10,$0}'. Единственная проблема сейчас (которой не так много) заключается в том, что мой оператор удаления :%s/^[0-9]*// оставляет лишние пробелы спереди, и ссылка на \s, похоже, не помогает. - person Lance Roberts; 13.01.2011
comment
@Lance: хорошо, я соответствующим образом отредактировал ответ. Ваша конкретная проблема может быть ответом на этой странице;) - person VonC; 13.01.2011
comment
Я поставил номера строк с: :%!cat -n но как их можно удалить? - person Cristian; 12.04.2016
comment
@Cristian Не уверен: вы должны задать это как отдельный вопрос (со ссылкой на этот ответ в качестве контекста) - person VonC; 12.04.2016
comment
@VonC спасибо за ваше предложение. Я задал здесь новый вопрос: stackoverflow.com/questions/36579720/ - person Cristian; 12.04.2016

Во-первых, вы можете удалить существующие номера строк, если вам нужно:

:%s/^[0-9]*//

Затем вы можете добавить номера строк. NR относится к текущему номеру строки, начинающемуся с единицы, поэтому вы можете выполнить некоторые математические операции, чтобы получить нужную нумерацию. Следующая команда дает вам четырехзначные номера строк:

:%!awk '{print 1000+NR*10,$0}'
person Lance Roberts    schedule 12.01.2011

Плагин "VisIncr" удобен для вставки столбцов возрастающих чисел в общий (или буквы, даты, римские цифры и т. д.). Вы можете управлять числовым форматом, заполнением и так далее. Поэтому вставьте «1» перед каждой строкой (через :s или :g или вставку визуального блока), выделите этот столбец в режиме визуального блока и выполните одну из команд из плагина.

person Brian Carper    schedule 02.11.2008

Если кто-то хочет поместить вкладку (или несколько пробелов) после вставки номеров строк, используя этот отличный ответ, вот способ . После перехода в режим побега выполните:

:%s/^/\=line('.').'    '/

^ означает начало строки, а %s — директиву для подстановки. Итак, мы говорим, что помещаем номер строки в начало каждой строки и добавляем к нему 4 пробела, а затем помещаем то, что было содержимым строки перед заменой, и делаем это для всех строк в файле.

Это автоматически заменит его. В качестве альтернативы, если вы хотите, чтобы команда запросила у вас подтверждение, выполните:

:%s/^/\=line('.').'    '/igc

P.S: сила vim :)

person kmario23    schedule 08.09.2018