Как работает диапазон для внутреннего содержимого фигурных скобок в Vim? - PullRequest
0 голосов
/ 25 сентября 2018

Из фантастической книги Дрю Нейла "Practical Vim" я узнал, что вы можете сделать с помощью команды :g.Однако есть одно выражение, которое я не получаю.

:g/{/ .+1,/}/-1 sort

Это сортирует все строки в скобках в файле по алфавиту.Общая форма этой команды:

:global/{pattern}/[cmd]

, где [cmd] состоит из [range] [cmd].Я понял, что шаблон поиска является отправной точкой, поэтому :g/{/ ясно.Затем следует диапазон .+1,/}/-1, где . является текущей строкой (т. Е. Каждая строка соответствует шаблону {), +1 добавляет смещение на одну строку, , отделяет начало диапазона от конца, /}/ говоря "до закрывающей скобки" и -1 вычитая одну строку, чтобы соответствовать только внутреннему содержанию фигурных скобок.Чего я не понимаю, так это частицу /}/.Для чего нужны слэши?Почему нельзя просто написать }?

РЕДАКТИРОВАТЬ: Из Vimhelp 10.3 Теперь я знаю, что /}/ - это шаблон поиска, используемый для верхней границы диапазона.Что оставляет меня в замешательстве насчет второго / здесь.Итак, обновленный вопрос: Зачем мне нужен второй / перед -1?

1 Ответ

0 голосов
/ 25 сентября 2018

С диапазонами всегда требуется /.../, чтобы сообщить Vim: это шаблон, поиск следующего соответствия и установка там курсора;вот где я хочу начать / закончить диапазон .Если вы посмотрите на :help :range, то буквальное значение } здесь не допускается;Vim хочет номер строки или символ, представляющий таковую, знак или шаблон поиска.Единственный допустимый вариант - ?...? для поиска вверх.

Когда вы попробуете предложенный вариант, вы получите

E492: Not an editor command: .+1,}-1 sort

Другой способ мотивировать это - абстрагироваться отбетон { ... } разделители.Представьте, как будет выглядеть диапазон, если вы хотите диапазон внутри foo ... bar.Что если бы диапазон был 000 ... 999;Vim не сможет различить диапазон буквенных чисел (строка 999) и поиск (следующая строка, содержащая 999).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...