У меня есть текстовый файл, как это (с помощью gVim на Windows)
foo bar baz quux
corge grault garply
waldo fred plugh
[...150 more lines...]
xyzzy thud
Я хочу добавить номер к каждой строке в файле. Не используется :set number
, но добавляет число в виде текста, предшествующего каждой строке, следующим образом, чтобы число было частью файла.
1. foo bar baz quux
2. corge grault garply
3. waldo fred plugh
[...~150 more lines...]
155. xyzzy thud
macro
text-generation
enumerate
roblogic
источник
источник
awk
вероятно инструмент для этой работы. Но я на Windows (вздох).cat
илиnl
, которые могут делать числовые строки, но обычно не доступны в Windows (как указывает OP из их комментариевawk
). Лучшие два решения - чистый Vim. И наконец, все строки против одного пункта - просто вопрос выбора диапазона. Очевидно, не большая проблема.Ответы:
В чистом виде Vim:
Объяснение:
Смотрите
:help \=
и:help line()
.Использование выражения в заменяющей части очень эффективно, и FWIW является хорошей отправной точкой для входа в vimscript.
источник
:help sub-replace-expression
Хорошая особенность макросов Vim заключается в том, что они могут возвращаться (они могут вызывать себя):
qqq
ggI1.
(не забывайте пробел!)0qq
yW
+P
0<c-a>
0
@q
.q
@@
Макрос продолжит вызывать себя, пока не достигнет конца файла.
Вы можете использовать рекурсивный макро-трюк для множества других подобных проблем, так что об этом стоит знать.
Если по какой-то причине вы не хотите использовать рекурсивный макрос, вы можете пропустить шаги 1 и 8 и использовать счетчик для запуска макроса несколько раз, например
100@q
, запуск макросаq
100 раз.источник
Мне нравится использовать команду vim global для выполнения подобных задач. Это относится к добавлению итерации в начало строки или изменению символа в тексте. Он выглядит сложнее, чем другие решения, но это довольно гибкий шаблон, который можно использовать, когда он вам удобен, и его легко изменить, не задумываясь.
Во-первых, выберите свой диапазон (какие линии вы хотите применить это). Я обычно использую метки (например,
ma
в первой строке иmb
во второй, но вы также можете использовать номера строк или визуальный выбор), затем введите модификацию следующей команды (в настоящее время настроена для вашего варианта использования)Деконструкция
Это устанавливает переменную
i
с начальным значением. Обычно списки начинаются с 1, поэтому я устанавливаю i в 1.Бар запускает новую команду
Это устанавливает диапазон следующей команды. Я иду от отметки
a
к отметкеb
, которая будет установлена в первой и последней строке вашего списка.Это глобальная команда. Он ищет в файле (или диапазоне) заданное регулярное выражение и выполняет оставшуюся часть командной строки в каждой строке, которая соответствует. Я сопоставляю каждую строку в поиске «начало строки». Если у вас был текст, как
и только хотите поставить эти метки перед
Item
и игнорировать другие строки, сделатьg/Item/
илиg/^Item/
вместо этого (при условии буквального текста элемента)Это выполняет регулярное выражение для замены начала строки значением
i
сцепленного с.
. Как правило, вы можете сделать это с чем угодно (например, заменить меткуItem
с номером).Даже если панель запускает новую команду, она устанавливает вторую команду для запуска в глобальной команде, а не после завершения глобальной. В результате мы увеличиваем значение
i
перед обработкой следующей строки g. Вот еще одно место гибкости. Модификация i может быть чем угодно (увеличить на 2, вызвать функцию, которая генерирует следующий элемент последовательности Фибоначчи, что угодно).источник
Добавить номера ко всем строкам
Можно использовать команды
:%!nl -ba
или,:%!cat -n
которые будут добавлять номера строк ко всем строкам.В Windows у вас должен быть установлен Cygwin / MSYS / SUA.
Добавить номера в выбранные строки
Чтобы добавить числа только для выбранных строк, выберите их в визуальном режиме ( vи курсоры), затем, когда закончите, выполните команду:
:%!nl
(игнорируйте пустые строки) или:%!cat -n
(включая пустые строки).Форматирование
Чтобы удалить лишние пробелы, выделите их в визуальном блоке ( Ctrl+ v) и удалите их ( x).
Для того, чтобы добавить некоторые символы (
.
,:
,)
) после цифр, выберите их в визуальном блоке ( Ctrl+ v), затем добавить символ ( Aвведите символ, а затем закончить с Esc).источник
Модификация ответа Роменля :
Это не только добавит номера строк, но и заменит существующие номера строк, если они уже есть. Если вы вставили строку посередине, она перенумерует все, как ожидалось.
Это работает, заменяя любое число с последующим. и пробел в начале строки с новым номером. Это, очевидно, сломается, если у вас есть строка, которая уже начинается с этого шаблона, так что используйте с мыслью.
Добавленная часть:
^
- начало строки\(
- Начать новую подгруппу\d\+
- Совпадение цифры один или несколько раз\.
- Совпадение точки (
.
) и пробела.
\)
- Конец подгруппы\?
- Сделайте группу необязательной, чтобы она работала как прежде, если в этой строке еще нет номера.Дополнительная подсказка:
чтобы удалить номера строк, вы можете использовать тот же шаблон с пустой частью ответа:
источник
Это нумерация первых двух строк, и вы можете нажать
@q
для нумерации последующих строк (или набрать, например,18@q
если вы хотите, чтобы всего было 20 строк).Объяснение:
Преимущество этого в том, что он не требует никаких внешних команд, что полезно, например, если вы работаете с Vim в Windows.
источник
1. <esc>h
вы находитесь во втором столбце, а не в первом столбце. Я хотел бы заменитьh
с0
, после чего я думаю , что ваше решение должно быть очень хорошим.^
ждет второго символа, чтобы разрешить вводить комбинации вроде^a -> â
. Я все еще согласен с тем, что это лучшее решение, но я думаю, что об этом следует упомянуть.Я думаю, что выбранный ответ является лучшим, но, несмотря на разнообразие, я предложу альтернативу, используя внешнюю программу:
Это отфильтрует весь ваш буфер (как обозначено
%
) через внешнюю программуcat
, где-n
флаг добавляет каждую строку ввода к номеру строки.Это, конечно, требует, чтобы вы
cat
установили, что верно (вероятно) для всех Unix-подобных систем.Проверьте
:help :range!
для более подробной информации о фильтрации через внешние программы.источник
msysgit
и добавили это в PATH (IIRC - это вариант установки), это решение также должно работать в Windows.cat -n
не POSIX, ноnl
есть, так что это может быть лучшим вариантом.Немного хакерское решение может быть следующим (все, что написано между <и>, должно быть вставлено после нажатия Ctrl+ v):
Деконструкция
запускает команду нормального режима в каждой строке, указанной диапазоном, в данном случае в каждой строке
перенаправляет каждый вывод, сделанный командами ex, в безымянный буфер.
это команда ex, которая выводит текущий номер строки (к сожалению, с предыдущей строкой)
перестает перенаправлять в безымянный буфер
вставляет содержимое безымянного буфера с. и вкладка в начало каждой строки и выход из режима вставки.
идет на одну строку вверх и удаляет символ новой строки, который является результатом команды:. =.
источник