Представьте, что у меня есть следующий текст:
some random stuff
* asdf
* foo
* bar
some other random stuff
Я хочу заменить звездочку пулями на цифры, например так:
some random stuff
1. asdf
2. foo
3. bar
some other random stuff
Как это можно сделать в vim?
substitute
filetype-markdown
range
markup
counting
Бреннан Винсент
источник
источник
1.
? Так:%s/^* /1. /
бы и сделал. Это похоже на гораздо меньшую работу.Ответы:
Вы можете попробовать следующую команду:
Сначала он инициализирует переменную
c
(let c=0
), затем выполняет глобальную команду,g
которая ищет шаблон^*
(начало строки, затем звездочка и пробел).Всякий раз, когда строка, содержащая этот шаблон, найдена, глобальная команда выполняет команду:
let c+=1 | s//\=c.'. '
она увеличивает переменную
c
(let c+=1
), затем (|
) заменяет (s
) предыдущий искомый шаблон (//
) оценкой выражения (\=
):содержимое переменной
c
сцепляется (.
) со строкой'. '
Если вы не хотите изменять все строки из буфера, а только определенный абзац, вы можете передать диапазон глобальной команде. Например, чтобы изменить только строки с номерами от 5 до 10:
Если у вас есть файл, содержащий несколько похожих списков, которые вы хотите преобразовать, например, что-то вроде этого:
Вы можете сделать это с помощью следующей команды:
Это просто вариант предыдущей команды, которая сбрасывает переменную
c
при переключении на другой список. Чтобы определить, находитесь ли вы в другом списке, переменнаяd
используется для хранения номера последней строки, где была сделана замена.Глобальная команда сравнивает текущий номер строки (
line('.')
) сd+1
. Если они совпадают, это означает, что мы находимся в том же списке, что и раньше, тоc
есть incremental (c+1
), в противном случае это означает, что мы находимся в другом списке, тоc
есть reset (1
).Внутри функции команду
let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
можно переписать так:Или вот так:
Чтобы сохранить некоторые нажатия клавиш, вы также можете определить пользовательскую команду
:NumberedLists
, которая принимает диапазон со значением по умолчанию1,$
(-range=%
):Когда
:NumberedLists
будет выполнено,<line1>
и<line2>
будет автоматически заменено диапазоном, который вы использовали.Итак, чтобы преобразовать все списки в буфере, вы должны набрать:
:NumberedLists
Только списки между строкой 10 и 20:
:10,20NumberedLists
Только визуальный подбор:
:'<,'>NumberedLists
Для получения дополнительной информации см .:
источник
Это работает только с последней версией Vim (которая имеет
:h v_g_CTRL-A
):*
) и заменить их0
(курсор находится на первом*
)Ctrl-v
j
j
r
0
.gv
g
Ctrl-a
... вот и все :)
(Если вы хотите , чтобы иметь точку после каждого номера, изменение 1 - ый шаг:
Ctrl-v
j
j
s
0
.
Esc
)источник
Визуально выберите строки и выполните команду замещения:
См
:help sub-replace-expression
,:help line()
и:help '<
.Чтобы избежать необходимости выбирать строки, можно использовать поиск назад и вперед со смещением, чтобы указать диапазон замены следующим образом:
Видеть
:help cmdline-ranges
источник
Другой путь:
источник
Вы также можете определить пользовательские операторы
Вы можете сопоставить их с последовательностями клавиш
'*
и'#
. Метки*
и#
не существуют, так что вы не будете переопределять любую функциональность по умолчанию. Причиной выбора'
в качестве префикса является получение какой-то мнемоники. Вы добавляете знак / знак перед некоторыми строками. И обычно для перехода к отметке вы используете префикс'
.Это также работает из визуального режима.
Ex-команды хороши для сценариев, но для интерактивного использования нормальный оператор, вероятно, лучше, потому что вы можете комбинировать его с любым движением или текстовым объектом.
Например, вы можете переключать список с префиксом звездочки или минус внутри текущего абзаца, нажав
'*ip
. Здесь'*
оператор иip
текстовый объект, над которым он работает.И сделайте то же самое для списка с префиксом чисел в следующих 10 строках, нажав
'#10j
. Здесь'#
другой оператор и10j
движение, покрывающее линии, на которых работает оператор.Другое преимущество использования пользовательского оператора заключается в том, что вы можете повторить последний выпуск с помощью команды точки.
источник